【C++】如何用C++写一个最简单的双人五子棋?

本文提供了一个简易的五子棋游戏编程教程,包括定义棋盘、玩家输入、棋子放置、棋盘输出以及判断胜负和平局的逻辑。使用C++语言,适合初学者入门学习。
摘要由CSDN通过智能技术生成

前言

众所周知,五子棋是一种两人对弈的棋类游戏,老少皆宜,很适合周末、假期、或是电脑课和信奥班摸鱼的时候玩,但是大佬们写的五子棋有些难肝出来

没事,我会教大家写一个最简单最抽象的五子棋,技术有限,加上很久没更了会有点水,写得不是很好,见谅

废话不多送,开始教程

教程

不想看教程可以直接跳到后文的完整程序去看

1.初始变量(棋盘、轮到哪个玩家出棋等)

1.在main()函数外定义全局变量棋盘,我这里的棋盘是15路的,大家可根据自己的喜好决定棋盘大小

还有玩家、玩家出棋的x、y坐标、当前局棋盘上共有多少棋子

程序:

int a[16][16];  //15路的棋盘,大家可根据自己的喜好决定棋盘大小

int p=1,x,y,sum=0;

2.玩家输入出棋位置判断

棋盘中,需要判断玩家出棋的位置是否超出x、y坐标,若超出则提示错误,并返回继续输入;若未超出,但该位置以有棋,则一样的报错返回输入;直到输入的坐标正确

程序:

        bool n=0;
        do{
          printf("请玩家%d输入出棋的y、x坐标:",p);
          cin>>x>>y;    
          if((1<=x&&x<=15)&&(1<=y&&y<=15)){
                if(a[y][x]==0){
                    a[y][x]=p;                    
                    sum++;
                          printf("\n%d号玩家已出棋\n",p);
                      n=1; 
              }
              else{
                   printf("该位置已有棋\n\n\n");
                     n=0;  
              }
          }
          else{
                printf("输入错误,请重新输入\n\n\n");
                n=0;
          }
        }
        while(n==0);

3.输出棋盘

循环输出棋盘(此处程序输出的棋子用数字代表,若要字符代表棋子可直接看后文的优化)

程序:

        printf("棋盘状况:\n");
          for(int i=1;i<=15;i+=1){
            for(int j=1;j<=15;++j) cout<<a[i][j]<<" ";
            cout<<endl;
        }
        printf("\n\n\n");

4.是否有玩家连成五子判断

遍历整个棋子,先找横排再找竖排,然后是对角线,若找到连着的五子则提示该玩家胜利,并跳出循环;

若没有连成五子,则切换下一个玩家

当然,大家可以优化一下,直接以这回玩家出棋的位置为中心遍历,这里就不写了,留给大家思考的余地

程序:

        for(int i=1;i<=11;++i){   
            for(int j=1;j<=15;++j){
                if((a[j][i]==a[j+1][i]&&a[j][i]==a[j+2][i]&&a[j][i]==a[j+3][i]&&a[j][i]==a[j+4][i])&&a[j][i]!=0){
                    printf("%d号玩家胜利!\n\n\n",p);

                    system("pause");
                    return 0;
                }
            }
        }
        for(int i=1;i<=11;++i){
            for(int j=1;j<=11;++j){
                if((a[i][j]==a[i+1][j+1]&&a[i][j]==a[i+2][j+2]&&a[i][j]==a[i+3][j+3]&&a[i][j]==a[i+4][j+4])&&a[i][j]!=0){
                    printf("%d号玩家胜利!\n\n\n",p);

                    system("pause");
                    return 0;
                }
            }
        }
        for(int i=15;i>=5;--i){
            for(int j=1;j<=11;++j){
                if((a[i][j]==a[i-1][j+1]&&a[i][j]==a[i-2][j+2]&&a[i][j]==a[i-3][j+3]&&a[i][j]==a[i-4][j+4])&&a[i][j]!=0){
                    printf("%d号玩家胜利!\n\n\n",p);

                    system("pause");
                    return 0;
                }
            }
        }
        if(p==1) p=2;
        else if(p==2) p=1;

5.平局

当棋盘上没有空位,即sum=225时,则跳出循环,提示平局

程序:

    if(sum==225) printf("平局\n\n");

     system("pause");

    return 0;

完整程序

以下是完整程序:

#include<bits/stdc++.h>
using namespace std;
int a[16][16];
int p=1,x,y,sum=0;
int main(){ 
    while(sum<=225){
        bool n=0;
        do{
          printf("请玩家%d输入出棋的y、x坐标:",p);
          cin>>x>>y;    
          if((1<=x&&x<=15)&&(1<=y&&y<=15)){
                if(a[y][x]==0){
                    a[y][x]=p;                    
                    sum++;
                          printf("\n%d号玩家已出棋\n",p);
                      n=1; 
              }
              else{
                   printf("该位置已有棋\n\n\n");
                     n=0;  
              }
          }
          else{
                printf("输入错误,请重新输入\n\n\n");
                n=0;
          }
        }
        while(n==0);
        printf("棋盘状况:\n");
          for(int i=1;i<=15;i+=1){
            for(int j=1;j<=15;++j) cout<<s[a[i][j]]<<" ";
            cout<<endl;
        }
        printf("\n\n\n");
        for(int i=1;i<=11;++i){
            for(int j=1;j<=15;++j){
                if((a[i][j]==a[i][j+1]&&a[i][j]==a[i][j+2]&&a[i][j]==a[i][j+3]&&a[i][j]==a[i][j+4])&&a[i][j]!=0){
                    printf("%d号玩家胜利!\n\n\n",p);
                    system("pause");
                    return 0;
                }
            }
        }
        for(int i=1;i<=11;++i){
            for(int j=1;j<=15;++j){
                if((a[j][i]==a[j+1][i]&&a[j][i]==a[j+2][i]&&a[j][i]==a[j+3][i]&&a[j][i]==a[j+4][i])&&a[j][i]!=0){
                    printf("%d号玩家胜利!\n\n\n",p);
                    system("pause");
                    return 0;
                }
            }
        }
        for(int i=1;i<=11;++i){
            for(int j=1;j<=11;++j){
                if((a[i][j]==a[i+1][j+1]&&a[i][j]==a[i+2][j+2]&&a[i][j]==a[i+3][j+3]&&a[i][j]==a[i+4][j+4])&&a[i][j]!=0){
                    printf("%d号玩家胜利!\n\n\n",p);
                    system("pause");
                    return 0;
                }
            }
        }
        for(int i=15;i>=5;--i){
            for(int j=1;j<=11;++j){
                if((a[i][j]==a[i-1][j+1]&&a[i][j]==a[i-2][j+2]&&a[i][j]==a[i-3][j+3]&&a[i][j]==a[i-4][j+4])&&a[i][j]!=0){
                    printf("%d号玩家胜利!\n\n\n",p);
                    system("pause");
                    return 0;
                }
            }
        }
        if(p==1) p=2;
        else if(p==2) p=1;
        FLAG:
        if(star==0) break;    
    }
    if(sum==225&&star==1) printf("平局\n\n");
    system("pause");
    return 0;
}

优化

1.用字符代表棋子

定义全局变量,也可以定义成自己想输出的字符

string s[3]={"0 ","●","○"};

棋盘输出很简单,只需改为以下程序即可

        printf("棋盘状况:\n");
          for(int i=1;i<=15;i+=1){
            for(int j=1;j<=15;++j) cout<<s[a[i][j]];
            cout<<endl;
        }
        printf("\n\n\n");

结束语

希望这个教程能对大家有帮助,文章到此结束,谢谢大家

  • 36
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值