import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
/**
* 二维数组实现推箱子
* 二维数组地图为正方形
*/
public class Test01 {
public static void main(String[] args) {
//地图宽高
int n = 6;
//空格子
char empty = '*';
//自己
char self = '&';
//箱子
char box = '#';
//目标
char target = '0';
//创建地图
char[][] map = new char[n][n];
//先全部将地图赋值为指定字符的空格子
for (int i = 0; i < map.length; i++){
for (int j = 0; j < map[i].length; j++){
map[i][j] = empty;
}
}
//随机创建自己,箱子和目标位置
Random random = new Random();
//随机自己的位置
int self_i = random.nextInt(n);
int self_j = random.nextInt(n);
map[self_i][self_j] = self;
//随机箱子的位置,箱子必须不能在边缘
int box_i = -1;
int box_j = -1;
int i1 = random.nextInt(n);
int j1 = random.nextInt(n);
while (true){
//箱子不能打印在地图边缘
if (!(i1 == 0 || i1 == map.length-1 || j1 == 0 || j1 == map[0].length-1)){
//将坐标和字符赋值
box_i = i1;
box_j = j1;
map[box_i][box_j] = box;
break;
}else{//箱子打印在边缘,则重新随机输入
i1 = random.nextInt(n);
j1 = random.nextInt(n);
}
}
//随机目标的位置
int target_i = random.nextInt(n);
int target_j = random.nextInt(n);
map[target_i][target_j] = target;
//用户操作人的走向
Scanner input = new Scanner(System.in);
while (true){
//打印地图
System.out.println("==== "+empty+"--空格子 "+self+"--自己 "+box+"--箱子 "+target+"--目标 ====");
for (int i = 0; i < map.length; i++){
for (int j = 0; j < map[i].length; j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
//上下移动操作
while (true){
System.out.println("请输入你选择的方向(w-上 a-左 s-下 s-右):");
String choice = input.next();
switch (choice){
case "w"://上
if (self_i == 0){//上边界越界
System.out.println("你已移动到最上方,无法移动!游戏结束!");
System.exit(0);
}else{//进一步判断人的上面是空格子还是目标还是箱子
//取出自己上方的值作判断
char value = map[self_i - 1][self_j];
if (value == target){//上方为目标位置
System.out.println("你已掉入坑中!游戏结束!");
System.exit(0);
}else if (value == empty){//上方为空格子
//先把自己位置移动上去
map[self_i - 1][self_j] = self;
//重置原来的位置
map[self_i][self_j] = empty;
//更新自己的坐标
self_i--;
}else if (value == box){//上方为箱子
//判断箱子上方的情况
if (!(box_i == 0)){//箱子可向上移动
//取出箱子上方的位置,用于判断是否胜利
value = map[box_i - 1][box_j];
if (value == target){//箱子处于目标位置处
System.out.println("恭喜你!胜利啦!");
System.exit(0);
}else{//箱子可向上移动
//先把箱子向上移动
map[box_i - 1][box_j] = box;
//再将自己向上移动
map[self_i - 1][self_j] = self;
//重置自己的位置
map[self_i][self_j] = empty;
//更新坐标位置
box_i--;
self_i--;
}
}else{//箱子处于最上方
System.out.println("箱子已移动到最上方,无法移动!游戏结束!");
System.exit(0);
}
}
}
break;
case "s"://下
if (self_i == map.length - 1){
System.out.println("你已移动到最下方,无法移动!游戏结束!");
System.exit(0);
}else{
int value = map[self_i + 1][self_j];
if (value == target){
System.out.println("你已掉入坑中!游戏结束!");
System.exit(0);
} else if (value == empty) {
map[self_i + 1][self_j] = self;
map[self_i][self_j] = empty;
self_i++;
} else if (value == box){
if (!(box_i == map.length - 1)){
value = map[box_i + 1][box_j];
if (value == target){
System.out.println("恭喜你!胜利啦!");
System.exit(0);
}else{
map[box_i + 1][box_j] = box;
map[self_i + 1][self_j] = self;
map[self_i][self_j] = empty;
box_i++;
self_i++;
}
}else{
System.out.println("箱子已移动到最下方,无法移动!游戏结束!");
System.exit(0);
}
}
}
break;
case "a"://左
if (self_j == 0){
System.out.println("你已移动到最左方,无法移动!游戏结束!");
System.exit(0);
}else{
int value = map[self_i][self_j - 1];
if (value == target){
System.out.println("你已掉入坑中!游戏结束!");
System.exit(0);
}else if (value == empty){
map[self_i][self_j - 1] = self;
map[self_i][self_j] = empty;
self_j--;
}else if (value == box){
if (!(box_j == 0)){
value = map[box_i][box_j - 1];
if (value == target){
System.out.println("恭喜你!胜利啦!");
System.exit(0);
}else{
map[box_i][box_j - 1] = box;
map[self_i][self_j - 1] = self;
map[self_i][self_j] = empty;
box_j--;
self_j--;
}
}else{
System.out.println("箱子已移动到最左方,无法移动!游戏结束!");
System.exit(0);
}
}
}
break;
case "d"://右
if (self_j == map[0].length - 1){
System.out.println("你已移动到最右方,无法移动!游戏结束!");
System.exit(0);
}else{
int value = map[self_i][self_j + 1];
if (value == target){
System.out.println("你已掉入坑中!游戏结束!");
System.exit(0);
}else if (value == empty){
map[self_i][self_j + 1] = self;
map[self_i][self_j] = empty;
self_j++;
}else if (value == box){
if (!(box_j == map[0].length - 1)){
value = map[box_i][box_j + 1];
if (value == target){
System.out.println("恭喜你!胜利啦!");
System.exit(0);
}else{
map[box_i][box_j + 1] = box;
map[self_i][self_j + 1] = self;
map[self_i][self_j] = empty;
box_j++;
self_j++;
}
}else{
System.out.println("箱子已移动到最右方,无法移动!游戏结束!");
System.exit(0);
}
}
}
break;
default:
//处理输入错误
System.out.println("输入有误,请重新输入(w-上 a-左 s-下 s-右):");
choice = input.next();
}
break;
}
}
}
}
基于Java的二维数组和条件循环语句实现简单推箱子游戏
最新推荐文章于 2023-06-14 20:03:49 发布