Android贪吃蛇的设计

最近做了一个贪吃蛇的设计,分析思路:蛇是以每个小块组成的,并且可以游走,吃掉随机出现的的豆子,蛇的长度会增加一个块,如果蛇头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#的时候,我有深刻的体会。在最初设计思路的正确性非常重要,如果在平时做的时候解决了各种难题,这个也只是小菜一碟。我会继续完善蛇吃豆子的功能,还得别让蛇饿肚子。

      

原文地址:https://www.cnblogs.com/dzyBlog/p/3160407.html