C语言迷宫游戏设计3.0

一、游戏简介

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系统下暂停程序运行 
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤凰谪仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值