Android贪吃蛇的设计

最近做了一个贪吃蛇的设计,分析思路:蛇是以每个小块组成的,并且可以游走,吃掉随机出现的的豆子,蛇的长度会增加一个块,如果蛇头touch到蛇身,本次游戏终止;撞墙本次游戏结束。根据以上思路,我主要做了以下4个类,分别是块的设计、蛇的设计、gameView类、贪吃蛇的游走。

贪吃蛇运行效果图:

 Android贪吃蛇的设计_第1张图片

 

块的代码设计

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);

      for (int i = 0; i < k.size(); i++) //k.size()是集合中块的数量

      {

        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#的时候,我有深刻的体会。在最初设计思路的正确性非常重要,如果在平时做的时候解决了各种难题,这个也只是小菜一碟。我会继续完善蛇吃豆子的功能,还得别让蛇饿肚子。

 

      

你可能感兴趣的:(Android贪吃蛇的设计)