zoukankan      html  css  js  c++  java
  • C语言新手写扫雷攻略3

    界面绘制好后,雷数也布置了,接下来就是游戏的运行过程了,今天先不说具体过程,再来看看需要用到的辅助函数

    先是简单的画红旗,鼠标右键的功能是画红旗,至此我们都是在使用函数自己绘图,效率是低,但有助于理解

    void DrawRedFlag(int i, int j)
    {
    	setfillstyle(BS_SOLID);
    	setfillcolor(RED);
    	bar(8 + j * 20, 35 + i * 20, 8 + j * 20 + 5, 35 + i * 20 + 5);
    	setcolor(BLACK);
    	line(8 + j * 20, 35 + i * 20, 8 + j * 20, 35 + i * 20 + 10);
    }

    里面的坐标算好偏移,可以根据自己游戏的位置自行计算偏移坐标

    接下来是重要的雷数统计,统计的是一个格子周围的八个格子的雷数

    int MineStatistics(int i, int j)/*统计每个格子周围的雷数*/
    {
    	int nNUM = 0;
    	if (i == 0 && j == 0)/*左上角格子的统计*/
    	{
    		if (Mine[0][1].num == 1)
    			nNUM++;
    		if (Mine[1][0].num == 1)
    			nNUM++;
    		if (Mine[1][1].num == 1)
    			nNUM++;
    	}
    	else
    	if (i == 0 && j == 9)/*右上角格子的统计*/
    	{
    		if (Mine[0][8].num == 1)
    			nNUM++;
    		if (Mine[1][9].num == 1)
    			nNUM++;
    		if (Mine[1][8].num == 1)
    			nNUM++;
    	}
    	else
    	if (i == 9 && j == 0)/*左下角格子的统计*/
    	{
    		if (Mine[8][0].num == 1)
    			nNUM++;
    		if (Mine[9][1].num == 1)
    			nNUM++;
    		if (Mine[8][1].num == 1)
    			nNUM++;
    	}
    	else
    	if (i == 9 && j == 9)/*右下角格子的统计*/
    	{
    		if (Mine[9][8].num == 1)
    			nNUM++;
    		if (Mine[8][9].num == 1)
    			nNUM++;
    		if (Mine[8][8].num == 1)
    			nNUM++;
    	}
    	else if (j == 0)/*左边第一列格子的统计*/
    	{
    		if (Mine[i][j + 1].num == 1)
    			nNUM++;
    		if (Mine[i + 1][j].num == 1)
    			nNUM++;
    		if (Mine[i - 1][j].num == 1)
    			nNUM++;
    		if (Mine[i - 1][j + 1].num == 1)
    			nNUM++;
    		if (Mine[i + 1][j + 1].num == 1)
    			nNUM++;
    	}
    	else if (j == 9)/*右边第一列格子的统计*/
    	{
    		if (Mine[i][j - 1].num == 1)
    			nNUM++;
    		if (Mine[i + 1][j].num == 1)
    			nNUM++;
    		if (Mine[i - 1][j].num == 1)
    			nNUM++;
    		if (Mine[i - 1][j - 1].num == 1)
    			nNUM++;
    		if (Mine[i + 1][j - 1].num == 1)
    			nNUM++;
    	}
    	else if (i == 0)/*第一行格子的统计*/
    	{
    		if (Mine[i + 1][j].num == 1)
    			nNUM++;
    		if (Mine[i][j - 1].num == 1)
    			nNUM++;
    		if (Mine[i][j + 1].num == 1)
    			nNUM++;
    		if (Mine[i + 1][j - 1].num == 1)
    			nNUM++;
    		if (Mine[i + 1][j + 1].num == 1)
    			nNUM++;
    	}
    	else if (i == 9)/*最后一行格子的统计*/
    	{
    		if (Mine[i - 1][j].num == 1)
    			nNUM++;
    		if (Mine[i][j - 1].num == 1)
    			nNUM++;
    		if (Mine[i][j + 1].num == 1)
    			nNUM++;
    		if (Mine[i - 1][j - 1].num == 1)
    			nNUM++;
    		if (Mine[i - 1][j + 1].num == 1)
    			nNUM++;
    	}
    	else/*普通格子的统计*/
    	{
    		if (Mine[i - 1][j].num == 1)
    			nNUM++;
    		if (Mine[i - 1][j + 1].num == 1)
    			nNUM++;
    		if (Mine[i][j + 1].num == 1)
    			nNUM++;
    		if (Mine[i + 1][j + 1].num == 1)
    			nNUM++;
    		if (Mine[i + 1][j].num == 1)
    			nNUM++;
    		if (Mine[i + 1][j - 1].num == 1)
    			nNUM++;
    		if (Mine[i][j - 1].num == 1)
    			nNUM++;
    		if (Mine[i - 1][j - 1].num == 1)
    			nNUM++;
    	}
    		return nNUM;/*把格子周围一共有多少雷数的统计结果返回*/
    }

    这个功能的返回值就是这个各自周围的雷数,也就是扫雷点开后显示的数字

    不是每个格子都有雷,还有连续的区域是没有雷的,所以要现实空白的格子

    void ShowWhite(int i, int j)/*显示无雷区的空白部分*/
    {
    	if (Mine[i][j].flag == 1 || Mine[i][j].num == 0)/*如果有红旗或该格处理过就不对该格进行任何判断*/
    		return;
    	mineNUM--;/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/
    	if (Mine[i][j].roundnum == 0 && Mine[i][j].num != 1)/*显示空格*/
    	{
    		DrawEmpty(i, j, 1, WHITE);
    		Mine[i][j].num = 0;
    	}
    	else
    	if (Mine[i][j].roundnum != 0)/*输出雷数*/
    	{
    		DrawEmpty(i, j, 1, WHITE);
    		_stprintf_s(randmineNUM, _T("%d"), Mine[i][j].roundnum);
    		setcolor(RED);
    		outtextxy(6 + j * 20, 32 + i * 20, randmineNUM);
    		Mine[i][j].num = 0;/*已经输出雷数的格子用0表示已经用过这个格子*/
    		return;
    	}
    	/*8个方向递归显示所有的空白格子*/
    	if (i != 0 && Mine[i - 1][j].num != 1)
    		ShowWhite(i - 1, j);
    	if (i != 0 && j != 9 && Mine[i - 1][j + 1].num != 1)
    		ShowWhite(i - 1, j + 1);
    	if (j != 9 && Mine[i][j + 1].num != 1)
    		ShowWhite(i, j + 1);
    	if (j != 9 && i != 9 && Mine[i + 1][j + 1].num != 1)
    		ShowWhite(i + 1, j + 1);
    	if (i != 9 && Mine[i + 1][j].num != 1)
    		ShowWhite(i + 1, j);
    	if (i != 9 && j != 0 && Mine[i + 1][j - 1].num != 1)
    		ShowWhite(i + 1, j - 1);
    	if (j != 0 && Mine[i][j - 1].num != 1)
    		ShowWhite(i, j - 1);
    	if (i != 0 && j != 0 && Mine[i - 1][j - 1].num != 1)
    		ShowWhite(i - 1, j - 1);
    }

    这些是辅助函数,基本就这些!

  • 相关阅读:
    SAP SD 模块面试题
    商品ATP check FM(获得可用库存和总库存)
    获得SO的凭证流
    SAP XI 常用事务代码
    ABAP 面试问题及答案(一)(转)
    ABAP 面试题(转)
    SAP XI 3.0考试大纲
    Enterprise System Applicaiton 试题
    Enterprise Portal 试题
    ABAP 100 道面试题
  • 原文地址:https://www.cnblogs.com/acgpiano/p/3980178.html
Copyright © 2011-2022 走看看