You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

278 lines
8.6 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "Chess.h"
#include <conio.h>
//„1¤7„1¤7„1¤7„1¤7png<6E>0È6„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>1«9„1¤7„1¤7„1¤7<C2A4>0¶5„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>0Ð3„1¤7„1¤7<C2A4>0<EFBFBD>0„1¤7
void putimagePNG(int x, int y, IMAGE* picture) //x<>0Ë2„1¤7„1¤7„1¤7„1¤7<C2A4>0É0<C389>0œ2„1¤7„1¤7X„1¤7„1¤7„1¤76þ7y<37>0Ë2Y„1¤7„1¤7„1¤7„1¤7
{
// „1¤7„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>0¶3„1¤7„1¤7
DWORD* dst = GetImageBuffer(); // GetImageBuffer()„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>17„1¤7<C2A4>0§0„1¤7„1¤7<C2A4>0É0„1¤7õô„1¤7„1¤7„1¤7<C2A4>0é6„1¤7<C2A4>0ö8„1¤7ƒ0 3EASYX„1¤7<C2A4>0é6„1¤7
DWORD* draw = GetImageBuffer();
DWORD* src = GetImageBuffer(picture); //„1¤7„1¤7<C2A4>0§0picture„1¤7„1¤7„1¤7<C2A4>0é6„1¤7<C2A4>0ö8„1¤7„1¤7
int picture_width = picture->getwidth(); //„1¤7„1¤7<C2A4>0§0picture„1¤7<C2A4>07„1¤7„1¤7<C2A4>0§2„1¤7EASYX„1¤7<C2A4>0é6„1¤7
int picture_height = picture->getheight(); //„1¤7„1¤7<C2A4>0§0picture„1¤7<C2A4>00<E28098>1²2<C2B2>0§2„1¤7EASYX„1¤7<C2A4>0é6„1¤7
int graphWidth = getwidth(); //„1¤7„1¤7<C2A4>0§0„1¤7„1¤7<C2A4>0É0„1¤7„1¤7„1¤7<C2A4>07„1¤7„1¤7<C2A4>0§2„1¤7EASYX„1¤7<C2A4>0é6„1¤7
int graphHeight = getheight(); //„1¤7„1¤7<C2A4>0§0„1¤7„1¤7<C2A4>0É0„1¤7„1¤7„1¤7<C2A4>00<E28098>1²2<C2B2>0§2„1¤7EASYX„1¤7<C2A4>0é6„1¤7
int dstX = 0; //„1¤7„1¤7„1¤7<C2A4>0é6„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>1…3<E280A6>05<E28098>0¢3„1¤7
// <20>0µ6„1¤7„1¤7<C2A4>0È6„1¤7„1¤7„1¤7„1¤7<C2A4>0É0 „1¤7„1¤7<C2A4>0¶4„1¤7„1¤7 Cp=„1¤7„1¤7p*FP+(1-„1¤7„1¤7p)*BP „1¤7„1¤7 „1¤7„1¤7<C2A4>0Ý0<C39D>0»9„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7§Ö„1¤7„1¤7„1¤7<C2A4>0®2„1¤7<C2A4>00„1¤7„1¤7<C2A4>0¶3„1¤7„1¤7„1¤7
for (int iy = 0; iy < picture_height; iy++)
{
for (int ix = 0; ix < picture_width; ix++)
{
int srcX = ix + iy * picture_width; //„1¤7„1¤7„1¤7<C2A4>0é6„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>1…3<E280A6>05<E28098>0¢3„1¤7
int sa = ((src[srcX] & 0xff000000) >> 24); //0xAArrggbb;AA„1¤7„1¤7<C2A4>0È6„1¤7„1¤7„1¤7„1¤7
int sr = ((src[srcX] & 0xff0000) >> 16); //„1¤7„1¤7<C2A4>0§0RGB„1¤7„1¤7„1¤7R
int sg = ((src[srcX] & 0xff00) >> 8); //G
int sb = src[srcX] & 0xff; //B
if (ix >= 0 && ix <= graphWidth && iy >= 0 && iy <= graphHeight && dstX <= graphWidth * graphHeight)
{
dstX = (ix + x) + (iy + y) * graphWidth; //„1¤7„1¤7„1¤7<C2A4>0é6„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>1…3<E280A6>05<E28098>0¢3„1¤7
int dr = ((dst[dstX] & 0xff0000) >> 16);
int dg = ((dst[dstX] & 0xff00) >> 8);
int db = dst[dstX] & 0xff;
draw[dstX] = ((sr * sa / 255 + dr * (255 - sa) / 255) << 16) //„1¤7„1¤7<C2A4>0¶4„1¤7„1¤7 Cp=„1¤7„1¤7p*FP+(1-„1¤7„1¤7p)*BP „1¤7„1¤7 „1¤7„1¤7p=sa/255 , FP=sr , BP=dr
| ((sg * sa / 255 + dg * (255 - sa) / 255) << 8) //„1¤7„1¤7p=sa/255 , FP=sg , BP=dg
| (sb * sa / 255 + db * (255 - sa) / 255); //„1¤7„1¤7p=sa/255 , FP=sb , BP=db
}
}
}
}
Chess::Chess(int gradeSize, int marginX, int marginY, double chessSize)
{
this->gradeSize = gradeSize;
this->margin_x = marginX;
this->margin_y = marginY;
this->chessSize = chessSize;
playerFlag = CHESS_BLACK;
for (int i = 0; i < gradeSize; ++i)
{
vector<int>row;
for (int j = 0; j < gradeSize; ++j)
{
row.push_back(0);
}
chessMap.push_back(row);
}
}
void Chess::init()
{
//„1¤7„1¤7<C2A4>0¶5„1¤7„1¤7„1¤7„1¤7
loadimage(0, "map.png");//¸ü¸Ä·¾¶
//„1¤7„1¤7<C2A4>0¶5„1¤7„1¤7„1¤7„1¤7
loadimage(&chessBlackImg, "black.png", chessSize-2, chessSize-2, true);//¸ü¸Ä·¾¶
loadimage(&chessWhiteImg, "white.png", chessSize-2, chessSize-2, true);//¸ü¸Ä·¾¶
//„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7
for (int i = 0; i < gradeSize; ++i)
for (int j = 0; j < gradeSize; ++j)
chessMap[i][j] = 0;
playerFlag = true;
}
bool Chess::clickBoard(int x, int y, ChessPos* pos)
{
int col = (x - margin_x) / chessSize;
int row = (y - margin_y) / chessSize;
int leftTopPosX = margin_x + chessSize * col;
int leftTopPosY = margin_y + chessSize * row;
int offset = chessSize * 0.4;
int len;
bool ret = false;
do {
//„1¤7„1¤7„1¤7<C2A4>0Ñ1„1¤7
len = sqrt((x - leftTopPosX) * (x - leftTopPosX) + (y - leftTopPosY) * (y - leftTopPosY));
if (len < offset)
{
pos->row = row;
pos->col = col;
if (chessMap[pos->row][pos->col] == 0)
ret = true;
break;
}
//„1¤7„1¤7„1¤7<C2A4>0Ñ1„1¤7
int x2 = leftTopPosX + chessSize;
int y2 = leftTopPosY;
len = sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
if (len < offset)
{
pos->row = row;
pos->col = col+1;
if (chessMap[pos->row][pos->col] == 0)
ret = true;
break;
}
//„1¤7„1¤7„1¤7<C2A4>0†5„1¤7
int x3 = leftTopPosX;
int y3 = leftTopPosY + chessSize;
len = sqrt((x - x3) * (x - x3) + (y - y3) * (y - y3));
if (len < offset)
{
pos->row = row + 1;
pos->col = col;
if (chessMap[pos->row][pos->col] == 0)
ret = true;
break;
}
//„1¤7„1¤7„1¤7<C2A4>0†5„1¤7
int x4 = leftTopPosX + chessSize;
int y4 = leftTopPosY + chessSize;
len = sqrt((x - x4) * (x - x4) + (y - y4) * (y - y4));
if (len < offset)
{
pos->row = row + 1;
pos->col = col + 1;
if (chessMap[pos->row][pos->col] == 0)
ret = true;
break;
}
} while (0);
return ret;
}
void Chess::ChessMove(ChessPos* pos, chess_kind_t kind)
{
int x = margin_x + chessSize * pos->col - 0.5 * chessSize;
int y = margin_y + chessSize * pos->row - 0.5 * chessSize;
if (kind == CHESS_WHITE)
putimagePNG(x, y, &chessWhiteImg);
else
putimagePNG(x, y, &chessBlackImg);
updateGameMap(pos);
}
int Chess::getGradeSize()
{
return gradeSize;
}
bool Chess::checkWin()
{
// „1¤7„1¤7„1¤7„1¤7§Ò„1¤7„1¤7„1¤7<C2A4>0ö4„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>07„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>1¥3„1¤7<C2A4>0¢2„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤75„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>0á5„1¤7„1¤7„1¤7<C2A4>0Ý5„1¤7<C2A4>0ö7„1¤7„1¤7<C2A4>0Ñ2„1¤7„1¤7„1¤7<C2A4>0â6
// <20>0º8<C2BA>0<EFBFBD>9„1¤7„1¤7„1¤7„1¤7
int row = lastPos.row;
int col = lastPos.col;
//„1¤7„1¤7„1¤7„1¤7<C2A4>0º8<C2BA>0<EFBFBD>9„1¤7„1¤7„1¤7„1¤7
for (int i = 0; i < 5; i++)
{
if (col - i >= 0 &&
col - i + 4 < gradeSize &&
chessMap[row][col - i] == chessMap[row][col - i + 1] &&
chessMap[row][col - i] == chessMap[row][col - i + 2] &&
chessMap[row][col - i] == chessMap[row][col - i + 3] &&
chessMap[row][col - i] == chessMap[row][col - i + 4])
{
setlinecolor(RED);
line(margin_x + (col - i) * chessSize, margin_y + (row) * chessSize, margin_x + (col - i + 4) * chessSize, margin_y + (row) * chessSize);
return true;
}
}
// „1¤7„1¤7<C2A4>0ö1„1¤7„1¤7„1¤7„1¤7(„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤74„1¤7„1¤7)
for (int i = 0; i < 5; i++)
{
if (row - i >= 0 &&
row - i + 4 < gradeSize &&
chessMap[row - i][col] == chessMap[row - i + 1][col] &&
chessMap[row - i][col] == chessMap[row - i + 2][col] &&
chessMap[row - i][col] == chessMap[row - i + 3][col] &&
chessMap[row - i][col] == chessMap[row - i + 4][col])
{
setlinecolor(RED);
line(margin_x + (col) * chessSize, margin_y + (row - i)*chessSize, margin_x + (col) * chessSize, margin_y + (row - i + 4)*chessSize);
return true;
}
}
// „1¤7„1¤7/"„1¤7„1¤7„1¤7„1¤7
for (int i = 0; i < 5; i++)
{
if (row + i < gradeSize &&
row + i - 4 >= 0 &&
col - i >= 0 &&
col - i + 4 < gradeSize &&
// „1¤7„1¤7[row+i]„1¤7§µ„1¤7„1¤7„1¤7[col-i]„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>0á5„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>0Ð5„1¤7„1¤7„1¤7„1¤7„1¤74„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>0ã4„1¤7„1¤7„1¤7<C2A4>0Ç4
chessMap[row + i][col - i] == chessMap[row + i - 1][col - i + 1] &&
chessMap[row + i][col - i] == chessMap[row + i - 2][col - i + 2] &&
chessMap[row + i][col - i] == chessMap[row + i - 3][col - i + 3] &&
chessMap[row + i][col - i] == chessMap[row + i - 4][col - i + 4])
{
setlinecolor(RED);
line(margin_x + (col - i)*chessSize, margin_y + (row + i) * chessSize, margin_x + (col - i + 4)*chessSize, margin_y + (row + i - 4) * chessSize);
return true;
}
}
// „1¤7„1¤7\„1¤7„1¤7 „1¤7„1¤7„1¤7„1¤7
for (int i = 0; i < 5; i++)
{
// „1¤7„1¤7[row+i]„1¤7§µ„1¤7„1¤7„1¤7[col-i]„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>0á5„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7¡¤„1¤7„1¤7„1¤7„1¤7„1¤74„1¤7„1¤7„1¤7„1¤7„1¤7<C2A4>0ã4„1¤7„1¤7„1¤7<C2A4>0Ç4
if (row - i >= 0 &&
row - i + 4 < gradeSize &&
col - i >= 0 &&
col - i + 4 < gradeSize &&
chessMap[row - i][col - i] == chessMap[row - i + 1][col - i + 1] &&
chessMap[row - i][col - i] == chessMap[row - i + 2][col - i + 2] &&
chessMap[row - i][col - i] == chessMap[row - i + 3][col - i + 3] &&
chessMap[row - i][col - i] == chessMap[row - i + 4][col - i + 4])
{
setlinecolor(RED);
line(margin_x + (col - i) * chessSize, margin_y + (row - i) * chessSize, margin_x + (col - i + 4) * chessSize, margin_y + (row - i + 4) * chessSize);
return true;
}
}
return false;
}
bool Chess::checkOver()
{
if (checkWin())
{
Sleep(3000);
//<2F>0â6„1¤7„1¤7
if (!playerFlag)
{
loadimage(0, "win.jpg",400,400,true);//¸ü¸Ä·¾¶
}
//<2F>0´2„1¤7„1¤7
else
{
loadimage(0, "fail.png", 400, 400, true);//¸ü¸Ä·¾¶
}
Sleep(5000);
return true;
}
return false;
}
int Chess::getChessData(ChessPos* pos)
{
return chessMap[pos->row][pos->col];
}
int Chess::getChessData(int row, int col)
{
return chessMap[row][col];
}
void Chess::updateGameMap(ChessPos* pos)
{
lastPos = *pos;
chessMap[pos->row][pos->col] = playerFlag ? CHESS_BLACK : CHESS_WHITE;
playerFlag = !playerFlag;//„1¤7„1¤7„1¤7„1¤7
}