贪吃蛇是一个非常古老的游戏,他的算法不难但也算不上很简单,这里呢我做了一个不完整的贪吃蛇的游戏。设计的思路是这样的:由于蛇是由一块一块的小方块组成的,所以我们首先要设计一个(块)类,接下来呢我们就要设计蛇出生的状态也就是一个蛇头和一个蛇身相连的状态即(蛇)类,然后我们就应该设计一个(gameView)类用于呈现这条蛇。效果就是按键盘上的上下左右键时,蛇会根据所按的箭头改变方向。当鼠标单击的时候,这个蛇就会长长一节。具体实现步骤如下:
1.块类的实现
1 package com.cqvie;
2
3 import android.graphics.*;
4 import android.graphics.Paint.Style;
5
6 public class Kuai
7 {
8 //public int HANG, LIE; //最大行、最大列
9 public int hang, lie; //当前行、当前列
10 public int BianChang; //方块的边长
11 public int YanSe; //方块的颜色
12 public void Hua(Bitmap bmp) //在画布上画方块
13 {
14 Canvas c=new Canvas(bmp);
15 Rect rc=new Rect(
16 lie * BianChang, hang * BianChang,
17 (lie+1) * BianChang,(hang+1) * BianChang);
18 Paint paint=new Paint();
19 paint.setColor(YanSe);
20 paint.setStyle(Style.STROKE); //空心
21 paint.setStrokeWidth(2); //线宽
22
23 c.drawRect(rc, paint);
24 }
25 }
Kuai.java
2. 蛇类的实现
1 package com.cqvie;
2
3 import java.util.LinkedList;
4 import java.util.List;
5 import android.graphics.*;
6
7 public class She
8 {
9 private List<Kuai> k; //块的集合
10 private int fangXiang; //蛇的运动方向(上下左右)
11 private int BianChang; //蛇的块的边长(所有块都一样大)
12 public She(int hang,int lie,int fangxiang,int BianChang) //构造函数
13 {
14 this.fangXiang = fangxiang;
15 this.BianChang = BianChang;
16 k = new LinkedList<Kuai>(); //产生存放块的集合
17 Kuai tou = new Kuai();
18 tou.hang = hang;
19 tou.lie = lie;
20 k.add(tou); //把蛇头加入到集合中
21 Kuai shen = new Kuai();
22 shen.hang = tou.hang;
23 shen.lie = tou.lie + 1;
24 k.add(shen); //把蛇身加入到集合中
25 }
26 public void hua(Bitmap bmp) //画蛇
27 {
28 //用黑色填充画布
29 Canvas c=new Canvas(bmp);
30 c.drawColor(Color.BLACK);
31 for (int i = 0; i < k.size(); i++) //k.size()是集合中块的数量
32 {
33 k.get(i).BianChang = BianChang; //块的边长等于蛇的边长
34 k.get(i).YanSe = Color.WHITE;
35 k.get(i).Hua(bmp);
36 }
37 }
38 public void ZengZhang()
39 {
40 Kuai kk = new Kuai();
41 Kuai k1 = k.get(k.size() - 1); //倒数第一个块(尾巴)
42 Kuai k2 = k.get(k.size() - 2); //倒数第二个块
43 kk.hang = k1.hang + (k1.hang - k2.hang);
44 kk.lie = k1.lie + (k1.lie - k2.lie);
45 k.add(kk);
46 }
47 public void YiDong() //前一个块的旧坐标,即后一个块的新坐标
48 {
49 for (int i = k.size() - 1; i >= 1; i--) //除蛇头之外的其它块
50 {
51 k.get(i).hang = k.get(i-1).hang;
52 k.get(i).lie = k.get(i-1).lie;
53 }
54 if (fangXiang == 1) //蛇头
55 k.get(0).hang--;
56 else if (fangXiang == 2)
57 k.get(0).hang++;
58 else if (fangXiang == 3)
59 k.get(0).lie--;
60 else
61 k.get(0).lie++;
62 }
63 public void GaiBianFangXiang(int fx)
64 {
65 if (fangXiang==2 && fx == 1)
66 return;
67 if (fangXiang==1 && fx == 2)
68 return;
69 if (fangXiang==3 && fx == 4)
70 return;
71 if (fangXiang==4 && fx == 3)
72 return;
73 fangXiang = fx;
74 }
75 }
She.java
3.gameView类的实现
1 package com.cqvie;
2
3 import android.content.Context;
4 import android.graphics.Bitmap;
5 import android.graphics.Canvas;
6 import android.graphics.Bitmap.Config;
7 import android.view.View;
8
9 public class gameView extends View implements Runnable
10 {
11 Bitmap bmp;
12 Thread thread;
13 public She s;
14 public gameView(Context context) {
15 super(context);
16 bmp=Bitmap.createBitmap(600,400,Config.ARGB_8888);
17 s=new She(30, 30, 3, 6);
18 //启动线程
19 thread = new Thread(this);
20 thread.start();
21 }
22 @Override
23 protected void onDraw(Canvas canvas) {
24 super.onDraw(canvas);
25 s.YiDong();
26 s.hua(bmp);
27 canvas.drawBitmap(bmp, 0, 0, null);
28 }
29 @Override
30 public void run() {
31 while (thread != null)
32 {
33 //实现界面刷新(调用onDraw)
34 this.postInvalidate();
35 try
36 {
37 Thread.sleep(300);
38 } catch (InterruptedException e)
39 {
40 e.printStackTrace();
41 }
42 }
43 }
44 }
gamaeView.java
4. 贪吃蛇的实现
1 package com.cqvie;
2 import android.app.Activity;
3 import android.graphics.Bitmap;
4 import android.graphics.Bitmap.Config;
5 import android.os.Bundle;
6 import android.view.KeyEvent;
7 import android.view.View;
8 import android.view.View.OnClickListener;
9 import android.view.ViewGroup.LayoutParams;
10 import android.widget.Button;
11 import android.widget.ImageView;
12 import android.widget.LinearLayout;
13
14 public class TCSActivity extends Activity implements OnClickListener {
15
16 gameView game; //全局对象
17 /** Called when the activity is first created. */
18 @Override
19 public void onCreate(Bundle savedInstanceState) {
20 super.onCreate(savedInstanceState);
21
22 game=new gameView(this);
23 setContentView(game);
24 game.setOnClickListener(this);
25 }
26 @Override
27 public boolean onKeyDown(int keyCode, KeyEvent event) {
28 switch(keyCode)
29 {
30 case KeyEvent.KEYCODE_DPAD_UP:
31 game.s.GaiBianFangXiang(1);
32 return true;
33 case KeyEvent.KEYCODE_DPAD_DOWN:
34 game.s.GaiBianFangXiang(2);
35 return true;
36 case KeyEvent.KEYCODE_DPAD_LEFT:
37 game.s.GaiBianFangXiang(3);
38 return true;
39 case KeyEvent.KEYCODE_DPAD_RIGHT:
40 game.s.GaiBianFangXiang(4);
41 return true;
42 }
43 return super.onKeyDown(keyCode, event);
44 }
45 @Override
46 public void onClick(View v) {
47 game.s.ZengZhang();
48 }
49 }
TCSActivity.Java 5.贪吃蛇结果展示
贪吃蛇效果图
总结
在做这个贪吃蛇的时候,我遇到了很多问题。比如说,开始刚写完了自己就信心满满的开始运行,结果一个漆黑的屏幕什么都没有,后来经过调试终于出来了一条小蛇。然而这个条蛇它又不动,经过努力它终于走起来了,可走走它就断开了。上一篇我不是说到要勇敢的面对问题吗,其实那些问题都不难。经过这次做这个贪吃蛇的小游戏,让我发现了就算遇到的问题再多,只要我们一个一个的解决,问题总会被我们打败的。