#include "Chess.h" #include //����png͸�������޷���ʾ�����ϵ��ģ� void putimagePNG(int x, int y, IMAGE* picture) //xΪ����ͼƬ��X���꣬yΪY���� { // ������ʼ�� DWORD* dst = GetImageBuffer(); // GetImageBuffer()���������ڻ�ȡ��ͼ�豸���Դ�ָ�룬EASYX�Դ� DWORD* draw = GetImageBuffer(); DWORD* src = GetImageBuffer(picture); //��ȡpicture���Դ�ָ�� int picture_width = picture->getwidth(); //��ȡpicture�Ŀ��ȣ�EASYX�Դ� int picture_height = picture->getheight(); //��ȡpicture�ĸ߶ȣ�EASYX�Դ� int graphWidth = getwidth(); //��ȡ��ͼ���Ŀ��ȣ�EASYX�Դ� int graphHeight = getheight(); //��ȡ��ͼ���ĸ߶ȣ�EASYX�Դ� int dstX = 0; //���Դ������صĽDZ� // ʵ��͸����ͼ ��ʽ�� Cp=��p*FP+(1-��p)*BP �� ��Ҷ˹���������е���ɫ�ĸ��ʼ��� for (int iy = 0; iy < picture_height; iy++) { for (int ix = 0; ix < picture_width; ix++) { int srcX = ix + iy * picture_width; //���Դ������صĽDZ� int sa = ((src[srcX] & 0xff000000) >> 24); //0xAArrggbb;AA��͸���� int sr = ((src[srcX] & 0xff0000) >> 16); //��ȡRGB���R 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; //���Դ������صĽDZ� 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) //��ʽ�� Cp=��p*FP+(1-��p)*BP �� ��p=sa/255 , FP=sr , BP=dr | ((sg * sa / 255 + dg * (255 - sa) / 255) << 8) //��p=sa/255 , FP=sg , BP=dg | (sb * sa / 255 + db * (255 - sa) / 255); //��p=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) { vectorrow; for (int j = 0; j < gradeSize; ++j) { row.push_back(0); } chessMap.push_back(row); } } void Chess::init() { //��ʾ���� loadimage(0, "map.png");//更改路径 //��ʾ���� loadimage(&chessBlackImg, "black.png", chessSize-2, chessSize-2, true);//更改路径 loadimage(&chessWhiteImg, "white.png", chessSize-2, chessSize-2, true);//更改路径 //�������� 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 { //���Ͻ� 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; } //���Ͻ� 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; } //���½� 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; } //���½� 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() { // ����б���ִ������ÿ����������ݵ�ǰ�����������5�����ӣ���һ�ַ��Ͼ���Ӯ // ˮƽ���� int row = lastPos.row; int col = lastPos.col; //����ˮƽ���� 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; } } // ��ֱ����(��������4��) 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; } } // ��/"���� for (int i = 0; i < 5; i++) { if (row + i < gradeSize && row + i - 4 >= 0 && col - i >= 0 && col - i + 4 < gradeSize && // ��[row+i]�У���[col-i]�����ӣ������Ϸ�����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; } } // ��\�� ���� for (int i = 0; i < 5; i++) { // ��[row+i]�У���[col-i]�����ӣ������·�����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); //Ӯ�� if (!playerFlag) { loadimage(0, "win.jpg",400,400,true);//更改路径 } //ʧ�� 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;//���� }