C语言小游戏: 推箱子 支线(一)--1
2024-09-01 09:50:16
好家伙,考完试了
回顾一下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.
还有,新年快乐.
最新文章
- Facebook的Web开发三板斧:React.js、Relay和GraphQL
- 纯命令行的编辑利器:用好 awk 与 sed
- ASP.NET 实现站内信功能(点对点发送,管理员群发)
- 崽崽帮www.zaizaibang.com精选14
- iOS-音频和视频
- FZU1894 志愿者选拔 --单调队列
- 尝试使用word发布博客
- 数据写入文本文件并读出到浏览器的PHP代码
- (四)java程序基本组成
- LocalActivityManager的内部机制
- Python之路Day13
- Struts 关联DTD 文件
- epoll的高效实现原理
- 【洛谷】【数论】P1876 开灯
- js切换背景颜色
- Python多线程-2(线程共享全局变量)
- MySQL(4):主从复制原理
- sort命令详解及Nginx统计运用
- ffmpeg源码分析四:transcode_step函数 (转4)
- UVa 12716 - GCD XOR(筛法 + 找规律)
热门文章
- Unsupported major.minor version 52.0 (unable to load class org.apache.kafka.clients.producer.Produce异常解决方法
- Linux 磁盘挂载和swap空间管理
- SLSA 框架与软件供应链安全防护
- HMS Core图形图像技术展现最新功能和应用场景,加速构建数智生活
- 2022-7-21 第七组 pan小堂 继承与super与this
- 不同云服务器下,ubuntu下开k3s集群
- WPF 截图控件之绘制方框与椭圆(四) 「仿微信」
- Str 真题解(置换)
- 「APIO2010」巡逻 题解
- vue之请求axios