課程設計之五子棋

首先聲明:

        在我的電腦(win10)和機房電腦(win7)棋盤排版不同???須小小的改動打印棋盤的表格符號,我會把在我的電腦(win10)運行代碼貼上!!!

代碼(win10):

#include <conio.h>
#include <windows.h>                                            //遊戲結束彈跳提示窗口函數MessageBox所在的頭文件
#include<stdio.h>
#include<stdlib.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow);//遊戲結束彈跳提示窗口
int main()
{
    newgame:system("cls");                                                     //遊戲結束時返回這一步,進行新遊戲
    printf("\n\n\n\n\n\n\t\t\t五子棋遊戲\n\t\t\t退出遊戲請按Esc鍵");           //新遊戲提示
    printf("\n\t\t\t開始新遊戲請按除Esc鍵任意鍵");
    printf("\n\t\t\t\t遊戲出品----zeng");
    int ng;                                                                    //是否開始新遊戲
    ng=getch();
    if(ng==27)                                                                 //如果輸入爲Esc鍵,結束遊戲
        exit(1);
    int w=1;                                                                   //記錄玩家
    int wei[70][70]={0};                                                       //記錄已落棋子
    int g[50][50]={0};                       //記錄光標行走軌跡,1爲光標所在,每一次更新時須將1變爲0,只能有一個1
    system("mode con cols=66 lines=35");     //控制遊戲窗口的大小,符合棋盤大小
    void f(int w,int wei[70][70],int g[50][50]);//  打印棋盤
    int pd(int w,int wei[70][70],int g[50][50]);//  判斷輸贏
    int x=10,y=10;                             // 存放光標位置,初始化在棋盤中間
    int gu;                                    //記錄玩家操作,進行落子(光標)
    g[x][y]=1;                                //方形光標初始化爲啓動程序可顯示
    f(w,wei,g);                              // 啓動程序顯示棋盤
    g[x][y]=0;                               // 方形光標記錄清除,防止下一次存留輸出上一次的操作
    while(1)            //開始玩家操作、輸入、判斷
    {
        gu=getch();              // 玩家在鍵盤操作上下左右鍵位,gu直接獲得鍵位的ASCLL碼用來進行判斷操作
        if(gu==80&&x+1<30)     //玩家按下且光標不會越界
        {
            x++;
            while(wei[x][y]!=0)    //要是下一個光標的落腳點有棋子,則光標落腳點繼續按照規律移動下一個,直至落腳點爲空
                x++;
        }//
        else if(gu==72&&x-1>1)    //玩家按上且光標不會越界
        {
            x--;
            while(wei[x][y]!=0)
                x--;
        }
        else if(gu==75&&y-1>0)      //玩家按左且光標不會越界
        {
            y--;
            while(wei[x][y]!=0)
                y--;
        }
        else if(gu==77&&y+1<30)    //玩家按右且光標不會越界
        {
            y++;
            while(wei[x][y]!=0)
                y++;
        }
        g[x][y]=1;                //現在光標所在位置
        if(gu==13&&w==1&&wei[x][y]==0)        //進行落子操作,且此地爲空
            wei[x][y]=1,w=-1;                 //落白子,換玩家
        else if(gu==13&&w==-1&&wei[x][y]==0)
            wei[x][y]=2,w=1;
        f(w,wei,g);
        if(gu==13&&pd(w,wei,g)==1)        //落子之後,白棋玩家獲得勝利
        {
            MessageBox(NULL, TEXT("恭喜白棋玩家獲勝!\n單擊確定開始新遊戲"), TEXT("遊戲結束!"), MB_OK);  // 彈出提示信息
            goto newgame;                         //回到newgame開始語句,運行新遊戲
        }
        if(gu==13&&pd(w,wei,g)==2)              //黑棋玩家獲得勝利
        {
            MessageBox(NULL, TEXT("恭喜黑棋玩家獲勝!\n單擊確定開始新遊戲"), TEXT("遊戲結束!"), MB_OK);
            goto newgame;
        }
        g[x][y]=0;                 // 清除光標位置,準備下一步
    }
    return 0;
}
void f(int w,int wei[70][70],int g[50][50])                                             //
{
    system("cls");                //清除一次屏幕所有
    int i,t;
    int x,y;
    int n=15,m=15;
    for(i=1;i<=n;i++)                //  開始打印棋盤
    {
        if(i==1)printf("┌─");
        else if(i==n)printf("└─");
        else printf("├─");
        for(t=1;t<m;t++)
        {
            if(i==1)printf("┬─");
            else if(i==n)printf("┴─");
            else if(wei[i][t]==1)             // 遇到存放白棋的位置
                printf("●");
            else if(wei[i][t]==2)             // 遇到存放黑棋的位置
                printf("○");
            else if(g[i][t]==1)                // 遇到光標所在位置
                printf("▉");
            else if(g[i][t+1]==1)printf("┼ ");
            else printf("┼-");
        }
        if(i==1)printf("┐");
        else if(i==n)printf("┘");
        else printf("┤");
        printf("\n");
    }
    printf("操作說明:方向鍵移動方形光標,回車鍵在光標所在位置落子\n");      // 在棋盤下方顯示操作說明
    printf("\n                                                     ");
    return ;
}
int pd(int w,int wei[70][70],int g[50][50])       // 勝負判斷函數
{
    int i,t;
    int j,k;
    int x=0,y=0;                               //分別存放白棋黑棋的連續棋子個數
    for(i=1;i<=35;i++)                         // 判斷行
        for(t=1;t<=35;t++)
        {
            if(wei[i][t]==1)x++;           //遇到白棋,白棋計數加一
            else x=0;                      //遇到黑棋或空格,計數清零
            if(x>=5)return 1;              //白棋超過五個,返回1代表白棋勝利
            if(wei[i][t]==2)y++;//
            else y=0;
            if(y>=5)return 2;
        }
    for(i=1;i<=35;i++)                        //  判斷列
        for(t=1;t<=35;t++)
        {
            if(wei[t][i]==1)x++;
            else x=0;
            if(x>=5)return 1;
            if(wei[t][i]==2)y++;
            else y=0;
            if(y>=5)return 2;
        }
    for(i=-35;i<35;i++)                         //判斷正對角線與其平行斜線
        for(t=1;t<=35;t++)
        {
            if(wei[t][t+i]==1&&t+i>=0)x++;
            else x=0;
            if(x>=5)return 1;
            if(wei[t][t+i]==2&&t+i>=0)y++;
            else y=0;
            if(y>=5)return 2;
        }
    for(i=1;i<=66;i++)                     //判斷反對角線與其平行線
        for(t=0;t<=66;t++)                    // 棋盤右下角的五子用整體斜線的話,需要判斷到接近兩倍棋盤行列數
        {
            if(wei[t][i-t]==1&&i-t>=0)x++;
            else x=0;
            if(x>=5)return 1;
            if(wei[t][i-t]==2&&i-t>=0)y++;
            else y=0;
            if(y>=5)return 2;
        }
        return 0;
}

測試運行:




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