C语言小游戏: 推箱子 支线(一)--1
好家伙,考完试了
回顾一下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.
还有,新年快乐.