From 591d0e5a0eadc9ba9fa1b7738a082322955d8ef7 Mon Sep 17 00:00:00 2001 From: py8alo9st <1756267935@qq.com> Date: Tue, 18 Jun 2024 16:15:38 +0800 Subject: [PATCH] ADD file via upload --- Gomoku.cpp | 604 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 604 insertions(+) create mode 100644 Gomoku.cpp diff --git a/Gomoku.cpp b/Gomoku.cpp new file mode 100644 index 0000000..0ca5b39 --- /dev/null +++ b/Gomoku.cpp @@ -0,0 +1,604 @@ + +#include +#include +#include +#include +#include +#include + +class seat +{ +public: + int i = 0; + int j = 0; + int number = 0; +}; + +class box +{ +public: + void draw(); + +public: + int x = 0; + int y = 0; + int value = -1; + int modle = 0; + bool isnew = false; + COLORREF color = WHITE; +}; + +void draw(); +void init(); +seat findbestseat(int color, int c); +void isWIN(); +void game(); + +int main() +{ + initgraph(700, 700); + setbkcolor(WHITE); + cleardevice(); + setbkmode(TRANSPARENT); + while (true) + { + init(); + game(); + cleardevice(); + } +} + +box BOX[19][19]; +int win = -1; +int whoplay = 0; +int playercolor = 0; +int dx[4]{ 1, 0, 1, 1 }; +int dy[4]{ 0, 1, 1, -1 }; +int Score[3][5] = { + {0, 80, 250, 500, 500}, {0, 0, 80, 250, 500}, {0, 0, 0, 80, 500} }; +int MAXxs[361]; +int MAXys[361]; +int mylength = 0; + +void box::draw() +{ + COLORREF thefillcolor = getfillcolor(); + setlinestyle(PS_SOLID, 2); + setfillcolor(color); + solidrectangle(x, y, x + 30, y + 30); + if (isnew) + { + setlinecolor(LIGHTGRAY); + line(x + 1, y + 2, x + 8, y + 2); + line(x + 2, y + 1, x + 2, y + 8); + line(x + 29, y + 2, x + 22, y + 2); + line(x + 29, y + 1, x + 29, y + 8); + line(x + 2, y + 29, x + 8, y + 29); + line(x + 2, y + 22, x + 2, y + 29); + line(x + 29, y + 29, x + 22, y + 29); + line(x + 29, y + 22, x + 29, y + 29); + } + setlinecolor(BLACK); + switch (modle) + { + case 0: + line(x + 15, y, x + 15, y + 30); + line(x - 1, y + 15, x + 30, y + 15); + break; + case 1: + line(x + 14, y + 15, x + 30, y + 15); + setlinestyle(PS_SOLID, 3); + line(x + 15, y, x + 15, y + 30); + setlinestyle(PS_SOLID, 2); + break; + case 2: + line(x - 1, y + 15, x + 15, y + 15); + setlinestyle(PS_SOLID, 3); + line(x + 15, y, x + 15, y + 30); + setlinestyle(PS_SOLID, 2); + break; + case 3: + line(x + 15, y + 15, x + 15, y + 30); + setlinestyle(PS_SOLID, 3); + line(x - 1, y + 15, x + 30, y + 15); + setlinestyle(PS_SOLID, 2); + break; + case 4: + line(x + 15, y, x + 15, y + 15); + setlinestyle(PS_SOLID, 3); + line(x - 1, y + 15, x + 30, y + 15); + setlinestyle(PS_SOLID, 2); + break; + case 5: + setlinestyle(PS_SOLID, 3); + line(x + 15, y, x + 15, y + 15); + line(x + 15, y + 15, x + 30, y + 15); + setlinestyle(PS_SOLID, 2); + break; + case 6: + setlinestyle(PS_SOLID, 3); + line(x + 15, y, x + 15, y + 15); + line(x - 1, y + 15, x + 15, y + 15); + setlinestyle(PS_SOLID, 2); + break; + case 7: + setlinestyle(PS_SOLID, 3); + line(x - 1, y + 15, x + 15, y + 15); + line(x + 15, y + 15, x + 15, y + 30); + setlinestyle(PS_SOLID, 2); + break; + case 8: + setlinestyle(PS_SOLID, 3); + line(x + 15, y + 15, x + 30, y + 15); + line(x + 15, y + 15, x + 15, y + 30); + setlinestyle(PS_SOLID, 2); + break; + case 9: + line(x + 15, y, x + 15, y + 30); + line(x - 1, y + 15, x + 30, y + 15); + setfillcolor(BLACK); + setlinestyle(PS_SOLID, 1); + fillcircle(x + 15, y + 15, 4); + break; + } + switch (value) + { + case 0: + setfillcolor(WHITE); + setlinestyle(PS_SOLID, 1); + fillcircle(x + 15, y + 15, 13); + break; + case 1: + setfillcolor(BLACK); + setlinestyle(PS_SOLID, 1); + fillcircle(x + 15, y + 15, 13); + break; + } + setfillcolor(thefillcolor); +} + +void draw() +{ + int number = 0; + TCHAR strnum[19][3] = { _T("1"), _T("2"), _T("3"), _T("4"), _T("5"), _T("6"), _T("7"), _T("8"), _T("9"), _T("10"), _T("11"), _T("12"), _T("13"), _T("14"), _T("15"), _T("16"), _T("17"), _T("18"), _T("19") }; + TCHAR strabc[19][3] = { _T("A"), _T("B"), _T("C"), _T("D"), _T("E"), _T("F"), _T("G"), _T("H"), _T("I"), _T("J"), _T("K"), _T("L"), _T("M"), _T("N"), _T("O"), _T("P"), _T("Q"), _T("R"), _T("S") }; + LOGFONT nowstyle; + gettextstyle(&nowstyle); + settextstyle(0, 0, NULL); + for (int i = 0; i < 19; i++) + { + for (int j = 0; j < 19; j++) + { + BOX[i][j].draw(); + if (BOX[i][j].isnew == true) + { + BOX[i][j].isnew = false; + } + } + } + for (int i = 0; i < 19; i++) + { + outtextxy(75 + number, 35, strnum[i]); + outtextxy(53, 55 + number, strabc[i]); + number += 30; + } + settextstyle(&nowstyle); +} + +void init() +{ + win = -1; + for (int i = 0, k = 0; i < 570; i += 30) + { + for (int j = 0, g = 0; j < 570; j += 30) + { + int modle = 0; + BOX[k][g].value = -1; + BOX[k][g].color = RGB(255, 205, 150); + BOX[k][g].x = 65 + j; + BOX[k][g].y = 50 + i; + if (k == 0 && g == 0) + { + modle = 8; + } + else if (k == 0 && g == 18) + { + modle = 7; + } + else if (k == 18 && g == 18) + { + modle = 6; + } + else if (k == 18 && g == 0) + { + modle = 5; + } + else if (k == 0) + { + modle = 3; + } + else if (k == 18) + { + modle = 4; + } + else if (g == 0) + { + modle = 1; + } + else if (g == 18) + { + modle = 2; + } + else if ((k == 3 && g == 3) || (k == 3 && g == 15) || (k == 15 && g == 3) || (k == 15 && g == 15) || (k == 3 && g == 9) || (k == 9 && g == 3) || (k == 15 && g == 9) || (k == 9 && g == 15) || (k == 9 && g == 9)) + { + modle = 9; + } + else + { + modle = 0; + } + BOX[k][g].modle = modle; + g++; + } + k++; + } +} + +seat findbestseat(int color, int c) +{ + if (c == 0) + { + mylength = 0; + } + int MAXnumber = -1e9; + for (int i = 0; i < 19; i++) + { + for (int j = 0; j < 19; j++) + { + if (BOX[i][j].value == -1) + { + int length; + int emeny; + int nowi = 0; + int nowj = 0; + int thescore = 0; + int is = 0; + for (int k = 0; k < 4; k++) + { + nowi = i; + nowj = j; + nowi += dx[k]; + nowj += dy[k]; + if (nowi >= 0 && nowj >= 0 && nowi <= 18 && nowj <= 18 && BOX[nowi][nowj].value != -1) + { + is = 1; + break; + } + nowi = i; + nowj = j; + nowi += dx[k]; + nowj += dy[k]; + if (nowi >= 0 && nowj >= 0 && nowi <= 18 && nowj <= 18 && BOX[nowi][nowj].value != -1) + { + is = 1; + break; + } + nowi = i; + nowj = j; + nowi -= dx[k]; + nowj -= dy[k]; + if (nowi >= 0 && nowj >= 0 && nowi <= 18 && nowj <= 18 && BOX[nowi][nowj].value != -1) + { + is = 1; + break; + } + nowi = i; + nowj = j; + nowi -= dx[k]; + nowj -= dy[k]; + if (nowi >= 0 && nowj >= 0 && nowi <= 18 && nowj <= 18 && BOX[nowi][nowj].value != -1) + { + is = 1; + break; + } + } + if (!is) + { + continue; + } + BOX[i][j].value = color; + for (int k = 0; k < 4; k++) + { + length = 0; + emeny = 0; + nowi = i; + nowj = j; + while (nowi <= 18 && nowj <= 18 && nowi >= 0 && nowj >= 0 && BOX[nowi][nowj].value == color) + { + length++; + nowj += dy[k]; + nowi += dx[k]; + } + if (nowi < 0 || nowj < 0 || nowi > 18 || nowj > 18 || BOX[nowi][nowj].value == !color) + { + emeny++; + } + nowi = i; + nowj = j; + while (nowi <= 18 && nowj <= 18 && nowi >= 0 && nowj >= 0 && BOX[nowi][nowj].value == color) + { + length++; + nowj -= dy[k]; + nowi -= dx[k]; + } + if (nowi < 0 || nowj < 0 || nowi > 18 || nowj > 18 || BOX[nowi][nowj].value == !color) + { + emeny++; + } + length -= 2; + if (length > 4) + { + length = 4; + } + if (Score[emeny][length] == 500) + { + BOX[i][j].value = -1; + return { i, j, Score[emeny][length] }; + } + thescore += Score[emeny][length]; + length = 0; + emeny = 0; + } + BOX[i][j].value = !color; + for (int k = 0; k < 4; k++) + { + length = 0; + emeny = 0; + nowi = i; + nowj = j; + while (nowi <= 18 && nowj <= 18 && nowi >= 0 && nowj >= 0 && BOX[nowi][nowj].value == !color) + { + length++; + nowj += dy[k]; + nowi += dx[k]; + } + if (nowi < 0 || nowj < 0 || nowi > 18 || nowj > 18 || BOX[nowi][nowj].value == color) + { + emeny++; + } + nowi = i; + nowj = j; + while (nowi <= 18 && nowj <= 18 && nowi >= 0 && nowj >= 0 && BOX[nowi][nowj].value == !color) + { + length++; + nowj -= dy[k]; + nowi -= dx[k]; + } + if (nowi < 0 || nowj < 0 || nowi > 18 || nowj > 18 || BOX[nowi][nowj].value == color) + { + emeny++; + } + length -= 2; + if (length > 4) + { + length = 4; + } + if (Score[emeny][length] == 500) + { + BOX[i][j].value = -1; + return { i, j, Score[emeny][length] }; + } + thescore += Score[emeny][length]; + length = 0; + emeny = 0; + } + BOX[i][j].value = -1; + if (thescore >= MAXnumber) + { + if (c < 3) + { + BOX[i][j].value = color; + int nowScore = thescore - findbestseat(!color, c + 1).number; + BOX[i][j].value = -1; + if (nowScore > MAXnumber) + { + MAXnumber = nowScore; + if (c == 0) + { + mylength = 0; + } + } + if (c == 0) + { + if (nowScore >= MAXnumber) + { + MAXxs[mylength] = i; + MAXys[mylength] = j; + mylength++; + } + } + } + else + { + if (thescore > MAXnumber) + { + MAXnumber = thescore; + } + } + } + } + } + } + if (c == 0) + { + int mynum = rand() % mylength; + return { MAXxs[mynum], MAXys[mynum], MAXnumber }; + } + return { 0, 0, MAXnumber }; +} + +void isWIN() +{ + bool isfull = true; + for (int i = 0; i < 19; i++) + { + for (int j = 0; j < 19; j++) + { + if (BOX[i][j].value != -1) + { + int nowcolor = BOX[i][j].value; + int length[4] = { 0, 0, 0, 0 }; + for (int k = 0; k < 4; k++) + { + int nowi = i; + int nowj = j; + while (nowi <= 18 && nowj <= 18 && nowi >= 0 && nowj >= 0 && BOX[nowi][nowj].value == nowcolor) + { + length[k]++; + nowj += dx[k]; + nowi += dy[k]; + } + nowi = i; + nowj = j; + while (nowi <= 18 && nowj <= 18 && nowi >= 0 && nowj >= 0 && BOX[nowi][nowj].value == 1 - nowcolor) + { + length[k]++; + nowj -= dx[k]; + nowi -= dy[k]; + } + } + for (int k = 0; k < 4; k++) + { + if (length[k] >= 5) + { + if (nowcolor == playercolor) + { + win = playercolor; + } + if (nowcolor == 1 - playercolor) + { + win = 1 - playercolor; + } + } + } + } + else + { + isfull = false; + } + } + } + if (isfull) + { + win = 2; + } +} + +void game() +{ + bool isinit; + int oldi = 0; + int oldj = 0; + srand(time(NULL)); + playercolor = rand() % 2; + setfillcolor(RGB(255, 205, 150)); + solidrectangle(40, 25, 645, 630); + settextstyle(30, 15, 0, 0, 0, 1000, false, false, false); + settextcolor(BLACK); + if (playercolor == 0) + { + isinit = 1; + outtextxy(150, 650, _T("玩家执白后行,电脑执黑先行")); + whoplay = 1; + } + else + { + isinit = 0; + outtextxy(150, 650, _T("玩家执黑先行,电脑执白后行")); + whoplay = 0; + } + draw(); + while (1) + { + NEXTPLAYER: + if (whoplay == 0) + { + MOUSEMSG mouse = GetMouseMsg(); + for (int i = 0; i < 19; i++) + { + for (int j = 0; j < 19; j++) + { + if (mouse.x > BOX[i][j].x && mouse.x < BOX[i][j].x + 30 && mouse.y > BOX[i][j].y && mouse.y < BOX[i][j].y + 30 && BOX[i][j].value == -1) + { + if (mouse.mkLButton) + { + BOX[i][j].value = playercolor; + BOX[i][j].isnew = true; + oldi = -1; + oldj = -1; + whoplay = 1; + goto DRAW; + } + BOX[oldi][oldj].isnew = false; + BOX[oldi][oldj].draw(); + BOX[i][j].isnew = true; + BOX[i][j].draw(); + oldi = i; + oldj = j; + } + } + } + } + else + { + if (isinit) + { + isinit = 0; + int drawi = 9; + int drawj = 9; + while (BOX[drawi][drawj].value != -1) + { + drawi--; + drawj++; + } + BOX[drawi][drawj].value = 1 - playercolor; + BOX[drawi][drawj].isnew = true; + } + else + { + seat best; + best = findbestseat(1 - playercolor, 0); + BOX[best.i][best.j].value = 1 - playercolor; + BOX[best.i][best.j].isnew = true; + } + whoplay = 0; + goto DRAW; + } + } +DRAW: + isWIN(); + draw(); + oldi = 0; + oldj = 0; + if (win == -1) + { + Sleep(500); + goto NEXTPLAYER; + } + settextcolor(RGB(0, 255, 0)); + Sleep(1000); + if (win == 0) + { + outtextxy(320, 320, _T("白胜")); + } + if (win == 1) + { + outtextxy(320, 320, _T("黑胜")); + } + if (win == 2) + { + outtextxy(320, 320, _T("平局")); + } + Sleep(5000); + return; +}