控制器 制作 單一的推箱子遊戲(馬推箱子)
馬推箱子(有些複雜化了(當時沒有想那麼多,盡量不要出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();