C语言小游戏: 推箱子 支线(一)--1

2022-10-31,,

好家伙,考完试了

回顾一下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.

还有,新年快乐.

C语言小游戏: 推箱子 支线(一)--1的相关教程结束。

《C语言小游戏: 推箱子 支线(一)--1.doc》

下载本文的Word格式文档,以方便收藏与打印。