/*主要功能分析:使用Switch语句实现,上下左右移动;用栈实现返回上一步操作。*/
#include <stdio.h>
#include <conio.h>
#include<stdlib.h>
#include<windows.h>
int map1[9][9] = {
{1,1,1,1,1,1,1,1,1}, //0代表空地
{1,0,0,0,0,0,0,0,1}, //1代表墙
{1,0,0,0,4,0,0,0,1}, //3代表目的地
{1,0,4,3,0,3,4,0,1}, //4代表箱子
{1,0,0,0,3,0,0,0,1}, //5代表人
{1,0,0,0,0,0,0,0,1},
{1,0,0,0,5,0,0,0,1},
{1,1,1,1,1,1,1,1,1},
};
int map2[9][9] = {
{1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,1},
{1,0,0,1,1,1,0,0,1},
{1,0,0,3,1,3,0,0,1},
{1,0,0,1,3,1,0,0,1},
{1,0,4,0,4,0,4,0,1},
{1,0,0,0,5,0,0,0,1},
{1,1,1,1,1,1,1,1,1}};
typedef char ElementType;
typedef char Position;
typedef struct SNode *PtrToSNode;
struct SNode{
ElementType *Data; //储存元素的数组
Position Top; //栈顶指针
int MaxSize; //堆栈最大容量
};
typedef PtrToSNode Stack;
Stack CreateStack(int MaxSize){
Stack S=(Stack)malloc(sizeof(struct SNode));
S->Data=(ElementType*)malloc(MaxSize*sizeof(ElementType));
S->Top =-1;
S->MaxSize =MaxSize;
return S;
}
bool IsFull(Stack S){
return(S->Top ==S->MaxSize -1);
}
bool Push(Stack S,ElementType X){
if(IsFull(S))
return false;
else{
S->Data[++(S->Top)]=X;
return true;
}
}
bool IsEmpty(Stack S){
return(S->Top==-1);
}
ElementType Pop(Stack S){
if(!IsEmpty(S))
return(S->Data[(S->Top )--]);
}
void DrawMap(int map[][9],int x);
ElementType PlayGame1(Stack S,int map1[][9],int x);
ElementType playGame2(Stack S,int map1[][9],int x);
int main() //主函数
{
int sum=0;
Stack S=CreateStack(1000);
int guan;
printf("请选择关数(1-2):");
scanf("%d",&guan);
if(guan==1)
while (1){
system("cls");
DrawMap(map1,9);
printf("步数为%d",sum);
int bushu=PlayGame1(S,map1,9);
sum=sum+bushu;
if(sum<0){
sum=0;
}
}
if(guan==2)
while (1){
system("cls");
DrawMap(map2,9);
printf("步数为%d",sum);
int bushu=PlayGame1(S,map2,9);
sum=sum+bushu;
if(sum<0){
sum=0;
}
}
return 0;
}
void DrawMap(int map[][9],int x) //绘制地图
{
int sum=0,shu;
for (int i = 0; i < x; i++){
for (int j = 0; j < 9; j++){
switch (map[i][j])
{
case 0:
printf(" ");
break;
case 1:
printf("■");
break;
case 3:
printf("☆");
break;
case 4:
printf("□");
break;
case 5:
printf("♀");
break;
case 7: //4 + 3 箱子在目的地中
printf("★");
sum++;
break;
case 8: // 5 + 3 人在目的地当中
printf("♀");
break;
}
}
printf("\n");
}
}
ElementType PlayGame1(Stack S,int map1[][9],int x) //移动
{
int bushu=0;
int r, c; //人的下标
for (int i = 0; i < x; i++){
for (int j = 0; j < 9; j++){
if (map1[i][j] == 5||map1[i][j]==8){
r = i;
c = j;
}
}
}
char ch; //字符变量
ch = getch(); //从键盘得到输入
switch (ch)
{
case 'W':
case 'w':
case 72:
if (map1[r - 1][c] == 0|| map1[r - 1][c] == 3) //如果人的上面为空地或者目的地
{
map1[r - 1][c] += 5; //人上面那个地方就变为人
map1[r][c] -= 5; //人的位置变为空地
Push(S,'W');
bushu++;
}
else if (map1[r - 1][c] == 4 || map1[r - 1][c] == 7)//如果人的上面有箱子或者有箱子的目的地
{
if (map1[r - 2][c] == 0 || map1[r - 2][c] == 3)//如果人的上面上面是空地或者目的地
{
map1[r - 2][c] += 4;//人上面的上面就变为箱子或者有箱子的目的地
map1[r - 1][c] += 1;//人的上面变为人
map1[r][c] -= 5;//人的位置变为空地
Push(S,'w');
bushu++;
}
}
break;
case 'S': //enter按键的作用 确认 返回
case 's':
case 80:
if (map1[r + 1][c] == 0 || map1[r + 1][c] == 3) //如果人的下面为空地或者目的地
{
map1[r + 1][c] += 5;//人下面那个地方就变为人
map1[r][c] -= 5;//人的位置变为空地
Push(S,'S');
bushu++;
}
else if (map1[r + 1][c] == 4 || map1[r+ 1][c] == 7)//如果人的下面有箱子或者有箱子的目的地
{
if (map1[r + 2][c] == 0 || map1[r + 2][c] == 3)//如果人的下面下面是空地或者目的地
{
map1[r + 2][c] += 4;//人下面的下面就变为箱子或者有箱子的目的地
map1[r + 1][c] += 1;//人的下面变为人
map1[r][c] -= 5;//人的位置变为空地
Push(S,'s');
bushu++;
}
}
break;
case 'A':
case 'a':
case 75:
if (map1[r ][c - 1] == 0 || map1[r ][c - 1] == 3)//如果人的左面为空地或者目的地
{
map1[r ][c - 1] += 5;//人左面那个地方就变为人
map1[r][c] -= 5;//人的位置变为空地
Push(S,'A');
bushu++;
}
else if (map1[r][c - 1] == 4 || map1[r][c - 1] == 7)//如果人的左面有箱子或者有箱子的目的地
{
if (map1[r ][c - 2] == 0 || map1[r ][c - 2] == 3)//如果人的左面的左面是空地或者目的地
{
map1[r ][c - 2] += 4;//人左面的左面就变为箱子或者有箱子的目的地
map1[r ][c - 1] += 1;//人的左面变为人
map1[r][c] -= 5;//人的位置变为空地
Push(S,'a');
bushu++;
}
}
break;
case 'D':
case 'd':
case 77:
if (map1[r][c + 1] == 0 || map1[r][c + 1] == 3)//如果人的右面为空地或者目的地
{
map1[r][c + 1] += 5;//人右面那个地方就变为人
map1[r][c] -= 5;//人的位置变为空地
Push(S,'D');
bushu++;
}
else if (map1[r][c + 1] == 4 || map1[r][c + 1] == 7)//如果人的右面有箱子或者有箱子的目的地
{
if (map1[r][c + 2] == 0 || map1[r][c + 2] == 3)//如果人的右面右面是空地或者目的地
{
map1[r][c + 2] += 4;//人右面的右面就变为箱子或者有箱子的目的地
map1[r][c + 1] += 1;//人的右面变为人
map1[r][c] -= 5;//人的位置变为空地
Push(S,'d');
bushu++;
}
}
break;
case 27:
exit(0);
case 'z':
bushu=playGame2(S,map1,9);
system("cls");
}
return bushu;
}
ElementType playGame2(Stack S,int map1[][9],int x) //实现按键 Z 撤回
{
int bushu=-1;
int r, c; //人的下标
for (int i = 0; i < x; i++){
for (int j = 0; j < 9; j++){
if (map1[i][j] == 5||map1[i][j]==8){
r = i;
c = j;
}
}
}
char ch;
ch = Pop(S); //将键盘的输入保存到字符中
switch (ch)
{
case 'W':
if (map1[r + 1][c] == 0 || map1[r + 1][c] == 3) //如果人的下面为空地或者目的地
{
map1[r + 1][c] += 5;//人下面那个地方就变为人
map1[r][c] -= 5;//人的位置变为空地或者目的地
}
break;
case 'w':
case 72:
if (map1[r - 1][c] == 4 || map1[r - 1][c] == 7)//如果人的上面有箱子或者有箱子的目的地
{
if (map1[r + 1][c] == 0 || map1[r + 1][c] == 3) //如果人的下面为空地或者目的地
{
map1[r - 1][c] -= 4;//人的上面变为空地或者目的地
map1[r][c] -= 1;//人的位置变为箱子或者有箱子的目的地
map1[r + 1][c] += 5;//人的下面变为人
}
}
break;
case 'S': //enter按键的作用 确认 返回
if (map1[r - 1][c] == 0|| map1[r - 1][c] == 3) //如果人的上面为空地或者目的地
{
map1[r - 1][c] += 5; //人上面那个地方就变为人
map1[r][c] -= 5;//人的位置变为空地或者目的地
}
break;
case 's':
case 80:
if (map1[r + 1][c] == 4 || map1[r+ 1][c] == 7)//如果人的下面有箱子或者有箱子的目的地
{
if (map1[r - 1][c] == 0|| map1[r - 1][c] == 3) //如果人的上面为空地或者目的地
{
map1[r + 1][c] -= 4;//人的下面变为空地或者目的地
map1[r][c] -= 1;//人的位置变为箱子或者有箱子的目的地
map1[r - 1][c] += 5;//人的上面变为人
}
}
break;
case 'A':
if (map1[r][c + 1] == 0 || map1[r][c + 1] == 3)//如果人的右面为空地或者目的地
{
map1[r][c + 1] += 5;//人的右面变为人
map1[r][c] -= 5;//人的位置变为空地或者目的地
}
break;
case 'a':
case 75:
if (map1[r][c - 1] == 4 || map1[r][c - 1] == 7)//如果人的左面有箱子或者有箱子的目的地
{
if (map1[r][c + 1] == 0 || map1[r][c + 1] == 3)//如果人的右面为空地或者目的地
{
map1[r ][c - 1] -= 4;//人的左面变为空地或者目的地
map1[r][c] -= 1;//人的位置变为箱子或者有箱子的目的地
map1[r][c + 1] += 5;//人的右面变为人
}
}
break;
case 'D':
if (map1[r ][c - 1] == 0 || map1[r ][c - 1] == 3)//如果人的左面为空地或者目的地
{
map1[r ][c - 1] += 5;//人的左面变为人
map1[r][c] -= 5;//人的位置变为空地或者目的地
}
break;
case 'd':
case 77:
if (map1[r][c + 1] == 4 || map1[r][c + 1] == 7)//如果人的右面有箱子或者有箱子的目的地
{
if (map1[r ][c - 1] == 0 || map1[r ][c - 1] == 3)//如果人的左面为空地或者目的地
{
map1[r][c + 1] -= 4;//人的右面变为空地或者目的地
map1[r][c] -= 1;//人的位置变为箱子或者有箱子的目的地
map1[r ][c - 1] += 5;//人的左面变为人
}
}
break;
case 27:
exit(0);
}
return bushu;
}
推箱子_C语言
最新推荐文章于 2022-06-18 11:24:39 发布