自己开发的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>