(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)
之前做了很多与easyx相关的游戏,这次我们之间用控制台做游戏试试看吧
就以推箱子游戏为例
首先就是引用头文件
#include<stdio.h> #include<conio.h>//按键控制 #include<stdlib.h>
然后就是要定义相关变量,在推箱子游戏中,涉及到的元素有
//空地 0 墙 1 目的地 2 箱子 3 玩家 4 #define SPACE 0 #define WALL 1 #define DEST 2 #define BOX 3 #define PLAYER 4
因为控制台程序没有easyx图形库的坐标那样方便, 我们要想绘制图形,只能用二维数组来实现
//制作基本框架 int map[10][10] = { 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,0,0,0, 0,0,0,0,1,2,1,0,0,0, 0,0,0,1,1,0,1,0,0,0, 0,1,1,1,0,3,1,1,1,0, 0,1,2,0,3,4,3,2,1,0, 0,1,1,1,1,3,1,1,1,0, 0,0,0,0,1,2,1,0,0,0, 0,0,0,0,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0, };
为了便于变量的运算,我们这里将变量i,k作为全局变量
int i = 0; int k = 0;
接下来就是图像的绘制了,如果只是用1234来表示图形未免太抽象了吧O(∩_∩)O哈哈~
void draw()//画基本框架 { for (int i = 0; i < 10; i++) { for (int k = 0; k < 10; k++) { switch (map[i][k]) { case SPACE: printf(" "); break; case WALL: printf("l "); break; case DEST: printf("* "); break; case BOX: printf("& "); break; case PLAYER: printf("@ "); break; case BOX + DEST://箱子与目的地相碰后变成另一个字符 printf("# "); } } printf("\n"); } }
画完基本框架,接下来就是对玩家进行移动
首先要先找到玩家的位置,才能对玩家进行移动,找到以后,用goto函数跳出循环
这里以向上为例:当玩家向上移动时,首先要判断玩家是否能移动,如果玩家的上面是墙,就不能移动,如果玩家的上面是箱子或者是空地,就可以移动,当玩家上面是箱子时,在玩家向上移动的同时,箱子也要跟着向上移动,当箱子上面也是墙时,箱子和玩家都不能再向上移动
getch使计算机可以直接读取键盘,这个在我之前的游戏中都有讲到。
void move()//移动 { //先找到玩家 for (i = 0; i < 10; i++) { for (k = 0; k < 10; k++) { if (map[i][k] == PLAYER) { goto end; } } } end:; char key = _getch(); switch (key) { case'W': case'w': case 72://上 //先判断玩家能不能动,玩家的前面是空地或者箱子才能动 if (map[i - 1][k] == SPACE || map[i - 1][k] == DEST) { //先把人物移动到前面,再把原来的消除 map[i - 1][k] += PLAYER; map[i][k] -= PLAYER; } //玩家前面是箱子 else if (map[i - 1][k] == BOX || map[i - 1][k] == BOX + DEST) { //箱子是否可以动 if (map[i - 2][k] == SPACE || map[i - 2][k] == DEST) { map[i - 2][k] += BOX;//移动箱子到前面 map[i - 1][k] -= BOX;//取消原来的箱子 map[i - 1][k] += PLAYER; map[i][k] -= PLAYER; } } break; case'S': case's': case 80://下 //先判断玩家能不能动,玩家的前面是空地或者箱子才能动 if (map[i+1][k] == SPACE || map[i+1][k] == DEST) { //先把人物移动到前面,再把原来的消除 map[i+1][k] += PLAYER; map[i][k] -= PLAYER; } //玩家前面是箱子 else if (map[i+1][k] == BOX || map[i+1][k] == BOX + DEST) { //箱子是否可以动 if (map[i+2][k] == SPACE || map[i+2][k] == DEST) { map[i+2][k] += BOX;//移动箱子到前面 map[i+1][k] -= BOX;//取消原来的箱子 map[i+1][k] += PLAYER; map[i][k] -= PLAYER; } } break; case'A': case'a': case 75://左 if (map[i][k - 1] == SPACE || map[i][k - 1] == DEST) { //先把人物移动到前面,再把原来的消除 map[i][k - 1] += PLAYER; map[i][k] -= PLAYER; } else if (map[i][k - 1] == BOX || map[i][k - 1] == BOX + DEST) { if (map[i][k - 2] == SPACE || map[i][k - 2] == DEST) { map[i][k - 2] += BOX;//移动箱子到前面 map[i][k - 1] -= BOX;//取消原来的箱子 map[i][k - 1] += PLAYER; map[i][k] -= PLAYER; } } break; case'D': case'd': case 77://右 if (map[i][k + 1] == SPACE || map[i][k + 1] == DEST) { map[i][k + 1] += PLAYER; map[i][k] -= PLAYER; } else if (map[i][k + 1] == BOX|| map[i][k + 1]==BOX+DEST) { if (map[i][k + 2] == SPACE || map[i][k + 2] == DEST) { map[i][k + 2] += BOX; map[i][k + 1] -= BOX; map[i][k + 1] += PLAYER; map[i][k] -= PLAYER; } } break; } }
接下来就是要判断是否通关
//判断是否通关 int jude() { for (int i = 0; i < 10; i++) { for (int k = 0; k < 10; k++) { if (map[i][k] == BOX) { return 0; } } } return 1; }
最后将其全部输入主函数中
int main() { while (1) { system("cls"); draw(); if (jude()) { printf("通关"); return 0; } move(); } return 0; }
具体代码如下,如果大家发现bug或者有更好的方法 ,欢迎大家一起来讨论,一起加油吧
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<conio.h>//按键控制 #include<stdlib.h> //空地 0 墙 1 目的地 2 箱子 3 玩家 4 #define SPACE 0 #define WALL 1 #define DEST 2 #define BOX 3 #define PLAYER 4 //推箱子需要通过二维数组实现 //初始化变量,制作基本框架 int map[10][10] = { 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,0,0,0, 0,0,0,0,1,2,1,0,0,0, 0,0,0,1,1,0,1,0,0,0, 0,1,1,1,0,3,1,1,1,0, 0,1,2,0,3,4,3,2,1,0, 0,1,1,1,1,3,1,1,1,0, 0,0,0,0,1,2,1,0,0,0, 0,0,0,0,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0, }; int i = 0; int k = 0; void draw()//画基本框架 { for (int i = 0; i < 10; i++) { for (int k = 0; k < 10; k++) { switch (map[i][k]) { case SPACE: printf(" "); break; case WALL: printf("l "); break; case DEST: printf("* "); break; case BOX: printf("& "); break; case PLAYER: printf("@ "); break; case BOX + DEST: printf("# "); } } printf("\n"); } } void move()//移动 { //先找到玩家 for (i = 0; i < 10; i++) { for (k = 0; k < 10; k++) { if (map[i][k] == PLAYER) { goto end; } } } end:; char key = _getch(); switch (key) { case'W': case'w': case 72://上 //先判断玩家能不能动,玩家的前面是空地或者箱子才能动 if (map[i - 1][k] == SPACE || map[i - 1][k] == DEST) { //先把人物移动到前面,再把原来的消除 map[i - 1][k] += PLAYER; map[i][k] -= PLAYER; } //玩家前面是箱子 else if (map[i - 1][k] == BOX || map[i - 1][k] == BOX + DEST) { //箱子是否可以动 if (map[i - 2][k] == SPACE || map[i - 2][k] == DEST) { map[i - 2][k] += BOX;//移动箱子到前面 map[i - 1][k] -= BOX;//取消原来的箱子 map[i - 1][k] += PLAYER; map[i][k] -= PLAYER; } } break; case'S': case's': case 80://下 //先判断玩家能不能动,玩家的前面是空地或者箱子才能动 if (map[i+1][k] == SPACE || map[i+1][k] == DEST) { //先把人物移动到前面,再把原来的消除 map[i+1][k] += PLAYER; map[i][k] -= PLAYER; } //玩家前面是箱子 else if (map[i+1][k] == BOX || map[i+1][k] == BOX + DEST) { //箱子是否可以动 if (map[i+2][k] == SPACE || map[i+2][k] == DEST) { map[i+2][k] += BOX;//移动箱子到前面 map[i+1][k] -= BOX;//取消原来的箱子 map[i+1][k] += PLAYER; map[i][k] -= PLAYER; } } break; case'A': case'a': case 75://左 if (map[i][k - 1] == SPACE || map[i][k - 1] == DEST) { //先把人物移动到前面,再把原来的消除 map[i][k - 1] += PLAYER; map[i][k] -= PLAYER; } else if (map[i][k - 1] == BOX || map[i][k - 1] == BOX + DEST) { if (map[i][k - 2] == SPACE || map[i][k - 2] == DEST) { map[i][k - 2] += BOX;//移动箱子到前面 map[i][k - 1] -= BOX;//取消原来的箱子 map[i][k - 1] += PLAYER; map[i][k] -= PLAYER; } } break; case'D': case'd': case 77://右 if (map[i][k + 1] == SPACE || map[i][k + 1] == DEST) { map[i][k + 1] += PLAYER; map[i][k] -= PLAYER; } else if (map[i][k + 1] == BOX|| map[i][k + 1]==BOX+DEST) { if (map[i][k + 2] == SPACE || map[i][k + 2] == DEST) { map[i][k + 2] += BOX; map[i][k + 1] -= BOX; map[i][k + 1] += PLAYER; map[i][k] -= PLAYER; } } break; } } //判断是否通关 int jude() { for (int i = 0; i < 10; i++) { for (int k = 0; k < 10; k++) { if (map[i][k] == BOX) { return 0; } } } return 1; } int main() { while (1) { system("cls"); draw(); if (jude()) { printf("通关"); return 0; } move(); } return 0; }