好家伙,考完试了

回顾一下2021

回顾一下某次的作业

妙啊

所以,

做一个推箱子小游戏

1.先去4399找一下关卡灵感

就它了

2.在百度上搜几篇推箱子,

参考其中的"■ ☆"图案以及行动逻辑


取其精华,再缝缝补补,再缝缝补补,再缝缝补补,

就行了,代码如下:

#include <stdio.h>
#include <conio.h>
#include<stdlib.h>
#include<windows.h> int map[6][8] = {
{1,1,1,1,1,1,1,1}, //0代表空地
{1,0,0,0,0,1,1,1}, //1代表墙
{1,0,0,0,3,3,0,1}, //3代表目的地
{1,0,4,4,4,5,0,1}, //4代表箱子
{1,0,0,1,0,3,0,1}, //5代表人
{1,1,1,1,1,1,1,1},};
//2 3 4 5 6 7 8 9 1 0 //绘制地图 //二维数组+switch()
void DrawMap()
{
//遍历二维数组 //0 打印空格 //1 墙 //3 目的地 //什么结构?
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 8; j++)
{
//if else switch
switch (map[i][j])
{
case 0:
printf(" ");
break;
case 1:
printf("■");
break;
case 3:
printf("☆");
break;
case 4:
printf("□");
break;
case 5:
printf("♀"); //5人
break;
case 7: //4 + 3 箱子在目的地中
printf("★");
break;
case 8: // 5 + 3 人在目的地当中 人?
printf("♀");
break;
}
}
printf("\n");
}
} void PlayGame()
{
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(); //键盘的输入保存到字符中
// getch() getchar() 接收键盘字符
// getch()直接接收 不显示回文 getchar()显示回文可以修改 enter键结束 //根据不同的按键 改变不同的值. 分支.
switch (ch)
{
case 'W': //上下左右 对应的ASCll码: 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 main() //主函数
{
printf("这是一个朴实无华的推箱子游戏\n");
printf("W---向上走\n");
printf("A---向左走\n");
printf("S---向下走\n");
printf("D---向右走\n");
printf("\n");
printf("当然你也可以使用上下左右键\n");
printf("如果你走错了,心态崩了,可以关掉重来\n");
printf("游戏将于3秒后开始\n"); Sleep(3000); while (1)
{ system("cls"); //清屏再绘图
DrawMap();    //画地图
PlayGame();
if(map[2][4]==7&&map[2][5]==7&&map[4][5]==7)
{
printf("恭喜你通关了!");
Sleep(2000);
} } return 0;
}

搞定了,

其中比较重要的几点:

1.用数字去代表图案,  "人"行动时进行数字的加减

       case 0:
printf(" "); //空路
break;
case 1:
printf("■");   //墙壁,无法行走
break;
case 3:
printf("☆"); //目的地
break;
case 4:
printf("□"); //箱子
break;
case 5:        //玩家操作的人
printf("♀"); //5人
break;
case 7: //4 + 3 箱子在目的地中
printf("★");
break;
case 8: // 5 + 3 人在目的地当中
printf("♀");
break;

2.最主要的行动逻辑:

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; //原地变为空格 //下面的"向 ,左 ,右 ,下走"就不打注释了,一样的逻辑
}
}

其他方向的走动也是这么个逻辑

3.其中有个小细节

char ch;  //字符变量
ch = getch();

getch()与getchar()有区别的是:getchar()输入一个字符后需要回车来进行下一个字符的输入,按一下"w"再按回一下"回车"才走一步,(简直折磨玩家)

              getch()不需要回车就能连续输入多个字符,更加人性化了,

其最终效果如下:

真是非常的朴实无华(简陋,破烂)

还是有一些小毛病:1,走错了不能退步(走错了直接关了重开),2,"人"走的时候一闪一闪的,3,全部归位最后一步的前一步会有点卡

This all.

还有,新年快乐.

最新文章

  1. Facebook的Web开发三板斧:React.js、Relay和GraphQL
  2. 纯命令行的编辑利器:用好 awk 与 sed
  3. ASP.NET 实现站内信功能(点对点发送,管理员群发)
  4. 崽崽帮www.zaizaibang.com精选14
  5. iOS-音频和视频
  6. FZU1894 志愿者选拔 --单调队列
  7. 尝试使用word发布博客
  8. 数据写入文本文件并读出到浏览器的PHP代码
  9. (四)java程序基本组成
  10. LocalActivityManager的内部机制
  11. Python之路Day13
  12. Struts 关联DTD 文件
  13. epoll的高效实现原理
  14. 【洛谷】【数论】P1876 开灯
  15. js切换背景颜色
  16. Python多线程-2(线程共享全局变量)
  17. MySQL(4):主从复制原理
  18. sort命令详解及Nginx统计运用
  19. ffmpeg源码分析四:transcode_step函数 (转4)
  20. UVa 12716 - GCD XOR(筛法 + 找规律)

热门文章

  1. Unsupported major.minor version 52.0 (unable to load class org.apache.kafka.clients.producer.Produce异常解决方法
  2. Linux 磁盘挂载和swap空间管理
  3. SLSA 框架与软件供应链安全防护
  4. HMS Core图形图像技术展现最新功能和应用场景,加速构建数智生活
  5. 2022-7-21 第七组 pan小堂 继承与super与this
  6. 不同云服务器下,ubuntu下开k3s集群
  7. WPF 截图控件之绘制方框与椭圆(四) 「仿微信」
  8. Str 真题解(置换)
  9. 「APIO2010」巡逻 题解
  10. vue之请求axios