推箱子(C语言)

#include <stdio.h>
#include<windows.h>
#include<time.h>
//#include<stdlib.h>
#define kRows 15
#define kCols 16
//#define time 90

int m;


/* 定义变量 */
char map[kRows][kCols];
//定义变量保存位置信息
//定义小人当前位置信息
int personX;
int personY;
//小人将要移动的下一个位置信息
int personNextX;
int personNextY;

//定义箱子的当前的位置
int boxX;
int boxY;

//定义变量接收用户输入的方向
char direction;

//定义路的字符
char street;
char boxFlag;
/* 定义变量 */

void printMap(char map[kRows][kCols]){ int i=0;
    
    for ( i=0; i<kRows; i++) /*二维数组按行输出 一个I即可*/
	{
        printf("%s\n",map[i]);
    }
    
}


void move1(char map[kRows][kCols],int oldX,int oldY,int newX,int newY){
    
    //交换两个位置的字符
    char temp;
    temp = map[oldX][oldY];
    map[oldX][oldY] = map[newX][newY];
    map[newX][newY] = temp;
    
}


void initMap(char map[kRows][kCols]) {
    char tempMap[kRows][kCols]={
        "###############",
        "#O ####      ##",
        "# X#          #",
        "#  #  #  ##   #",
        "#        #   ##",
        "#        #   ##",
        "########### ## ",
        "#       #    # ",
        "#            # ",
        "#   # #      # ",
        "#     ##     # ",
        "#   ########## ",
        "#            # ",
        "#            # ",
        "########## ### "};
		int i=0,j=0;
    
    for (i = 0; i < kRows; i++) {
        for ( j = 0; j < kCols; j++) {
            map[i][j] = tempMap[i][j];
        }
    }

	
		

    
    //定义变量保存位置信息
    //定义小人当前位置信息
    personX =1;
    personY =1;
    //小人将要移动的下一个位置信息
    personNextX=personX;
    personNextY=personY;
    
    //定义箱子的当前的位置
    boxX = 2;
    boxY = 2;
    
    //定义路的字符
    street =' ';

    boxFlag = 'X';
}
void initMap2(char map[kRows][kCols]){
		char tempMap[kRows][kCols]={
	    "###############",
        "#O ####  #   ##",
        "# X#        # #",
        "#  #  #  ##   #",
        "#        #   ##",
        "# #   #  #    #",
        "#########   ## ",
        "#    #  #    # ",
        "#          # # ",
        "# # # #    # # ",
        "# # # ## #   # ",
        "##  # ## ##### ",
        "#          ### ",
        "#####        # ",
        "########## ### "};
		
		int i=0,j=0;
    
    for (i = 0; i < kRows; i++) {
        for ( j = 0; j < kCols; j++) {
            map[i][j] = tempMap[i][j];
        }
    }
	    //定义变量保存位置信息
    //定义小人当前位置信息
    personX =1;
    personY =1;
    //小人将要移动的下一个位置信息
    personNextX=personX;
    personNextY=personY;
    
    //定义箱子的当前的位置
    boxX = 2;
    boxY = 2;
    
    //定义路的字符
    street =' ';
    boxFlag = 'X';
}
void initMap3(char map[kRows][kCols]){
		char tempMap[kRows][kCols]={
	    "###############",
        "#O ##     #  ##",
        "# X#   #   ## #",
        "#  #          #",
        "#        # # ##",
        "# #   ##      #",
        "# # ##      # #",
        "#       #   ## ",
        "# #  #       # ",
        "#   # #    ### ",
        "# #    #  #  # ",
        "#   #  #   # # ",
        "#      ### # # ",
        "#  ##        #",
        "########## ### "};
		
		int i=0,j=0;
    
    for (i = 0; i < kRows; i++) {
        for ( j = 0; j < kCols; j++) {
            map[i][j] = tempMap[i][j];//整体替换全局变量MAP二维数组的内容
        }
    }
	    //定义变量保存位置信息
    //定义小人当前位置信息
    personX =1;
    personY =1;
    //小人将要移动的下一个位置信息
    personNextX=personX;
    personNextY=personY;
    
    //定义箱子的当前的位置
    boxX = 2;
    boxY = 2;
    
    //定义路的字符
    street =' ';

    boxFlag = 'X';
}
void initMap4(char map[kRows][kCols]){
		char tempMap[kRows][kCols]={
	    "###############",
        "#O ##   ###   #",
        "# X#   #    # #",
        "#  #       #  #",
        "#        # # ##",
        "# #  ###  ## ##",
        "# # ##        #",
        "#  #  ###  ### ",
        "# #          # ",
        "# # # #  # ### ",
        "# #    #  #### ",
        "#   #  ##  # # ",
        "# #    ### # # ",
        "#  ##        #",
        "########## ### "};
		
		int i=0,j=0;
    
    for (i = 0; i < kRows; i++) {
        for ( j = 0; j < kCols; j++) {
            map[i][j] = tempMap[i][j];
        }
    }
	    //定义变量保存位置信息
    //定义小人当前位置信息
    personX =1;
    personY =1;
    //小人将要移动的下一个位置信息
    personNextX=personX;
    personNextY=personY;
    
    //定义箱子的当前的位置
    boxX = 2;
    boxY = 2;
    
    //定义路的字符
    street =' ';

    boxFlag = 'X';
}

	
		


void restart() {
    //******** 初始化地图 **********
    initMap(map);
    
    //*******  打印地图 **********

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED);//颜色
		printf("*****先来个最简单的试试手*****\n");
    printf("请控制小人移动:\nO.小人 X.箱子\nw.上  s.下  a.左  d.右 r.重新开始 q.退出 \n回车键确认\n");

}
void restart2() {
    //******** 初始化地图 **********
    initMap2(map);
    
    //*******  打印地图 **********
    
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED);//颜色
		printf("*****先来个最简单的试试手*****\n");
    printf("请控制小人移动:\nO.小人 X.箱子\nw.上  s.下  a.左  d.右 r.重新开始 q.退出 \n回车键确认\n");

}
void restart3() {
    //******** 初始化地图 **********
    initMap3(map);
    
    //*******  打印地图 **********
    
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED);//颜色
		printf("*****先来个最简单的试试手*****\n");
    printf("请控制小人移动:\nO.小人 X.箱子\nw.上  s.下  a.左  d.右 r.重新开始 q.退出 \n回车键确认\n");

}
void restart4() {
    //******** 初始化地图 **********
	
    initMap4(map);
    
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED);//颜色
		printf("*****先来个最简单的试试手*****\n");
    printf("请控制小人移动:\nO.小人 X.箱子\nw.上  s.下  a.左  d.右 r.重新开始 q.退出 \n回车键确认\n");

}
void judge()
{     //5、根据用户输入的方向 判断如何移动
        if (map[personNextX][personNextY] == street) {
            //        先判断小人的下一个位置是否 是路
            
            //        如果是路,先让小人移动
            //移动
            //让小人和路进行交换
            move1(map,personX,personY,personNextX,personNextY);
            
            //重新调整小人的位置
            personX = personNextX;
            personY = personNextY;
            
        }else if (map[personNextX][personNextY] == boxFlag){
            
            //        如果不是路,
            
            //              再次判断是否是箱子
            //              如果是箱子,计算箱子的下一个位置
            
            int boxNextX = boxX+(boxX-personX);
            int boxNextY = boxY+(boxY-personY);
            
            //                 再次判断箱子的下一个位置是否是路
            if (map[boxNextX][boxNextY] == street) {
                
                //                 如果箱子的下一个位置是路,要移动小人和箱子
                //                        如何移动小人和箱子呢?
                //                        1)移动箱子到箱子的下一个位置
                move1(map, boxX, boxY, boxNextX, boxNextY);
                //                        2)让小人移动到箱子的原来的位置
                move1(map, personX, personY, boxX, boxY);
                
                //重新调整 箱子的位置和小人的位置
                personX = personNextX;
                personY = personNextY;
                
                boxX = boxNextX;
                boxY = boxNextY;
                
            }
            //              如果不是箱子,什么也不干
        }}

int main() {
   
    restart();

    
mark: while (1) { _sleep(500);
        
        //3、接收用户输入的方向
        //rewind(stdin);
        scanf("%c",&direction);
        //获取一个字符从键盘
        //判断方向
        switch (direction) {
            case 'w':
            case 'W':
                //下一个位置-1
                personNextX--;
                break;
            case 's':
            case 'S':
                personNextX++;
                break;
            case 'a':
            case 'A':
                personNextY--;
                break;
            case 'd':
            case 'D':
                personNextY++;
                break;
            case 'r':
            case 'R': {
                printf("程序已经重新开始\n");
				if(m!=1&&m!=2&&m!=3){
					restart();}
				if(m==1)
				{restart2();}
				if(m==2)
				{restart3();}
				if(m==3)
				{restart4();}
            }
                break;
			case'g':
			case'G':
				boxX=kCols-2;
				break;

            case 'q':
            case 'Q':
                
                printf("程序正在退出...\n");
                printf("程序已经退出!\n");
                return 0;
                
            default:
                break;
        }
        
      judge();
        system("cls");
        
        //******   重绘地图 ***********
        // 6、重绘地图
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED );
        printMap(map);//运行一次打印一次
        //*******  判断是否走出来 ******
        // 7、判断箱子是否被推出来了
        if (boxX==kCols-2) {
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);

            printf("6666666666!\n");//通关提示
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE |FOREGROUND_INTENSITY );
			printf("*******来吧勇士 选哪一关!********\n");
			printf("1代表普通难度\n");
			printf("2困难难度\n");
			printf("3通关?不存在的\n");
			scanf("%d",&m);
			if(m==1){
			initMap2(map);
				printMap(map);
				goto mark;	
			}
		 if(m==2){
			initMap3(map);
		    	printMap(map);
			goto mark;
			}
		 if(m==3){
			 initMap4(map);
		 printMap(map);
		 goto mark;
		 }

		

		 
			break;
		}

		}


    
    return 0;

}


猜你喜欢

转载自blog.csdn.net/sunshunli/article/details/81437705