利用二维数组制作简易的推箱子游戏,一个人去推一个箱子到一个点
package com.lan.java03;
import java.util.Scanner;
public class TuiXiangZi {
public static void main(String[] args) {
/*
* 首先我们要创建出来小人可以移动的地图
* 这个地图是一个二维的数组
*
* */
/*-----------------------开始创建地图-----------------------------*/
int[ ][ ] c = new int[5][5]; //定义一个数组
/*
* 接下来,我希望从输入确定我的小人在哪个初始位置
* */
Scanner scanner = new Scanner(System.in);
System.out.println("请输入小人的横坐标从0到" + (c.length - 1));
int i = scanner.nextInt(); //就是小人的行坐标
if( i >= c.length || i < 0){
System.out.println("您输入的行数有误,小人坐标脱离了地图");
return;
}
System.out.println("请输入小人的列坐标从0到" + (c[0].length - 1));// i j 代表小人
int j = scanner.nextInt(); //就是小人的列坐标
if( j >= c[i].length || j < 0){
System.out.println("您输入的列数有误,小人坐标脱离了地图");
return;
}
c[i][j] = 1; //初始化位置c[i][j] = 1 我没做合法性判断
System.out.println("小地图的目前状态如下");
System.out.println("**************************************************************************"); // 输出地图
for(int n = 0; n < c.length; n++){ //输出矩阵
for(int m = 0 ; m < 5 ;m++){
System.out.print(c[n][m] + " ");
}
System.out.println();
}
System.out.println("请输入箱子的横坐标:从0-" + (c.length - 1)); //boxM boxN代表箱子
int boxM = scanner.nextInt();
if(boxM >= c.length || boxM < 0){
System.out.println("箱子脱离地图");
return;
}
System.out.println("请输入箱子的纵坐标:从0-" + (c[boxM].length - 1));
int boxN = scanner.nextInt();
if(boxN >= c[boxM].length || boxN < 0){
System.out.println("箱子脱离地图");
return;
}else if(i == boxM && j == boxN){
System.out.println("小人与箱子重复");
return;
}
c[boxM][boxN] = 2;
System.out.println("小地图的目前状态如下");
System.out.println("**************************************************************************"); //输出地图
for(int n = 0; n < c.length; n++){ //输出矩阵
for(int m = 0 ; m < 5 ;m++){
System.out.print(c[n][m] + " ");
}
System.out.println();
}
System.out.println("请输入箱子终点位置的横坐标:从0-" + (c.length - 1)); //boxM boxN代表箱子
int x = scanner.nextInt();
if(x >= c.length || x < 0){
System.out.println("箱子终点脱离地图");
return;
}
System.out.println("请输入箱子终点位置的纵坐标:从0-" + (c[x].length - 1)); //x y代表点
int y= scanner.nextInt();
if(y >= c[x].length || y < 0){
System.out.println("箱子的终点脱离地图");
return;
}else if(boxM == x && boxN == y ){
c[x][y] = 5;
}else if(x == i && y == j){
c[x][y] = 4;
}else{
c[x][y] = 3;
}
System.out.println("小地图的目前状态如下");
System.out.println("**************************************************************************");
for(int n = 0; n < c.length; n++){ //输出矩阵
for(int m = 0 ; m < 5 ;m++){
System.out.print(c[n][m] + " ");
}
System.out.println();
}
/*-------------------------创建地图结束,并实例化小人------------------------------*/
/*
* 我们检查一下目前的地图小人
* */
while(true){
/*------------------------检查动作结束------------------------------*/
/*-----------------------小人行走的逻辑----------------------------*/
System.out.println("请输入小人移动方向:w向上 a向左 s向下 d向右"); //输入移动方向
String command = scanner.next();
command.toUpperCase(); // 大小写通用
switch(command){
case"w": //判定w a s d
//这里让小人向上移动
if( i == 0 ){
System.err.println("小人撞墙了,不能向上走了");
}else if(c[i-1][j] == 2){
if(c[i-2][j] ==2){
System.out.println("箱子前面还有箱子不能退了");
}else if(i - 2 == 0){
System.out.println("箱子到顶了,不能向上走了");
}else if(c[i-1][j] ==5 ){
c[i-2][j] = c[i-2][j] + c[i-1][j];
c[i-1][j] = c[i][j] - 1;
c[i][j] = c[i][j] - 1;
i= i - 1;
}else if(c[i][j] == 4){
c[i-2][j] = c[i-2][j] + c[i-1][j];
c[i-1][j] =c[i][j] - 3 ;
c[i][j] = c[i][j] - 1;
i= i - 1;
}else{
c[i-2][j] = c[i-2][j] + c[i-1][j];
c[i-1][j] =c[i][j] ;
c[i][j] = c[i][j] - 1;
i= i - 1;
}
}else if(c[i-1][j] == 3 ){
c[i-1][j] = c[i-1][j]+c[i][j] ;
c[i][j] = c[i][j] - 1;
i= i - 1;
}else {
c[i-1][j] = 1;
c[i][j] = c[i][j] -1;
i= i - 1;
}
break;
case"a":
if(j == 0){
System.err.println("小人撞墙了,不能向左走了");
}else if(c[i][j-1] == 2){
if(j - 2 == 0){
System.out.println("箱子到顶了,不能向上走了");
}else if( c[i][j-2] == 2){
System.out.println("箱子前面还有箱子不能退了");
} else if(c[i][j-1] == 5){
c[i][j-2] = c[i][j-2] + c[i][j-1];
c[i][j-1] = c[i][j] - 1;
c[i][j] = c[i][j] - 1;
j= j - 1;
}else if(c[i][j] == 4){
c[i][j-2] = c[i][j-2] + c[i][j-1];
c[i][j-1] = c[i][j] - 3;
c[i][j] = c[i][j] - 1;
j= j - 1;
}else{
c[i][j-2] = c[i][j-2] + c[i][j-1];
c[i][j-1] = c[i][j];
c[i][j] = c[i][j] - 1;
j= j - 1;
}
}else if(c[i][j-1] == 3){
c[i][j-1] = c[i][j-1]+c[i][j] ;
c[i][j] = c[i][j] - 1;
j= j - 1;
}else{
c[i][j-1] = 1;
c[i][j] = c[i][j] -1;
j= j - 1;
}
break;
case"s":
if(i == 4){
System.err.println("小人撞墙了,不能向下走了");
}else if(c[i+1][j] == 2){
if(i + 2 == c.length){
System.out.println("箱子到顶了,不能向下走了");
}else if( c[i+2][j] == 2){
System.out.println("箱子前面还有箱子不能退了");
}else if(c[i+1][j] == 5){
c[i+2][j] = c[i+2][j] + c[i+1][j];
c[i+1][j] = c[i][j]-1;
c[i][j] = c[i][j] - 1;
i= i + 1;
}else if(c[i][j] == 4){
c[i+2][j] = c[i+2][j] + c[i+1][j];
c[i+1][j] = c[i][j] - 3;
c[i][j] = c[i][j] - 1;
i= i + 1;
}else{
c[i+2][j] = c[i+2][j] + c[i+1][j];
c[i+1][j] = c[i][j];
c[i][j] = c[i][j] - 1;
i= i + 1;
}
}else if(c[i+1][j] == 3){
c[i+1][j] = c[i+1][j]+c[i][j];
c[i][j] = c[i][j] - 1;
i= i + 1;
}else{
c[i+1][j] = 1;
c[i][j] = c[i][j] -1;
i= i + 1;
}
break;
case "d":
if(j == c.length -1){
System.err.println("小人撞墙了,不能向右走了");
}else if(c[i][j+1] == 2 ){//有箱子
if(j + 2 == c[i].length){ //箱子到最右边
System.out.println("箱子到顶了,不能向右走了");
}else if( c[i][j+2] == 2){ //箱子右边有箱子 (多箱子的情况)
System.out.println("箱子前面还有箱子不能退了");
}else if(c[i][j+1] == 5) { // 推箱子时箱子站在点上(多箱子、多点的情况 )
c[i][j+2] = c[i][j+2] + c[i][j+1];
c[i][j+1] = c[i][j]-1 ;
c[i][j] = c[i][j] - 1;
j= j + 1;
}else if(c[i][j] == 4){ //推箱子时人站在点上
c[i][j+2] = c[i][j+2] + c[i][j+1];
c[i][j+1] = c[i][j] - 3;
c[i][j] = c[i][j] - 1;
j= j + 1;
}else { //
c[i][j+2] = c[i][j+2] + c[i][j+1];
c[i][j+1] = c[i][j];
c[i][j] = c[i][j] - 1;
j= j + 1;
}
}else if(c[i][j+1] == 3){ //右边是3
c[i][j+1] = c[i][j+1]+c[i][j];
c[i][j] = c[i][j] - 1;
j= j + 1;
}else{ //右边是0
c[i][j+1] = 1;
c[i][j] = c[i][j] - 1;
j= j + 1;
}
break;
default:
System.err.println("您主动关闭程序了");
return;
}
System.out.println("小地图的目前状态如下");
System.out.println("**************************************************************************");
for(int n = 0; n < c.length; n++){ //输出矩阵
for(int m = 0 ; m < 5 ;m++){
System.out.print(c[n][m] + " ");
}
System.out.println();
}
if(c[x][y] == 5){
System.out.println("恭喜您获胜了");
return;
}
}
}
}