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

📄 five.cpp

📁 站长以前用Brew写的五子棋程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "AEEModGen.h"          // Module interface definitions
#include "AEEAppGen.h"          // Applet interface definitions
#include "AEEShell.h"           // Shell interface definitions
#include "AEEFile.h"			// File interface definitions
#include "AEENet.h"				// Socket interface definitions
#include "AEESound.h"			// Sound Interface definitions
#include "AEETapi.h"			// TAPI Interface definitions
#include "AEEGraphics.h"
#include "aeestdlib.h"

#include "five.h"
#include "util.h"
/*
  type:0-black, 1-white, 2-last black, 3-last white, 4-xor cur_i/j and draw i/j, 5-only xor
*/
int FIVE_HumanGo(APP_DATA *pdata, int i, int j)
{
	if(i <0) i =0;
	if(i >LINE_COUNT-1) i =LINE_COUNT-1;
	if(j <0) j =0;
	if(j >LINE_COUNT-1) j =LINE_COUNT-1;
	if(pdata->man[i][j] !=0) return -1;

	FIVE_DrawMan(pdata, i, j, pdata->my_color);
	pdata->man[i][j] =pdata->my_color+1;
	pdata->step[pdata->cur_step].x =i;
	pdata->step[pdata->cur_step].y =j;
	pdata->cur_step++;

	if(FIVE_CheckStat(pdata, i, j, pdata->my_color+1) ==0)
	{
		FIVE_ShowStat2(pdata, "you win!");
		pdata->stat =0;

		return 0;
	}

	FIVE_MachineGo(pdata);

	return 0;
}

int FIVE_MachineGo(APP_DATA *pdata)
{
	POINT pt;
	if(pdata->cur_step ==0)
	{
		pt.x =LINE_COUNT/2;
		pt.y =LINE_COUNT/2;
	}
	else
	{
		pt =FIVE_GetBestPoint(pdata, pdata->my_color);
		if(pt.x ==-1 || pt.y ==-1)
			return 0;
	}

	FIVE_DrawMan(pdata, pt.x, pt.y, !pdata->my_color);
	pdata->man[pt.x][pt.y] =!pdata->my_color+1;
	
	pdata->step[pdata->cur_step].x =pt.x;
	pdata->step[pdata->cur_step].y =pt.y;
	pdata->cur_step++;
	
	if(FIVE_CheckStat(pdata, pt.x, pt.y, !pdata->my_color+1) ==0)
	{
		FIVE_ShowStat2(pdata, "machine win!");
		pdata->stat =0;
		return 0;
	}
	FIVE_ShowStat2(pdata, "please go..");

	return 0;
}

int FIVE_DrawBoard(APP_DATA *pdata)
{
	AEERect rc;
	int i;

	//ISHELL_GetDeviceInfo(pdata->a.m_pIShell, &di);

	IGRAPHICS_SetFillMode(pdata->m_pGraphics, TRUE);
	IGRAPHICS_SetFillColor(pdata->m_pGraphics, 255, 159, 81, 0);
	rc.x =0;
	rc.y =0;
	rc.dx =pdata->cx_screen;
	rc.dy =pdata->cy_screen;
	IGRAPHICS_DrawRect(pdata->m_pGraphics, &rc);
	for(i =0; i<LINE_COUNT; i++)
		IDISPLAY_DrawHLine(pdata->a.m_pIDisplay, pdata->start_space, pdata->start_space+pdata->per_line_width*i, pdata->cx_screen-15);
	IGRAPHICS_SetFillColor(pdata->m_pGraphics, 0, 0, 0, 0);
	for(i =0; i<LINE_COUNT; i++)
	{
		IDISPLAY_DrawVLine(pdata->a.m_pIDisplay, pdata->start_space+pdata->per_line_height*i, pdata->start_space, pdata->cx_screen-15);
		if(i ==3 || i ==12)
		{
			rc.x =pdata->start_space + pdata->per_line_width*i-1;
			rc.y =pdata->start_space + pdata->per_line_height*3-1;
			rc.dx=3;
			rc.dy=3;
			IGRAPHICS_DrawRect(pdata->m_pGraphics, &rc);
			rc.y =pdata->start_space + pdata->per_line_height*12-1;
			IGRAPHICS_DrawRect(pdata->m_pGraphics, &rc);
		}
	}
	IDISPLAY_Update(pdata->a.m_pIDisplay);
	
	return 0;
}

int FIVE_DrawMan(APP_DATA *pdata, int i, int j, int type)
{
	AEECircle ac;

	if(i <0) i =0;
	if(i >LINE_COUNT-1) i =LINE_COUNT-1;
	if(j <0) j =0;
	if(j >LINE_COUNT-1) j =LINE_COUNT-1;

	ac.r =pdata->man_width;

	switch(type)
	{
	case MAN_WHITE:
		if(pdata->man[i][j] >0)
			return 0;
		pdata->cur_i =-1;
		pdata->cur_j =j;
		ac.cx =pdata->start_space+pdata->per_line_width*i;
		ac.cy =pdata->start_space+pdata->per_line_height*j;
		IGRAPHICS_SetFillColor(pdata->m_pGraphics, COLOR_WHITE1,COLOR_WHITE2,COLOR_WHITE3, 0);
		IGRAPHICS_DrawCircle(pdata->m_pGraphics, &ac);
		//pdata->last_white_i =i;
		//pdata->last_white_j =j;
		//pdata->man[i][j] =MAN_WHITE;
		break;
	
	case MAN_BLACK:
		if(pdata->man[i][j] >0)
			return 0;
		pdata->cur_i =-1;
		pdata->cur_j =j;
		ac.cx =pdata->start_space+pdata->per_line_width*i;
		ac.cy =pdata->start_space+pdata->per_line_height*j;
		IGRAPHICS_SetFillColor(pdata->m_pGraphics, COLOR_BLACK1, COLOR_BLACK2, COLOR_BLACK3, 0);
		IGRAPHICS_DrawCircle(pdata->m_pGraphics, &ac);
		//pdata->last_black_i =i;
		//pdata->last_black_j =j;
		//pdata->man[i][j] =MAN_BLACK;
		//if(FIVE_CheckWin(pdata) >0)
		//	break;
		//pdata->stat =2;  // 机器走
		//FIVE_MachineGo(pdata);
		//pdata->stat =1;     // 人走
		break;

	case 2:
		break;
	
	case 3:
		break;

	case 4:
		if(pdata->cur_i >=0 && pdata->cur_j >=0)
		{
			IDISPLAY_BitBlt(pdata->a.m_pIDisplay,
				pdata->start_space+pdata->per_line_width*pdata->cur_i-pdata->man_width-1,
				pdata->start_space+pdata->per_line_width*pdata->cur_j-pdata->man_width-1,
				pdata->man_width*2+2, pdata->man_width*2+2,
				(void *)pdata->pCurBmp, 0, 0, AEE_RO_COPY);
		}

		IBitmap *pbmp;
		pbmp =NULL;

		IDISPLAY_GetDeviceBitmap(pdata->a.m_pIDisplay, &pbmp);
		IBITMAP_BltIn(pdata->pCurBmp, 0, 0,
			pdata->man_width*2+2,
			pdata->man_width*2+2,
			pbmp,
			pdata->start_space+pdata->per_line_width*i-pdata->man_width-1,
			pdata->start_space+pdata->per_line_height*j-pdata->man_width-1,
			AEE_RO_COPY);
		IBITMAP_Release(pbmp);

		ac.cx =pdata->start_space+pdata->per_line_width*i;
		ac.cy =pdata->start_space+pdata->per_line_height*j;
		if(pdata->man[i][j] ==0)
			IGRAPHICS_SetFillColor(pdata->m_pGraphics, COLOR_CUR1, COLOR_CUR2, COLOR_CUR3, 0);
		else if(pdata->man[i][j] ==MAN_WHITE+1)
			IGRAPHICS_SetFillColor(pdata->m_pGraphics, COLOR_CUR_WHITE1, COLOR_CUR_WHITE2, COLOR_CUR_WHITE3, 0);
		else if(pdata->man[i][j] ==MAN_BLACK+1)
			IGRAPHICS_SetFillColor(pdata->m_pGraphics, COLOR_CUR_BLACK1, COLOR_CUR_BLACK2, COLOR_CUR_BLACK3, 0);
		IGRAPHICS_DrawCircle(pdata->m_pGraphics, &ac);
		pdata->cur_i =i;
		pdata->cur_j =j;
		//FIVE_tmp(pdata, i, j);
		break;
	case 5:
		if(pdata->cur_i >=0 && pdata->cur_j >=0)
		{
			IDISPLAY_BitBlt(pdata->a.m_pIDisplay,
				pdata->start_space+pdata->per_line_width*pdata->cur_i-pdata->man_width-1,
				pdata->start_space+pdata->per_line_width*pdata->cur_j-pdata->man_width-1,
				pdata->man_width*2+2, pdata->man_width*2+2,
				(void *)pdata->pCurBmp, 0, 0, AEE_RO_COPY);
		}
	}

	return 0;
}

// 悔棋
int FIVE_GoBack(APP_DATA *pdata)
{
	return 0;
}

// 判断输赢和最佳点
int FIVE_CheckStat(APP_DATA *pdata, int nX, int nY, char cValue)
{
	int  nGrade;
	int  i, j, k, l;
	int  nXStart, nXEnd;
	int  nYStart, nYEnd;
	int  nXYStart, nXYEnd;
	int  nYXStart, nYXEnd;
	int  nXStartAdd, nYStartAdd, nXYStartAdd, nYXStartAdd;            
	int  nXEndAdd, nYEndAdd, nXYEndAdd, nYXEndAdd;            
	bool bXStartEmpty, bXEndEmpty, bXStartEmpty1, bXEndEmpty1;
	bool bYStartEmpty, bYEndEmpty, bYStartEmpty1, bYEndEmpty1;
	bool bXYStartEmpty, bXYEndEmpty, bXYStartEmpty1, bXYEndEmpty1;
	bool bYXStartEmpty, bYXEndEmpty, bYXStartEmpty1, bYXEndEmpty1;
		
	nXStart  = nXEnd  = nX;
	nYStart  = nYEnd  = nY;
	nXYStart = nXYEnd = nX;
	nYXStart = nYXEnd = nX;                                           
	nXStartAdd = nYStartAdd = nXYStartAdd = nYXStartAdd = 0;            	
	nXEndAdd = nYEndAdd = nXYEndAdd = nYXEndAdd = 0;            	
	bXStartEmpty = bYStartEmpty = bXYStartEmpty = bYXStartEmpty = FALSE;
	bXEndEmpty = bYEndEmpty = bXYEndEmpty = bYXEndEmpty = FALSE;
	bXStartEmpty1 = bYStartEmpty1 = bXYStartEmpty1 = bYXStartEmpty1 = FALSE;
	bXEndEmpty1 = bYEndEmpty1 = bXYEndEmpty1 = bYXEndEmpty1 = FALSE;
	
	for (i=nX-1; i>=0; i--)            // <-
	{
	    if (pdata->man[i][nY]==cValue)
	    	nXStart = i;
	    else if (pdata->man[i][nY]==0) 
	    {
			bXStartEmpty = TRUE;
			for (j=i-1; j>=0; j--)            // <-
			{
			    if (pdata->man[j][nY]==cValue)
	    			nXStartAdd = i-j;
			    else if (pdata->man[j][nY]==0) 
			    {
					bXStartEmpty1 = TRUE;
					break;
				}
				else
					break;
			}
            break;
        }                         
        else
        	break;
	}
	for (i=nX+1; i<LINE_COUNT; i++)           // ->
	{
	    if (pdata->man[i][nY]==cValue)
	    	nXEnd = i;
		else if (pdata->man[i][nY]==0)
		{
			bXEndEmpty = TRUE;     
			for (j=i+1; j<LINE_COUNT; j++)            // ->
			{
			    if (pdata->man[j][nY]==cValue)
	    			nXEndAdd = j-i;
			    else if (pdata->man[j][nY]==0) 
			    {
					bXEndEmpty1 = TRUE;
					break;
				}
				else
					break;
			}
            break;
	    }
	    else
	    	break;
	}
	    	
	for (i=nY-1; i>=0; i--)            // ^|^
	{
	    if (pdata->man[nX][i]==cValue)
	    	nYStart = i;
		else if (pdata->man[nX][i]==0)
		{
			bYStartEmpty = TRUE;   
			for (j=i-1; j>=0; j--)            // <-
			{
			    if (pdata->man[nX][j]==cValue)
	    			nYStartAdd = i-j;
			    else if (pdata->man[nX][j]==0) 
			    {
					bYStartEmpty1 = TRUE;
					break;
				}
				else
					break;
			}
            break;
		}
	    else
	    	break;
	}
	for (i=nY+1; i<LINE_COUNT; i++)           // v|v
	{
	    if (pdata->man[nX][i]==cValue)
	    	nYEnd = i;
		else if (pdata->man[nX][i]==0)
		{
			bYEndEmpty = TRUE;     
			for (j=i+1; j<LINE_COUNT; j++)            // ->
			{
			    if (pdata->man[nX][j]==cValue)
	    			nYEndAdd = j-i;
			    else if (pdata->man[nX][j]==0) 
			    {
					bYEndEmpty1 = TRUE;
					break;
				}
				else
					break;
			}
            break;
		}
	    else
	    	break;
	}
	
	//j = nY;
	for (i=nX-1, j=nY+1; i>=0&&j<LINE_COUNT; i--, j++)            // /'
	{
	    //j++;
	    if (pdata->man[i][j]==cValue)
	    	nXYStart = i;
		else if (pdata->man[i][j]==0)
		{
			bXYStartEmpty = TRUE; 
			for (k=i-1, l=j+1; k>=0&&l<LINE_COUNT; k--, l++)            // /'
			{
			    if (pdata->man[k][l]==cValue)
	    			nXYStartAdd = i-k;
				else if (pdata->man[k][l]==0)
				{
					bXYStartEmpty1 = TRUE; 
                    break;
                }
                else
                	break;
            }
			break;
		}
	    else
	    	break;
	}   
	//j = nY;
	for (i=nX+1, j=nY-1; i<LINE_COUNT&&j>=0; i++, j--)           // ./
	{      
		//j--;
	    if (pdata->man[i][j]==cValue)
	    	nXYEnd = i;
		else if (pdata->man[i][j]==0)
		{
			bXYEndEmpty = TRUE;   
			for (k=i+1, l=j-1; l>=0&&k<LINE_COUNT; l--, k++)            // /'
			{
			    if (pdata->man[k][l]==cValue)
	    			nXYEndAdd = k-i;
				else if (pdata->man[k][l]==0)
				{
					bXYEndEmpty1 = TRUE; 
                    break;
                }
                else
                	break;
            }
			break;
		}
	    else
	    	break;
	}
	    	
	//j = nY;
	for (i=nX-1, j=nY-1; i>=0&&j>=0; i--, j--)            // '`
	{
	    //j--;
	    if (pdata->man[i][j]==cValue)
	    	nYXStart = i;
		else if (pdata->man[i][j]==0)
		{
			bYXStartEmpty = TRUE; 
			for (k=i-1, l=j-1; k>=0&&l>=0; k--, l--)            // /'
			{
			    if (pdata->man[k][l]==cValue)
	    			nYXStartAdd = i-k;
				else if (pdata->man[k][l]==0)
				{
					bYXStartEmpty1 = TRUE; 
                    break;
                }
                else
                	break;
            }
			break;
		}
	    else
	    	break;
	}   
	//j = nY;
	for (i=nX+1, j=nY+1; i<LINE_COUNT&&j<LINE_COUNT; i++, j++)           // `.
	{      
		//j++;
	    if (pdata->man[i][j]==cValue)
	    	nYXEnd = i;
		else if (pdata->man[i][j]==0)
		{
			bYXEndEmpty = TRUE;   
			for (k=i+1, l=j+1; l<LINE_COUNT&&k<LINE_COUNT; l++, k++)            // /'
			{
			    if (pdata->man[k][l]==cValue)
	    			nYXEndAdd = k-i;
				else if (pdata->man[k][l]==0)
				{
					bYXEndEmpty1 = TRUE; 
                    break;
                }
                else
                	break;
            }
			break;
		}

⌨️ 快捷键说明

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