綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[討論] 請問如何讓貪食蛇增加障礙物的設定??

[複製連結] 查看: 1683|回覆: 4|好評: 0
跳轉到指定樓層
樓主
kira800917 | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2013-5-11 22:00

馬上加入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;
        }
}
「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)
收藏收藏 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

沙發
sheng760504 | 收聽TA | 只看該作者
發表於 2013-5-22 02:45
跟牆壁一樣不是嗎?
if(tailNode == 障礙物座標){
  蛇死掉
}
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

板凳
 樓主| kira800917 | 收聽TA | 只看該作者
發表於 2013-5-22 20:06
但是牆壁的座標怎麼抓取呀??
@@  ??不知道怎麼設定.... 一直抓不到值
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

地板
sheng760504 | 收聽TA | 只看該作者
發表於 2013-5-22 21:12
本帖最後由 sheng760504 於 2013-5-22 21:13 編輯

大略看一下,牆壁判斷已寫好-->snackDie()這裡面

障礙物:
你在onDrow裡面用這條線代表障礙物
//障礙物(starx,starty,stopx,stopy, x)
canvas.drawLine( x1, y1, x2, y2, Obstacle);//畫直線
那想個方法把線記下來->例如: point( x1, y1)( x2, y2)
到snackDie()裡加一個if 判斷 --> if(頭的x座標介於x1~x2  &&  y座標介於y1~y2 )

用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

5
 樓主| kira800917 | 收聽TA | 只看該作者
發表於 2013-5-25 11:20
謝謝大大。感恩=)
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則