在我学习游戏开发的过程中,遇到的最大的麻烦就是不知道一个游戏的完整实现过程,代码倒是其次。

这里,总结一下我做过的游戏,主要是梳理整每个步骤。


先看下最终的效果


Android猜鸡蛋游戏总结 打鸡蛋的游戏叫什么_扫雷




第1步,准备素材图片

包括鸡蛋、骨头,还有数字以及骨头标识和砸鸡蛋用的小锤。


第2步,声明 Egg类

它只包含2个成员变量

class CEgg
{
public:
	int bitmap;		//位图
	int num;		//数目
};





 

第2步,初始化界面

1.1 还是要在CMainFrame中设置窗口参数以及图标

1.2 和 五子棋游戏 不同,这里,要删掉工具栏和状态栏。(详见代码中CMainFrame类中的OnCreate()函数)


2.加载各个资源、初始化骨头数目、已标记骨头数目、时间等


3.1 随机设置若干个位置,用于显示有骨头的鸡蛋,(num为-1代表有骨头的鸡蛋)

//设置25根骨头	
	int aa=0;
	do	
	{		
        //以当前秒数为产生随机算法		
        int k=(rand()*s)%rowNum;		
        int l=(rand()*s)%colNum;	
		
        if(egg[k][l].num!=-1)			
        {			
	    egg[k][l].num=-1; 			
            aa++; 			
        }				
	}while(aa!=bone);




3.2 之后计算每个鸡蛋周围的骨头数目。

//给方格赋值,计算骨头数	
	for(int a=0;a<rowNum;a++)		
        for(int b=0;b<colNum;b++)			
			if(egg[a][b].num==0)				
			{				
				for(int c=a-1;c<a+2;c++)				
					for(int d=b-1;d<b+2;d++)						
						if(c>=0&&c<rowNum&&d>=0&&d<colNum)							
							if(egg[c][d].num==-1)								
								egg[a][b].num++;        								
			}






3.3  在C**View的OnDraw()函数中显示雷数、显示按钮位图、显示彩色鸡蛋位图(通过随机函数)

//显示按钮
Dc.SelectObject(button[0]);
pDC->BitBlt(250,10,160,160,&Dc,0,0,SRCCOPY);





代码比较多,不全部贴出来了


3.4  设置 当鼠标移动到视类界面时,显示锤子

BOOL CBoneInEggView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if(nHitTest==HTCLIENT)
	{
		SetCursor(cur);
		return 1;
	}
	return CView::OnSetCursor(pWnd, nHitTest, message);
}





第3步,完成游戏动作响应功能

现在界面已经做好了,只要完成左键按下、左键松开、右键按下功能函数,以及 重新开始功能、扫描功能即可。


分析下每个动作所要完成的功能

左键按下:

首先判断按下的位置,只有在 按钮位图 上面 和 鸡蛋上面 按下左键才是有效的;

如果是在 按钮位图上面单击,则 改变按钮位图的图片(左键松开的时候再重新初始化)

如果是在 鸡蛋位图上面单击,若鸡蛋里没有骨头,则显示相应数字,并重画周围8个位置,当鸡蛋里有骨头时,游戏结束,停止计时


左键松开:

如果是在 按钮位图上面,则 重新初始化界面

如果是在 鸡蛋位图上面,提示玩家,游戏结束


右键按下:(只在鸡蛋上,且 鸡蛋是初始位图状体,该操作有效)

若第一次按下,当前位置显示 警告标志,左上角显示的骨头数目-1

若第二次按下,消除 警告 标志,左上角显示的骨头数目+1


重新开始:

和初始化操作一样,也要设置计时。


扫描功能:

如果当前位置不是带骨头的鸡蛋,且周围有0个带骨头的鸡蛋,则扫描它周围的8个位置,并显示相应的数字

void CBoneInEggView::scan(void)
{
	 for(int i=0;i<rowNum;i++)
		for(int j=0;j<colNum;j++)
			if(egg[i][j].num==0&&egg[i][j].bitmap==1)
			{
				for(int n=i-1;n<i+2;n++)
					for(int m=j-1;m<j+2;m++)
						if(n>=0&&n<rowNum&&m>=0&&m<colNum)
							if(egg[n][m].num!=-1&&egg[n][m].bitmap==0)
							{
								egg[n][m].bitmap=1;
								CRect rect;
								rect.left=n*30+10;
								rect.right=n*30+40;
								rect.top=m*30+50;
								rect.bottom=m*30+80;
								InvalidateRect(&rect);		
							}
			}
}





代码地址

鸡蛋里挑骨头