课程设计之五子棋

首先声明:

        在我的电脑(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;
}

测试运行:




猜你喜欢

转载自blog.csdn.net/qq_41170600/article/details/80214002
今日推荐