网络111 葛鹏
贪吃蛇又名贪食蛇,是一款经典的小游戏。玩家使用方向键操控一条长长的蛇不断吞下豆子,同时蛇身随着吞下的豆子不断变长,当蛇头撞到蛇身或障壁时游戏结束。贪吃蛇最初为人们所知的是诺基亚手机附带的一个小游戏,它伴随着诺基亚手机走向世界。现在的贪吃蛇出现了许多衍生版本,并被移植到各种平台上。但我今天所实现的功能是蛇的移动与增长。
知识点:
1.理解android应用的基本架构,面向对象的思想,以及代码的简洁明了。
2.了解整个程序的结构。
3.理解每一行代码的意思。
操作步骤:
1.首先创建一个类,类名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); } }
2.创建一个关于蛇的类,类名: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; } }
3.创建第三个类,类名:gameView
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(); } } } }
4.最后一步,在类TCSActivity中编写代码,实现功能,代码如下:
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); 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(); } }
5.运行程序,出现以下结果。
总结:
对于编写贪吃蛇这个程序,我还是费了不少力气,虽然老师有讲,也给了程序项目,但是重在理解,所以就不断的百度,问大神,最后才慢慢理解了,然后对着老师给的程序项目代码的注释,慢慢一点一点的理解,最后才算是真正的成功,收获也是很大的去哪,更重要的是练习,明显我练习的还不够,如果熟练的话,估计也就用30分钟就可以做完这个项目,但是我却整整用了2个小时,期间是因为蛇跑着跑着分叉了啊,或者是被一个白色的框子给框住了,或者蛇只能上下移动,等等,这些问题,还好最后对着老师原来给的项目,慢慢的调试好,但是,这就是效率问题,所以在今后编写的程序中一定要注意有所收获,而且要强加练习,不然效率还是上不去,好在这次我都理解了,不然效率没跟上,好多东西都没有理解,这才真正的说不过去。