public class body {
public int ax;//代表X周變量
public int ay;//代表Y軸變量
public int getAx() {
return ax;
}
public void setAx(int ax) {
this.ax = ax;
}
public int getAy() {
return ay;
}
public void setAy(int ay) {
this.ay = ay;
}
public body(int a, int b){//構造函數
this.ax = a;
this.ay = b;
}
}
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
public class GetStone {//獲取圖片
public static Bitmap createBitmap(Context context,int resId){
Bitmap map = BitmapFactory.decodeResource(context.getResources(),resId);
return map;
}
}
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity {
private rungame game;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉標題欄
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏顯示
super.onCreate(savedInstanceState);
int width =getWindowManager().getDefaultDisplay().getWidth();//獲得屏幕寬度
int height = getWindowManager().getDefaultDisplay().getHeight();//獲得屏幕高度
game = new rungame(this,width,height);
setContentView(game);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
import java.util.ArrayList;
import java.util.Random;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
import android.view.View;
import android.view.View.OnTouchListener;
public class rungame extends SurfaceView implements Callback,OnTouchListener{
private Context context;
private SurfaceHolder holder;
private int screenw;//傳遞屏幕寬度
private int screenh;//傳遞屏幕高度
private static int HH = 0;//獲得磚塊的高度,設置爲全局變量
private static int WW = 0;//獲得磚塊的寬度,設置爲全局變量
// private static int [][] bodystart = {{3,8},{3,7},{3,6},{3,5}};//貪喫蛇初始化出現的位置
private static ArrayList<body> snakeBodies = new ArrayList<body>();//LIST數組的蛇身位置
private static ArrayList<body> star = new ArrayList<body>();//LIST數組的星星位置
private static final int UP = 1;//移動方向向上
private static final int DOWN = 2;//移動方向向下
private static final int LEFT = 3;//移動方向向左
private static final int RIGHT = 4;//移動方向向右
private static int DirectionMove;//當前移動方向,並初始化爲向下
private static int NextDirectionMove=DOWN;//當前移動方向,並初始化爲向下
private static long StayTime = 600;//繪製停留時間,初始化爲600毫秒
private static int Score = 0;//分數,默認爲0
public rungame(Context context,int screenwidth,int screenheight) {
super(context);
this.context = context;
this.screenh = screenheight;
this.screenw = screenwidth;
holder = this.getHolder();
holder.addCallback(this);
setOnTouchListener(this);
getWH();//初始化,取得磚塊的長寬(遊戲以磚牆的長寬爲基礎)
setArrayList();//初始化蛇身的位置
setstar();//初始化星星的位置
}
private void draw(){//繪製初始化
Canvas canvas = holder.lockCanvas();
drawwall(canvas);//繪製牆壁
drawstar(canvas);//繪製星星
drawsnake(canvas);//繪製蛇身
holder.unlockCanvasAndPost(canvas);
}
public void drawstar(Canvas canvas){//隨即繪製兩個個星星
super.onDraw(canvas);
// Canvas canvas = holder.lockCanvas();
Bitmap mapstar =GetStone.createBitmap(context, R.drawable.star);
// canvas.drawBitmap(mapstar, star.get(0).ax*WW, star.get(0).ay*HH,null);
// canvas.drawBitmap(mapstar, star.get(1).ax*WW, star.get(1).ay*HH,null);
for(int i=0;i<star.size();i++ ){//畫出星星
int px = star.get(i).ax;
int py = star.get(i).ay;
canvas.drawBitmap(mapstar, px*WW, py*HH, null);
}
// holder.unlockCanvasAndPost(canvas);
}
private ArrayList<body> setstar(){
int [][] yes1 = randompoint();
int [][] yes2 = randompoint();
Log.i("FFF", "star的座標:"+yes1[0][0]+" "+yes1[0][1]);
Log.i("FFF", "star的座標:"+yes2[0][0]+" "+yes2[0][1]);
body boss1 = new body(yes1[0][0], yes1[0][1]);
body boss2 = new body(yes2[0][0], yes2[0][1]);
star.add(boss1);
star.add(boss2);
Log.i("FFF", "star的長度:"+star.size());
return star;
}
public int[][] randompoint(){//在空白處隨機產生一個數組,用於產生星星的位置
Random random = new Random();
int b,d;
int a = screenh/HH;
int c = screenw/WW;
ArrayList<body> bossBody = new ArrayList<body>();
do{
d = random.nextInt(c-2)+1;
b = random.nextInt(a-2)+1;
body booss = new body(d, b);
bossBody.add(booss);
}
while(snakeBodies.equals(bossBody));//最初的位置不能跟蛇身的位置重合
int [][] arraystar = {{d,b}};
Log.i("Width", "寬度格數"+c);
Log.i("Height", "高度格數"+a);
return arraystar;
}
public ArrayList<body> setArrayList(){//蛇身的位置
body bos1 = new body(1,8);
body bos2 = new body(1,7);
body bos3 = new body(1,6);
body bos4 = new body(1,5);
snakeBodies.add(bos1);
snakeBodies.add(bos2);
snakeBodies.add(bos3);
snakeBodies.add(bos4);
return snakeBodies;
}
public void drawsnake(Canvas canvas){//初始化一條蛇,由數組控制蛇的樣子
int movex,movey;
super.onDraw(canvas);
DirectionMove=NextDirectionMove;//將變初始向設置爲變更方向
switch (DirectionMove) {
case UP:
movex = 0;
movey = -1;
break;
case DOWN:
movex = 0;
movey = 1;
break;
case LEFT:
movex = -1;
movey = 0;
break;
default:
movex = 1;
movey = 0;
break;
}
Bitmap mapbody = GetStone.createBitmap(context, R.drawable.body);
body mms = new body(snakeBodies.get(0).ax, snakeBodies.get(0).ay);//獲得蛇頭的座標
mms.ax+=movex;//蛇頭下一步X軸的座標
mms.ay+=movey;//蛇頭下一步Y軸的座標
Log.i("SHOWmovex", " "+movex);
Log.i("SHOWmovex", " "+movey);
Log.i("添加前snakeBodiesSIZE", " "+snakeBodies.size());
snakeBodies.add(0,mms);//將該蛇頭下一步的座標插入蛇頭的位置,後面蛇身的位置向後移動
Log.i("添加後snakeBodiesSIZE", " "+snakeBodies.size());
if(!eatcheck()){
snakeBodies.remove(snakeBodies.size()-1);//刪除蛇的最後
}
for(int i=0;i<snakeBodies.size();i++ ){//畫出蛇身
int px = snakeBodies.get(i).ax;
int py = snakeBodies.get(i).ay;
canvas.drawBitmap(mapbody, px*WW, py*HH, null);
}
Log.i("EVEPOINT", "每次蛇頭的座標"+snakeBodies.get(0).ax+" "+snakeBodies.get(0).ay);
try {
Thread.sleep(StayTime);
} catch (Exception e) {
// TODO: handle exception
}
}
private void getWH(){
Bitmap mapcrack =GetStone.createBitmap(context, R.drawable.crack);
WW = mapcrack.getWidth();
HH = mapcrack.getHeight();
}
public void drawwall(Canvas canvas){//繪製牆壁
super.onDraw(canvas);
// Canvas canvas = holder.lockCanvas();
Bitmap mapcrack =GetStone.createBitmap(context, R.drawable.crack);
// WW = mapcrack.getWidth();
// HH = mapcrack.getHeight();
int ssh = screenh/HH;
int ssw = screenw/WW;
canvas.drawColor(Color.WHITE);
for(int i=0;i<=ssh*HH;i+=HH){//繪製牆壁左邊
canvas.drawBitmap(mapcrack, 0, i,null);
}
for(int i=0;i<=ssh*HH;i+=HH){//繪製牆壁右邊
canvas.drawBitmap(mapcrack, (ssw-1)*WW, i,null);//這裏有一點問題
}
for(int i=WW;i<=ssw*WW-WW;i+=WW){//繪製牆壁上邊
canvas.drawBitmap(mapcrack, i, 0,null);
}
for(int i=WW;i<=ssw*WW-WW;i+=WW){//繪製牆壁下邊
canvas.drawBitmap(mapcrack, i, ssh*HH,null);
}
// holder.unlockCanvasAndPost(canvas);
}
public void drawScore(){//繪製分數
Canvas canvas = holder.lockCanvas();
// canvas.drawColor(Color.WHITE);//註釋掉後會直接繪製到遊戲界面上
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setTextSize(30);
canvas.drawText("總分數:"+Score, screenw/3,screenh/2, paint);//確定繪製分數位置
holder.unlockCanvasAndPost(canvas);
}
class moveThread implements Runnable{//創建線程
@Override
public void run() {
while(runinto()){
draw();
}
drawScore();
}
}
public boolean runinto(){//碰撞檢測
if(snakeBodies.get(0).ax == 0 || snakeBodies.get(0).ax == (screenw/WW-1)
|| snakeBodies.get(0).ay == 0 || snakeBodies.get(0).ay == (screenh/HH-1)){//蛇頭裝牆壁上
Log.i("RRR", "false1");
return false;
}else if(runbody(snakeBodies.get(0))){//蛇頭撞蛇身上
Log.i("RRR", "false2");
return false;
}else {
Log.i("RRR", "true");
return true;
}
}
public boolean runbody(body oop){//蛇頭位置相對於蛇身位置的判斷
ArrayList<body> fuu = new ArrayList<body>();
// fuu = snakeBodies;//直接賦值有嚴重錯誤,操作fuu相當於直接操作snakeBodies
for(int i=0;i<snakeBodies.size();i++){
body puk = new body(snakeBodies.get(i).ax, snakeBodies.get(i).ay);
fuu.add(puk);
}
fuu.remove(0);//獲得除蛇頭以外的軀幹座標
/* for(int i=0;i<fuu.size();i++){
if(fuu.get(i).equals(oop)){
return true;
}
}*/
/* if(fuu.contains(oop)){
return true;
}
return false;
*/
// return fuu.contains(oop);
int nx = snakeBodies.get(0).ax;
int ny = snakeBodies.get(0).ay;
for(int i=0;i<fuu.size();i++){
if(fuu.get(i).ax==nx&&fuu.get(i).ay==ny){
return true;
}
}
return false;
}
public boolean eatcheck(){//喫到星星檢測
/* if(snakeBodies.get(0).equals(star.get(0))){
star.remove(0);
int [][] aa = randompoint();
body ppo = new body(aa[0][0], aa[0][1]);
star.add(ppo);
Score++;
Log.i("EEE","喫到星星"+1);
return true;
}else if (snakeBodies.get(0).equals(star.get(1))) {
star.remove(1);
int [][] aa = randompoint();
body ppo = new body(aa[0][0], aa[0][1]);
star.add(ppo);
Score++;
Log.i("EEE","喫到星星"+2);
return true;
}else {
Log.i("EEE","沒有喫到星星");
return false;
}*/
/* if(star.contains(snakeBodies.get(0))){
int amp = star.indexOf(snakeBodies.get(0));//找出與蛇頭位置一樣的星星序號
Log.i("NUM", "星星序號"+amp);
Log.i("STAR", "星星座標"+star.get(amp).ax+" "+star.get(amp).ay);
star.remove(amp);
int [][] aa = randompoint();
body ppo = new body(aa[0][0], aa[0][1]);
star.add(ppo);
Score++;
Log.i("EEE","喫到星星"+amp);
return true;
}else {
Log.i("EEE","沒有喫到星星");
return false;
}*/
/* for(int i=0;i<star.size();i++){
if(snakeBodies.get(0).equals(star.get(i))){
Log.i("NUM", "星星序號"+i);
Log.i("STAR", "星星座標"+star.get(i).ax+" "+star.get(i).ay);
star.remove(i);
int [][] aa = randompoint();
body ppo = new body(aa[0][0], aa[0][1]);
star.add(ppo);
Score++;
Log.i("EEE","喫到星星"+i);
return true;
}
}
return false;*/
int nx = snakeBodies.get(0).ax;
int ny = snakeBodies.get(0).ay;
for(int i=0;i<star.size();i++){
if(star.get(i).ax==nx&&star.get(i).ay==ny){
Log.i("NUM", "星星序號"+i);
Log.i("STAR", "星星座標"+star.get(i).ax+" "+star.get(i).ay);
star.remove(i);
int [][] aa = randompoint();
body ppo = new body(aa[0][0], aa[0][1]);
star.add(ppo);
Score++;
Log.i("EEE","喫到星星"+i);
StayTime *= 0.9;
return true;
}
}
return false;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i("BBB","初始方向"+DirectionMove);//初始方向
if(DirectionMove == UP||DirectionMove == DOWN){
if(event.getX()>snakeBodies.get(0).ax*WW){
NextDirectionMove = RIGHT;
}else {
NextDirectionMove = LEFT;
}
}else if(DirectionMove == RIGHT||DirectionMove == LEFT){
if (event.getY()>snakeBodies.get(0).ay*HH) {
NextDirectionMove = DOWN;
}else {
NextDirectionMove = UP;
}
}
Log.i("CCC","變更方向"+NextDirectionMove);//變更方向
return false;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
new Thread(new moveThread()).start();//啓動線程
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}
地址:http://pan.baidu.com/share/link?shareid=2604684104&uk=1259703658