失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 控制台推箱子小游戏C语言

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

时间:2019-08-05 18:19:20

相关推荐

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

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

源代码和exe程序下载链接:/download/weixin_46355280/87385765?spm=1001..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语言》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。