欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

C语言经典小游戏之----推箱子

时间:2023-04-30

        在进行推箱子的实验中,可以使用对应的API函数来改变对应箱子的颜色,也需要根据,人在移动的过程中,可以通过方向键,并改变对应的颜色,从而实现控制人物的目的。

       代码实现如下:

#include#include#include#include#includeint x = 0, y = 0;//存储当前使用的地图int map[10][10] = { 0 };//地图 1int map_1[10][10] = {{ 0,0,1,1,1,0,0,0 },{ 0,0,1,4,1,0,0,0 },{ 0,0,1,0,1,1,1,1 },{ 1,1,1,0,0,2,4,1 },{ 1,4,2,2,0,1,1,1 },{ 1,1,1,3,2,1,0,0 },{ 0,0,0,1,4,1,0,0 },{ 0,0,0,1,1,1,0,0 }};//地图 2int map_2[10][10] = {{ 0,0,0,1,1,1,1,1,1,1 },{ 0,0,1,1,0,0,1,0,3,1 },{ 0,0,1,0,0,0,1,0,0,1 },{ 0,0,1,2,0,2,0,2,0,1 },{ 0,0,1,0,2,1,1,0,0,1 },{ 1,1,1,0,2,0,1,0,1,1 },{ 1,4,4,4,4,4,0,0,1,0 },{ 1,1,1,1,1,1,1,1,1,0 },};//判断游戏是否挑战成功int finish();//控制小人移动void move(int x1, int y1, int x2, int y2);//根据二维数组,渲染地图int render();//查找小人所在的当前位置void find();//根据用户输入,确定用户选择哪张地图void setmap(int n);//设置文本显示时的颜色void color(int m);int main() {int n;char dir;char c;printf("**************推箱子游戏欢迎您***************n""* *n""* ----------------------- *n""* | Powered By c.biancheng.net | *n""* ----------------------- *n""* *n""* ♀:自己的位置 *n""* ☆:箱子要到的的位置 *n""* ■:箱子的位置 *n""* *n""* | 游戏规则 | *n""* *n""* 控制♀将■推到☆的位置 *n""* 按 wasd 控制♀的移动 *n""* 按 r 重新开始游戏 *n""* 按 q 退出游戏 *n""*********************************************n");color(0xA);printf("请选择关卡:(1/2)(0:退出游戏):");while (scanf("%d", &n)) {getchar();//n==0,游戏退出if (n == 0) {printf("game overn");break;}system("cls");//清空命令行窗口中显示的所有信息if (n == 1 || n == 2) {setmap(n);//根据 n 的值,设置当前地图render();//根据所选地图,在命令行窗口中将其渲染出来 //游戏开始,用户输入字符w/a/s/d,控制小人移动while ((dir = getch()) != EOF) {system("cls");//移动之前,删除原有命令行中的地图find();//移动之前,需找到当前小人所在的位置 //根据 dir 字符的值,控制小人的移动,以及设置重新开始和退出选项的操作switch (dir) {case 'w':move(x - 1, y, x - 2, y); break;case 's':move(x + 1, y, x + 2, y); break;case 'a':move(x, y - 1, x, y - 2); break;case 'd':move(x, y + 1, x, y + 2); break;case 'r':setmap(n); break;case 'q':return 0;}//重新渲染人移动后的场景render();//每次移动,判断是否挑战成功if (finish()) {printf("游戏胜利,请重新选择关卡(1/2)(0:退出游戏):");break;}}}else {printf("输入有误,请重新输入n");printf("请选择关卡:(1/2)(0:退出游戏):");}}system("pause");return 0;}// 按w的时候的输出结果void move(int x1, int y1, int x2, int y2) {if (map[x][y] == 3) //找到自己的位置{//人前边是箱子,箱子在空格上if (map[x1][y1] == 2) {//箱子前边是空格if (map[x2][y2] == 0) {map[x][y] = 0;map[x1][y1] = 3;map[x2][y2] = 2;}//箱子前边是位置if (map[x2][y2] == 4) {map[x][y] = 0;map[x1][y1] = 3;map[x2][y2] = 5;}}//人前是箱子,箱子在位置上if (map[x1][y1] == 5) {//箱子前边是空格if (map[x2][y2] == 0) {map[x][y] = 0;map[x1][y1] = 6;map[x2][y2] = 2;}//箱子前边是位置if (map[x2][y2] == 4) {map[x][y] = 0;map[x1][y1] = 6;map[x2][y2] = 5;}}//人前为空格if (map[x1][y1] == 0) {map[x1][y1] = 3;map[x][y] = 0;}if (map[x1][y1] == 4) {map[x][y] = 0;map[x1][y1] = 6;}}if (map[x][y] == 6) //人在位置上{//位置前是箱子,箱子在空格上if (map[x1][y1] == 2) {//箱子前是空格if (map[x2][y2] == 0) {map[x][y] = 4;map[x1][y1] = 3;map[x2][y2] = 2;}//箱子前是位置if (map[x2][y2] == 4) {map[x][y] = 4;map[x1][y1] = 3;map[x2][y2] = 5;}}//位置前是箱子,箱子在位置上if (map[x1][y1] == 5) {//箱子前是空格if (map[x2][y2] == 0) {map[x][y] = 4;map[x1][y1] = 6;map[x2][y2] = 2;}//箱子前是位置if (map[x2][y2] == 4) {map[x][y] = 4;map[x1][y1] = 6;map[x2][y2] = 5;}}//人前面是位置if (map[x1][y1] == 4) {map[x][y] = 4;map[x1][y1] = 6;}//人前面是空格if (map[x1][y1] == 0) {map[x][y] = 4;map[x1][y1] = 3;}}}void find() {for (x = 0; x < 10; x++) {for (y = 0; y < 10; y++) {if (map[x][y] == 3 || map[x][y] == 6) {return;}}}}int render() {for (x = 0; x<10; x++) {for (y = 0; y<10; y++) {if (map[x][y] == 1) {color(8);printf("■"); //输出砖块的样子}if (map[x][y] == 3) {color(3);printf("♀"); //输出自己的位置}if (map[x][y] == 2) {color(4);printf("■"); //输出箱子}if (map[x][y] == 4) {color(0xE);printf("☆"); //输出箱子要到的位置}if (map[x][y] == 0) {color(0xF);printf(" "); //输出空白}if (map[x][y] == 5) {color(6);printf("★"); //箱子到达目标位置后的图标}if (map[x][y] == 6) {color(3);printf("♀");//人达到星星处,要由☆改为♀}}printf("n");}return 0;}void setmap(int n) {if (n == 1) {memcpy(map, map_1, sizeof(map_1));}if (n == 2) {memcpy(map, map_2, sizeof(map_2));}}int finish(){for (x = 0; x < 10; x++) {for (y = 0; y < 10; y++) {if (map[x][y] == 2)return 0;}}return 1;}void color(int m) {HANDLE consolehend;consolehend = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(consolehend, m);}

对应的实验现象如下:

 

总结:在编写C语言代码的过程中,理解对应API函数的真正使用方法,加深对函数的理解。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。