走迷宫之推箱子

这篇具有很好参考价值的文章主要介绍了走迷宫之推箱子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

在上一篇文章当中我介绍了一个走迷宫的写法,但是那个迷宫没什么可玩性和趣味性,所以我打算在迷宫的基础上加上一个推箱子,使之有更好的操作空间,从而增强了游戏的可玩性和趣味性。

1. 打印菜单

void menu()
{
	printf("|---------------------------------------|\n");
	printf("|                                       |\n");
	printf("|                走迷宫                 |\n");
	printf("|                1.Start                |\n");
	printf("|                2.Exit                 |\n");
	printf("|                e.Restart              |\n");
	printf("|                                       |\n");
	printf("|---------------------------------------|\n");
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("选择有误,请重新选择!\a\n");
		}
	} while (input);
}

2. 分析迷宫的组成要素

迷宫的组成要素无非就是:墙、路、入口、出口,根据这些要素我们可以设置一个数组然后随机给其赋值为0,1,2,3,当数组等于0时打印路(这里用空格代替),等于1时打印墙(这里用█代替),等于2打印入口(这里用S代替),等于3时打印出口(这里用E代替)。

3. 实现迷宫的组成要素

因为这些要素的生成都与随机数有关,所以这里就要使用到time函数、srand函数和rand函数来进行随机数的生成。

#include<time.h>
srand((time(NULL))
int x = rand();

3.1 生成路

给数组初始化为0生成路,后面再用随机数生成。

  for (int i = 0; i < SIZE; i++)
  {
      for (int j = 0; j < SIZE; j++)
      {
          maze[i][j] = 0;
      }
  }

3.2 生成围墙

还需要设置围墙将我们的迷宫围起来,防止数组的越界访问。

for (int i = 0; i < SIZE; i++)
{
    maze[0][i] = 1;
    maze[i][0] = 1;
    maze[SIZE - 1][i] = 1;
    maze[i][SIZE - 1] = 1;
}

3.3 生成入口、出口和箱子

因为入口、出口和箱子(我在这里只设置了一个)都是只有一个,所以这里我们需要单独使用随机数生成入口、出口和箱子。

  //设置入口
 int start_x = rand() % SIZE;
 int start_y = rand() % SIZE;
 maze[start_y][start_x] = 2;
 //设置出口
 int end_x = rand() % SIZE;
 int end_y = rand() % SIZE;
 maze[end_y][end_x] = 3;
 //设置箱子
 int box_x = rand() % SIZE;
 int box_y = rand() % SIZE;
 maze[box_y][box_x] = 4;

3.4 防止入口、出口和箱子出现在错误的位置上

这里使用了goto语句

3.4.1 防止入口和出口出现在围墙上

 again:
 //防止入口或出口出现在围墙上
  if (start_x == 0 || start_x == SIZE - 1 || start_y == 0 || start_y == SIZE - 1
      || end_x == 0 || end_x == SIZE - 1 || end_y == 0 || end_y == SIZE - 1
      || box_x == 0 || box_x == SIZE - 1 || box_y == 0 || box_y == SIZE - 1)
      goto again;

3.41 防止箱子出现在围墙的边上

因为如果箱子出现在边上,这个箱子就推不了左右了。所以需要防止箱子出现在围墙的边上

again:
//防止箱子出现在边上
if (box_y == 1 || box_y == SIZE || box_x == 1 || box_x == SIZE)
    goto again;

3.5 生成墙

for (int i = 0; i < SIZE; i++)
{
    for (int j = 0; j < SIZE; j++)
    {
        if (maze[i][j] != 2 && maze[i][j] != 3)
        {
            if (rand() % 4 == 0)
            {
                maze[i][j] = 1;
            }
        }
    }
}

4. 操作移动

4.1 getch函数

在这里用到了getch()函数,这个函数需要用#include <conio.h>来进行调用。

#include <conio.h>
int main()
{
	while (1)
	{
		int x = getch(); 
		if (x == 'w')
			printf("上\n");
		if (x == 'a')
			printf("左\n");
		if (x == 's')
			printf("下\n");
		if (x == 'd')
			printf("右\n");
	}
	return 0;
}

走迷宫之推箱子,c语言,c语言,游戏

4.2 操作S的移动: 

输入w向上移动,输入s向下移动,输入a向左移动,输入d向右移动。

以输入w向上移动为例:

需要满足S的上一个格子是路,也就是需要满足maze[start_y - 1][start_x] == 0才会接受向上移动的信息,而要想实现一个向上移动的效果,我们就需要将原来的位置变为路也就是使maze[start_y][start_x] = 0;,然后使原来位置的上一个变为S也就是 start_y--; maze[start_y][start_x] = 2;

完整的移动代码: 

if (x == 'w')//上
    {
        if (maze[start_y - 1][start_x] == 0)
        {
            maze[start_y][start_x] = 0;
            start_y--;
            maze[start_y][start_x] = 2;
        }
    }

其中system("cls")函数的作用是清屏,它需要使用#icnldue<stdlib.h>进行调用。 

4.3 操作箱子的移动: 

以向上移动为例:

箱子可以向上移动的前提是:

1.箱子出现在S的上面,也就是maze[start_y - 1][start_x] == 4

2.箱子的上面不是墙,也就是maze[box_y - 1][box_x] != 1

实现一个向上移动的效果:

实现这个移动效果的写法与移动S的写法相同

if (x == 'w')//上
{
    if (maze[start_y - 1][start_x] == 4)
    {
            if (maze[box_y - 1][box_x] != 1)
            {
                maze[box_y][box_x] = 0;
                box_y--;
                maze[box_y][box_x] = 4;
            }
    }

4.5 完整移动代码: 

do
{
    system("cls");
    print_maze(maze);
    int x = getch();
    if (x == 'w')//上
    {
        if (maze[start_y - 1][start_x] == 4)
        {
                if (maze[box_y - 1][box_x] != 1)
                {
                    maze[box_y][box_x] = 0;
                    box_y--;
                    maze[box_y][box_x] = 4;
                }
        }
        if (maze[start_y - 1][start_x] != 1 && maze[start_y - 1][start_x] != 4&& maze[start_y - 1][start_x] != 3)
        {
            maze[start_y][start_x] = 0;
            start_y--;
            maze[start_y][start_x] = 2;
        }
       
    }
    if (x == 'a')//左
    {
        if (maze[start_y][start_x - 1] == 4)
        {
            if (maze[box_y][box_x - 1] != 1)
            {
                maze[box_y][box_x] = 0;
                box_x--;
                maze[box_y][box_x] = 4;
            }
        }
        if (maze[start_y][start_x - 1] != 1 && maze[start_y][start_x - 1] != 4 && maze[start_y][start_x - 1] != 3)
        {
            maze[start_y][start_x] = 0;
            start_x--;
            maze[start_y][start_x] = 2;
        }
    }
    if (x == 's')//下
    {
        if (maze[start_y + 1][start_x] == 4)
        {
            if (maze[box_y + 1][box_x] != 1)
            {
                maze[box_y][box_x] = 0;
                box_y++;
                maze[box_y][box_x] = 4;
            }
        }
        if (maze[start_y + 1][start_x] != 1 && maze[start_y + 1][start_x] != 4 && maze[start_y + 1][start_x] != 3)
        {
            maze[start_y][start_x] = 0;
            start_y++;
            maze[start_y][start_x] = 2;
        }
    }
    if (x == 'd')//右
    {
        if (maze[start_y][start_x + 1] == 4)
        {
            if (maze[box_y][box_x + 1] != 1)
            {
                maze[box_y][box_x] = 0;
                box_x++;
                maze[box_y][box_x] = 4;
            }
        }
        if (maze[start_y][start_x + 1] != 1&& maze[start_y][start_x + 1] != 4 && maze[start_y][start_x + 1] != 3)
        {
            maze[start_y][start_x] = 0;
            start_x++;
            maze[start_y][start_x] = 2;
        }
    }
  
} while (1);

其中system("cls")函数的作用是清屏,它需要使用#icnldue<stdlib.h>进行调用。 

5. 游戏的结束与游戏的重开

当门的位置等于箱子也就是maze[end_y][end_x] == 4即为通关成功。

加一个e的指令重开游戏

 if (x == 'e')
        {
            system("cls");
            printf("重新开始游戏!\n");
            break;
        }

完整代码 :

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#include<conio.h>
#define SIZE 45
//打印迷宫
void print_maze(int maze[SIZE][SIZE])
{
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {
            if (maze[i][j] == 1)
            {
                printf("█");
            }
            else if (maze[i][j] == 2)
            {
                printf("S");//入口
            }
            else if (maze[i][j] == 3)
            {
                printf("E");//出口
            }
            else if (maze[i][j] == 4)
            {
                printf("@");//箱子
            }
            else
            {
                printf(" ");
            }
        }
        printf("\n");
    }
    printf("\n");
}

void generate_maze(int maze[SIZE][SIZE])
{
again:
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {
            maze[i][j] = 0;
        }
    }
    //围墙
    for (int i = 0; i < SIZE; i++)
    {
        maze[0][i] = 1;
        maze[i][0] = 1;
        maze[SIZE - 1][i] = 1;
        maze[i][SIZE - 1] = 1;
    }
    //设置入口
    int start_x = rand() % SIZE;
    int start_y = rand() % SIZE;
    maze[start_y][start_x] = 2;
    //设置出口
    int end_x = rand() % SIZE;
    int end_y = rand() % SIZE;
    maze[end_y][end_x] = 3;
    //设置箱子
    int box_x = rand() % SIZE;
    int box_y = rand() % SIZE;
    maze[box_y][box_x] = 4;

    //防止入口或出口出现在围墙上
    if (start_x == 0 || start_x == SIZE - 1 || start_y == 0 || start_y == SIZE - 1
        || end_x == 0 || end_x == SIZE - 1 || end_y == 0 || end_y == SIZE - 1
        || box_x == 0 || box_x == SIZE - 1 || box_y == 0 || box_y == SIZE - 1)
    {
        goto again;
    }
    //防止箱子出现在边上
    if (box_y == 1 || box_y == SIZE || box_x == 1 || box_x == SIZE)
        goto again;
    //设置迷宫
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {
            if (maze[i][j] != 2 && maze[i][j] != 3 && maze[i][j] != 4)
            {
                if (rand() % 5 == 0)
                {
                    maze[i][j] = 1;
                }
            }
        }
    }
    //操作S移动
    do
    {
        system("cls");
        print_maze(maze);
        int x = getch();
        if (x == 'w')//上
        {
            if (maze[start_y - 1][start_x] == 4)
            {
                if (maze[box_y - 1][box_x] != 1)
                {
                    maze[box_y][box_x] = 0;
                    box_y--;
                    maze[box_y][box_x] = 4;
                }
            }
            if (maze[start_y - 1][start_x] != 1 && maze[start_y - 1][start_x] != 4 && maze[start_y - 1][start_x] != 3)
            {
                maze[start_y][start_x] = 0;
                start_y--;
                maze[start_y][start_x] = 2;
            }

        }
        if (x == 'a')//左
        {
            if (maze[start_y][start_x - 1] == 4)
            {
                if (maze[box_y][box_x - 1] != 1)
                {
                    maze[box_y][box_x] = 0;
                    box_x--;
                    maze[box_y][box_x] = 4;
                }
            }
            if (maze[start_y][start_x - 1] != 1 && maze[start_y][start_x - 1] != 4 && maze[start_y][start_x - 1] != 3)
            {
                maze[start_y][start_x] = 0;
                start_x--;
                maze[start_y][start_x] = 2;
            }
        }
        if (x == 's')//下
        {
            if (maze[start_y + 1][start_x] == 4)
            {
                if (maze[box_y + 1][box_x] != 1)
                {
                    maze[box_y][box_x] = 0;
                    box_y++;
                    maze[box_y][box_x] = 4;
                }
            }
            if (maze[start_y + 1][start_x] != 1 && maze[start_y + 1][start_x] != 4 && maze[start_y + 1][start_x] != 3)
            {
                maze[start_y][start_x] = 0;
                start_y++;
                maze[start_y][start_x] = 2;
            }
        }
        if (x == 'd')//右
        {
            if (maze[start_y][start_x + 1] == 4)
            {
                if (maze[box_y][box_x + 1] != 1)
                {
                    maze[box_y][box_x] = 0;
                    box_x++;
                    maze[box_y][box_x] = 4;
                }
            }
            if (maze[start_y][start_x + 1] != 1 && maze[start_y][start_x + 1] != 4 && maze[start_y][start_x + 1] != 3)
            {
                maze[start_y][start_x] = 0;
                start_x++;
                maze[start_y][start_x] = 2;
            }
        }

        if (maze[end_y][end_x] == 4)
        {
            system("cls");
            print_maze(maze);
            printf("恭喜你成功通关!\n");
            break;
        }
        if (x == 'e')
        {
            system("cls");
            printf("重新开始游戏!\n");
            break;
        }
    } while (1);

}
void menu()
{
    printf("|---------------------------------------|\n");
    printf("|                                       |\n");
    printf("|                走迷宫                 |\n");
    printf("|                1.play                 |\n");
    printf("|                2.exit                 |\n");
    printf("|                                       |\n");
    printf("|---------------------------------------|\n");
}



void game()
{
    srand(time(NULL));
    int maze[SIZE][SIZE];
    //打印迷宫
    generate_maze(maze);
}

int main()
{
    int input = 0;
    do
    {
        menu();
        printf("请选择:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏!\n");
            break;
        default:
            printf("选择有误,请重新选择!\a\n");
        }
    } while (input);
}

效果图: 

走迷宫之推箱子,c语言,c语言,游戏

以上就是《走迷宫之推箱子》的全部内容啦,如果上述内容对你有帮助的话不要忘记点上一个关注支持一下小编呦,期待我们下次再见。文章来源地址https://www.toymoban.com/news/detail-796142.html

到了这里,关于走迷宫之推箱子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java版本实现推箱子小游戏

    推方块 游戏简介: 由 ↑,↓,←,→键来控制方向,点击空格键表示重玩当前关卡。 核心代码部分 :就是如何处理人的移动和人和箱子一起时的移动,这里需要对人要走的下一步和人推着箱子一起走的下一步进行判断分析,如果没有被阻挡就可以继续走下一步。(有兴趣

    2024年02月11日
    浏览(53)
  • Unity游戏源码分享-3d机器人推箱子游戏

    Unity游戏源码分享-3d机器人推箱子游戏 一个非常意思的3D游戏    工程地址:https://download.csdn.net/download/Highning0007/88098014

    2024年02月15日
    浏览(51)
  • python小游戏 推箱子小游戏设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 推箱子小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 游戏简介: 经典

    2024年02月08日
    浏览(74)
  • C/C++项目实战-推箱子小游戏

    2024年02月08日
    浏览(52)
  • 【c语言】推箱子

    所需知识:c语言枚举,数组,for循环,while循环,switch,case语句,图形库相关函数 将printmap()在main中调用 为了让程序不会输入字符后退出,加上while循环 为了保证游戏的美观性,我们将对应的数字转化为好看的图案 使用两层循环遍历二维数组,在使用switch已经将对应的数字用

    2024年02月08日
    浏览(47)
  • 【HTML小游戏】推箱子网页版(附完整源码)

    最近刚刚更新完了HTML,CSS的万字总结 ,有很多人已经学习完了文章,感觉反馈还不错,今天,用HTML,CSS,JS的知识编写了一个童年经典游戏 - 推箱子,供学习参考。 游戏主界面展示: 游戏界面展示: 经典的推箱子是一个非常古老游戏,甚至是80,90年代的回忆,目的是在训

    2024年02月04日
    浏览(52)
  • python毕设分享 python推箱子小游戏

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 推箱子小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: htt

    2024年02月05日
    浏览(40)
  • 怎样使用Pyglet库给推箱子游戏画关卡地图

    目录 pyglet库 画图事件 按键事件 程序扩展 关卡地图 是一个跨平台的Python多媒体库,提供了一个简单易用的接口来创建窗口、加载图像和视频、播放音频、处理用户输入事件以及进行2D图形绘制。特别适合用于游戏开发、视听应用以及其它需要高效图形渲染和音频播放的项目

    2024年02月22日
    浏览(42)
  • python项目分享 推箱子小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 推箱子小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: htt

    2024年01月23日
    浏览(53)
  • 毕业设计 单片机推箱子游戏(AT89C51)

    一、电路设计 此电路由AT89C51最小系统、LCD12864显示模块、74LS08芯片和四个独立按键组成。 LCD12864显示模块 带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体 中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置

    2024年02月21日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包