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

          

  • 相关阅读:
    Scrapy的安装和基本使用方法
    使用BERT词向量
    主动学习方法实践:让模型变“主动”
    WSAI2020
    mac电脑的图片存储的位置
    问答系统-不能直接根据问题寻找答案?
    谷歌飞马PEGASUS
    通过强化学习协作多代理对话模型训练
    学习笔记(55)- 深度学习工具及平台
    学习笔记(54)- NLU
  • 原文地址:https://www.cnblogs.com/dzyBlog/p/3160407.html
Copyright © 2011-2022 走看看