当下所说的贪吃蛇是一种简单的,没有实现其食豆增长的功能。只是实现贪吃蛇运动的功能。
首先我们在Eclipse下新建项目TCS。然后我们就需要com.cqvie下新建几个类:gameview.java、
kuai.java、she.java。接下来就是代码的设计
首先是kuai.java
package com.cqvie;
import android.graphics.*;
import android.graphics.Paint.Style;
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);
}
}
然后she.java
package com.cqvie;
import java.util.LinkedList;
import java.util.List;
import android.graphics.*;
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.java
package com.cqvie;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Bitmap.Config;
import android.view.View;
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();
}
}
}
TCSActivity.java
package com.cqvie;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
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);
// setContentView(R.layout.main);
//
// LinearLayout layout=(LinearLayout) findViewById(
// R.id.layout_main);
// game=new gameView(this);
// game.setLayoutParams(new LayoutParams(
// LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
// layout.addView(game);
game=new gameView(this);
setContentView(game);
game.setOnClickListener(this);
// ImageView iv=(ImageView) findViewById(R.id.imageView1);
// Bitmap bmp=Bitmap.createBitmap(600, 400, Config.ARGB_8888);
// She s=new She(30, 20, 3, 12);
// s.ZengZhang();s.ZengZhang();s.ZengZhang();
// s.GaiBianFangXiang(1);
// s.YiDong();s.YiDong();s.YiDong();
// s.hua(bmp);
// iv.setImageBitmap(bmp);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch(keyCode)
{
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onClick(View v) {
game.s.ZengZhang();
}
}
代码的设计基本上相对来说比较简单,重复率很高。因此看上去代码量比较大。但在这个过程中我们主要需要考虑的还是如何是的蛇的头部和身体在移动工程中保持不断开,以及移动方向的设置、整个蛇身的设计。
我们将蛇的每一个部位设计成一个小的方块,然后蛇的每一个部位的移动都根据其上面一个方块的移动来确定移动方向,从而是整个蛇身的移动方向和舌头保持一致,达到不间断的效果。