最近做了一个贪吃蛇的设计,分析思路:蛇是以每个小块组成的,并且可以游走,吃掉随机出现的的豆子,蛇的长度会增加一个块,如果蛇头touch到蛇身,本次游戏终止;撞墙本次游戏结束。根据以上思路,我主要做了以下4个类,分别是块的设计、蛇的设计、gameView类、贪吃蛇的游走。
贪吃蛇运行效果图:
块的代码设计
public class Kuai{ //public int HANG, LIE; //最大行、最大列 public int hang, lie; //当前行、当前列 public int BianChang; //方块的边长 public int YanSe; //方块的颜色 //在画布上画方块 public void Hua(Bitmap bmp){ Canvas c=new Canvas(bmp); Rect rc=new Rect( lie * BianChang, hang * BianChang, (lie+1) * BianChang,(hang+1) * BianChang); Paint paint=new Paint(); paint.setColor(YanSe); paint.setStyle(Style.STROKE); //空心 paint.setStrokeWidth(2); //线宽 c.drawRect(rc, paint); } }
蛇类的代码设计
public class She{ private List<Kuai> k; //块的集合 private int fangXiang; //蛇的运动方向(上下左右) private int BianChang; //蛇的块的边长(所有块都一样大) //构造函数 public She(int hang,int lie,int fangxiang,int BianChang) { this.fangXiang = fangxiang; this.BianChang = BianChang; k = new LinkedList<Kuai>(); //产生存放块的集合 Kuai tou = new Kuai(); tou.hang = hang; tou.lie = lie; k.add(tou); //把蛇头加入到集合中 Kuai shen = new Kuai(); shen.hang = tou.hang; shen.lie = tou.lie + 1; k.add(shen); //把蛇身加入到集合中 } //画蛇 public void hua(Bitmap bmp){ //用黑色填充画布 Canvas c=new Canvas(bmp); c.drawColor(Color.BLACK); //k.size()是集合中块的数量 for (int i = 0; i < k.size(); i++) { k.get(i).BianChang = BianChang; //块的边长等于蛇的边长 k.get(i).YanSe = Color.WHITE; k.get(i).Hua(bmp); } } public void ZengZhang(){ Kuai kk = new Kuai(); Kuai k1 = k.get(k.size() - 1); //倒数第一个块(尾巴) Kuai k2 = k.get(k.size() - 2); //倒数第二个块 kk.hang = k1.hang + (k1.hang - k2.hang); kk.lie = k1.lie + (k1.lie - k2.lie); k.add(kk); } //前一个块的旧坐标,即后一个块的新坐标 public void YiDong() { //除蛇头之外的其它块 for (int i = k.size() - 1; i >= 1; i--){ k.get(i).hang = k.get(i-1).hang; k.get(i).lie = k.get(i-1).lie; } if (fangXiang == 1) //蛇头 k.get(0).hang--; else if (fangXiang == 2) k.get(0).hang++; else if (fangXiang == 3) k.get(0).lie--; else k.get(0).lie++; } public void GaiBianFangXiang(int fx){ if (fangXiang==2 && fx == 1) return; if (fangXiang==1 && fx == 2) return; if (fangXiang==3 && fx == 4) return; if (fangXiang==4 && fx == 3) return; fangXiang = fx; } }
GameView试图呈现代码设计
public class gameView extends View implements Runnable{ Bitmap bmp; Thread thread; public She s; public gameView(Context context) { super(context); bmp=Bitmap.createBitmap(600,400,Config.ARGB_8888); s=new She(30, 30, 3, 6); //启动线程 thread = new Thread(this); thread.start(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); s.YiDong(); s.hua(bmp); canvas.drawBitmap(bmp, 0, 0, null); } @Override public void run() { while (thread != null){ //实现界面刷新(调用onDraw) this.postInvalidate(); try{ Thread.sleep(300); } catch (InterruptedException e){ e.printStackTrace(); } } } }
实现蛇的游走
public class TCSActivity extends Activity implements OnClickListener { gameView game; //全局对象 /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); game=new gameView(this); setContentView(game); game.setOnClickListener(this); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch(keyCode){ case KeyEvent.KEYCODE_DPAD_UP: game.s.GaiBianFangXiang(1); return true; case KeyEvent.KEYCODE_DPAD_DOWN: game.s.GaiBianFangXiang(2); return true; case KeyEvent.KEYCODE_DPAD_LEFT: game.s.GaiBianFangXiang(3); return true; case KeyEvent.KEYCODE_DPAD_RIGHT: game.s.GaiBianFangXiang(4); return true; } return super.onKeyDown(keyCode, event); } @Override public void onClick(View v) { game.s.ZengZhang(); } }
感悟:
通过这个贪吃蛇,我发现有很多需要注意细节的地方,做程序需要细心和耐心,一一解决错误的关键所在。同时我也发现,有很多知识是相通的,在做C#的时候,我有深刻的体会。在最初设计思路的正确性非常重要,如果在平时做的时候解决了各种难题,这个也只是小菜一碟。我会继续完善蛇吃豆子的功能,还得别让蛇饿肚子。