馬上加入Android 台灣中文網,立即免費下載應用遊戲。
您需要 登錄 才可以下載或查看,沒有帳號?註冊
x
請問如何讓貪食蛇增加障礙物的設定??
我劃出了draw 的設定,但是不知道怎麼增加上障礙物的座標 ((不知道這樣想是對的嗎?
請大大幫忙求解> <
以下JAVA的程式碼
import java.util.Random;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.widget.LinearLayout;
import android.widget.Toast;
public class Game_Snake extends Activity
{
final int UP = 0;
final int DOWN = 1;
final int LEFT = 2;
final int RIGHT = 3;
//蛇身體的節點,頭節點是蛇尾,尾節點是蛇頭
Snack_Node headNode, tailNode;
//螢幕的寬高
float ftWid, ftHei;
//遊戲區域的寬高
int inGameWid, inGameHei;
//遊戲的障礙物
int ObstacleW, ObstacleH;
//蛇的長度,預設為5
int inSnackLong = 5;
//蛇的方向,預設往下移動
int inSnackDirection = DOWN;
//蛇移動的速度,幾豪秒移動一步
int inSnackSpeed = 500;
//物件建立
LinearLayout llOut;//佈局物件
DrawPic dp;//畫布物件
//遊戲是否進行,預設為false,遊戲一開始蛇不會動要玩家碰觸一下畫面才會開始遊戲,預設蛇往右移動
boolean blGame = false;
//蛇移動執行緒物件
SnackMoveThread smt;
int Fraction=0;
//障礙物的x
private static int[]ObstacleX1;
private static int[]ObstacleY;
//
//??
public static final int MAP_TILE_WIDTH = 48;
public static final int MAP_TILE_HEIGHT = 48;
//執行緒所使用的Handler,某些語法或變數和物件的改變要透過Handler這個媒介才可以進行
Handler hdSnack = new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case 0://碰撞,遊戲結束
Toast.makeText(Game_Snake.this, "Game Over!!\nScore: " + (inSnackLong - 5), Toast.LENGTH_LONG).show();
Snack_Node sn = headNode;
for(int i = 0; i < inSnackLong; i++){
headNode = headNode.nextNode;
sn = null;
sn = headNode;
}
System.gc();
//遊戲重新
headNode = tailNode = null;
inSnackLong = 5;
for(int i = 0; i < inSnackLong; i++){
insertNode((int)inGameWid / 2, (int)inGameHei / 2);
}
snFruit.nodeX = rd.nextInt(inGameWid-4)+2;
snFruit.nodeY = rd.nextInt(inGameHei-4)+2;
break;
case 1://吃到水果
//蛇變長
inSnackLong++;
//吃到分數加一
Toast.makeText(Game_Snake.this,"分數"+(inSnackLong-5),Toast.LENGTH_SHORT).show();
//用吐司來顯示分數
//新增一個節點
insertNode(snFruit.nodeX, snFruit.nodeY);
//變更水果的位置
snFruit.nodeX = rd.nextInt(inGameWid-4)+2;
snFruit.nodeY = rd.nextInt(inGameHei-4)+2;
break;
}
}
};
//蛇吃的水果的x,y位置,不用兩個變數直接用一個節點代替
Snack_Node snFruit = new Snack_Node(0,0);
//建立亂數類別的物件,透過此類別可以產生亂數
Random rd = new Random();
//創造活動的方法,必要
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//全螢幕
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//把狀態列消除
requestWindowFeature(Window.FEATURE_NO_TITLE);//把程式標題(Title)消除
//取得螢幕寬高
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
ftWid = dm.widthPixels;
ftHei = dm.heightPixels;
//障礙物的寬跟高
//ObstacleX1[0] = 100;
//ObstacleX1[1] = 110;
//ObstacleX1[2] = 120;
//ObstacleX1[3] =130;
//ObstacleY[0] = 120;
//產身障礙物座標
//????
inGameWid = (int)(ftWid / 10);
inGameHei = (int)(ftHei /10);
//鎖定螢幕,鎖定為直式
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//設定畫面佈局
setContentView(R.layout.main);
//設定物件等於佈局中的指定元件
llOut = (LinearLayout) findViewById(R.id.out_main);
//一開始都指向頭
headNode = tailNode = null;
//遊戲一開始,蛇有五個身體
for(int i = 0; i < inSnackLong; i++){
insertNode(inGameWid / 2-i, inGameHei / 2-i);
}
dp = new DrawPic(Game_Snake.this);
llOut.addView(dp);
//設定畫布的觸控監聽
MoveTouch mt = new MoveTouch();
dp.setOnTouchListener(mt);
}
//新增節點的方法
public void insertNode(int x, int y){
Snack_Node newNode = new Snack_Node(x, y);
if(headNode == null){
headNode = tailNode = newNode;
}else{
tailNode.nextNode = newNode;
tailNode = newNode;
}
}
//螢幕觸控類別
class MoveTouch implements OnTouchListener{
//按下的x,y
int inDownX, inDownY;
//放開的x,y
int inUpX, inUpY;
public boolean onTouch(View arg0, MotionEvent me) {
switch(me.getAction()){
//按下
case MotionEvent.ACTION_DOWN:
//遊戲一開始處碰螢幕
if(!blGame){
blGame = true;
//建立物件,並開啟執行緒
smt = new SnackMoveThread();
smt.start();
//遊戲開始,決定水果的位置
snFruit.nodeY = snFruit.nodeY - snFruit.nodeY % 10;
snFruit.nodeX = rd.nextInt(inGameWid-4)+2;
snFruit.nodeY = rd.nextInt(inGameHei-4)+2;
}
inDownX = (int) me.getX();
inDownY = (int) me.getY();
break;
//拖曳
case MotionEvent.ACTION_MOVE:
break;
//放開
case MotionEvent.ACTION_UP:
inUpX = (int) me.getX();
inUpY = (int) me.getY();
changedirection();
}
return true;
}
//判斷方向的方法
public void changedirection(){
if(Math.abs(inDownX - inUpX) > Math.abs(inDownY - inUpY)){
if(inDownX > inUpX && inSnackDirection != RIGHT)
inSnackDirection = LEFT;
else
if(inSnackDirection != LEFT)
inSnackDirection = RIGHT;
}
else{
if(inDownY > inUpY && inSnackDirection != DOWN)
inSnackDirection = UP;
else
if(inSnackDirection != UP)
inSnackDirection = DOWN;
}
}
}
//繪圖類別
class DrawPic extends View{
Context c;
public DrawPic(Context c) {
super(c);
this.c = c;
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
//畫筆,水果
Paint pFruit = new Paint();
pFruit.setColor(Color.GRAY);//藍色
pFruit.setStyle(Style.FILL);//填滿
//畫水果
canvas.drawCircle(snFruit.nodeX*10, snFruit.nodeY*10, 5, pFruit);
//畫筆,障礙物
Paint Obstacle = new Paint();
Obstacle.setColor(Color.YELLOW);//綠色
Obstacle.setStyle(Style.FILL);//填滿
Obstacle.setStrokeWidth(10);//粗細
//障礙物(starx,starty,stopx,stopy, x)
canvas.drawLine(100, 120, 130, 120, Obstacle);//畫直線
//畫筆,牆
Paint pWall = new Paint();
pWall.setColor(Color.GREEN);//綠色
pWall.setStyle(Style.FILL);//填滿
pWall.setStrokeWidth(10);//粗細
//畫周圍的牆
canvas.drawLine(0, 5, inGameWid*10, 5, pWall);//上邊
canvas.drawLine(0, inGameHei*10 - 5, inGameWid*10, inGameHei*10 - 5, pWall);//下邊
canvas.drawLine(5, 5, 5, inGameHei*10, pWall);//左邊
canvas.drawLine(inGameWid*10 - 5, 0, inGameWid*10 - 5, inGameHei*10, pWall);//右邊
//畫筆,蛇
Paint pSnack = new Paint();
pSnack.setStyle(Style.FILL);//填滿
Snack_Node sn = headNode;
//若尋覽所有節點,未到尾節點都畫黑色身體
while(sn != tailNode){
pSnack.setColor(Color.BLACK);
canvas.drawCircle(sn.nodeX*10, sn.nodeY*10, 5, pSnack);
//下一個節點
sn = sn.nextNode;
}
//尾節點算蛇頭,畫紅色
pSnack.setColor(Color.RED);
canvas.drawCircle(sn.nodeX*10, sn.nodeY*10, 5, pSnack);
//重畫
invalidate();
}
}
//蛇移動的執行緒類別
class SnackMoveThread extends Thread{
public void run(){
while(blGame){
snackMove();
//若有吃到水果
if(snackEatFruit()){
//執行Handler,傳送要做的事情(Message)的編號
Message msg = new Message();
msg.what = 1;
hdSnack.sendMessage(msg);
}else{
//否則沒吃到水果就去判斷是否有碰撞
if(snackDie()){
blGame = false;
//執行Handler,傳送要做的事情(Message)的編號
Message msg = new Message();
msg.what = 0;
hdSnack.sendMessage(msg);
}
}
try {
Thread.sleep(inSnackSpeed);
inSnackSpeed--;
} catch (InterruptedException e) {e.printStackTrace();}
}
}
//蛇移動的方法
public void snackMove(){
Snack_Node sn = headNode;
while(sn != tailNode){
sn.nodeX = sn.nextNode.nodeX;
sn.nodeY = sn.nextNode.nodeY;
//下一個節點
sn = sn.nextNode;
}
switch(inSnackDirection){
case UP://上
sn.nodeY--;
break;
case DOWN://下
sn.nodeY++;
break;
case LEFT://左
sn.nodeX--;
break;
case RIGHT://右
sn.nodeX++;
break;
}
}
//蛇吃到水果的判斷
public boolean snackEatFruit(){
boolean blEat = false;
if(tailNode.nodeX == snFruit.nodeX && tailNode.nodeY == snFruit.nodeY ){
blEat = true;
}
return blEat;
}
//蛇碰撞的判斷
public boolean snackDie(){
boolean blDie = false;
//先判斷是否有碰到牆壁,若有碰到牆壁則判定為死亡
if(tailNode.nodeX <= 1 || tailNode.nodeX >= inGameWid- 1
|| tailNode.nodeY <= 1 || tailNode.nodeY >= inGameHei -1
//|| tailNode.nodeX== ObstacleX1[0]&&tailNode.nodeY==ObstacleY[0]
){
blDie = true;
}else{
//否則再判斷是否有碰到自己的身體
Snack_Node sn = headNode;
for(int i = 0; i < (inSnackLong - 1); i++){
//若有碰撞到自己的身體則判定為死亡
if(sn.nodeX == tailNode.nodeX && sn.nodeY == tailNode.nodeY){
blDie = true;
}
sn = sn.nextNode;
}
}
return blDie;
}
}
}
//節點類別
class Snack_Node{
int nodeX, nodeY;
Snack_Node nextNode;
public Snack_Node(int x, int y){
nodeX = x;
nodeY = y;
nextNode = null;
}
} |