一、游戏简介
1、基于C语言的简单迷宫游戏设计
2、界面升级、图形优化、增设时间、生命值、计分
3、玩家可以通过W(上)S(下)A(左)D(右)控制小星星走出迷宫通关游戏
4、3.0版本唯一的缺点就是频闪过于严重,原因是显示器的刷新频率与图像帧率不同步造成的,基于gpt4.0提供的解决方案就是开辟两个缓冲区一个绘图一个显示图像!还在学习中,这个bug有望在后续版本中解决
二、游戏界面
三、游戏代码
/* 迷宫游戏.exe 3.0 */
#include<stdio.h> //标准输入输出头文件
#include<stdlib.h> //函数system():发出一个DOS命令
#include<conio.h> //函数kbhit():检测键盘是否按下; 函数getch():获取用户输入(无需回车)
#include<windows.h> //函数Sleep():将程序挂起一段时间
#include<time.h> //计算游戏时间
#define N 50
#define M 50
double times;
void Show(int maze[][M],int n,int m);
void MazeUpdate(int maze[][M],int n,int m,double start);
int maze[N][M] =
{{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1},
{1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1},
{1,0,1,0,1,0,1,1,1,0,1,1,0,4,1,0,1,0,0,1,0,1,1,0,1},
{1,0,1,0,1,0,0,0,1,0,0,1,0,1,1,0,0,0,0,1,1,4,1,1,1},
{1,0,0,0,1,1,1,0,1,0,0,0,0,0,1,4,0,1,0,1,0,0,0,0,1},
{1,0,1,1,1,4,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,0,1},
{1,0,1,0,0,0,1,0,0,0,0,1,4,0,0,0,0,1,0,0,0,1,0,0,1},
{1,0,1,0,1,0,1,0,1,1,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1},
{1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,3},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
//主函数
int main(void)
{
int n = 12,m = 25; // n行m列
clock_t start; //首先用clock_t定义两个变量储存开始与结束值
printf("游戏加载中...\n");
Sleep(2000);
system("cls"); //清屏
printf(" 欢迎来到C语言迷宫游戏3.0\n");
printf(" 游戏说明\n\n");
//printf("");
//printf("操作说明:\n");
printf(" 生命值或得分为0则游戏失败\n\n");
printf(" *********************\n");
printf(" * 上:W 墙壁:▓ *\n");
printf(" * 下:S 陷阱:※ *\n");
printf(" * 左:A 终点:★ *\n");
printf(" * 右:D 人物:☆ *\n");
printf(" *********************\n");
printf("\n");
system("PAUSE");
start = clock(); //记录开始时间
Show(maze,n,m);
MazeUpdate(maze,n,m,start);
//end = clock();
//times = ((double)(end - start))/CLK_TCK;
//printf("总用:%.fs",times);
return 0;
}
//函数功能:显示迷宫地图
void Show(int maze[][M],int n,int m)
{
int i,j;
for (i=0;i<n;i++) //显示n行m列迷宫地图数据
{
for (j=0;j<m;j++)
{
if (maze[i][j]==0)
{
printf(" "); //显示路径
}
else if (maze[i][j]==1)
{
printf("▓ "); //显示障碍物
}
else if (maze[i][j]==2)
{
printf("☆"); //显示电子鼠
}
else if (maze[i][j]==3)
{
printf("★");
}
else if (maze[i][j]==4)
{
printf("※");
}
}
printf("\n");
}
}
//函数功能:完成与用户输入有关的迷宫更新
void MazeUpdate(int maze[][M],int n,int m,double start)
{
int count=3,score=500;
int x = 1,y = 23; //初始位置
int exitX = 10, exitY = 24; //迷宫出口
char input;
clock_t end;
while (x!=exitX || y!=exitY) //判断是否达到迷宫出口
{
score--;
if (score==0) break;
if (kbhit()) //检查是否有键盘输入,没有就继续循环
{
input = getch(); //从键盘获取输入(不会在屏幕显示)
if (count==0) break;
if (input=='a' && maze[x][y-1]!=1) //左移
{
if (maze[x][y-1]==4) count--;
maze[x][y] = 0;
y--;
maze[x][y] = 2;
}
else if (input=='d' && maze[x][y+1]!=1) //右移
{
if (maze[x][y+1]==4) count--;
maze[x][y] = 0;
y++;
maze[x][y] = 2;
}
else if (input=='w' && maze[x-1][y]!=1) //上移
{
if (maze[x-1][y]==4) count--;
maze[x][y] = 0;
x--;
maze[x][y] = 2;
}
else if (input=='s' && maze[x+1][y]!=1) //下移
{
if (maze[x+1][y]==4) count--;
maze[x][y] = 0;
x++;
maze[x][y] = 2;
}
}
system("cls"); //清屏
printf(" \t\t迷宫游戏3.0.exe\n");
if ((x==exitX && y==exitY) || count==0 || score==0) //副标题提示进行和结束
{
printf(" \t\t 已结束\n");
}
//else if (count==0 || score==0)
//{
// printf(" \t\t 已结束\n");
//}
else
{
printf(" \t\t 进行中\n");
}
end = clock();
times = ((double)(end - start)) / CLOCKS_PER_SEC;
/* CLOCKS_PER_SEC是<time.h>定义的常量,
上式获得以秒为单位游戏的运行时间*/
printf("用时:%.fs",times);
printf("\t生命值:%d",count);
printf("\t得分:%d\n",score);
Show(maze,n,m); //显示更新后的迷宫
Sleep(100); //延时100ms
}
if (count==0 || score==0)
{
printf("很遗憾,闯关失败!\n");
}
else
{
printf("太棒了,恭喜你通关迷宫!\n");
}
system("PAUSE"); //Windows系统下暂停程序运行
}