java贪吃蛇大作战辅助程序程序死亡之后重新开始游戏怎么让他原来的程序关闭啊?

【贪吃蛇—Java程序员写Android游戏】系列&1.Android&SDK&Sample-Snake详解
SnakeNokiaAndroid SDK
1.5Android
SDK SampleSnakeSDK 2.3.3%Android_SDK_HOME%
/samples/android-10/Snake
&通过File-New
Project-Android-Android Project,选择“Create project from
existing sample”创建自己的应用SnakeAndroid,如下图:
运行效果如下图:
&其实Snake的工程蛮简单的,源文件就三个:Snake.java
SnakeView.java TileView.java。Snake类是这个游戏的入口点,TitleView类进行游戏的绘画,SnakeView类则是对游戏控制操作的处理。Coordinate,RefreshHandler是2个辅助类,也是SnakeView类中的内部类。其中,Coordinate是一个点的坐标(x,y),RefreshHandler将RefreshHandler对象绑定某个线程并给它发送消息。如下图:
SnakeRefreshHandlerHandlerRefreshHandlerHandleRefreshHandlerHandlersleep()handleMessage()方法在接受消息后,根据当前的游戏状态重绘界面,运行机制如下:
update()sleep()mRedrawHandleAvtivitysleep()update()sleep()
最后分析下游戏数据的保存机制,如下:
ActivityAndroid
1、Snake.java
package com.deaboway.
import android.app.A
import android.os.B
import android.widget.TextV
// 贪吃蛇: 经典游戏,在一个花园中找苹果吃,吃了苹果会变长,速度变快。碰到自己和墙就挂掉。
public class Snake extends Activity {
&& &private
SnakeView mSnakeV
&& &private
static String ICICLE_KEY = "snake-view";
activity 第一次创建时被调用
&@Override
&& &public void
onCreate(Bundle savedInstanceState) {
&super.onCreate(savedInstanceState);
&setContentView(R.layout.snake_layout);
&mSnakeView = (SnakeView)
findViewById(R.id.snake);
&mSnakeView.setTextView((TextView)
findViewById(R.id.text));
&// 检查存贮状态以确定是重新开始还是恢复状态
&if (savedInstanceState == null) {
&// 存储状态为空,说明刚启动可以切换到准备状态
&mSnakeView.setMode(SnakeView.READY);
&// 已经保存过,那么就去恢复原有状态
&Bundle map =
savedInstanceState.getBundle(ICICLE_KEY);
&if (map != null) {
&// 恢复状态
&mSnakeView.restoreState(map);
&// 设置状态为暂停
&mSnakeView.setMode(SnakeView.PAUSE);
暂停事件被触发时
&@Override
&& &protected
void onPause() {
&super.onPause();
&// Pause the game along with the activity
&mSnakeView.setMode(SnakeView.PAUSE);
&@Override
&& &public void
onSaveInstanceState(Bundle outState) {
&// 存储游戏状态到View里
&outState.putBundle(ICICLE_KEY,
mSnakeView.saveState());
2、SnakeView.java
package com.deaboway.
import java.util.ArrayL
import java.util.R
import android.content.C
import android.content.res.R
import android.os.H
import android.os.M
import android.util.AttributeS
import android.os.B
import android.util.L
import android.view.KeyE
import android.view.V
import android.widget.TextV
public class SnakeView extends TileView {
&& &private
static final String TAG = "Deaboway";
游戏状态,默认值是准备状态
&& &private int
mMode = READY;
&& &// 游戏的四个状态
暂停 准备 运行 和 失败
&& &public
static final int PAUSE = 0;
&& &public
static final int READY = 1;
&& &public
static final int RUNNING = 2;
&& &public
static final int LOSE = 3;
游戏中蛇的前进方向,默认值北方
&& &private int
mDirection = NORTH;
下一步的移动方向,默认值北方
&& &private int
mNextDirection = NORTH;
&& &// 游戏方向设定 北
&& &private
static final int NORTH = 1;
&& &private
static final int SOUTH = 2;
&& &private
static final int EAST = 3;
&& &private
static final int WEST = 4;
三种游戏元
&& &private
static final int RED_STAR = 1;
&& &private
static final int YELLOW_STAR = 2;
&& &private
static final int GREEN_STAR = 3;
&& &private long
mScore = 0;
&& &private long
mMoveDelay = 600;
最后一次移动时的毫秒时刻
&& &private long
显示游戏状态的文本组件
&& &private
TextView mStatusT
蛇身数组(数组以坐标对象为元素)
&& &private
ArrayList&Coordinate& mSnakeTrail =
new ArrayList&Coordinate&();
苹果数组(数组以坐标对象为元素)
&& &private
ArrayList&Coordinate& mAppleList =
new ArrayList&Coordinate&();
&& &// 随机数
&& &private
static final Random RNG = new Random();
创建一个Refresh Handler来产生动画: 通过sleep()来实现
&& &private
RefreshHandler mRedrawHandler = new RefreshHandler();
一个Handler
RefreshHandler extends Handler {
&// 处理消息队列
&@Override
&public void handleMessage(Message msg) {
&// 更新View对象
&SnakeView.this.update();
&// 强制重绘
&SnakeView.this.invalidate();
&// 延迟发送消息
&public void sleep(long delayMillis) {
&this.removeMessages(0);
&sendMessageDelayed(obtainMessage(0),
delayMillis);
&& &public
SnakeView(Context context, AttributeSet attrs) {
&super(context, attrs);
&// 构造时初始化
&initSnakeView();
&& &public
SnakeView(Context context, AttributeSet attrs, int defStyle)
&super(context, attrs, defStyle);
&initSnakeView();
&& &// 初始化
&& &private void
initSnakeView() {
&// 可选焦点
&setFocusable(true);
&Resources r =
this.getContext().getResources();
&// 设置贴片图片数组
&resetTiles(4);
&// 把三种图片存到Bitmap对象数组
&loadTile(RED_STAR,
r.getDrawable(R.drawable.redstar));
&loadTile(YELLOW_STAR,
r.getDrawable(R.drawable.yellowstar));
&loadTile(GREEN_STAR,
r.getDrawable(R.drawable.greenstar));
开始新的游戏——初始化
&& &private void
initNewGame() {
&// 清空ArrayList列表
&mSnakeTrail.clear();
&mAppleList.clear();
&// For now we're just going to load up a short
default eastbound snake
&// that's just turned north
&// 创建蛇身
&mSnakeTrail.add(new Coordinate(7, 7));
&mSnakeTrail.add(new Coordinate(6, 7));
&mSnakeTrail.add(new Coordinate(5, 7));
&mSnakeTrail.add(new Coordinate(4, 7));
&mSnakeTrail.add(new Coordinate(3, 7));
&mSnakeTrail.add(new Coordinate(2, 7));
&// 新的方向 :北方
&mNextDirection = NORTH;
&// 2个随机位置的苹果
&addRandomApple();
&addRandomApple();
&// 移动延迟
&mMoveDelay = 600;
&// 初始得分0
&mScore = 0;
3、TileView.java
package com.deaboway.
import android.content.C
import android.content.res.TypedA
import android.graphics.B
import android.graphics.C
import android.graphics.P
import android.graphics.drawable.D
import android.util.AttributeS
import android.view.V
// View 变种,用来处理 一组 贴片—— “icons”或其它可绘制的对象
public class TileView extends View {
&& &protected
static int mTileS
X轴的贴片数量
&& &protected
static int mXTileC
Y轴的贴片数量
&& &protected
static int mYTileC
&& &private
static int mXO
&& &private
static int mYO
贴片图像的图像数组
&& &private
Bitmap[] mTileA
保存每个贴片的索引——二维数组
&& &private
int[][] mTileG
Paint对象(画笔、颜料)
&& &private
final Paint mPaint = new Paint();
&& &public
TileView(Context context, AttributeSet attrs, int defStyle) {
&super(context, attrs, defStyle);
&TypedArray a =
context.obtainStyledAttributes(attrs,
&R.styleable.TileView);
&mTileSize =
a.getInt(R.styleable.TileView_tileSize, 12);
&a.recycle();
&& &public
TileView(Context context, AttributeSet attrs) {
&super(context, attrs);
&TypedArray a =
context.obtainStyledAttributes(attrs,
&R.styleable.TileView);
&mTileSize =
a.getInt(R.styleable.TileView_tileSize, 12);
&a.recycle();
设置贴片图片数组
&& &public void
resetTiles(int tilecount) {
&mTileArray = new Bitmap[tilecount];
回调:当该View的尺寸改变时调用,在onDraw()方法调用之前就会被调用,所以用来设置一些变量的初始值
在视图大小改变的时候调用,比如说手机由垂直旋转为水平
&@Override
&& &protected
void onSizeChanged(int w, int h, int oldw, int oldh) {
&// 定义X轴贴片数量
&mXTileCount = (int) Math.floor(w /
mTileSize);
&mYTileCount = (int) Math.floor(h /
mTileSize);
&// X轴偏移量
&mXOffset = ((w - (mTileSize * mXTileCount)) /
&// Y轴偏移量
&mYOffset = ((h - (mTileSize * mYTileCount)) /
&// 定义贴片的二维数组
&mTileGrid = new
int[mXTileCount][mYTileCount];
&// 清空所有贴片
&clearTiles();
给mTileArray这个Bitmap图片数组设置值
&& &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);
&// 把一个drawable转成一个Bitmap
&tile.draw(canvas);
&// 在数组里存入该Bitmap
&mTileArray[key] =
清空所有贴片
&& &public void
clearTiles() {
&for (int x = 0; x & mXTileC
&for (int y = 0; y & mYTileC
&// 全部设置为0
&setTile(0, x, y);
给某个贴片位置设置一个状态索引
&& &public void
setTile(int tileindex, int x, int y) {
&mTileGrid[x][y] =
&& &// onDraw
在视图需要重画的时候调用,比如说使用invalidate刷新界面上的某个矩形区域
&@Override
&& &public void
onDraw(Canvas canvas) {
&super.onDraw(canvas);
&for (int x = 0; x & mXTileC x
&for (int y = 0; y & mYTileC y
&// 当索引大于零,也就是不空时
&if (mTileGrid[x][y] & 0) {
&// mTileGrid中不为零时画此贴片
&canvas.drawBitmap(mTileArray[mTileGrid[x][y]],
mXOffset + x
&* mTileSize, mYOffset + y * mTileSize,
&Android SDK
SampleSnakeJ2MEAndroidJ2MEJ2MEAndroid
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。java编写贪吃蛇小游戏
投稿:hebedich
字体:[ ] 类型:转载 时间:
贪吃蛇是经典手机游戏,既简单又耐玩。通过控制蛇头方向吃蛋,使得蛇变长,从而获得积分。今天我们就来用java来实现下贪吃蛇小游戏,有需要的小伙伴可以参考下
废话不多说,直接奉上代码:
Frame.java
import java.awt.G
import java.awt.M
import java.awt.MenuB
import java.awt.MenuI
import java.awt.event.ActionE
import java.awt.event.ActionL
import java.awt.event.KeyE
import java.awt.event.KeyL
import javax.swing.JF
public class Frame extends JFrame implements KeyListener {
Boolean isA
Boolean isP
private static final long serialVersionUID = 1L;
public Frame(){
// TODO Auto-generated constructor stub
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,300);
addKeyListener(this);
panel = new Panel();
add(panel);
setVisible(true);
direction = new Character('d');
MenuBar menuBar = new MenuBar();
Menu menu = new Menu("menu");
MenuItem reset = new MenuItem("newgame");
MenuItem pause= new MenuItem("pause");
pause.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(!isPause) isPause=
reset.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
menu.add(reset);
menu.add(pause);
menuBar.add(menu);
setMenuBar(menuBar);
public void reset(){
panel.reset();
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_UP)
direction = 'w';
if(e.getKeyCode()==KeyEvent.VK_DOWN) direction = 's';
if(e.getKeyCode()==KeyEvent.VK_LEFT) direction = 'a';
if(e.getKeyCode()==KeyEvent.VK_RIGHT) direction = 'd';
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
public void paint(Graphics g){
panel.repaint();
Launch.java
import java.util.T
import java.util.TimerT
public class Launch extends TimerTask {
Frame frame = new Frame();
public Launch() {
// TODO Auto-generated constructor stub
boolean crashWall(){
SnakeBody sb = frame.panel.snake.getFirst();
if((sb.x&0)||(sb.y&0)||(sb.x&=Panel.LINE)||(sb.y&=Panel.LINE))
void initial(){
frame.panel.snake.add(newBody());
frame.panel.food = newBody();
public void run() {
// TODO Auto-generated method stub
if(frame.panel.snake.isEmpty())
initial();
if(frame.isAlive)
if(!frame.isPause){
if(goStraight())
frame.isAlive =
frame.repaint();
if(crashWall()) frame.isAlive =
SnakeBody newBody(){
SnakeBody sb = new SnakeBody();
boolean overlap =
while(overlap){
sb.x = (int) (Math.random()*(Panel.LINE-2)+1);
sb.y = (int) (Math.random()*(Panel.LINE-2)+1);
if(!frame.panel.snake.isEmpty())
for(SnakeBody s : frame.panel.snake)
if(sb.equals(s))
void eat(SnakeBody sb){
frame.panel.snake.addFirst(sb);
boolean goStraight(){
boolean result =
SnakeBody sb =new SnakeBody(frame.panel.snake.getFirst());
frame.panel.snake.removeLast();
if(frame.direction=='w')
sb.turnUp();
if(frame.direction=='s')
sb.turnDown();
if(frame.direction=='a')
sb.turnLeft();
if(frame.direction=='d')
sb.turnRight();
for(SnakeBody s : frame.panel.snake){
if(sb.equals(s)) result =
frame.panel.snake.addFirst(sb);
if(sb.equals(frame.panel.food)){
if(frame.direction=='w')
frame.panel.food.turnUp();
if(frame.direction=='s')
frame.panel.food.turnDown();
if(frame.direction=='a')
frame.panel.food.turnLeft();
if(frame.direction=='d')
frame.panel.food.turnRight();
eat(frame.panel.food);
frame.panel.food = newBody();
public static void main(String[] args){
// TODO Auto-generated method stub
Launch timertask = new Launch();
Timer timer = new Timer();
timer.schedule(timertask,0,500);
Panel.java
import java.awt.C
import java.awt.G
import java.util.LinkedL
import javax.swing.JP
public class Panel extends JPanel {
private static final long serialVersionUID = 1L;
public LinkedList&SnakeBody& snake = new LinkedList&SnakeBody&();
static final int LINE = 10;
SnakeBody food = new SnakeBody(-99,-99);
public Panel() {
// TODO Auto-generated constructor stub
public void reset(){
snake.clear();
public void paint(Graphics g){
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
for(SnakeBody sb : snake){
g.setColor(Color.black);
g.drawRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
g.setColor(Color.orange);
g.fillRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
g.setColor(Color.red);
g.fillRect(food.x*getWidth()/LINE,food.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
SnakeBody.java
class SnakeBody {
public SnakeBody() {
// TODO Auto-generated constructor stub
public SnakeBody(int a,int b){
public SnakeBody(SnakeBody sb){
this(sb.x,sb.y);
public void turnUp(){
public void turnDown(){
public void turnLeft(){
public void turnRight(){
boolean equals(SnakeBody s){
if((x==s.x)&&(y==s.y))
以上所述就是本文给大家分享的贪吃蛇的全部代码了,希望能够对大家熟练掌握java有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 scratch贪吃蛇的程序 的文章

 

随机推荐