【C++/控制台】简易五子棋游戏

程序源码

cpp 复制代码
#include <iostream>
#include <vector>
#include <string>
#include <windows.h>
using namespace std;

void color(int x) {
    // 设置颜色的函数
    if (x >= 0 & x <= 15)
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
    else {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
    }
}

class Chess {
public:
    int a[15][15];
    Chess();
    void paint1();
    void play();
    int AI();
    int player(int, int, int);
    int max1(int a1[4]);
    int get1(int a1[4]);
    int s;
    int s1[2];
};

Chess::Chess() {
    // 棋盘类的构造函数
    for (int i = 0; i < 15; i++) {
        for (int j = 0; j < 15; j++) {
            a[i][j] = 0;
        }
    }
    s = 0;
    s1[0] = -1;
    s1[1] = -1;
}

int Chess::max1(int a1[4]) {
    int temp = a1[0];
    for (int i = 1; i < 4; i++)
        if (a1[i] > temp) {
            temp = a1[i];
        }
    return temp;
}

int Chess::get1(int a1[4]) {
    int temp = a1[0];
    int tp1 = 1;
    for (int i = 1; i < 4; i++)
        if (a1[i] > temp) {
            temp = a1[i];
            tp1 = i + 1;
        }
    return tp1;
}

void Chess::paint1() {
    // 绘制棋盘的函数
    cout << "   ";
    for (int i = 0; i < 15; i++) {
        if (i <= 9) {
            cout << i << " ";
        } else
            cout << i << "";
    }
    cout << endl;
    for (int i = 0; i < 15; i++) {
        if (i <= 9) {
            cout << i << "  ";
        } else
            cout << i << " ";
        for (int j = 0; j < 15; j++) {
            if (a[i][j] == 0) {
                color(7);
                cout << "十";
            } else if (a[i][j] == 1) {
                color(12); // 显示红色棋子
                cout << "红";
            } else if (a[i][j] == 2) {
                color(2); // 显示蓝色棋子
                cout << "蓝";
            }
        }
        cout << endl;
    }
}

int Chess::player(int x1, int y1, int z) {
    if (a[x1][y1] != 0) {
        cout << "落子无效";
        return 1;
    }
    a[x1][y1] = z;

    // 判断同一直线上位置是否有五子
    int total = 0;
    for (int i = y1 - 1; i >= 0; i--) {
        if (a[x1][i] == z)
            total++;
        else
            break;
    }

    for (int i = y1 + 1; i < 15; i++) {
        if (a[x1][i] == z)
            total++;
        else
            break;
    }
    if (total >= 4)
        return 5; // 获胜

    // 判断同一竖线上是否有五子

    total = 0;
    for (int i = x1 - 1; i >= 0; i--) {
        if (a[i][y1] == z)
            total++;
        else
            break;
    }
    for (int i = x1 + 1; i < 15; i++) {
        if (a[i][y1] == z)
            total++;
        else
            break;
    }
    if (total >= 4)
        return 5; // 获胜

    // 判断左斜线是否有五子
    total = 0;
    for (int i = 1; i < 5; i++) {
        if (x1 - i < 0 || y1 - i < 0)
            break;
        if (a[x1 - i][y1 - i] == z)
            total++;
        else
            break;
    }

    for (int i = 1; i < 5; i++) {
        if (x1 + i >= 15 || y1 + i >= 15)
            break;
        if (a[x1 + i][y1 + i] == z)
            total++;
        else
            break;
    }
    if (total >= 4)
        return 5; // 获胜

    // 判断右斜线是否有五子;
    total = 0;
    for (int i = 1; i < 5; i++) {
        if (x1 - i < 0 || y1 + i >= 15)
            break;
        if (a[x1 - i][y1 + i] == z)
            total++;
        else
            break;
    }

    for (int i = 1; i < 5; i++) {
        if (x1 + i >= 15 || y1 - i < 0)
            break;
        if (a[x1 + i][y1 - i] == z)
            total++;
        else
            break;
    }
    if (total >= 4)
        return 5; // 获胜
    return 2;     // 落子有效,但未获胜
}

int Chess::AI() {
    int t1 = 0;
    // 判断自己有没有四子的情况

    for (int i = 0; i < 15; i++) {
        for (int j = 0; j < 15; j++) {
            int total1 = 0;
            int total2 = 0;
            int total3 = 0;
            int total4 = 0;
            if (a[i][j] != 0)
                continue;
            for (int a1 = 1; a1 < 5; a1++) {
                // 判断水平线
                if (j - a1 < 0)
                    break;
                if (a[i][j - a1] == 2)
                    total1++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                if (j + a1 >= 15)
                    break;
                if (a[i][j + a1] == 2)
                    total1++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                // 判断竖直部分
                if (i - a1 < 0)
                    break;
                if (a[i - a1][j] == 2)
                    total2++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                if (i + a1 >= 15)
                    break;
                if (a[i + a1][j] == 2)
                    total2++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                // 判断左斜线
                if (i - a1 < 0 || j - a1 < 0)
                    break;
                if (a[i - a1][j - a1] == 2)
                    total3++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                if (i + a1 >= 15 || j + a1 >= 15)
                    break;
                if (a[i + a1][j + a1] == 2)
                    total3++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                // 判断右斜线
                if (i - a1 < 0 || j + a1 >= 15)
                    break;
                if (a[i - a1][j + a1] == 2)
                    total4++;
                else
                    break;
            }
            for (int a1 = 1; a1 < 5; a1++) {
                if (i + a1 >= 15 || j - a1 < 0)
                    break;
                if (a[i + a1][j - a1] == 2)
                    total4++;
                else
                    break;
            }
            int a1[4] = {total1, total2, total3, total4};
            int temp = max1(a1);
            if (temp >= 4) {
                a[i][j] = 2;
                // cout<<"AI已获胜";
                return -1;
            }
        }
    }

    for (int i = 0; i < 15; i++) {
        // 判断对手是否有大于三子的情况
        for (int j = 0; j < 15; j++) {
            int total1 = 0;
            int total2 = 0;
            int total3 = 0;
            int total4 = 0;
            if (a[i][j] == 1 || a[i][j] == 2)
                continue;
            for (int a1 = 1; a1 < 5; a1++) {
                // 判断水平线
                if (j - a1 < 0)
                    break;

                if (a[i][j - a1] == 1)
                    total1++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                if (j + a1 >= 15)
                    break;
                if (a[i][j + a1] == 1)
                    total1++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                // 判断竖直线
                if (i - a1 < 0)
                    break;
                if (a[i - a1][j] == 1)
                    total2++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                if (i + a1 >= 15)
                    break;
                if (a[i + a1][j] == 1)
                    total2++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                // 判断左斜线
                if (i - a1 < 0 || j - a1 < 0)
                    break;
                if (a[i - a1][j - a1] == 1)
                    total3++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                if (i + a1 >= 15 || j + a1 >= 15)
                    break;
                if (a[i + a1][j + a1] == 1)
                    total3++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                // 判断右斜线
                if (i - a1 < 0 || j + a1 >= 15)
                    break;
                if (a[i - a1][j + a1] == 1)
                    total4++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                if (i + a1 >= 15 || j - a1 < 0)
                    break;
                if (a[i + a1][j - a1] == 1)
                    total4++;
                else
                    break;
            }
            int a1[4] = {total1, total2, total3, total4};
            int temp = max1(a1);
            int tp1 = get1(a1); // 获取哪个方向上连子最多,1表示水平线,2代表竖直线,3代表左斜线,4代表右斜线
            if (temp == 3) {
                // 对手已经三子,此时要分情况,有边界的三子不用堵,没有边界的三子需要堵
                if (tp1 == 1) {
                    // 水平线有三子
                    int a1;
                    int tpx1 = 0;
                    for (a1 = 1; a1 <= 3; a1++) {
                        //  tpx1=0;
                        if (j - a1 < 0)
                            break;
                        if (a[i][j - a1] == 1)
                            tpx1++;
                        else
                            break;
                    }

                    if (tpx1 == 3) {
                        if (j - a1 == 0) {
                        } else if (j - a1 - 1 >= 0) {
                            if (a[i][j - a1 - 1] == 0) {
                                a[i][j] = 2;
                                return 0;
                            }
                        }
                    }

                    else if (tpx1 == 2) {
                        a[i][j] = 2;
                        return 0;
                    } else if (tpx1 == 1) {
                        a[i][j] = 2;
                        return 0;
                    } else if (tpx1 == 0) {
                        if (j + a1 == 14) {
                        } else if (j + a1 < 14) {
                            if (a[i][j + a1 + 1] == 0) {
                                a[i][j] = 2;
                                return 0;
                            }
                        }
                    }

                } // 水平线三子情况判断结束

                else if (tp1 == 2) {
                    // 竖直线有三子的情况

                    int a1;
                    int tpx1 = 0;
                    for (a1 = 1; a1 <= 3; a1++) {
                        //  tpx1=0;
                        if (i - a1 < 0)
                            break;
                        if (a[i - a1][j] == 1)
                            tpx1++;
                        else
                            break;
                    }

                    if (tpx1 == 3) {
                        if (i - a1 == 0) {
                        } else if (i - a1 - 1 >= 0) {
                            if (a[i - a1 - 1][j] == 0) {
                                a[i][j] = 2;
                                return 0;
                            }
                        }
                    }

                    else if (tpx1 == 2) {
                        a[i][j] = 2;
                        return 0;
                    } else if (tpx1 == 1) {
                        a[i][j] = 2;
                        return 0;
                    } else if (tpx1 == 0) {
                        if (i + a1 == 14) {
                        } else if (i + a1 < 14) {
                            if (a[i + a1 + 1][j] == 0) {
                                a[i][j] = 2;
                                return 0;
                            }
                        }
                    }

                } // 竖直线有三子情况判断结束

                else if (tp1 == 3) {
                    // 左斜线有三子的情况

                    int a1;
                    int tpx1 = 0;
                    for (a1 = 1; a1 <= 3; a1++) {
                        //  tpx1=0;
                        if (i - a1 < 0 || j - a1 < 0)
                            break;
                        if (a[i - a1][j - a1] == 1)
                            tpx1++;
                        else
                            break;
                    }

                    if (tpx1 == 3) {
                        if (i - a1 == 0 || j - a1 == 0) {
                        } else if (i - a1 - 1 >= 0 and j - a1 - 1 >= 0) {
                            if (a[i - a1 - 1][j - a1 - 1] == 0) {
                                a[i][j] = 2;
                                return 0;
                            }
                        }
                    }

                    else if (tpx1 == 2) {
                        a[i][j] = 2;
                        return 0;
                    } else if (tpx1 == 1) {
                        a[i][j] = 2;
                        return 0;
                    } else if (tpx1 == 0) {
                        if (i + a1 == 14 || j + a1 == 14) {
                        } else if (i + a1 < 14 and j + a1 < 14) {
                            if (a[i + a1 + 1][j + a1 + 1] == 0) {
                                a[i][j] = 2;
                                return 0;
                            }
                        }
                    }

                } // 左斜线三子情况判断结束

                else if (tp1 == 4) {
                    // 判断右斜线有三子的情况

                    int a1;
                    int tpx1 = 0;
                    for (a1 = 1; a1 <= 3; a1++) {
                        //  tpx1=0;
                        if (i - a1 < 0 || j + a1 > 14)
                            break;
                        if (a[i - a1][j + a1] == 1)
                            tpx1++;
                        else
                            break;
                    }

                    if (tpx1 == 3) {
                        if (i - a1 == 0 || j + a1 == 14) {
                        } else if (i - a1 - 1 >= 0 and j + a1 + 1 <= 14) {
                            if (a[i - a1 - 1][j + a1 + 1] == 0) {
                                a[i][j] = 2;
                                return 0;
                            }
                        }
                    }

                    else if (tpx1 == 2) {
                        a[i][j] = 2;
                        return 0;
                    } else if (tpx1 == 1) {
                        a[i][j] = 2;
                        return 0;
                    } else if (tpx1 == 0) {
                        if (i + a1 == 14 || j - a1 == 0) {
                        } else if (i + a1 < 14 and j - a1 > 0) {
                            if (a[i + a1 + 1][j - a1 - 1] == 0) {
                                a[i][j] = 2;
                                return 0;
                            }
                        }
                    }

                } // 右斜线三子情况判断结束

            } // 对手有三子的情况 (if的括号)

            else if (temp == 4 || temp == 5) {
                // 对手有四子或五子,一定要堵
                a[i][j] = 2;
                return 0;
            }
        }
    }

    // 判断对手连子情况结束,开始连自己五子

    for (int i = 0; i < 15; i++) {
        for (int j = 0; j < 15; j++) {
            if (a[i][j] == 2)
                t1++;
        }
    }

    if (t1 == 0) {
        a[7][7] = 2;
        return 0;
    }
    for (int i = 0; i < 15; i++) {
        for (int j = 0; j < 15; j++) {
            int total1 = 0;
            int total2 = 0;
            int total3 = 0;
            int total4 = 0;
            if (a[i][j] != 0)
                continue;
            for (int a1 = 1; a1 < 5; a1++) {
                // 判断水平线
                if (j - a1 < 0)
                    break;
                if (a[i][j - a1] == 2)
                    total1++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                if (j + a1 >= 15)
                    break;
                if (a[i][j + a1] == 2)
                    total1++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                // 判断竖直部分
                if (i - a1 < 0)
                    break;
                if (a[i - a1][j] == 2)
                    total2++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                if (i + a1 >= 15)
                    break;
                if (a[i + a1][j] == 2)
                    total2++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                // 判断左斜线
                if (i - a1 < 0 || j - a1 < 0)
                    break;
                if (a[i - a1][j - a1] == 2)
                    total3++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                if (i + a1 >= 15 || j + a1 >= 15)
                    break;
                if (a[i + a1][j + a1] == 2)
                    total3++;
                else
                    break;
            }

            for (int a1 = 1; a1 < 5; a1++) {
                // 判断右斜线
                if (i - a1 < 0 || j + a1 >= 15)
                    break;
                if (a[i - a1][j + a1] == 2)
                    total4++;
                else
                    break;
            }
            for (int a1 = 1; a1 < 5; a1++) {
                if (i + a1 >= 15 || j - a1 < 0)
                    break;
                if (a[i + a1][j - a1] == 2)
                    total4++;
                else
                    break;
            }
            int a1[4] = {total1, total2, total3, total4};
            int temp = max1(a1);
            if (temp >= 4) {
                a[i][j] = 2;
                // cout<<"AI已获胜";
                return -1;
            }
            if (temp > s) {
                s = temp;
                s1[0] = i;
                s1[1] = j;
            }
        }
    }

    s = 0;
    a[s1[0]][s1[1]] = 2;
    s1[0] = -1;
    s1[1] = -1;
    return 0;
}

void Chess::play() {
    while (1) {
        int x1, y1;

        int temp = AI();
        paint1();
        cout << endl;
        if (temp == -1) {
            cout << "AI已获胜";
            Sleep(20000);
            return;
        }
        cout << "AI已经落子" << endl;

        cout << "请红方落子" << endl;
        cin >> x1 >> y1;
        temp = player(x1, y1, 1);
        cout << endl;
        if (temp == 1) {
            while (temp == 1) {
                paint1();
                cout << "红方落子无效,请重新落子";
                cin >> x1 >> y1;
                temp = player(x1, y1, 1);
                cout << endl;
            }
        }

        if (temp == 5) {
            paint1();
            cout << "恭喜红方获胜" << endl;
            Sleep(20000);
            return;
        }
        paint1();
        cout << endl;
    }
}

int main() {
    Chess a;
    a.paint1();
    a.play();
}

运行结果

相关推荐
霖002 分钟前
同步/异步电路;同步/异步复位
开发语言·前端·javascript·嵌入式硬件·fpga开发·信号处理
真智AI24 分钟前
如何用 Qwen1.5-7B-Chat 模型打造高效轻量的 Python 智能助手(详细实操指南)
开发语言·python
一只鱼^_24 分钟前
力扣第450场周赛
数据结构·c++·算法·leetcode·近邻算法·广度优先·图搜索算法
不知道写什么的作者29 分钟前
Python安全密码生成器:告别弱密码的最佳实践
开发语言·python
lyj16899733 分钟前
vite搭建vue3项目及相关配置
开发语言·javascript·ecmascript
嵌入式小能手42 分钟前
Regmap子系统之六轴传感器驱动-完整驱动icm20607.c示例源码
c语言·开发语言
helloworld工程师1 小时前
CI/CD的演进之路
java·开发语言·ci/cd
汉卿HanQ1 小时前
技术篇-2.5.Matlab应用场景及开发工具安装
开发语言·数学建模·matlab
o0向阳而生0o1 小时前
50、js 中var { ipcRenderer } = require(‘electron‘);是什么意思?
开发语言·javascript·electron
纪伊路上盛名在1 小时前
python、R、shell兼容1
开发语言·python·jupyter·r语言·shell·生物信息·效率