⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mine.c

📁 brew3.1做的挖雷游戏
💻 C
📖 第 1 页 / 共 2 页
字号:
		for(y=0;y<MINE_COLU_NUM;y++)
		{
			pMine->m_Data[x][y].m_bSel=TRUE;
			WINMINE_DrawElement(pMine,x,y,FALSE);	
		}
	WINMINE_SaveScore(pMine);	
	WINMINE_ShowMsg(pMine,1);
	IMINEMUSIC_Start(pMine->m_pMusic,MMT_SUCCESS);	
	return TRUE;
}
static boolean WINMINE_FAILUREHDL(IWinmine* pMine)
{
	int x,y;
	MINEASSERTNULL(pMine);
	pMine->m_Result=STAT_FAILURE;
	for(x=0;x<MINE_LINE_NUM;x++)
		for(y=0;y<MINE_COLU_NUM;y++)
		{
			pMine->m_Data[x][y].m_bSel=TRUE;
			WINMINE_DrawElement(pMine,x,y,FALSE);	
		}
	WINMINE_ShowMsg(pMine,2);
	IMINEMUSIC_Start(pMine->m_pMusic,MMT_FAILURE);		
	return TRUE;
}	
static boolean WINMINE_BLANKHDL(IWinmine* pMine,int x,int y)
{
	MINEASSERTNULL(pMine);
	
	if((x-1>=0)&&(y-1>=0))
		WINMINE_BlankElementHDL(pMine,x-1,y-1);
	if(x-1>=0)
		WINMINE_BlankElementHDL(pMine,x-1,y);
	if((x-1>=0)&&(y+1<MINE_COLU_NUM))
		WINMINE_BlankElementHDL(pMine,x-1,y+1);
	
	if(y-1>=0)
		WINMINE_BlankElementHDL(pMine,x,y-1);
	if(y+1<MINE_COLU_NUM)
		WINMINE_BlankElementHDL(pMine,x,y+1);	
	
	if((x+1<MINE_LINE_NUM)&&(y-1>=0))
		WINMINE_BlankElementHDL(pMine,x+1,y-1);
	if(x+1<MINE_LINE_NUM)
		WINMINE_BlankElementHDL(pMine,x+1,y);
	if((x+1<MINE_LINE_NUM)&&(y+1<MINE_COLU_NUM))
		WINMINE_BlankElementHDL(pMine,x+1,y+1);	
	return TRUE;
}	
static void WINMINE_BlankElementHDL(IWinmine* pMine,int x,int y)
{
	if(FALSE==pMine->m_Data[x][y].m_bSel)
	{
		pMine->m_Data[x][y].m_bSel=TRUE;
		WINMINE_DrawElement(pMine,x,y,FALSE);
		if(0==pMine->m_Data[x][y].m_Stat)
			WINMINE_BLANKHDL(pMine,x,y);
	}
}
static boolean WINMINE_ShowMsg(IWinmine* pMine,int nType)
{
	AECHAR wBuf[32];
	char       cBuf[32];
	AEERect rt;
	RGBVAL col;
	MINEASSERTNULL(pMine);
	
	rt.x=pMine->m_MenuRect.x+2;
	rt.y=pMine->m_MenuRect.y+2;	
	rt.dx=pMine->m_MenuRect.dx-4;
	rt.dy=pMine->m_MenuRect.dy-4;	
	ISHELL_CancelTimer(pMine->m_pApp->m_pIShell,(PFNNOTIFY) WINMINE_MsgTimerHDL, pMine);	
	
	switch(nType)	
	{
	case 0://time
	//get the timer value
		if(0==pMine->m_TimerCount)
		{		
			return WINMINE_FAILUREHDL(pMine);
		}
		else
		{
			SPRINTF(cBuf,"Best:%3d   score:%3d",pMine->m_MaxScore,pMine->m_TimerCount);
			STRTOWSTR(cBuf,wBuf,64);
		}
		pMine->m_TimerCount--;	
	//show image
		col=IDISPLAY_SetColor(pMine->m_pApp->m_pIDisplay, CLR_USER_TEXT,MAKE_RGB(0,0,205));
		if(pMine->m_pImage)
		{
			IIMAGE_SetOffset(pMine->m_pImage,MSGOFFSET_TIMER,2);
			IIMAGE_Draw(pMine->m_pImage,rt.x,rt.y);
			IDISPLAY_DrawText(pMine->m_pApp->m_pIDisplay,AEE_FONT_NORMAL,wBuf,
				-1,0,0,&rt,IDF_ALIGN_CENTER |IDF_ALIGN_MIDDLE|IDF_RECT_FRAME|IDF_TEXT_TRANSPARENT);	
		}
		else
			IDISPLAY_DrawText(pMine->m_pApp->m_pIDisplay,AEE_FONT_NORMAL,wBuf,
				-1,0,0,&rt,IDF_ALIGN_CENTER |IDF_ALIGN_MIDDLE|IDF_RECT_FRAME|IDF_RECT_FILL );			
		IDISPLAY_SetColor(pMine->m_pApp->m_pIDisplay, CLR_USER_TEXT,col);		
	//set timer
		ISHELL_SetTimer(pMine->m_pApp->m_pIShell,1000,(PFNNOTIFY) WINMINE_MsgTimerHDL, pMine);		
		break;
	case 1://sucess
		if(pMine->m_pImage)
		{
			IIMAGE_SetOffset(pMine->m_pImage,MSGOFFSET_SUCCESS,10);
			IIMAGE_Draw(pMine->m_pImage,rt.x,rt.y);
		}
		else
		{
			STRTOWSTR("SUCCESS",wBuf,20);
			IDISPLAY_DrawText(pMine->m_pApp->m_pIDisplay,AEE_FONT_BOLD,wBuf,
				-1,0,0,&rt,IDF_ALIGN_CENTER |IDF_ALIGN_MIDDLE|IDF_RECT_FRAME|IDF_RECT_FILL );			
		}
		break;
	case 2://failure
		if(pMine->m_pImage)
		{
			IIMAGE_SetOffset(pMine->m_pImage,MSGOFFSET_FAILURE,10);
			IIMAGE_Draw(pMine->m_pImage,rt.x,rt.y);
		}
		else
		{
			STRTOWSTR("FAILURE",wBuf,20);
			IDISPLAY_DrawText(pMine->m_pApp->m_pIDisplay,AEE_FONT_BOLD,wBuf,
				-1,0,0,&rt,IDF_ALIGN_CENTER |IDF_ALIGN_MIDDLE|IDF_RECT_FRAME|IDF_RECT_FILL );			
		}		
		break;
	default://error
		return FALSE;
	}
	IDISPLAY_Update(pMine->m_pApp->m_pIDisplay);
	return TRUE;
}
static void WINMINE_MsgTimerHDL(IWinmine* pMine)
{
	WINMINE_ShowMsg(pMine,0);
}
static boolean WINMINE_DrawElement(IWinmine* pMine,int x,int y,boolean bSel)
{
	AEERect rt,rtbak;
	MINEASSERTNULL(pMine);

	rt.dx=pMine->m_ElementWide;
	rt.dy=pMine->m_ElementHeight;

	rt.x=x*rt.dx+pMine->m_OffsetX;
	rt.y=y*rt.dy+pMine->m_OffsetY;	

	rtbak=rt;
	
	if(FALSE==pMine->m_Data[x][y].m_bSel)
		WINMINE_DrawFrame(pMine,&rtbak,x,y);
	else
	{
		char cBuf[2];

		switch(pMine->m_Data[x][y].m_Stat)
		{
		case MINE_FLAGE:
				switch(pMine->m_Result)
				{
				case STAT_START:
					WINMINE_DrawFrame(pMine,&rtbak,x,y);				
					WINMINE_DrawBanner(pMine,&rt);
					break;
				case STAT_SUCCESS:
					IDISPLAY_DrawRect(pMine->m_pApp->m_pIDisplay,&rtbak,MINEUI_FRAME,MINEUI_FILLCOLOR,IDF_RECT_FRAME|IDF_RECT_FILL);			
					WINMINE_DrawMine(pMine,&rt);					
					break;
				default:
					IDISPLAY_DrawRect(pMine->m_pApp->m_pIDisplay,&rtbak,MINEUI_FRAME,MINEUI_FILLCOLOR,IDF_RECT_FRAME|IDF_RECT_FILL);			
					WINMINE_DrawBlast(pMine,&rt);
				}
			break;
		case 0:
			WINMINE_DrawNumber(pMine,&rt," ");
			break;
		default:
			SPRINTF(cBuf,"%d",pMine->m_Data[x][y].m_Stat);
			WINMINE_DrawNumber(pMine,&rt,cBuf);			
		}
	}
	if(bSel)
		WINMINE_DrawCuror(pMine,&rt);
	return TRUE;
}

static boolean WINMINE_DrawCuror(IWinmine* pMine,AEERect* rt)
{
	AEEEllipse ellipse;

	if(pMine->m_pGraphic)
	{
		ellipse.cx=rt->x+rt->dx/2;
		ellipse.cy=rt->y+rt->dy/2;	
		ellipse.wx=rt->dx/2-2;
		ellipse.wy=rt->dy/2-2;
		
		IGRAPHICS_SetColor(pMine->m_pGraphic,255,0,0,255);
		IGRAPHICS_DrawEllipse(pMine->m_pGraphic,&ellipse);	
		IGRAPHICS_SetColor(pMine->m_pGraphic,0,0,0,255);		
	}
	return TRUE;
}
static boolean WINMINE_DrawMine(IWinmine* pMine,AEERect* rt)
{
	AEECircle circle;

	if(pMine->m_pGraphic)
	{
		circle.cx=rt->x+rt->dx/2;
		circle.cy=rt->y+rt->dy/2;	
		circle.r=(rt->dx>rt->y)?rt->y:rt->dx;
		circle.r=circle.r/2-4;
		IGRAPHICS_SetFillMode(pMine->m_pGraphic,TRUE);		
		IGRAPHICS_SetFillColor(pMine->m_pGraphic,0,0,0,255);
		IGRAPHICS_DrawCircle(pMine->m_pGraphic,&circle);	

		circle.r/=2;
		circle.cx-=circle.r;
		circle.cy-=circle.r;	
	
		IGRAPHICS_SetFillColor(pMine->m_pGraphic,205,205,205,255);	
		IGRAPHICS_DrawCircle(pMine->m_pGraphic,&circle);	
		IGRAPHICS_SetFillMode(pMine->m_pGraphic,FALSE);		
	}
	return TRUE;
}
static boolean WINMINE_DrawBlast(IWinmine* pMine,AEERect* rt)
{
	AEELine line;
	int x,y,z;
	int16    lineLen=1; 

	x=rt->dx/2+rt->x;
	y=rt->dy/2+rt->y;
	z=(rt->dx>rt->dy)?(rt->dy/2):(rt->dx/2);
//横线
	line.sx=rt->x+2;
	line.sy=y;
	line.ex=rt->x+rt->dx-2;
	line.ey=y;
	IGRAPHICS_DrawLine(pMine->m_pGraphic,&line);
//竖线
	line.sx=x;
	line.sy=rt->y+2;
	line.ex=x;
	line.ey=rt->y+rt->dy-2;
	IGRAPHICS_DrawLine(pMine->m_pGraphic,&line);
//Z
	z=z*3/5;
//左斜线
	line.sx=x-z;
	line.sy=y-z;
	line.ex=x+z;
	line.ey=y+z;
	IGRAPHICS_DrawLine(pMine->m_pGraphic,&line);
//右斜线
	line.sx=x+z;
	line.sy=y-z;
	line.ex=x-z;
	line.ey=y+z;
	IGRAPHICS_DrawLine(pMine->m_pGraphic,&line);
//地雷
	WINMINE_DrawMine(pMine,rt);
	return TRUE;
}	
static boolean WINMINE_DrawBanner(IWinmine* pMine,AEERect* rt)
{
	AEERect rect;
	AEETriangle triagle;
	AEELine line;
	int nHeight=2;
	int x=rt->x+rt->dx/2;
	int z=rt->dx/3;

	IGRAPHICS_SetFillMode(pMine->m_pGraphic,TRUE);		
	IGRAPHICS_SetFillColor(pMine->m_pGraphic,0,0,0,255);
//mast
	line.sx=line.ex=x;
	line.sy=rt->y+2;
	line.ey=rt->y+rt->dy-4;
	IGRAPHICS_DrawLine(pMine->m_pGraphic,&line);	
//pedestal
	rect.x=x-z;
	rect.y=rt->y+rt->dy-nHeight-2;
	rect.dx=z*2;
	rect.dy=nHeight;
	IGRAPHICS_DrawRect(pMine->m_pGraphic,&rect);
	
	z/=2;
	rect.x=x-z;
	rect.y-=nHeight-1;
	rect.dx=z*2;
	rect.dy=nHeight;
	IGRAPHICS_DrawRect(pMine->m_pGraphic,&rect);	
//flage 
	triagle.x0=line.sx;
	triagle.y0=line.sy;	
	triagle.x1=line.sx;
	triagle.y1=line.sy+(line.ey-line.sy)/2;	
	triagle.x2=rt->x+2;
	triagle.y2=line.sy+(line.ey-line.sy)/4;	
	IGRAPHICS_SetFillColor(pMine->m_pGraphic,255,0,0,255);
	IGRAPHICS_DrawTriangle(pMine->m_pGraphic,&triagle);
	IGRAPHICS_SetFillMode(pMine->m_pGraphic,FALSE);		
	return TRUE;
}	
static boolean WINMINE_DrawNumber(IWinmine* pMine,AEERect* rt,char* pText)
{
	AECHAR wBuf[4];
	RGBVAL col=IDISPLAY_SetColor(pMine->m_pApp->m_pIDisplay,CLR_USER_BACKGROUND,MINEUI_FILLCOLOR);
	STRTOWSTR(pText,wBuf,4);
	IDISPLAY_DrawText(pMine->m_pApp->m_pIDisplay,AEE_FONT_BOLD,wBuf,
		-1,0,0,rt,IDF_ALIGN_CENTER |IDF_ALIGN_MIDDLE|IDF_RECT_FRAME|IDF_RECT_FILL);
	IDISPLAY_SetColor(pMine->m_pApp->m_pIDisplay,CLR_USER_BACKGROUND,col);	
	return TRUE;
}	
static boolean WINMINE_DrawFrame(IWinmine* pMine,AEERect* rt,int x,int y)
{
	int cx=rt->x+2;
	int cy=rt->y+2;
	IDISPLAY_DrawFrame(pMine->m_pApp->m_pIDisplay,rt,AEE_FT_RAISED,MINEUI_FILLCOLOR);
	if(pMine->m_pGameImage)
	{
		IIMAGE_SetOffset(pMine->m_pGameImage,x*pMine->m_ElementWide,y*pMine->m_ElementHeight);
		IIMAGE_Draw(pMine->m_pGameImage,cx,cy);			
	}
	return TRUE;
}

static void WINMINE_SaveScore(IWinmine* pMine)
{
	TScore score;
	uint32 sec;
	if(pMine->m_TimerCount>pMine->m_MaxScore)
	{
		sec=GETTIMESECONDS();
		GETJULIANDATE(sec,&(score.m_Date));
		score.m_nScore=pMine->m_TimerCount;
		ISHELL_SetAppPrefs(pMine->m_pApp->m_pIShell,1,&score,sizeof(score));
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -