📄 reversi.c
字号:
* _OnMouseOver
*/
#if (GUI_SUPPORT_MOUSE & GUI_SUPPORT_CURSOR)
static void _OnMouseOver(WM_MESSAGE* pMsg) {
const GUI_PID_STATE* pState = (const GUI_PID_STATE *)pMsg->Data.p;
if (pState) {
_HandlePID(pState->x, pState->y, -1);
}
}
#endif
/*******************************************************************
*
* _OnMenu
*/
static void _OnMenu(WM_MESSAGE* pMsg) {
MENU_MSG_DATA* pData = (MENU_MSG_DATA*)pMsg->Data.p;
MENU_Handle hMenu = pMsg->hWinSrc;
switch (pData->MsgType) {
case MENU_ON_INITMENU:
if (_GameOver) {
MENU_DisableItem(hMenu, ID_MENU_PASS);
} else {
MENU_EnableItem(hMenu, ID_MENU_PASS);
}
break;
case MENU_ON_ITEMSELECT:
switch (pData->ItemId) {
case ID_MENU_NEW:
_StartNewGame();
break;
case ID_MENU_PASS:
_NextPlayer();
break;
case ID_MENU_EXIT:
WM_DeleteWindow(_hFrame);
break;
case ID_MENU_SETTINGS:
_ShowDialogSettings();
break;
case ID_MENU_ABOUT:
_ShowAboutBox();
break;
case ID_MENU_TEST:
WM_ReleaseCapture();
WM_DetachWindow(_hContextMenu);
break;
}
break;
default:
WM_DefaultProc(pMsg);
}
}
/*******************************************************************
*
* _OnPaint
*/
static void _OnPaint(WM_HWIN hWin) {
GUI_COLOR Color;
GUI_RECT r;
int x, y, xPos, yPos;
int CellSize, rStone, rMove;
char Cell, IsValidMove;
_CalcBoardDimensions();
GUI_AA_SetFactor(AA_FACTOR);
#if AA_USE_HIRES
GUI_AA_EnableHiRes();
#endif
LCD_SetBkColor(CLIENT_COLOR);
WM_GetClientRectEx(hWin, &r);
GUI_ClearRect(r.x0, r.y0, r.x1, _BoardY0 - 1);
GUI_ClearRect(r.x0, _BoardY0, _BoardX0 - 1, _BoardY0 + (8 * _CellSize));
GUI_ClearRect(_BoardX0 + (8 * _CellSize) + 1, _BoardY0, r.x1, _BoardY0 + (8 * _CellSize));
GUI_ClearRect(r.x0, _BoardY0 + (8 * _CellSize) + 1, r.x1, r.y1);
CellSize = _CellSize - 1;
rStone = ((CellSize - 3) * AA_CALCFACTOR) >> 1;
rMove = ((CellSize - 2) * AA_CALCFACTOR) >> 3;
if (rStone < AA_CALCFACTOR) {
rStone = AA_CALCFACTOR;
}
if (rMove < (AA_CALCFACTOR >> AA_USE_HIRES)) {
rMove = (AA_CALCFACTOR >> AA_USE_HIRES);
}
for (yPos = _BoardY0, y = 0; y < 8; y++) {
for (xPos = _BoardX0, x = 0; x < 8; x++) {
Color = ((x + (y & 1)) & 1) ? (GUI_LIGHTGRAY) : (GUI_WHITE);
LCD_SetColor(Color);
GUI_FillRect(xPos + 1, yPos + 1, xPos + CellSize, yPos + CellSize);
Cell = _GetStone(x, y);
IsValidMove = (_ShowPossibleMoves) ? _IsValidMove(x, y) : 0;
if (_pPlayerAI[_ActPlayer - 1]) {
IsValidMove = 0;
}
if (Cell || IsValidMove) {
int xCircle, yCircle;
xCircle = (xPos + 1) * AA_CALCFACTOR + ((CellSize * AA_CALCFACTOR) >> 1);
yCircle = (yPos + 1) * AA_CALCFACTOR + ((CellSize * AA_CALCFACTOR) >> 1);
if (Cell) {
Color = (Cell == 1) ? (GUI_RED) : (GUI_BLUE);
LCD_SetColor(Color);
#if (AA_FACTOR > 1)
GUI_AA_FillCircle(xCircle, yCircle, rStone);
#else
GUI_FillCircle(xCircle, yCircle, rStone);
#endif
} else {
LCD_SetColor(GUI_BLACK);
#if (AA_FACTOR > 1)
GUI_AA_FillCircle(xCircle, yCircle, rMove);
#else
GUI_FillCircle(xCircle, yCircle, rMove);
#endif
}
}
LCD_SetColor(GRID_COLOR);
GUI_DrawVLine(xPos, yPos + 1, yPos + CellSize);
xPos += _CellSize;
}
GUI_DrawVLine(xPos, yPos + 1, yPos + CellSize);
GUI_DrawHLine(yPos, _BoardX0, _BoardX0 + (_CellSize << 3));
yPos += _CellSize;
}
GUI_DrawHLine(yPos, _BoardX0, _BoardX0 + (_CellSize << 3));
}
/*******************************************************************
*
* _cbReversiWin
*/
static void _cbReversiWin(WM_MESSAGE* pMsg) {
WM_HWIN hWin = pMsg->hWin;
switch (pMsg->MsgId) {
case WM_PAINT:
_OnPaint(hWin);
break;
case WM_TOUCH:
_OnTouch(pMsg);
break;
#if (GUI_SUPPORT_MOUSE & GUI_SUPPORT_CURSOR)
case WM_MOUSEOVER:
_OnMouseOver(pMsg);
break;
#endif
case WM_MENU:
_OnMenu(pMsg);
break;
case WM_DELETE:
_hFrame = 0;
break;
default:
WM_DefaultProc(pMsg);
}
}
/*********************************************************************
*
* _StartReversi
*/
static void _StartReversi(void) {
_hFrame = FRAMEWIN_CreateEx(64, 11, 191, 218, WM_HBKWIN, WM_CF_SHOW, FRAMEWIN_CF_MOVEABLE, 0, NULL, &_cbReversiWin);
FRAMEWIN_SetClientColor(_hFrame, GUI_INVALID_COLOR);
FRAMEWIN_SetFont (_hFrame, &GUI_Font10_1);
FRAMEWIN_SetTextAlign (_hFrame, GUI_TA_HCENTER);
FRAMEWIN_AddCloseButton(_hFrame, FRAMEWIN_BUTTON_LEFT, 0);
FRAMEWIN_AddMaxButton (_hFrame, FRAMEWIN_BUTTON_RIGHT, 0);
FRAMEWIN_AddMinButton (_hFrame, FRAMEWIN_BUTTON_RIGHT, 1);
FRAMEWIN_SetResizeable (_hFrame, 1);
_CreateMenu(_hFrame);
_StartNewGame();
WM_SetFocus(_hFrame);
while (_hFrame) {
GUI_Delay(500);
}
}
/*********************************************************************
*
* Public code
*
**********************************************************************
*/
#if 1
/*********************************************************************
*
* _GetNearValue
*/
static int _GetNearValue(int x, int y) {
int r = 0xFF;
if ((x >= 0) && (y >= 0)) {
int x1, y1;
x1 = 7 - x;
y1 = 7 - y;
x = (x < x1) ? x : x1;
y = (y < y1) ? y : y1;
r = (x < y) ? x : y;
}
return r;
}
/*********************************************************************
*
* _PlayerAI_NearToBorder
*/
static char _PlayerAI_NearToBorder(U16 Board[8][8], U16 Flags, int Player, int* px, int* py) {
int x, y, xNear, yNear;
xNear = -1;
for (y = 0; y < 8; y++) {
for (x = 0; x < 8; x++) {
if (((y == 1) || (y == 6)) && ((x != 0) && (x != 7))) {
continue;
}
if (((x == 1) || (x == 6)) && ((y != 0) && (y != 7))) {
continue;
}
if (Board[x][y] & 0xFF00) {
if (_GetNearValue(x, y) < _GetNearValue(xNear, yNear)) {
xNear = x;
yNear = y;
}
}
}
}
if (xNear >= 0) {
*px = xNear;
*py = yNear;
} else {
return _PlayerAI_FirstValid(Board, Flags, Player, px, py);
}
return 1;
}
#endif
/*********************************************************************
*
* MainTask
*/
void MainTask(void);
void MainTask_Game(void) {
GUI_Init();
GUI_CURSOR_Select(&GUI_CursorArrowM);
GUI_CURSOR_Show();
WM_SetDesktopColor(DESKTOP_COLOR);
WM_SetCreateFlags(WM_CF_MEMDEV); /* Use memory devices on all windows to avoid flicker */
//_pPlayerAI[1] = &_PlayerAI_NearToBorder;
_pPlayerAI[1] = &_PlayerAI_FirstValid;
while (1) {
_StartReversi();
GUI_Delay(1000);
}
}
/*************************** End of file ****************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -