迦瓦栈队 团队第三周项目总结
迦瓦栈队 团队第三周项目总结
本周,根据项目计划完成模块的设计代码
本项目主要是完成贪吃蛇游戏的基本操作。用户可以自己练习和娱乐。需要满足以下几点要求。
(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);
}
}
}
}
}
代码托管截图
总结
本周按项目计划,完成了部分模块的代码设计。实现蛇的身体、实现蛇的移动、实现蛇吃食物。还没有完全实现最终程序,仍需进项代码实现和修改。另外,还需进行代码的测试。会好好利用时间,完成最终得游戏。