• C语言---简单实现推箱子


    所需知识:分支结构;循环结构;二维数组;C语言基本知识

    如图所示推箱子的基本元素为:人,箱子,目的地,墙、空地;

    怎么样去表示它:使得计算机能够编译并运行呢?

       用基本数据类型:int ,char 均可,这里我们用int 的数据表示,并令 0对应空地,1 对应墙,3对应目的地,4对应箱子,5对应人,对于一些特殊状态,比如人站在目的地上:用数字8(3+5)相对应,箱子在目的地上用数字7(3+4)表示;

       我们用二维数组去表示推箱子的地图(本人称之为二维数组的图形化,类似于打印爱心),该二维数组的数据类型与要存放的数据有关,大小与要表示的地图大小有关(几行几列),通过数据与实例的一一对应,方可在控制台输出所想要的地图。

      所需头文件   

    #include    //C语言头文件
    #include //应用_getch()函数必需;
    #include //应用system()函数必需;

       (一)地图的打印

    1. //0:空地 1:墙 3:目的地 4:箱子 5:人 8:人站在目的地 7:箱在目的地
    2. int map[8][8] = {
    3. 0,0,1,1,1,0,0,0,
    4. 0,0,1,3,1,0,0,0,
    5. 0,0,1,0,1,0,0,0,
    6. 1,1,1,4,0,1,1,0,
    7. 1,3,0,4,5,4,3,1,
    8. 1,1,1,1,4,1,1,0,
    9. 0,0,1,1,3,1,0,0,
    10. 0,0,0,1,1,1,0,0,
    11. };
    12. //打印地图
    13. void show()
    14. {
    15. for (int i = 0; i < 8; i++)
    16. {
    17. for (int j = 0; j < 8; j++) {
    18. switch (map[i][j])
    19. {
    20. case 0:
    21. printf(" ");
    22. break;
    23. case 1:
    24. printf("墙");
    25. break;
    26. case 3:
    27. printf("☆");
    28. break;
    29. case 4:
    30. printf("箱");
    31. break;
    32. case 5:case 8:
    33. printf("人");
    34. break;
    35. case 7:
    36. //箱子到达目的地
    37. printf("★");
    38. break;
    39. }
    40. }printf("\n");
    41. }
    42. }

     (二)人物的移动

    坐标:控制台的坐标理应为XOY,就是以正东方向(右边)为x轴的正方向,反之为负方向;

    以正南方向(下边)为y轴的正方向,反之为负方向;在该程序中,为了移动人物,我们得先找到其坐标,我就用x,y(名称而已)来保存其坐标,与XOY无联系。

     2.人物的移动:

    人的坐标为x,y;先判断能移动不?以向上方向为例

      情况一:若前一个格子坐标的数据是空地或者目的地, 直接移动!怎么去表示?

    1. //情况1:前面是空地或者目的地
    2. if (x > 0 && (map[x-1][y] == 0 || map[x-1][y ] == 3))
    3. {
    4. map[x][y] = map[x-1][y];
    5. map[x-1][y] = 5;
    6. }

     情况二:若人前一个格子坐标数据是箱子,则需要判断前面第二个格子是空地或者目的地吗,若是可以移动,否则不然。

    1. //情况2:前1格是箱子
    2. if (x > 2 && map[x - 1][y] == 4||map[x - 1][y]==7)
    3. {
    4. if (map[x - 2][y] == 0 || map[x - 2][y] == 3)
    5. {
    6. map[x - 2][y] += 4;
    7. map[x - 1][y] += 1;//人:5 箱:4 人来箱去
    8. map[x][y] -= 5;
    9. }
    10. }

     完整代码:

    1. #include
    2. #include
    3. #include
    4. //0:空地 1:墙 3:目的地 4:箱子 5:人 8:人站在目的地 7:箱在目的地
    5. int map[8][8] = {
    6. 0,0,1,1,1,0,0,0,
    7. 0,0,1,3,1,0,0,0,
    8. 0,0,1,0,1,0,0,0,
    9. 1,1,1,4,0,1,1,0,
    10. 1,3,0,4,5,4,3,1,
    11. 1,1,1,1,4,1,1,0,
    12. 0,0,1,1,3,1,0,0,
    13. 0,0,0,1,1,1,0,0,
    14. };
    15. //打印地图
    16. void show()
    17. {
    18. for (int i = 0; i < 8; i++)
    19. {
    20. for (int j = 0; j < 8; j++) {
    21. switch (map[i][j])
    22. {
    23. case 0:
    24. printf(" ");
    25. break;
    26. case 1:
    27. printf("墙");
    28. break;
    29. case 3:
    30. printf("☆");
    31. break;
    32. case 4:
    33. printf("箱");
    34. break;
    35. case 5:case 8:
    36. printf("人");
    37. break;
    38. case 7:
    39. //箱子到达目的地
    40. printf("★");
    41. break;
    42. }
    43. }printf("\n");
    44. }
    45. }
    46. //人物移动--->首先要先找到人在哪
    47. int x = -1, y = -1;//x,y分别表示人物的坐标
    48. void Move()
    49. {
    50. //找人
    51. for (int i = 0; i < 8; i++)
    52. {
    53. for (int j = 0; j < 8; j++) {
    54. if (map[i][j] == 5 || map[i][j] == 8)
    55. {
    56. x = i; y = j;
    57. }
    58. }
    59. }
    60. //按键
    61. int key = _getch();
    62. switch (key)
    63. {
    64. case 'a':case 'A':
    65. {
    66. if (y > 0 && (map[x ][y- 1] == 0 || map[x ][y- 1] == 3))
    67. {
    68. map[x][y] = map[x][y - 1];
    69. map[x ][y- 1] = 5;
    70. }
    71. if (y > 2 && map[x][y - 1] == 4 || map[x ][y- 1] == 7)
    72. {
    73. if (map[x ][y- 2] == 0 || map[x ][y- 2] == 3)
    74. {
    75. map[x ][y- 2] += 4;
    76. map[x ][y- 1] += 1;//人:5 箱:4 人来箱去
    77. map[x][y] -= 5;
    78. }
    79. }
    80. }
    81. break;
    82. case 's':case 'S':
    83. {
    84. if (x < 8&& (map[x +1][y] == 0 || map[x + 1][y] == 3))
    85. {
    86. map[x][y] = map[x + 1][y];
    87. map[x + 1][y] = 5;
    88. }
    89. if (06 && map[x+ 1][y] == 4 || map[x + 1][y] == 7)
    90. {
    91. if (map[x + 2][y] == 0 || map[x + 2][y] == 3)
    92. {
    93. map[x + 2][y] += 4;
    94. map[x + 1][y] += 1;//人:5 箱:4 人来箱去
    95. map[x][y] -= 5;
    96. }
    97. }
    98. }
    99. break;
    100. case 'W':case 'w':
    101. {
    102. if (x > 0 && (map[x-1][y] == 0 || map[x-1][y ] == 3))
    103. {
    104. map[x][y] = map[x-1][y];
    105. map[x-1][y] = 5;
    106. }
    107. if (x > 2 && map[x - 1][y] == 4||map[x - 1][y]==7)
    108. {
    109. if (map[x - 2][y] == 0 || map[x - 2][y] == 3)
    110. {
    111. map[x - 2][y] += 4;
    112. map[x - 1][y] += 1;//人:5 箱:4 人来箱去
    113. map[x][y] -= 5;
    114. }
    115. }
    116. }
    117. break;
    118. case 'D':case 'd':
    119. {
    120. if (y < 8 && (map[x][y + 1] == 0 || map[x][y + 1] == 3))
    121. {
    122. map[x][y] = map[x][y + 1];
    123. map[x][y + 1] = 5;
    124. }
    125. if (y<6 && map[x][y + 1] == 4 || map[x][y + 1] == 7)
    126. {
    127. if (map[x][y + 2] == 0 || map[x][y + 2] == 3)
    128. {
    129. map[x][y + 2] += 4;
    130. map[x][y + 1] += 1;//人:5 箱:4 人来箱去
    131. map[x][y] -= 5;
    132. }
    133. }
    134. }
    135. break;
    136. }
    137. }
    138. //判断输赢-->没有箱子&&箱子均在目的地
    139. int main()
    140. {
    141. while (1) {
    142. show();
    143. Move();
    144. int a=_getch();
    145. system("cls");
    146. }
    147. return 0;
    148. }

    实现效果:

  • 相关阅读:
    一百套毕业设计开题报告和答辩PPT(附下载地址)
    pureComponent
    node+mysql+navicat一条龙流程
    分布式事务-CAP&Raft原理
    最小生成树——Prim算法与Kruskal算法
    【微信小程序怎么开店铺】微信小程序店铺怎么制作?
    《安富莱嵌入式周报》第277期:业界首款Cortex-M55+Ethos-U55 NPU套件发布,20个墨水屏菊花链玩法,氙气灯镇流器设计
    JavaScript用浏览器书签制作插件(爬虫)
    基于微信小程序的桥牌计分系统设计与实现-计算机毕业设计源码+LW文档
    你了解TLS协议吗?
  • 原文地址:https://blog.csdn.net/qq_63976098/article/details/127643539