• 手把手教你用C语言写出“走迷宫”小游戏(能看懂文字就会自己敲系列)


    目录

    设计迷宫地图

    设计主角——小球

    完整代码


    这次教大家编写一个简单的“走迷宫”小游戏,我们可以通过键盘上的‘W’、‘S’、‘A’、‘D’四个键来控制一个“小球”向上,下,左,右移动,目的就是让这个“小球”从起点走出迷宫。

    设计迷宫地图

    首先,我们可以用字符‘#’表示迷宫的墙,用大写字母‘O’来表示小球

    我们可以先设计一个简单的迷宫,并用二维字符数组来存储这个迷宫。


    1. char a[50][50] = { "######",
    2. "#O # ",
    3. "# ## #",
    4. "# # #",
    5. "## #",
    6. "######",
    7. };

    迷宫设计并存储好了之后,我们可以用for循环打印出这个迷宫在屏幕上,如下代码:

    1. for (i = 0;i <= 5;i++)
    2. puts(a[i]);

    上面这个for循环从0到5,共进行6次循环,依次输出迷宫的第0~5行。puts(a[i])表示输出每一行的字符串。

    设计主角——小球

    我们可以用变量x和y来存储小球的初始位置,用变量p和q来存储迷宫的终点(出口)

    注意:字符串是从0开始计数的,千万别算错了小球的初始位置及迷宫的出口位置

    然后接下来要设计如何控制小球了,这里可以用键盘上的‘w’、‘s’、‘a’、‘d’四个按键来控制小球的行走,当然也可以按照你喜欢的按键来进行设计。

    那如何实现呢?我们希望当我们按下‘s’的时候,小球向下移动一步,所以可以用‘getch()’来获取字符(这里并不想显示输入的字符,并且希望输入的字符可以立即被程序获得,而不用在敲击一个字符后再敲击一个“enter”键,至于为什么用getch,可以看我前几篇博客有关‘getche’等的介绍)

    ch = getch();//输入的字符串存储在变量ch中

    好,我们已经实现字符串的输入了,接下来实现当敲击字符s的时候,让小球向下移动一步

    1. if (ch == 's')
    2. {
    3. if (a[x + 1][y] != '#')
    4. {
    5. a[x][y] = ' ';
    6. x++;
    7. a[x][y] = 'O';
    8. }
    9. }

    这里解释一下:首先我们用if语句判断我们输入的字符是不是‘s’,如果是字符s,我们就让小球向下移动,但是在让小球向下移动之前,需要看看下一步是否能移动(也就是说是否为‘#’)

    所以再用if语句判断一下下一步是不是‘#’(这里可能有人会问为什么a[x+1][y]表示向下走一步呢?解释:向下移动时,小球当然还在这一列,不过不在这一行了,而是在下一行,因此向下移动是y不变,x加1)

    如果是向右边移动,很明显还是在同一行,所以x不变,但是小球已经不在刚才的那一列了,而在它右边的那一列,因此y需要加1

    方向总结:

    向下移动是y不变,x加1

    向上移动是y不变,x减1
    向左移动是x不变,y减1

    向右移动是x不变,y加1

    a[x][y] = '  ';
                    x++;
                    a[x][y] = 'O';

     至于这三行的意思是,让小球向下移动,就是让小球原本位置上的“O”变成空格,且让下一格变成“O”。

    第一句a[x][y]=‘  ’;就是让小球的当前位置变成空格,x++;这句话非常重要,它表示更改小球的位置,因为小球向下运动只需要x++就行了,y不变。最后的a[x][y]=‘O’;就是将小球新位置上的内容替换为小球‘O’。

    因为小球的位置有了变化,因此还需要将新迷宫的状态重新打印一次。在打印前记得把之前的屏幕清理掉,代码如下:

    system("cls");//这个是清理屏幕的,需要包含头文件

    但是以上的代码只能只能移动一步呀,所以这里暂时用while(1)循环解决一下

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. char a[50][50] = { "######",
    7. "#O # ",
    8. "# ## #",
    9. "# # #",
    10. "## #",
    11. "######",
    12. };
    13. int i, x, y, p, q;//这里定义小球的初始位置和迷宫的终点位置
    14. char ch;
    15. x = 1;y = 1;p = 1;q = 5;
    16. for (i = 0;i <= 5;i++)
    17. puts(a[i]);
    18. while (1)
    19. {
    20. ch = getch();
    21. if (ch == 's')
    22. {
    23. if (a[x + 1][y] != '#')
    24. {
    25. a[x][y] = ' ';
    26. x++;
    27. a[x][y] = 'O';
    28. }
    29. }
    30. system("cls");
    31. for (i = 0;i <= 5;i++)
    32. {
    33. puts(a[i]);
    34. }
    35. }
    36. system("cls");
    37. Sleep(500);
    38. return 0;
    39. }

    目前小球还只能朝一个方向运动,我们接下来实现小球向其他三个方向的运动

    向其他三个方向移动其实和“向下移动”差不多,只要注意x在变化还是y在变化,是加一还是减一就行了。

    1. while (x != p || y != q)//这里把1改为迷宫的出口位置
    2. {
    3. ch = getch();
    4. if (ch == 's')
    5. {
    6. if (a[x + 1][y] != '#')
    7. {
    8. a[x][y] = ' ';
    9. x++;
    10. a[x][y] = 'O';
    11. }
    12. }
    13. if (ch == 'w')
    14. {
    15. if (a[x - 1][y] != '#')
    16. {
    17. a[x][y] = ' ';
    18. x--;
    19. a[x][y] = 'O';
    20. }
    21. }
    22. if (ch == 'a')
    23. {
    24. if (a[x][y - 1] != '#')
    25. {
    26. a[x][y] = ' ';
    27. y--;
    28. a[x][y] = 'O';
    29. }
    30. }
    31. if (ch == 'd')
    32. {
    33. if (a[x][y + 1] != '#')
    34. {
    35. a[x][y] = ' ';
    36. y++;
    37. a[x][y] = 'O';
    38. }
    39. }

    最最后,我们可以在后面游戏结束时打印“你获胜了”。

    完整代码

    如下:

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. char a[50][50] = { "######",
    7. "#O # ",
    8. "# ## #",
    9. "# # #",
    10. "## #",
    11. "######",
    12. };
    13. int i,x, y, p, q;
    14. char ch;
    15. x = 1;y = 1;p = 1;q = 5;
    16. for (i = 0;i <= 5;i++)
    17. puts(a[i]);
    18. while (x != p || y != q)
    19. {
    20. ch = getch();
    21. if (ch == 's')
    22. {
    23. if (a[x + 1][y] != '#')
    24. {
    25. a[x][y] = ' ';
    26. x++;
    27. a[x][y] = 'O';
    28. }
    29. }
    30. if (ch == 'w')
    31. {
    32. if (a[x - 1][y] != '#')
    33. {
    34. a[x][y] = ' ';
    35. x--;
    36. a[x][y] = 'O';
    37. }
    38. }
    39. if (ch == 'a')
    40. {
    41. if (a[x][y - 1] != '#')
    42. {
    43. a[x][y] = ' ';
    44. y--;
    45. a[x][y] = 'O';
    46. }
    47. }
    48. if (ch == 'd')
    49. {
    50. if (a[x][y + 1] != '#')
    51. {
    52. a[x][y] = ' ';
    53. y++;
    54. a[x][y] = 'O';
    55. }
    56. }
    57. system("cls");
    58. for (i = 0;i <= 5;i++)
    59. {
    60. puts(a[i]);
    61. }
    62. }
    63. system("cls");
    64. printf("you win!\n");
    65. Sleep(500);
    66. return 0;
    67. }

    感谢各位观看,看完自己敲一下玩玩吧,当然也可以设计更加复杂的地图,参数自己改下就行啦。

  • 相关阅读:
    算法基础之归并排序
    如何解释”字面量“?
    Linux自有服务与软件包管理
    SpringBoot 3.0 新特性,内置声明式HTTP客户端
    jQuery学习:onload和read区别(时间早晚 监听个数)
    从大数据中看人工智能机器人的教育模式
    Java并发-操作系统,进程,线程,并行并发?
    如何判断linux 文件(或lib)是由uclibc还是glibc编译出来的?
    cesium 实现地图环境功能 - 雨,雪,雾特效
    MyLife - Docker安装Consul
  • 原文地址:https://blog.csdn.net/zsd2829568515/article/details/134477620