Android游戏 贪吃蛇

Android游戏<wbr>贪吃蛇

package com.android.snack;
import android.app.Activity;
import android.os.Bundle;
public class MainSnack extends Activity {
   
    SnackView sv;
    public voidonCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       sv = new SnackView(this, null);
       setContentView(sv);
    }
}
package com.android.snack;
public class SnackBody {
private int SnackX;
private int SnackY;
public int getSnackX() {
return SnackX;
}
public void setSnackX(int snackX) {
SnackX = snackX;
}
public int getSnackY() {
return SnackY;
}
public void setSnackY(int snackY) {
SnackY = snackY;
}
}
package com.android.snack;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;
public class SnackView extends View {
public static final int MAP_SIZE=20;//地图宽
public static final int MAP_H = 30;//地图长
public static final int GAME_PRE = 1;//游戏准备状态
public static final int GAME_RUN =2;//游戏运行状态
public static final int GAME_END = 3;//游戏结束状态
    private intStartX;
    private intStartY;//游戏地图的开始的坐标
private int mGameState = GAME_RUN;//当前游戏状态
private Paint mPaint;
private int SnackWidth;//蛇身的大小
private int FoodX;
private int FoodY;
private int move = 1;
private boolean start = true;
Random r= new Random();
List<SnackBody> list =new ArrayList<SnackBody>();
public SnackView(Context context, AttributeSet attrs) {
super(context, attrs);
this.setFocusable(true);
this.setFocusableInTouchMode(true);
// TODO Auto-generated constructor stub
}
public void init(){
FoodX = r.nextInt(19);
FoodY = r.nextInt(29);
int x = r.nextInt(19);
int y = r.nextInt(29);
SnackBody snackBody = new SnackBody();
snackBody.setSnackX(x);
snackBody.setSnackY(y);
list.add(snackBody);
new Thread(new ThreadRunnable()).start();
}
protected void onSizeChanged(int W,int H, int oldW,intoldH){
if(W/MAP_SIZE<H/MAP_H)
SnackWidth = W/MAP_SIZE;
else 
SnackWidth = H/MAP_H;
StartX =(W-MAP_SIZE*SnackWidth)>>1;
StartY =(H-MAP_H*SnackWidth)>>1;
init();
}
public void onDraw(Canvas canvas){
canvas.drawColor(Color.GREEN);
//画地图边界
mPaint = new Paint();
mPaint.setStyle(Style.STROKE);
mPaint.setStrokeWidth(4);
mPaint.setColor(Color.BLACK);
canvas.drawRect(StartX, StartY, SnackWidth*MAP_SIZE+6,SnackWidth*MAP_H+6, mPaint);
  //画食物
mPaint.setStyle(Style.FILL);
mPaint.setColor(Color.GRAY);
canvas.drawRect(FoodX*SnackWidth+StartX,FoodY*SnackWidth+StartY,FoodX*SnackWidth+StartX+SnackWidth,FoodY*SnackWidth+StartY+SnackWidth,mPaint);
//画蛇身
mPaint.setStyle(Style.FILL);
mPaint.setColor(Color.YELLOW);
for(int i =0;i<list.size();i++){
int left = list.get(i).getSnackX()*SnackWidth+StartX;
int top  =list.get(i).getSnackY()*SnackWidth+StartY;
int right=list.get(i).getSnackX()*SnackWidth+StartX+SnackWidth;
int bottom =list.get(i).getSnackY()*SnackWidth+StartY+SnackWidth;
canvas.drawRect(left, top, right, bottom, mPaint);
}
}
public void eat(){
if(list.get(0).getSnackX()==FoodX&&list.get(0).getSnackY()==FoodY){
SnackBody snackBody = new SnackBody();
snackBody.setSnackX(list.get(list.size()-1).getSnackX());
snackBody.setSnackY(list.get(list.size()-1).getSnackY());
list.add(snackBody);
FoodX = r.nextInt(19);
FoodY = r.nextInt(29);
}
}
private void otherMove(){
SnackBody body = new SnackBody();
for(int i=0;i<list.size();i++){
if(i==1){
list.get(i).setSnackX(list.get(0).getSnackX());
list.get(i).setSnackY(list.get(0).getSnackY());
}else if(i>1){
body =list.get(i-1);
list.set(i-1, list.get(i));
list.set(i, body);
}
}
}
private void move(int x,int y){
if(dead(x,y)){
otherMove();
list.get(0).setSnackX(list.get(0).getSnackX()+x);
list.get(0).setSnackY(list.get(0).getSnackY()+y);
eat();}
else{
start = false;
}
}
    public booleanonKeyDown(int keyCode, KeyEvent event){
    if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){
    move(0,1);
    move =1;
    }
    if(keyCode ==KeyEvent.KEYCODE_DPAD_LEFT){
    move(-1,0);
    move =2;
    }
    if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){
    move(1,0);
    move =3;
    }
    if(keyCode==KeyEvent.KEYCODE_DPAD_UP){
    move(0,-1);
    move = 4;
    }
    this.invalidate();
return super.onKeyDown(keyCode, event);
   
    }
    public boolean dead(intx,int y){
   if((list.get(0).getSnackX()+x)<0||(list.get(0).getSnackX()+x)>18||
   (list.get(0).getSnackY()+y)<0||(list.get(0).getSnackY()+y)>29){
    return false;
    }
    return true;
    }
public class ThreadRunnable implements Runnable{
public void run() {
while(start){
try{
switch(move){
case 1:move(0,1);
     break;
case 2:move(-1,0);
      break;
case 3:move(1,0);
     break;
case 4:move(0,-1);
     break;
}
Thread.sleep(1000);
}catch(Exception e){
}
postInvalidate();
}
}}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值