• C语言新手写扫雷攻略4


    今天写的是游戏过程的函数,基本的算法前面都解释过了,今天是实现基本的功能

    补充一下前面需要用到的头文件

    #include<conio.h>  //_kbhit()
    #include<stdlib.h> //rand(),srand()
    #include<time.h>   //srand((unsigned)time(NULL))

    游戏的过程就是鼠标的操作过程,实现的就是鼠标的点击处理,因为不是WinAPI的按钮点击,所以得自己算坐标得到鼠标动作

    void MouseGetXY(void)
    {
    	m = GetMouseMsg();
    	MouseX = m.x;
    	MouseY = m.y;
    }

    m是鼠标的结构体,前面有定义过,具体结构查看前面或EasyX帮助

    然后实现的就是鼠标操作游戏过程

    void GamePlay(void)/*游戏过程*/
    {
    	int i, j, Num = 0;/*Num用来接收统计函数返回一个格子周围有多少地雷*/
    	for (i = 0; i < 10; i++)
    	for (j = 0; j<10; j++)
    		Mine[i][j].roundnum = MineStatistics(i, j);/*统计每个格子周围有多少地雷*/
    	while (!_kbhit())
    	{
    		m = GetMouseMsg();
    		switch (m.uMsg)
    		{
    		case WM_LBUTTONDOWN:
    		{
    							   MouseGetXY();
    							   if (MouseX>90 && MouseX<110 && MouseY>5 && MouseY<25)/*重新来*/
    							   {
    								   MessageBox(NULL, TEXT("重新开始成功"), TEXT("YES"), MB_OK);
    								   AGAIN = 1;
    								   return;
    							   }
    							   if (MouseX>0 && MouseX<200 && MouseY>30 && MouseY < 230)/*当前鼠标位置在格子范围内*/
    							   {
    								   j = (MouseX) / 20;/*x坐标*/
    								   i = (MouseY - 30) / 20;/*y坐标*/
    								   if (Mine[i][j].flag == 1)/*如果格子有红旗则左键无效*/
    									   continue;
    								   if (Mine[i][j].num != 0)/*如果格子没有处理过*/
    								   {
    									   if (Mine[i][j].num == 1)/*鼠标按下的格子是地雷*/
    									   {
    										   GameOver();/*游戏失败*/
    										   break;
    									   }
    									   else/*鼠标按下的格子不是地雷*/
    									   {
    										   Num = MineStatistics(i, j);
    										   if (Num == 0)/*周围没地雷就用递归算法来显示空白格子*/
    											   ShowWhite(i, j);
    										   else/*按下格子周围有地雷*/
    										   {
    											   _stprintf_s(randmineNUM, _T("%d"), Num);/*输出当前格子周围的雷数*/
    											   DrawEmpty(i, j, 1, WHITE);
    											   setcolor(RED);
    											   outtextxy(6 + j * 20, 32 + i * 20, randmineNUM);
    											   mineNUM--;
    										   }
    										   Mine[i][j].num = 0;/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/
    										   if (mineNUM < 1)/*胜利了*/
    										   {
    											   GameWin();
    											   break;
    										   }
    									   }
    								   }
    							   }
    		}
    		case WM_RBUTTONDOWN:
    		{
    							   MouseGetXY();
    							   if (MouseX > 0 && MouseX<200 && MouseY>30 && MouseY < 230)/*当前鼠标位置在格子范围内*/
    							   {
    								   j = (MouseX) / 20;/*x坐标*/
    								   i = (MouseY - 30) / 20;/*y坐标*/
    								   //MessageBox(NULL, TEXT("右键测试"), TEXT("YES"), MB_OK);
    								   if (Mine[i][j].flag == 0 && Mine[i][j].num != 0)/*本来没红旗现在显示红旗*/
    								   {
    									   DrawRedFlag(i, j);
    									   Mine[i][j].flag = 1;
    								   }
    								   else
    								   if (Mine[i][j].flag == 1)/*有红旗标志再按右键就红旗消失*/
    								   {
    									   DrawEmpty(i, j, 0, LIGHTGRAY);
    									   Mine[i][j].flag = 0;
    								   }
    							   }
    		}
    		}
    	}
    }

    switch case只有两个,鼠标的左键和右键操作

    然后就是游戏胜利或者游戏失败的函数,都是比较简单的

    void GameOver(void)
    {
    	int i, j;
    	for (i = 0; i < 10; i++)
    	{
    		for (j = 0; j < 10; j++)
    		{
    			if (Mine[i][j].num == 1)//显示所有地雷
    			{
    				DrawEmpty(i, j, 0, WHITE);
    				setfillstyle(BS_SOLID);
    				setfillcolor(RED);
    				fillellipse(3 + j * 20, 33 + i * 20, 17 + j * 20, 47 + i * 20);	
    				setbkcolor(WHITE);
    				setcolor(RED);
    				settextstyle(16, 0, _T("宋体"));
    				outtextxy(2, 2, _T("输了请重来"));
    			}
    		}
    	}
    }
    
    void GameWin(void)
    {
    	setbkcolor(WHITE);
    	setcolor(RED);
    	settextstyle(16, 0, _T("宋体"));
    	outtextxy(2, 2, _T("你赢了"));
    }

    至此这个游戏就算完成了,基本的功能都实现了,大家还可以添加更高级的功能,比如限定雷数,倒计时等,下次放出完整的代码书呆子

  • 相关阅读:
    接口分类
    HTTPS和HTTP的主要区别
    协议类
    小程序
    Polyfill
    去重数组
    odoo 接口跨域请求报错
    docker-compose 自定义容器名称
    linux ssh 防暴力破解fail2ban
    odoo 知识点
  • 原文地址:https://www.cnblogs.com/acgpiano/p/3980186.html
Copyright © 2020-2023  润新知