Android实现贪吃蛇游戏
【绥江一百】http://www.sj100.net 欢迎,进入绥江一百感谢点击[我的小网站,请大家多多指教相互共勉]
贪吃蛇是一个非常古老的游戏,他的算法不难但也算不上很简单,这里呢我做了一个不完整的贪吃蛇的游戏。设计的思路是这样的:由于蛇是由一块一块的小方块组成的,所以我们首先要设计一个(块)类,接下来呢我们就要设计蛇出生的状态也就是一个蛇头和一个蛇身相连的状态即(蛇)类,然后我们就应该设计一个(gameView)类用于呈现这条蛇。效果就是按键盘上的上下左右键时,蛇会根据所按的箭头改变方向。当鼠标单击的时候,这个蛇就会长长一节。具体实现步骤如下:
1.块类的实现
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);
}
}
Kuai.java
2. 蛇类的实现
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;
}
}
She.java
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();
}
}
}
}
gamaeView.java
4. 贪吃蛇的实现
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); 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();
}
}
TCSActivity.Java
5.贪吃蛇结果展示
贪吃蛇效果图
总结
在做这个贪吃蛇的时候,我遇到了很多问题。比如说,开始刚写完了自己就信心满满的开始运行,结果一个漆黑的屏幕什么都没有,后来经过调试终于出来了一条小蛇。然而这个条蛇它又不动,经过努力它终于走起来了,可走走它就断开了。上一篇我不是说到要勇敢的面对问题吗,其实那些问题都不难。经过这次做这个贪吃蛇的小游戏,让我发现了就算遇到的问题再多,只要我们一个一个的解决,问题总会被我们打败的。
Android实现贪吃蛇游戏的更多相关文章
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- Android快乐贪吃蛇游戏实战项目开发教程-02虚拟方向键(一)自定义控件概述
该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.自定义控件简介 在本项目中,无论是游戏主区域还是虚拟方向键都是通过自定义控件 ...
- Android快乐贪吃蛇游戏实战项目开发教程-06虚拟方向键(五)绘制方向键箭头
本系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html本系列教程项目源码GitHub地址:https://github.com/jack ...
- Android快乐贪吃蛇游戏实战项目开发教程-05虚拟方向键(四)四个三角形按钮
该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.如何判断点击的是哪个方向键按钮 在上篇教程中我们实现了左边的三角形按钮效果, ...
- Android快乐贪吃蛇游戏实战项目开发教程-04虚拟方向键(三)三角形按钮效果
该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.知识点讲解 当我们点击系统自带的按钮时,按钮的外观会发生变化.上篇博文中我们 ...
- Android快乐贪吃蛇游戏实战项目开发教程-03虚拟方向键(二)绘制一个三角形
该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.绘制三角形 在上一篇文章中,我们已经新建了虚拟方向键的自定义控件Direct ...
- 用C++实现的贪吃蛇游戏
我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...
- WebGL实现HTML5的3D贪吃蛇游戏
js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...
- 100行JS实现HTML5的3D贪吃蛇游戏
js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...
随机推荐
- Webstorm2016激活码[ 转]
转至:http://blog.csdn.net/tingwode2014_/article/details/51063657 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QT ...
- Oracle DataGuard 物理Standby 搭建(下)
主备库切换 Switchover 一般SWITCHOVER切换都是计划中的切换,特点是在切换后,不会丢失任何的数据,而且这个过程是可逆的,整个DATA GUARD环境不会被破坏,原来DATA GUAR ...
- 配置文件struts2Struts2配置文件模块化包含(include)与action总结
本文是一篇关于配置文件struts2的帖子 <include>标签 当Struts配置文件比较多,需要模块化分别或分开成为多个配置文件时,这个功能比较好. 则需要使用<include ...
- 【M4】非必要不提供default 构造方法
1.default 构造方法意味着,没有外来信息的情况下,进行初始化,构造出一个对象.对于有些对象是很合理的,比如数值之类的对象,可以初始化为0:对于指针之类的对象,初始化为null:对于集合如vec ...
- BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树
2588: Spoj 10628. Count on a tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/J ...
- pjsip视频通信开发(上层应用)之拨号界面整体界面功能实现
在前面的几章里面写了显示.键盘.拨号.删除功能,这里我将他们进行组合,形成一个拨号键盘全部功能.首先是布局 <LinearLayout xmlns:android="http://sc ...
- key 限制字符的输入
//限制字符的输入 { 只能输入以下字符 } procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);begin If (Key ...
- cookie转CookieCollection
CookieCollection cookiesResponse = new CookieCollection(); if (response != null) { foreach (string c ...
- HDU-3790-最短路径
题目要求先选最短的道路,如果没有最短路可选,即几条道路都相等,再考花费.用Dijkstra更快一些.在选出最短边的同时加上对应的花费就可以了.详细请看代码: #include<iostream& ...
- 如何将一个 ASP.NET MVC 4 和 Web API 项目升级到 ASP.NET MVC 5 和 Web API 2
----转自微软官网www.asp.net/mvc/ ASP.NET MVC 5 和 Web API 2 带来的新功能,包括属性路由. 身份验证筛选器,以及更多的主机.请参阅http://www.as ...