天天看點

控制器 制作 單一的推箱子遊戲(馬推箱子)

控制器 制作 單一的推箱子遊戲(馬推箱子)

馬推箱子(有些複雜化了(當時沒有想那麼多,盡量不要出bug))

思路:

1.二維數組(三個左邊(終點,箱子,馬)),随機坐标,不相同。

2.隻需要做出一個方向的全部操作,另外三個都一樣。

3.确定情況四種(W)代碼都是重複的隻是改了下标:

  一)整個Y軸

控制器 制作 單一的推箱子遊戲(馬推箱子)

   

  二)整個Y軸隻有馬和箱子

控制器 制作 單一的推箱子遊戲(馬推箱子)

  三)整個Y軸隻有馬和終點

控制器 制作 單一的推箱子遊戲(馬推箱子)

  四)整Y軸,有馬,箱子,終點

    1)馬在最上面,另外兩個随便位置

控制器 制作 單一的推箱子遊戲(馬推箱子)

    2)馬在兩個之間(兩種情況)

控制器 制作 單一的推箱子遊戲(馬推箱子)

    3)馬在最下面(最複雜的)

      3.1)箱子在最上面,終點在中間

控制器 制作 單一的推箱子遊戲(馬推箱子)

             3.2)終點在最上面,箱子在中間(成功)

控制器 制作 單一的推箱子遊戲(馬推箱子)
控制器 制作 單一的推箱子遊戲(馬推箱子)

package com.xmx.lzy5_array;

import java.util.Arrays;

import java.util.Random;

import java.util.Scanner;

public class SokobanTwoDimensionalArrayDemo4 {

    public static void main(String[] args) {

        Scanner input=new Scanner(System.in);

        Random rd=new Random();

        //1.确定地圖樣式

        String[][] map=new String[10][10];

        for (String[] strings : map) {

            Arrays.fill(strings, "口");

        }

        //2.确定馬的坐标                  這裡的10個數  0:第1個數  從0開始一共10個數是以是0~9

        int h_x= rd.nextInt(10),h_y=rd.nextInt(10);

        map[h_y][h_x]="♘";

        //3.确定箱子的坐标 判斷是否跟馬重疊 這裡0~8 箱子不挨邊 挨邊會出現問題

        int b_x= rd.nextInt(8)+1,b_y=rd.nextInt(8)+1;

        //判斷

        while (h_x==b_x&&h_y==b_y){

            b_x= rd.nextInt(8)+1;

            b_y=rd.nextInt(8)+1;

        map[b_y][b_x]="〼";

        //4.确定終點的坐标 判斷是否跟馬和箱子重疊

        int t_x=rd.nextInt(10),t_y=rd.nextInt(10);

        while ((t_x==b_x&&t_y==b_y)||(h_x==t_x&&h_y==t_y)){

            t_x= rd.nextInt(8)+1;

            t_y=rd.nextInt(8)+1;

        map[t_y][t_x]="◇";

        //測試

//        b_x=h_x;

//        t_x=h_x;

        //檢測

        int sum=0;

        //顯示地圖

        drawMap(map);

        //5.移動馬(先弄一個死循環)

        while (true){

            System.out.println("請輸入(w-向_上;s-向下;a-向左;d-向右):");

            String trend=input.next();

            switch (trend){

                case "w":

                    //清空馬

                    map[h_y][h_x]="口";

                    //改變Y(-)坐标

                    if (h_y!=0){

                        //1.馬Y軸,隻有箱子。

                        if(h_x==b_x&&b_x!=t_x){

                            // 1.1).馬前面是箱子

                            if(h_y-1==b_y){

                                //判斷在臨界點

                                if (b_y!=0){

                                    //清空原來的位置

                                    map[b_y][b_x]="口";

                                    //更新位置

                                    h_y-=1;

                                    b_y-=1;

                                }

                            }

                            // 1.2).馬前面為空

                            else {

                                h_y-=1;

                        }

                        //2.馬Y軸,隻有終點。

                        if(h_x==t_x&&b_x!=t_x){

                            // 2.1).馬前面是終點

                            if(h_y-1==t_y){

                                if(t_y!=0){

                                    h_y-=2;

                            // 2.2).馬前面為空

                        //3.馬Y軸,有箱子-終點。

                        if(h_x==t_x&&h_x==b_x){

                            //3.1).馬在下面

                            if(h_y>t_y&&h_y>b_y){

                                //終點在上面--箱子中間

                                if (b_y>t_y){

                                    //馬臨界箱子的時候

                                    if(h_y-1==b_y){

                                        //箱子臨界終點的時候

                                        if (b_y-1==t_y){

                                            //清空

                                            map[b_y][b_x]="口";

                                            map[t_y][t_x]="口";

                                            //更新位置

                                            h_y-=1;

                                            b_y=t_y;//b_y-=1;  這個時候 b_y=t_y b_x=t_x

                                            //填充位置 在下面 做判斷

                                            sum++;

                                        }else {

                                            //清空箱子

                                            b_y-=1;

                                        }

                                    }else {

                                        h_y-=1;

                                    }

                                //箱子在上面--終點中間

                                else {

                                    //判斷馬臨界終點的時候

                                    if(h_y-1==t_y){

                                        //當終點前面是箱子

                                        if(t_y-1==b_y){

                                            //判斷箱子臨界

                                            if(b_y!=0){

                                                //更新位置

                                                h_y-=2;

                                                b_y-=1;

                                            }

                                            h_y-=2;

                            //3.2).馬在上面 不需要判斷 前面為全是空

                            else if (h_y<t_y&&h_y<b_y){

                                //更新位置

                            //3.3).馬在中間

                                //箱子在上面--終點下面(這個不需要管)

                                if(b_y<t_y){

                                    //臨界

                                        //臨界

                                        if (b_y!=0){

                                        //更新位置

                                //終點在上面--箱子下面(這個不需要管)

                                        if (t_y!=0){

                        //4.馬Y軸前面什麼都沒有

                        if(h_x!=b_x&&h_x!=t_x) {

                            h_y-=1;

                    }

                    map[h_y][h_x]="♘";

                    //判斷 輸出OK的時候 sum=1,map[t_y][t_x]="ok";

                    if(sum==1){

                        map[t_y][t_x]="ok";

                    }else {

                        map[b_y][b_x]="〼";

                    break;

                case "s":

                    //改變Y(+)坐标

                    if (h_y!=9){

                            // 1.1).馬後面是箱子

                            if(h_y+1==b_y){

                                if (b_y!=9){

                                    h_y+=1;

                                    b_y+=1;

                            // 1.2).馬後面為空

                                h_y+=1;

                            // 2.1).馬後面是終點

                            if(h_y+1==t_y){

                                if(t_y!=9){

                                    h_y+=2;

                            //3.1).馬在下面 不需要判斷 後面為全是空

                            //3.2).馬在上面

                                //終點在下面--箱子中間

                                if (b_y<t_y){

                                    if(h_y+1==b_y){

                                        if (b_y+1==t_y){

                                            h_y+=1;

                                            b_y+=1;

                                        h_y+=1;

                                //箱子在下面--終點中間

                                    if(h_y+1==t_y){

                                        if(t_y+1==b_y){

                                            if(b_y!=9){

                                                h_y+=2;

                                                b_y+=1;

                                            h_y+=2;

                                //箱子在下面--終點上面(這個不需要管)

                                if(b_y>t_y){

                                        if (b_y!=9){

                                        if (t_y!=9){

                            h_y+=1;

                case "a":

                    //改變X(-)坐标

                    if (h_x>0){

                        //1.馬X軸,隻有箱子。

                        if(h_y==b_y&&b_y!=t_y){

                            if(h_x-1==b_x){

                                if (b_x!=0){

                                    h_x-=1;

                                    b_x-=1;

                            /*

                            // 1.3).填充新位置

                            map[h_y][h_x]="♘";

                            map[b_y][b_x]="〼";*/

                        //2.馬X軸,隻有終點。

                        if(h_y==t_y&&b_y!=t_y){

                            if(h_x-1==t_x){

                                if(t_x!=0){

                                    h_x-=2;

                                h_x-=1;

                        //3.馬X軸,有箱子-終點。

                        if(h_y==t_y&&h_y==b_y){

                            //3.1).馬在右邊

                            if(h_x>t_x&&h_x>b_x){

                                //終點在左邊--箱子中間

                                if (b_x>t_x){

                                    if(h_x-1==b_x){

                                        if (b_x-1==t_x){

                                            h_x-=1;

                                            b_x=t_x;//b_y-=1;  這個時候 b_y=t_y b_x=t_x

                                            b_x-=1;

                                        h_x-=1;

                                //箱子在左邊--終點中間

                                    if(h_x-1==t_x){

                                        if(t_x-1==b_x){

                                            if(b_x!=0){

                                                h_x-=2;

                                                b_x-=1;

                                            h_x-=2;

                            //3.2).馬在左邊 不需要判斷 左邊為全是空

                            else if (h_x<t_x&&h_x<b_x){

                                //箱子在左邊--終點右邊(這個不需要管)

                                if(b_x<t_x){

                                        if (b_x!=0){

                                //終點在左邊--箱子右邊(這個不需要管)

                                        if (t_x!=0){

                        //4.馬X軸前面什麼都沒有

                        if(h_y!=b_y&&h_y!=t_y) {

                            h_x-=1;

                case "d":

                    //改變X(+)坐标

                    if (h_x<9){

                            // 1.1).馬右邊是箱子

                            if(h_x+1==b_x){

                                if (b_x!=9){

                                    h_x+=1;

                                    b_x+=1;

                            // 1.2).馬右邊為空

                                h_x+=1;

                            // 2.1).馬右邊是終點

                            if(h_x+1==t_x){

                                if(t_x!=9){

                                    h_x+=2;

                            // 2.2).馬右邊為空

                            //3.1).馬在右邊 不需要判斷 後面為全是空

                            //3.2).馬在左邊

                                //終點在右邊--箱子中間

                                if (b_x<t_x){

                                    if(h_x+1==b_x){

                                        if (b_x+1==t_x){

                                            h_x+=1;

                                            b_x+=1;

                                        h_x+=1;

                                //箱子在右邊--終點中間

                                    if(h_x+1==t_x){

                                        if(t_x+1==b_x){

                                            if(b_x!=9){

                                                h_x+=2;

                                                b_x+=1;

                                            h_x+=2;

                                //箱子在右邊--終點左邊(這個不需要管)

                                if(b_x>t_x){

                                        if (b_x!=9){

                                //終點在右邊--箱子左邊(這個不需要管)

                                        if (t_x!=9){

                        //4.馬Y軸什麼都沒有

                            h_x+=1;

                default:

                    System.out.println("************傻逼************"+"\n*********遵守遊戲規則********");

            }

            //覆寫

            drawMap(map);

            if(sum==1){

                break;

        System.out.println("*****************成功*****************");

    }

    //定義一個方法 列印地圖

    public static void drawMap(String [][] map){

            for (String string : strings) {

                System.out.print(string + "\t");

            System.out.println();