计算机软件实习2‘-基于WIN32 的贪吃蛇小程序

功能设计

功能要求

  1. 实现贪吃蛇游戏 基本功能, 屏幕上随机出现一个食物称为豆子,上下左右控制 “蛇 ”的移动 吃到 豆子 ”以后 “蛇 ”的身体加长 一点。
  2. “蛇 ”碰到边界 或蛇头与蛇身相撞蛇死亡,游戏结束。
  3. 为游戏设计友好的交互界面;例如欢迎界面,游戏界面,游戏结束界面。
    (这个贪食蛇程序在功能设定上(主要是交互界面)减少了一些功能实现,此例主要是为了学习WIN32)。

题目难点

  1. 要实现随机生成豆子(豆子不能和蛇头出现在同一位置)。
  2. 蛇身要自主增长(蛇头吃到豆子以后变长,不能直接在蛇尾增加长度,这个很可能撞墙,要在蛇头增加长度,并且更新蛇长)。
  3. 界面设计,对于游戏的不同状况要对进行分类,出现不同的提示(例如,在蛇死亡时,是重新开始游戏还是结束游戏)。

项目实现

利用Win32制作界面

首先新建一个项目,选择Win32Application,并输入相关的信息。
在这里插入图片描述
接着选择“Hello World”应用。然后点击结束,完成项目的创建。
在这里插入图片描述
然后我们进入初始界面。在打开项目上,文件里已经有一些初始代码,我们则要在这些初始代码中添加内容即可。
在这里插入图片描述
所有的代码,我们在一个WndProc内可以全部添加完成(相对于MFC而言更为简单,比较适合新手)。
在这里插入图片描述
下面我们主要开始用代码展示初始化贪食蛇游戏界面。
我们要明确我们需要哪些函数,这些函数的功能是什么:
①我们要有一条蛇,要有食物。
②蛇和食物要展现在界面上
③游戏要可以开始结束。
根据上面三条,我们设计了如下函数:

struct Snake//定义一个蛇的结构体
void init_snake();//初始化贪吃蛇
void generatefood();//在界面的任意位置产生食物
void MyPaint(HDC hdc);//定义一个函数,在函数中绘制网格,蛇身和食物,展示在界面上
void OnStart(HWND hWnd);//定义一个程序开始的函数

首先我们需要一些变量和函数来初始化网格窗口,蛇以及食物。
界面想要绘制出这些图像,都要通过画刷来展现。
变量:

HDC hdc;//定义界面
//定义行和列,以及网格的宽度和高度
int row=20;
int col=20;
#define WIDTH 30
#define HEIGHT 30

函数:

void MyPaint(HDC hdc){
	//绘制背景
	HBRUSH hbr=CreateSolidBrush(RGB(255,255,255));//创建画刷颜色为白色,用来绘制背景
	SelectObject(hdc,hbr);//通过for循环,初始化网格的背景色为白色
	for(int y=0;y<row;y++)
	{
		for(int x=0;x<col;x++)
		{
			Rectangle(hdc,x*WIDTH,y*HEIGHT,(x+1)*WIDTH,(y+1)*HEIGHT);
		}
	}
	//绘制贪吃蛇
    HBRUSH hbrred=CreateSolidBrush(RGB(255,0,0));//创建画刷颜色为红色,用来绘制蛇
	SelectObject(hdc,hbrred);//通过for循环,将选定坐标的对应的矩形涂满颜色
	for(int n=0;n<m_snake.len;n++)
	{
		Rectangle(hdc,m_snake.m_pos[n].x*WIDTH,m_snake.m_pos[n].y*HEIGHT,(m_snake.m_pos[n].x+1)*WIDTH,(m_snake.m_pos[n].y+1)*HEIGHT);
	}
	//绘制食物
    HBRUSH hbrblue=CreateSolidBrush(RGB(0,0,255));//创建画刷颜色为蓝色,用来绘制食物
	SelectObject(hdc,hbrblue);
	Rectangle(hdc,m_food.x*WIDTH,m_food.y*HEIGHT,(m_food.x+1)*WIDTH,(m_food.y+1)*HEIGHT);
}

其中generatefood()为随机生成食物的函数。

//在界面的任意位置产生食物
void generatefood(){
    //使用随机函数,并将食物设定在界面的范围内
	srand((unsigned)time(NULL));//记住在使用该函数的时候,别忘了添加头文件,否则报错
	m_food.x=rand()%20;
	m_food.y=rand()%20;
}

图片展示:
在这里插入图片描述

功能实现

我们在开始设计贪吃蛇项目的功能之前,我们首先要构造一个蛇的结构体。

//定义一个贪吃蛇的结构体
struct Snake{
	POINT m_pos[MAXSIZE];//定义结点的X,Y坐标表示蛇,其中m_pos[0]表示蛇头
	int m_direction;//定义变量表示蛇头运行的方向
	int len;//蛇的长度
};
Snake m_snake;

定义完结构体,我们需要初始化蛇(即设定蛇的长短,蛇头的位置等)。

//初始化贪吃蛇
void init_snake(){
	m_snake.len=3;
	m_snake.m_pos[0].x=0;
	m_snake.m_pos[0].y=0;
	m_snake.m_direction=1;
	for(int n=1;n<MAXSIZE;n++){//蛇身目前不存在,故位置为-1,不在框内
		m_snake.m_pos[n].x=-1;
		m_snake.m_pos[n].y=-1;
	}
	generatefood();//随机生成食物
}

除此之外,我们要设定程序开始的函数,其中主要要设定一个计算器,因为我们还要设计对应的蛇死亡。

//定义一个程序开始的函数
void OnStart(HWND hWnd){
	init_snake();
	//设计定时器
	SetTimer(hWnd,1,300,NULL);
}

初始化完蛇之后,我们开始蛇的功能实现,其中包括蛇的运动,蛇吃食物,蛇死亡。与此同时,我们还要在界面上展示这些功能。
首先是蛇的移动(我们要从键盘上改变蛇的方向):

	//设计使用键盘改变贪吃蛇移动的方向
		case WM_KEYDOWN://给上下左右设定一个数字,方便程序进行判断蛇的运动方向
			switch(wParam)
			{
			case VK_UP:
				m_snake.m_direction=0;//当m_direction=0,则判断蛇向上运动
				break;
			case VK_RIGHT:
				m_snake.m_direction=1;//当m_direction=1,则判断蛇向左运动
				 break;
			case VK_DOWN:
				m_snake.m_direction=2;//当m_direction=2,则判断蛇向下运动
				break;
			case VK_LEFT:
			    m_snake.m_direction=3;//当m_direction=3,则判断蛇向右运动
				break;
			}
			break;

接着,我们要设计一个定时器,在定时器内更新一系列动作,如果蛇死亡,则定时器结束。

        //设计定时器
		case WM_TIMER://用来更新蛇的坐标(现在可以根据键盘)
			for(n=m_snake.len-1;n>=1;n--){//更新蛇的其他部分
				m_snake.m_pos[n]=m_snake.m_pos[n-1];
			}
			//当蛇的方向改变时,更新蛇的坐标
			if(0==m_snake.m_direction){//向上
				m_snake.m_pos[0].y=m_snake.m_pos[0].y-1;
			}
			if(1==m_snake.m_direction){//向左
				m_snake.m_pos[0].x=m_snake.m_pos[0].x+1;
			}
			if(2==m_snake.m_direction){//向下
				m_snake.m_pos[0].y=m_snake.m_pos[0].y+1;
			}
			if(3==m_snake.m_direction){//向右
				m_snake.m_pos[0].x=m_snake.m_pos[0].x-1;
			}
			//判断蛇是否吃到食物
			if(m_snake.m_pos[0].x==m_food.x&&m_snake.m_pos[0].y==m_food.y){//如果蛇头的坐标等于食物的坐标
                m_snake.len++;
				generatefood();
			}
			//当蛇撞到边框时,游戏结束
			if(m_snake.m_pos[0].x>19||m_snake.m_pos[0].y>19||m_snake.m_pos[0].x<0||m_snake.m_pos[0].y<0){//当蛇头脱离屏幕内部,即撞到边框
                KillTimer(hWnd,1);//关闭定时器,游戏结束
				if(IDYES==MessageBox(hWnd,"Game Over,你想重新开始吗?","提示",MB_YESNO)){//蛇死亡后出现交互界面,判断是重新开始游戏还是结束游戏
					OnStart(hWnd);
				}
				else{
					PostQuitMessage(0);
				}
			}
			//将上面所有的动作展现在屏幕上
			hdc=GetDC(hWnd);//对上面的if语句进行判断,提取蛇移动的方向的句柄
			MyPaint(hdc);//用画刷展示(如果没有这两段程序,屏幕上则无法显示移动的蛇)
			break;

这样就完成了贪吃蛇游戏的制作。要注意蛇的初始化以及蛇的功能定位所在的位置。

成果展示

视频展示

在这里插入图片描述

思想感悟

这次利用Win32制作的贪吃蛇相对于MFC制作的贪吃蛇来说,整体来说制作更加简单,代码更加清晰,非常易于理解,很适合新手,而且整体来说,没有什么大的难点,易于实现。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值