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();
}
}}
}
Android游戏 贪吃蛇
最新推荐文章于 2025-08-14 19:04:22 发布