C语言 推箱子游戏

这是一个简单的推箱子游戏,使用Visual C++ 6.0 进行编程。
部分关卡参照手机推箱子游戏而设计,只需要把二维数组int map[9][11]进行自我修改,即可设计出自己想要的地图。

代码如下:

#include <stdio.h>  
#include <conio.h>
#include<stdlib.h>
#include<windows.h> 

int map0[9][11] = {
    {1,1,1,1,1,1,1,1,1,1,1},  //0代表空地
    {1,5,4,3,0,0,0,0,0,0,1},  //1代表墙
    {1,0,0,0,0,0,0,0,0,0,1},  //3代表目的地
    {1,0,0,0,0,0,0,0,0,0,1},  //4代表箱子
    {1,0,0,0,0,0,0,0,0,0,1},  //5代表人 
    {1,0,0,0,0,0,0,0,0,0,1},  //7代表箱子在目的地
    {1,0,0,0,0,0,0,0,0,0,1},  //8代表人在目的地
    {1,0,0,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1,1,1} };

int map1[9][11] = {
    {0,0,0,0,0,0,0,0,0,0,0},  //0代表空地
    {0,0,1,1,1,1,0,0,0,0,0},  //1代表墙
    {0,0,1,0,0,1,1,1,0,0,0},  //3代表目的地
    {0,0,1,0,0,4,5,1,0,0,0},  //4代表箱子
    {0,0,1,0,7,3,0,1,0,0,0},  //5代表人 
    {0,0,1,1,0,0,0,1,0,0,0},  //7代表箱子在目的地
    {0,0,0,1,1,1,1,1,0,0,0},  //8代表人在目的地
    {0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0} };

int map2[9][11] = {
    {0,0,1,1,1,1,1,0,0,0,0},  //0代表空地
    {0,0,1,0,0,0,1,1,0,0,0},  //1代表墙
    {0,0,1,0,0,7,0,1,1,1,0},  //3代表目的地
    {0,0,1,1,0,7,0,5,0,1,0},  //4代表箱子
    {0,0,0,1,0,7,0,0,0,1,0},  //5代表人 
    {0,0,0,1,4,3,4,1,1,1,0},  //7代表箱子在目的地
    {0,0,0,1,0,3,0,1,0,0,0},  //8代表人在目的地
    {0,0,0,1,1,1,1,1,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0} };

int map3[9][11] = {
    {0,0,1,1,1,1,0,0,0,0,0},  //0代表空地
    {0,0,1,0,0,1,0,0,0,0,0},  //1代表墙
    {0,0,1,0,0,1,1,1,0,0,0},  //3代表目的地
    {0,0,1,0,0,4,0,1,0,0,0},  //4代表箱子
    {0,0,1,1,7,1,3,1,0,0,0},  //5代表人 
    {0,0,1,0,0,5,0,1,0,0,0},  //7代表箱子在目的地
    {0,0,1,0,0,0,0,1,0,0,0},  //8代表人在目的地
    {0,0,1,0,0,1,1,1,0,0,0},
    {0,0,1,1,1,1,0,0,0,0,0} };

int map4[9][11] = {
    {0,0,0,0,0,0,0,0,0,0,0},  //0代表空地
    {0,0,1,1,1,1,0,0,0,0,0},  //1代表墙
    {0,0,1,0,0,1,0,0,0,0,0},  //3代表目的地
    {0,0,1,0,0,1,0,0,0,0,0},  //4代表箱子
    {0,0,1,0,5,1,1,1,0,0,0},  //5代表人 
    {0,0,1,0,4,4,0,1,0,0,0},  //7代表箱子在目的地
    {0,0,1,3,0,0,3,1,0,0,0},  //8代表人在目的地
    {0,0,1,1,1,1,1,1,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0} };

int map5[9][11] = {
    {0,0,0,0,0,0,0,0,0,0,0},  //0代表空地
    {0,0,0,1,1,1,1,1,0,0,0},  //1代表墙
    {0,0,0,1,0,0,0,1,0,0,0},  //3代表目的地
    {0,0,0,1,3,1,4,1,1,0,0},  //4代表箱子
    {0,0,0,1,0,0,5,0,1,0,0},  //5代表人 
    {0,0,0,1,3,0,4,0,1,0,0},  //7代表箱子在目的地
    {0,0,0,1,1,1,0,0,1,0,0},  //8代表人在目的地
    {0,0,0,0,0,1,1,1,1,0,0},
    {0,0,0,0,0,0,0,0,0,0,0} };

int map6[9][11] = {
    {0,0,1,1,1,1,1,0,0,0,0},  //0代表空地
    {0,1,1,0,0,3,1,0,0,0,0},  //1代表墙
    {0,1,0,4,1,3,1,0,0,0,0},  //3代表目的地
    {0,1,0,0,0,0,1,1,0,0,0},  //4代表箱子
    {0,1,1,0,1,0,0,1,0,0,0},  //5代表人 
    {0,0,1,4,0,5,0,1,0,0,0},  //7代表箱子在目的地
    {0,0,1,0,0,0,1,1,0,0,0},  //8代表人在目的地
    {0,0,1,1,1,1,1,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0} };

int map7[9][11] = {
    {0,0,0,0,0,0,0,0,0,0,0},  //0代表空地
    {0,1,1,1,1,1,1,0,0,0,0},  //1代表墙
    {0,1,0,0,0,0,1,0,0,0,0},  //3代表目的地
    {0,1,0,4,4,4,1,1,0,0,0},  //4代表箱子
    {0,1,0,0,1,3,3,1,1,1,0},  //5代表人 
    {0,1,1,0,0,3,3,4,0,1,0},  //7代表箱子在目的地
    {0,0,1,0,5,0,0,0,0,1,0},  //8代表人在目的地
    {0,0,1,1,1,1,1,1,1,1,0},
    {0,0,0,0,0,0,0,0,0,0,0} };

int map8[9][11] = {
    {0,0,0,1,1,1,1,0,0,0,0},  //0代表空地
    {0,1,1,1,0,5,1,1,1,0,0},  //1代表墙
    {0,1,0,3,0,3,0,0,1,0,0},  //3代表目的地
    {0,1,0,4,4,0,0,0,1,0,0},  //4代表箱子
    {0,1,1,1,0,7,1,1,1,0,0},  //5代表人 
    {0,0,0,1,0,0,1,0,0,0,0},  //7代表箱子在目的地
    {0,0,0,1,0,0,1,0,0,0,0},  //8代表人在目的地
    {0,0,0,1,1,1,1,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0} };

int map9[9][11] = {
    {0,0,0,0,0,0,0,0,0,0,0},  //0代表空地
    {0,0,1,1,1,1,1,1,1,0,0},  //1代表墙
    {0,0,1,0,4,3,0,0,1,0,0},  //3代表目的地
    {0,0,1,0,0,3,3,3,1,0,0},  //4代表箱子
    {0,0,1,1,4,0,7,0,1,0,0},  //5代表人 
    {0,0,1,5,4,0,4,1,1,0,0},  //7代表箱子在目的地
    {0,0,1,0,0,0,0,1,0,0,0},  //8代表人在目的地
    {0,0,1,1,1,1,1,1,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0} };

int map10[9][11] = {
    {0,0,1,1,1,1,1,1,1,0,0},  //0代表空地
    {0,0,1,0,3,1,3,0,1,0,0},  //1代表墙
    {0,0,1,0,0,4,0,0,1,0,0},  //3代表目的地
    {0,0,1,3,4,0,4,3,1,0,0},  //4代表箱子
    {0,0,1,0,4,5,4,0,1,0,0},  //5代表人 
    {0,0,1,3,4,0,4,3,1,0,0},  //7代表箱子在目的地
    {0,0,1,0,0,4,0,0,1,0,0},  //8代表人在目的地
    {0,0,1,0,3,1,3,0,1,0,0},
    {0,0,1,1,1,1,1,1,1,0,0} };

int map11[9][11] = {
    {0,0,0,1,1,1,1,0,0,0,0},  //0代表空地
    {0,0,0,1,5,0,1,0,0,0,0},  //1代表墙
    {0,0,0,1,0,4,1,1,1,0,0},  //3代表目的地
    {0,1,1,1,4,0,0,3,1,0,0},  //4代表箱子
    {0,1,0,0,0,0,1,0,1,0,0},  //5代表人 
    {0,1,0,7,4,3,0,0,1,0,0},  //7代表箱子在目的地
    {0,1,1,1,0,3,1,1,1,0,0},  //8代表人在目的地
    {0,0,0,1,0,0,1,0,0,0,0},
    {0,0,0,1,1,1,1,0,0,0,0} };

int map12[9][11] = {
    {0,0,0,0,0,1,1,1,1,0,0},  //0代表空地
    {0,0,1,1,1,1,0,5,1,0,0},  //1代表墙
    {0,0,1,0,0,4,4,0,1,0,0},  //3代表目的地
    {0,0,1,0,3,0,4,0,1,0,0},  //4代表箱子
    {0,0,1,1,3,3,0,1,1,0,0},  //5代表人 
    {0,0,0,1,1,1,1,1,0,0,0},  //7代表箱子在目的地
    {0,0,0,0,0,0,0,0,0,0,0},  //8代表人在目的地
    {0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0} };

int map13[9][11] = {
    {0,0,1,1,1,1,0,0,0,0,0},  //0代表空地
    {0,0,1,0,0,1,1,0,0,0,0},  //1代表墙
    {0,0,1,5,3,0,1,0,0,0,0},  //3代表目的地
    {0,0,1,3,7,4,1,1,0,0,0},  //4代表箱子
    {0,0,1,0,0,4,0,1,0,0,0},  //5代表人 
    {0,0,1,0,0,0,0,1,0,0,0},  //7代表箱子在目的地
    {0,0,1,1,1,1,1,1,0,0,0},  //8代表人在目的地
    {0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0} };


int map14[9][11] = {
    {0,0,0,0,0,0,0,0,0,0,0},  //0代表空地
    {0,1,1,1,1,1,1,0,0,0,0},  //1代表墙
    {0,1,0,0,0,0,1,1,1,0,0},  //3代表目的地
    {0,1,0,0,0,3,3,0,1,0,0},  //4代表箱子
    {0,1,0,4,4,4,5,0,1,0,0},  //5代表人 
    {0,1,0,0,1,0,3,1,1,0,0},  //7代表箱子在目的地
    {0,1,1,1,1,1,1,1,0,0,0},  //8代表人在目的地
    {0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0} };

int map15[9][11] = {
    {0,1,1,1,1,1,1,1,1,1,0},  //0代表空地
    {0,1,0,0,0,1,0,0,0,1,0},  //1代表墙
    {0,1,0,4,4,4,4,4,0,1,0},  //3代表目的地
    {0,1,0,4,0,4,0,4,0,1,1},  //4代表箱子
    {0,1,0,0,0,0,0,0,4,0,1},  //5代表人 
    {1,1,0,1,1,1,1,0,4,0,1},  //7代表箱子在目的地
    {1,0,8,3,3,3,3,1,0,0,1},  //8代表人在目的地
    {1,0,3,3,3,3,3,0,0,1,1},
    {1,1,1,1,1,1,1,1,1,1,0} };

//绘制地图  //二维数组+switch()
void DrawMap(int map[][11])
{
    //遍历二维数组         
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 11; j++)
        {
            switch (map[i][j])
            {
            case 0:
                printf("  ");//0 打印空格
                break;
            case 1:
                printf("■");//1 墙
                break;
            case 3:
                printf("☆");//3 目的地
                break;
            case 4:
                printf("□");//4 箱子
                break;
            case 5:
                printf("♀");//5 小人
                break;
            case 7:     
                printf("★");//4 + 3  箱子在目的地中
                break;
            case 8:      
                printf("♀");// 5 + 3  人在目的地当中
                break;
            }
        }
        printf("\n");
    }
}


void PlayGame(int map[][11])
{
    int r, c;  //人的下标  
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 11; j++)
        {
            if (map[i][j] == 5||map[i][j]==8)   //i j 人的下标
            {
                r = i;
                c = j;
            }
        }
    }

    char ch;  //字符变量
    ch = getch();  //键盘的输入保存到字符中
    switch (ch)
    {
    case 'W':  //W A S D方向 72  80  75  77
    case 'w':
	case 72:
        if (map[r - 1][c] == 0|| map[r - 1][c] == 3) 
        {
            map[r - 1][c] += 5;
            map[r][c] -= 5;
        }
        else if (map[r - 1][c] == 4 || map[r - 1][c] == 7)
        {
            if (map[r - 2][c] == 0 || map[r - 2][c] == 3)
            {
                map[r - 2][c] += 4;
                map[r - 1][c] += 1;
                map[r][c] -= 5;
            }
        }
        break;

    case 'S':  
    case 's':
	case 80:
        if (map[r + 1][c] == 0 || map[r + 1][c] == 3)
        {
            map[r + 1][c] += 5;
            map[r][c] -= 5;
        }
        else if (map[r + 1][c] == 4 || map[r+ 1][c] == 7)
        {
            if (map[r + 2][c] == 0 || map[r + 2][c] == 3)
            {
                map[r + 2][c] += 4;
                map[r + 1][c] += 1;
                map[r][c] -= 5;
            }
        }
        break;

    case 'A':
    case 'a':
	case 75:
        if (map[r ][c - 1] == 0 || map[r ][c - 1] == 3)
        {
            map[r ][c - 1] += 5;
            map[r][c] -= 5;
        }
        else if (map[r][c - 1] == 4 || map[r][c - 1] == 7)
        {
            if (map[r ][c - 2] == 0 || map[r ][c - 2] == 3)
            {
                map[r ][c - 2] += 4;
                map[r ][c - 1] += 1;
                map[r][c] -= 5;
            }
        }
        break;

    case 'D':
    case 'd':
	case 77:
        if (map[r][c + 1] == 0 || map[r][c + 1] == 3)
        {
            map[r][c + 1] += 5;
            map[r][c] -= 5;
        }
        else if (map[r][c + 1] == 4 || map[r][c + 1] == 7)
        {
            if (map[r][c + 2] == 0 || map[r][c + 2] == 3)
            {
                map[r][c + 2] += 4;
                map[r][c + 1] += 1;
                map[r][c] -= 5;
            }
        }
        break;
    }
}

int judgepoint(int map[][11])
{
	int i,j;
	for(i=0;i<9;i++)
	{
		for(j=0;j<11;j++)
		{
			if(map[i][j]==0||map[i][j]==1||map[i][j]==3||map[i][j]==5||map[i][j]==7||map[i][j]==8)
			{
				if(i==8&&j==10)
				{
					return 0;//过关	
				}
			}else
			{
				break;
			}
		}
		if(map[i][j]==4)
			break;
	}
}

void play(int map0[][11])
{
	char ch;
	int n=1;
	while (n)
    {
        system("cls");
		n=judgepoint(map0);
        DrawMap(map0);
        PlayGame(map0);
    }
	printf("\n真厉害!恭喜你过关啦!\n");
	printf("5秒后返回界面...\n");
	Sleep(5000);
	system("cls");
}



void begin()
{
	printf("******************************************************\n");
	printf("*   *    *            *    *                         *\n");
	printf("*   *   *   *        **** *****    ***********       *\n");
	printf("* **** ** *****    ** * **   *            ***        *\n");
	printf("*   * * *   *         *  *****           ***         *\n");
	printf("*   **  * *****    ***** *   *    **************     *\n");
	printf("*  **   *   *         *  *****           **          *\n");
	printf("* * *   * *****      *** *****           **          *\n");
	printf("* ***  **   *       * *  *   *         ****          *\n");
	printf("*   *   * *****    *  *  *****           **          *\n");
	printf("*                                                    *\n");
	printf("* 1,现有关卡共15关,请玩家斟酌选择;                *\n");
	printf("* 2,提示:                                          *\n");
	printf("*    人♀ 箱子□ 目的地☆ 到位后★ 墙■              *\n");
	printf("*    上W      下S       左A       右D                *\n");
	printf("* 3,推完请随便移动一步(判定过关)                   *\n");
	printf("******************************************************\n");
}

int main()  //主函数
{
	int s;
	while(1)
	{
		begin();
		printf("请输入关卡:");
		scanf("%d",&s);
		printf("加载中...");
		Sleep(3000);
		system("cls");

		switch(s)
		{
			case 0:play(map0);break;
			case 1:play(map1);break;
			case 2:play(map2);break;
			case 3:play(map3);break;
			case 4:play(map4);break;
			case 5:play(map5);break;
			case 6:play(map6);break;
			case 7:play(map7);break;
			case 8:play(map8);break;
			case 9:play(map9);break;
			case 10:play(map10);break;
			case 11:play(map11);break;
			case 12:play(map12);break;
			case 13:play(map13);break;
			case 14:play(map14);break;
			case 15:play(map15);break;
			default:printf("输入有误!\n\a");
		}
	}
    return 0;
}
推箱子游戏是一种经典的益智游戏,以下是一个简单的C语言推箱子游戏示例。注意,这个示例只实现了最基本的功能,没有进行美化和优化。 ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define WIDTH 10 #define HEIGHT 10 char map[HEIGHT][WIDTH] = { "##########", "# #", "# o * #", "# #", "# ######", "# #", "#### * #", "# o #", "# #", "##########" }; // 地图 int playerX, playerY; // 玩家位置 int boxX, boxY; // 箱子位置 // 打印地图 void printMap() { system("cls"); // 清屏 for (int i = 0; i < HEIGHT; i++) { for (int j = 0; j < WIDTH; j++) { printf("%c", map[i][j]); } printf("\n"); } } // 移动玩家 void movePlayer(int dx, int dy) { if (map[playerY + dy][playerX + dx] == ' ') { map[playerY][playerX] = ' '; playerX += dx; playerY += dy; map[playerY][playerX] = 'o'; } else if (map[playerY + dy][playerX + dx] == '*') { if (map[boxY + dy][boxX + dx] == ' ') { map[playerY][playerX] = ' '; playerX += dx; playerY += dy; map[playerY][playerX] = 'o'; map[boxY][boxX] = ' '; boxX += dx; boxY += dy; map[boxY][boxX] = '*'; } } } int main() { // 初始化位置 for (int i = 0; i < HEIGHT; i++) { for (int j = 0; j < WIDTH; j++) { if (map[i][j] == 'o') { playerX = j; playerY = i; } else if (map[i][j] == '*') { boxX = j; boxY = i; } } } printMap(); // 打印地图 while (true) { char input = getchar(); switch (input) { case 'w': movePlayer(0, -1); break; case 's': movePlayer(0, 1); break; case 'a': movePlayer(-1, 0); break; case 'd': movePlayer(1, 0); break; default: break; } printMap(); // 打印地图 // 判断是否成功通关 if (map[boxY][boxX] == '#' && map[boxY - 1][boxX] == '#' && map[boxY][boxX - 1] == '#' && map[boxY - 1][boxX - 1] == '#') { printf("恭喜你通关了!\n"); break; } } return 0; } ``` 该游戏使用二维字符数组作为地图,玩家用字母“o”表示,箱子用符号“*”表示,墙用符号“#”表示,空白地方用空格表示。玩家可以通过键盘输入w、s、a、d四个方向键来移动,玩家只能推着箱子移动,不能拉着箱子移动。当箱子被推到目标位置时,通关成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值