推箱子_C语言

/*主要功能分析:使用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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AKA小徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值