迦瓦栈队 团队第三周项目总结

迦瓦栈队 团队第三周项目总结

本周,根据项目计划完成模块的设计代码

本项目主要是完成贪吃蛇游戏的基本操作。用户可以自己练习和娱乐。需要满足以下几点要求。

(1) 利用方向键来改变蛇的运行方向。

(2) 空格键暂停或继续游戏,并在随机的地方产生食物。

(3) 吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。
抽象出目标系统的逻辑模型,建立目标系统的逻辑模型,设计系统的用户界面。

本系统主要是完成贪吃蛇游戏的基本操作,所以在本游戏中应该实现以下功能。
 1. 响应键盘 
玩家可以从手机键盘或者触屏开始游戏,操控游戏,暂停游戏,结束游戏。
 2. 绘制游戏图形界面 
玩家开始游戏后,在手机屏幕上绘制出一条初始由几个节点组成小蛇。蛇能够在屏幕上移动,屏幕上随机位置出现食物,当蛇吃到食物后蛇的身体会增长一截同时移动速度也会响应加快。蛇不能向相反方向移动,例如蛇头朝南时则不能向北移动。当蛇头碰到墙壁或者碰到自己的身体时游戏结束。
 3. 记录玩家分数 
当游戏结束后,显示玩家在游戏中所获得的分数。

具体设计

1、Snake类的设计

  • Snake类是蛇头以及蛇头的控制部分,用于选取有效方向。判断蛇头是否和蛇身的某个节点的坐标重合,即蛇是否吃到自己。实现蛇身沿着蛇头的轨迹移动。根据方向键,改变蛇头的x、y的值,即改变方向。。
public void onCreate(Bundle savedInstanceState) {         
super.onCreate(savedInstanceState);         
 
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.snake_layout); 
        mSnakeView = (SnakeView) findViewById(R.id.snake); 
        mSnakeView.setTextView((TextView) findViewById(R.id.text));
        play = (Button)findViewById(R.id.play);
        play.setId(PLAY); 
        play.setOnClickListener(this); 
        play.setBackgroundColor(Color.argb(0, 0, 255, 0));
        left = (ImageButton)findViewById(R.id.left);
        left.setId(LEFT); 
        left.setOnClickListener(this); 
        left.setBackgroundColor(Color.argb(1, 1, 255, 1));
        left.setVisibility(View.GONE); 
        right = (ImageButton)findViewById(R.id.right);
        right.setId(RIGHT); 
        right.setOnClickListener(this); 
        right.setBackgroundColor(Color.argb(1, 1, 255, 1));
        right.setVisibility(View.GONE); 
        up = (ImageButton)findViewById(R.id.up);
        up.setId(UP); 
        up.setOnClickListener(this); 
        up.setBackgroundColor(Color.argb(1, 1, 255, 1));
        up.setVisibility(View.GONE); 
        down = (ImageButton)findViewById(R.id.down);
        down.setId(DOWN); 
        down.setOnClickListener(this); 
        down.setBackgroundColor(Color.argb(1, 1, 255, 1));
        down.setVisibility(View.GONE);
         if (savedInstanceState == null) { 
            // 重新建立游戏
             mSnakeView.setMode(mSnakeView.READY);
         } else { 
            // 正在恢复 
            Bundle map = savedInstanceState.getBundle(ICICLE_KEY);
             if (map != null) { 
                mSnakeView.restoreState(map);
             } else { 
                mSnakeView.setMode(SnakeView.PAUSE);
             }
         }   
        handler = new Handler()
         { 
          public void handleMessage(Message msg)

{ 
            switch (msg.what)
             {  
              case Snake.GUINOTIFIER:
              play.setVisibility(View.VISIBLE);
              left.setVisibility(View.GONE);
                 right.setVisibility(View.GONE);
                 up.setVisibility(View.GONE);
                 down.setVisibility(View.GONE);
                 break;
              }  
            super.handleMessage(msg);
            }
         }
     }

2、游戏的界限设计

  • 蛇头若触碰到界限则游戏结束。因为界限也需要被现实到屏幕上,所以TileView需要继承Android.view.View类。
    实现一个View,需要实现框架中一些所有Views公用的方法。
  protected void onSizeChanged(int w, int h, int oldw, int oldh) {
         mXTileCount = (int) Math.floor(w / mTileSize);
         mYTileCount = (int) Math.floor(h / mTileSize);
         mXOffset = ((w - (mTileSize * mXTileCount)) / 2);
         mYOffset = ((h - (mTileSize * mYTileCount)) / 2);
         mTileGrid = new int[mXTileCount][mYTileCount];
         clearTiles();
 }
  public void loadTile(int key, Drawable tile) {
          Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize,
          Bitmap.Config.ARGB_8888);
          Canvas canvas = new Canvas(bitmap); 
          tile.setBounds(0, 0, mTileSize, mTileSize);
          tile.draw(canvas);
          mTileArray[key] = bitmap;
     }
      public void clearTiles() {
          for (int x = 0; x < mXTileCount; x++) {
             for (int y = 0; y < mYTileCount; y++) {
                 setTile(0, x, y);
             }
         }
     }
      public void setTile(int tileindex, int x, int y) {
         mTileGrid[x][y] = tileindex;
     }
      public void onDraw(Canvas canvas) {
         super.onDraw(canvas);
          for (int x = 0; x < mXTileCount; x += 1) {
             for (int y = 0; y < mYTileCount; y += 1) {
                 if (mTileGrid[x][y] > 0) {
                      canvas.drawBitmap(mTileArray[mTileGrid[x][y]],
                        mXOffset + x * mTileSize,
                        mYOffset + y * mTileSize,
                        mPaint);
                  }
             }
         }
     }
 } 

代码托管截图

总结

本周按项目计划,完成了部分模块的代码设计。实现蛇的身体、实现蛇的移动、实现蛇吃食物。还没有完全实现最终程序,仍需进项代码实现和修改。另外,还需进行代码的测试。会好好利用时间,完成最终得游戏。

posted @ 2016-05-29 23:13  迦瓦栈队  阅读(262)  评论(0编辑  收藏  举报