自己开发的C语言控制台推箱子小游戏,基于二维数组实现,功能不多但是游戏整体较为完整,因为技术有限,所以代码暂未优化且整体显得较为臃肿,整体架构简单,代码全自主设计编写,仅作交流学习,还望大佬多多指点。

源代码和exe程序下载链接:https://download.csdn.net/download/weixin_46355280/87385765?spm=1001.2014.3001.5503

#include <stdio.h>
#include<Stdlib.h>
#include<Conio.h>
//全局二维数组
char map[13][10] = {{'*','*','*','*','*','*','*','*','*','*'},{'*',' ',' ',' ',' ',' ',' ',' ',' ','*'},{'*',' ',' ',' ',' ',' ',' ',' ',' ','*'},{'*',' ',' ',' ',' ',' ','o',' ',' ','*'},{'*','*','*','*','*',' ',' ',' ',' ','*'},{'*',' ',' ',' ','*',' ',' ','@',' ','*'},{'*',' ',' ',' ','*',' ',' ',' ',' ','*'},{'*',' ',' ',' ','*',' ',' ','i',' ','*'},{'*',' ',' ',' ',' ',' ',' ',' ',' ','*'},{'*',' ',' ',' ',' ',' ',' ',' ',' ','*'},{'*',' ',' ',' ',' ',' ',' ',' ',' ','*'},{'*',' ',' ',' ',' ',' ',' ',' ',' ','*'},{'*','*','*','*','*','*','*','*','*','*'},
};//全局控制变量
int player_x = 7;//玩家X轴位置
int player_y = 7;//玩家Y轴位置
int box_x = 5;//箱子X轴位置
int box_y = 7;//箱子Y轴位置
int target_x = 3;//目标X轴位置
int target_y = 6;//目标Y轴位置
char input;//当前键盘输入的指令
int foot_num = 0;//玩家移动的步数
char initial_map[13][10];
//保存上一步的数据,方便回撤数据
char map_back[13][10];//上一步地图信息
int re_player_x = player_x;//上一步玩家X轴位置
int re_player_y = player_y;//上一步玩家Y轴位置
int re_box_x = box_x;//上一步箱子X轴位置
int re_box_y = box_y;//上一步箱子Y轴位置
int re_foot_num = foot_num;//上一步累计的步数
int win = 0;//赢的次数
int lose = 0;//输的次数//功能函数
void menu();//游戏开始菜单
void return_menu();//暂停游戏返回开始菜单
void initial_data();//保存初始地图数据
void keys_input();//读取键盘输入函数
void player_move();//玩家移动函数
void print_map();//打印地图函数
void box_move();//箱子移动函数
void time_out();//游戏暂停函数
void game_over();//游戏结束函数
void restart();//重新开始游戏
void exit_game();//退出游戏
void go_back();//返回上一步
void save_pre_data();//保存上一步的数据
void game_description();//打开游戏说明
void win_or_lose();//查看输赢次数//主函数
int main()
{while (1){for (int x = 0; x < 13; x++)//初始化返回地图变量{for (int y = 0; y < 10; y++){map_back[x][y] = map[x][y];}}menu();initial_data();//保存游戏地图初始数据,以便重启游戏while (1)//死循环控制游戏运行{print_map();game_over();keys_input();return_menu();game_description();exit_game();restart();go_back();time_out();player_move();box_move();system("cls");}}
}void menu()
{printf("\tgame begin menu\n\n");printf("\t1.进入游戏\n");printf("\t2.退出游戏\n");printf("\t3.查看输赢次数\n");while (1){char input = _getch();if (input == '1'){system("cls");break;}if (input == '2'){exit(0);}if (input == '3'){win_or_lose();break;}}
}void initial_data()
{for (int x = 0; x < 13; x++){for (int y = 0; y < 10; y++){initial_map[x][y] = map[x][y];}}input = NULL;
}void print_map()//刷新并打印地图
{printf("按 I 键打开游戏指南...\n");for (int x = 0; x < 13; x++){for (int y = 0; y < 10; y++){printf("%c", map[x][y]);}printf("\n");}printf("player:%d %d,box:%d %d target:%d %d input:%c foot_num:%d\n", player_x, player_y, box_x, box_y, target_x, target_y, input, foot_num);
}void keys_input()//键盘输入
{while (1){input = _getch();if (input == 87 || input == 65 || input == 83 || input == 68 || input == 13 || input == 71 || input == 80 || input == 82 || input == 73 || input == 89){break;}}
}void player_move() //玩家移动
{if (player_x == target_x && player_y == target_y){map[player_x][player_y] = 'o';}else{map[player_x][player_y] = ' ';}switch (input){case 'W':if (map[player_x - 1][player_y] != '*' && map[box_x - 1][box_y] != '*')//如果玩家移动以后的位置不是墙并且箱子被玩家移动后也不是墙{save_pre_data();//执行玩家移动前,保存当前游戏数据到保存上一步的函数里player_x -= 1;foot_num++;break;}if (map[player_x - 1][player_y] != map[box_x][box_y] && map[player_x - 1][player_y] != '*')//玩家移动以后的位置不是箱子当前的位置也不是墙{save_pre_data();player_x -= 1;foot_num++;break;}break;case 'A':if (map[player_x][player_y - 1] != map[box_x][box_y] && map[player_x][player_y - 1] != '*'){save_pre_data();player_y -= 1;foot_num++;break;}if (map[player_x][player_y - 1] != '*' && map[box_x][box_y - 1] != '*'){save_pre_data();player_y -= 1;foot_num++;break;}break;case 'S':if (map[player_x + 1][player_y] != map[box_x][box_y] && map[player_x + 1][player_y] != '*'){save_pre_data();player_x += 1;foot_num++;break;}if (map[player_x + 1][player_y] != '*' && map[box_x + 1][box_y] != '*'){save_pre_data();player_x += 1;foot_num++;break;}break;case 'D':if (map[player_x][player_y + 1] != map[box_x][box_y] && map[player_x][player_y + 1] != '*'){save_pre_data();player_y += 1;foot_num++;break;}if (map[player_x][player_y + 1] != '*' && map[box_x][box_y + 1] != '*'){save_pre_data();player_y += 1;foot_num++;break;}break;default:break;}map[player_x][player_y] = 'i';
}void box_move()//箱子移动
{if (player_x == box_x && player_y == box_y){switch (input){case 'W':if (map[box_x - 1][box_y] != '*'){box_x -= 1;}break;case 'A':if (map[box_x][box_y - 1] != '*'){box_y -= 1;}break;case 'S':if (map[box_x + 1][box_y] != '*'){box_x += 1;}break;case 'D':if (map[box_x][box_y + 1] != '*'){box_y += 1;}break;default:break;}map[box_x][box_y] = '@';}
}void time_out()//游戏暂停
{if (input == 13){printf("The game has been paused,press enter again to continue the game!\n");while (1){char input_s = _getch();if (input_s == 13){input = NULL;break;}}}
}void game_over()//游戏结束
{if (box_x == target_x && box_y == target_y){system("cls");printf("game over!you win!is restart?(yes is 1,no is 2)\n");win++;while (1){char input_s = _getch();if (input_s == '1'){input = 71;restart();system("cls");print_map();break;}if (input_s == '2'){system("cls");input = 71;restart();menu();print_map();break;}}}if (map[box_x - 1][box_y] == '*' && map[box_x][box_y - 1] == '*' || map[box_x + 1][box_y] == '*' && map[box_x][box_y + 1] == '*' || map[box_x - 1][box_y] == '*' && map[box_x][box_y + 1] == '*' || map[box_x][box_y - 1] == '*' && map[box_x + 1][box_y] == '*'){system("cls");printf("game over!you lose!is restart?(yes is 1,no is 2)\n");lose++;while (1){char input_s = _getch();if (input_s == '1'){input = 71;restart();system("cls");print_map();break;}if (input_s == '2'){system("cls");input = 71;restart();menu();print_map();break;}}}
}void restart()//重启游戏,初始化所有游戏数据
{if (input == 71)//检查游戏数据,避免不必要的游戏重启,这一步可有可无,意义不大{if (foot_num > 0){for (int x = 0; x < 13; x++){for (int y = 0; y < 10; y++){map[x][y] = initial_map[x][y];}}player_x = 7;//玩家初始X轴位置player_y = 7;//玩家初始Y轴位置box_x = 5;//箱子初始X轴位置box_y = 7;//箱子初始Y轴位置target_x = 3;//目标初始X轴位置target_y = 6;//目标初始Y轴位置input = NULL;//初始化键盘当前的指令foot_num = 0;//初始化玩家移动的步数}//重置游戏后,将上一步的数据保存为游戏初始数据,避免返回重启前的位置for (int x = 0; x < 13; x++){for (int y = 0; y < 10; y++){map_back[x][y] = map[x][y];}}re_player_x = player_x;re_player_y = player_y;re_box_x = box_x;re_box_x = box_x;input = NULL;}
}void exit_game()//退出游戏返回菜单
{if (input == 80){printf("is exit game?(yes=enter,no=delete)\n");while (1){char input_s = _getch();if (input_s == 13){printf("The game has exited!\n");input = 71;restart();system("cls");menu();input = NULL;break;}else if (input_s == 8){input = NULL;break;}}}
}void go_back()//返回上一步移动
{if (input != NULL){if (input == 82){for (int x = 0; x < 13; x++){for (int y = 0; y < 10; y++){map[x][y] = map_back[x][y];}}player_x = re_player_x;player_y = re_player_y;box_x = re_box_x;box_y = re_box_y;foot_num = re_foot_num;input = NULL;}}
}void save_pre_data()//保存上一步数据
{for (int x = 0; x < 13; x++){for (int y = 0; y < 10; y++){map_back[x][y] = map[x][y];}}re_player_x = player_x;re_player_y = player_y;re_box_x = box_x;re_box_y = box_y;re_foot_num = foot_num;}void game_description()//打开游戏指南
{if (input == 73){printf("游戏指南:\n");printf("按 W,A,S,D 移动玩家.\n按 回车键 暂停游戏.\n按 P 退出当前游戏并返回菜单.\n按 R 返回上一步移动.\n按 G 重置游戏.\n按 Y 暂停当前游戏返回开始菜单\n\n");printf("按I键继续游戏\n");int input = NULL;while (1){input = _getch();if (input == 73){break;}}}
}void return_menu()//返回开始菜单
{if (input == 89){system("cls");menu();}
}void win_or_lose()//查看输赢次数
{printf("win:%d\nlose:%d\n\ninput delete to exit see!\n",win,lose);while (1){char input_s = _getch();if (input_s == 8){system("cls");menu();break;}}
}

感谢观看!

<font color="#fff">

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

控制台推箱子小游戏C语言

</font>

控制台推箱子小游戏C语言相关推荐

  1. 控制台推箱子小游戏的实现

    首先,这个推箱子,是在黑窗口实现的,界面不美观,有能力的写好了可以尝试图形化窗口easyx封装好 先来看看完整代码 #include <stdio.h> #include <coni ...

  2. 推箱子小游戏---c语言

    推箱子 游戏特色 1.游戏同时支持鼠标和键盘操作,鼠标操作时,可点击任意你想去的地方. 2.提供回复上一步的功能,可以回到任何一步走过的路径,可以给用户足够的思考空间,使用户的智力在游戏的乐趣中得到充 ...

  3. 用 Dev-C++ 编写简单的推箱子小游戏

    用 Dev-C++ 编写简单的推箱子小游戏 前言 基础版 优化版 前言 以下是显示效果 B站视频讲解:[小游戏]用 Dev-C++ 编写简单的控制台推箱子小游戏 [小游戏]用 Dev-C++ 编写简单 ...

  4. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  5. 用C语言实现推箱子小游戏基础程序plus

    目录 设计一个简单的推箱子游戏 功能设计要求: 代码实现 数据定义头文件data_def.h 窗口设置头文件WindowsSet.h WindowsSet.cpp 上移函数 矩阵旋转函数 游戏帧 菜单 ...

  6. 大一C语言课程设计之推箱子小游戏

    大一C语言课程设计之推箱子小游戏 先看一下效果 因为技术原因,开发说明没有加进去 按任意键以后 )] 同时响起来 你笑起来真好看的bgm 胜利界面会弹出一个弹出框 私信我或者加我qq:65245534 ...

  7. c 语言推箱子vs,C语言推箱子小游戏教程

    作者GitHub-Pages个人主页 本教程GitHub-Pages链接 本教程百度云下载地址 本教程编写于2016/11/22 Dawson Lee edited this page on Beij ...

  8. C语言实现推箱子小游戏

    一.设计目的 用简单的C语言知识制作的推箱子游戏,通过上下左右键将所有箱子移动到目标位置. 2.让我们更好地了解和巩固C语言知识,并实际运用,同时运用一些不太常见的知识点. 二.功能描述 1.模块功能 ...

  9. 简单的c语言推箱子程序,完整版本的推箱子小游戏,最简单的纯C语言打造

    /*推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 左 ...

最新文章

  1. 在qemu模拟的aarch32上使用kgtp
  2. github 地图上画区域的工程_筑工程测量区别
  3. 端口镜像NIDS技术(sniffer抓包)
  4. Decision Tree学习笔记(基础篇)
  5. LeetCode-Clone Graph-克隆无向图
  6. UE4之cmd调用函数
  7. Webgoat 笔记总结 Insecure Communication/Configuration/Storage
  8. 苹果手机如何隐藏软件_手机资讯:苹果软件下载演示
  9. 在mini2440上面搞定CC2500驱动
  10. OVM虚拟化,做Openstack的减法
  11. 《 阿Q正传》-鲁迅 词语解释 | 经典语录
  12. Java笔记3.1——Java基础之数组
  13. keil工具栏错乱,图标显示不正常,工具栏不小心删除,等keil界面问题
  14. 四旋翼无人机从0到1的实现(十八)无人机外设驱动→MPU6500
  15. 广东省工业和信息化厅关于组织开展2022年创新型中小企业评价、专精特新中小企业认定和复核工作的通知
  16. 远程教育在线考试系统
  17. 初试MySQL触发器
  18. springboot中AOP总结
  19. 蓝桥杯青少儿创意编程往届真题或样题收集分享!
  20. 给感染新冠的老年人一点建议

热门文章

  1. TI DSP型号简述
  2. 最新抓取微信小程序源码教程+附逆向工具WxappUnpacker
  3. 沙排啦啦美女激情热舞 明眸皓齿惹人爱
  4. vscode 高效开心开发uniapp
  5. java覆盖率怎么包含多个工程,在多项目工程中统计子工程的覆盖率
  6. 使用ArcGIS API for Silverlight + Visifire绘制地图统计图
  7. ATP Cincinnati Roger VS Djokovic
  8. 践行者访谈实录:你真的了解CMMI吗?
  9. ajax显示加载动画,jQuery Ajax 加载数据时异步显示加载动画
  10. MAC上面推出“”失败,因为它当前正在使用中