五子棋小程序(升級版)

增加了一個人機對戰功能
不過機器是瞎逼下的
所以人贏起來很容易
感覺智商收到了侮辱(手動捂臉)
勿噴勿噴

#include <bits/stdc++.h>
#define SIZE 15
#define WIN 5

using namespace std;

char chessboard[SIZE][SIZE];
int heng,zong;

void prch();//打印棋盤
int menu();//遊戲選擇界面
int judge(char a);//判斷黑子白子是否勝利

int main()
{
    int p=menu();
    if(p==1)//人人對戰模式
    {
        prch();
        int flag=0;
        for (int i=0; i<SIZE; i++)//對奇葩內容進行初始化
            for (int j=0; j<SIZE; j++)
                chessboard[i][j] = ' ';
        printf("請輸入黑子(@)的座標,形如:4 4: ");
        while(~scanf("%d%d",&zong,&heng))
        {
            while (heng<1||zong<1||heng>SIZE||zong>SIZE||chessboard[zong-1][heng-1] != ' ')
            {
                printf("輸入有誤!請重新輸入!\n\n");
                if (flag%2==0)
                    printf("請輸入黑子(@)座標,形如:4 4:");
                else
                    printf("請輸入白子(O)座標,形如:4 4:");
                scanf("%d%d",&zong,&heng);
            }
            if (flag%2==0)
                chessboard[zong - 1][heng - 1]='@';
            else
                chessboard[zong - 1][heng - 1]='O';
            prch();
            //判斷哪一方獲勝
            if(flag%2==0)
            {
                if(judge('@'))
                {
                    printf("黑棋獲勝!!!!\n");
                    break;
                }
            }
            else
            {
                if(judge('O'))
                {
                    printf("白棋獲勝!!!!\n");
                    break;
                }
            }
            flag++;
            if (flag%2 ==0)
                printf("請輸入黑子(@)座標,形如:4 4:");
            else
                printf("請輸入白子(O)座標,形如:4 4:");
        }
    }
    else if(p==2)//人機對戰模式
    {
        prch();
        for (int i=0; i<SIZE; i++)//對奇葩內容進行初始化
            for (int j=0; j<SIZE; j++)
                chessboard[i][j] = ' ';
        printf("請輸入黑子(@)的座標,形如:4 4: ");
        while(~scanf("%d%d",&zong,&heng))
        {
            while (heng<1||zong<1||heng>SIZE||zong>SIZE||chessboard[zong-1][heng-1] != ' ')
            {
                printf("輸入有誤!請重新輸入!\n\n");
                printf("請輸入黑子(@)座標,形如:4 4:");
                scanf("%d%d",&zong,&heng);
            }
            chessboard[zong - 1][heng - 1]='@';
            prch();
            if(judge('@'))
                {
                    printf("黑棋獲勝!!!!\n");
                    break;
                }
            zong=rand()%15+1,heng=rand()%15+1;
            chessboard[zong - 1][heng - 1]='O';
            prch();
            if(judge('O'))
            {
                printf("白棋獲勝!!!!\n");
                break;
            }
            printf("請輸入黑子(@)座標,形如:4 4:");
        }
    }
    else//退出遊戲
        printf("退出遊戲");
    return 0;
}

void prch()//打印棋盤
{
    printf("    ");
    for (int i=1; i<=SIZE; i++)
        printf(" %-3d",i);
    printf("\n");
    printf("    ___________________________________________________________\n");
    for (int i=0; i<SIZE; i++)
    {
        if (i>=0)
            printf("%-3d",i+1);
        else
            printf("   ");
        printf("|");
        for (int j=0; j<SIZE; j++)
            printf(" %-2c|", chessboard[i][j]);
        printf("\n    ___________________________________________________________\n");
    }
    printf("\n\n");
}

int menu()//遊戲選擇界面
{
    int num;
    printf("************ 五子棋小遊戲  ************\n");
    printf("******  1.人人對戰  2.人機對戰  *******\n");
    printf("************  3.退出遊戲  *************\n");
    printf("***************************************\n");
    printf("         您的選擇(1或2)是:");
    scanf("%d",&num);
    return num;
}

int judge(char a)//判斷黑子白子是否勝利
{
    for (int i=0; i<SIZE; i++)
    {
        for (int j=0; j<SIZE; j++)
        {
            if (chessboard[i][j] == a)
            {
                int count_a = 1;

                //豎直方向
                for (int x=i-1,times=0; x>=0; x--,times++)
                {
                    if (chessboard[x][j]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                for (int y=i+1,times=0; y<SIZE; y++,times++)
                {
                    if (chessboard[y][j]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                if (count_a>=WIN)
                {
                    return true;
                }

                //橫方向
                count_a=1;
                for (int x=j-1,times=0; x>=0; x--,times++)
                {
                    if (chessboard[i][x]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                for (int y=j+1,times=0; y<SIZE; y++,times++)
                {
                    if (chessboard[i][y]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                if (count_a>=WIN)
                {
                    return true;
                }

                //上斜下方向
                count_a=1;
                for (int x=i-1,y=j-1,times=0; i>=0&&j>=0; x--,y--,times++)
                {
                    if (chessboard[x][y]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                for (int x=i+1,y=j+1,times=0; i<SIZE&&j<SIZE; x++,y++,times++)
                {
                    if (chessboard[x][y]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                if (count_a>=WIN)
                {
                    return true;
                }

                //下斜上方向
                count_a=1;
                for (int x=i+1,y=j-1,times=0; x<SIZE&&y>=0; x++,y--,times++)
                {
                    if (chessboard[x][y]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                for (int x=i-1,y=j+1,times=0; x>=0&&y<SIZE; x--,y++,times++)
                {
                    if (chessboard[x][y]==a)
                    {
                        count_a++;
                    }
                    else
                        break;
                    if (times>WIN-1)
                        break;
                }
                if (count_a>=WIN)
                {
                    return true;
                }

            }
        }
    }
    return false;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章