IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 五子棋游戏(C++字符版) -> 正文阅读

[C++知识库]五子棋游戏(C++字符版)

黑方使用@符号代表,白方使用 *号代表
. 1 2 3 4 5 6 7 8 9 A B C D E F
1 0 0 0 0 0 @ * 0 0 0 0 0 0 0 0
2 0 0 0 0 0 @ * 0 0 0 0 0 0 0 0
3 0 0 0 0 0 @ * * 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
D 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
E 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
F 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
用户输入走棋行列号如(3,5),表示第3行5列处落子。
建议10以后行列号用A,B,C,D,E,F
轮流下棋,直到输赢或(-1,-1)结束。

1? 问题描述

黑方使用@符号代表,白方使用 *号代表,能实现在棋盘上下棋,获胜,终止等功能。

2?功能要求

用户输入走棋行列号如(3,5),表示第3行5列处落子。轮流下棋,直到输赢或(-1,-1)结束。

3?功能实现

在这里插入图片描述

1) 输出棋盘函数

char ch='A';
 for (i = 0; i <= N; i++)
 {for (j = 0; j <= N; j++)
  {
     if (0 == i)
     {for(j=0;j<10;j++)
	   cout<<setw(2)<<j;
	   for(j=10;j<=N;j++)  
	   {cout<<setw(2)<<ch;                     	  
        ch=(ch+1); }
   }
//利用二维数组实现,行标与列标分别用i,j 表示,定义字符ch='A',即当列标j==0输出i,列行标i==0,for(j=0;j<10;j++),输出j; for(j=10;j<=N;j++),ch=(ch+1);依次输出ch。
   else if (1 == a[i][j])   cout<<setw(2)<<'@';
   else if (2 == a[i][j])  cout<<setw(2)<<'*';
   Else  cout<<setw(2)<<'.';

落子位置由整个棋盘一个一个判断这个位置是否被重新定义,若被新定义为2,则此位置输出*,若此位置被新定为1,此位置输出@,没有重新定义输出为.。

2)下棋函数

这是一个循环函数,whoTurn为总落子次数初始为零,每落一次子,whoTurn++,由总的落子次数除以2的余数判断该哪位选手落子。

 if (1 == whoTurn% 2)       cout<<"请第1位选手落子";
 else         cout<<"请第2位选手落子";
 if (1 == a[i][j])
  cout<<setw(2)<<'@';
 else if (2 == a[i][j])
 cout<<setw(2)<<'*';
 else   cout<<setw(2)<<'.';
//若此位置已被重新定义过,则不能落子,否则将此位置重新定义,第一位选手a[i][j] = 1;第二位选手a[i][j] = 2;
if(i==-1&&j==-1)                           
  {cout<<"结束!"<<endl; 
  exit(0);} 

若输入为(-1 -1)判断结束整个循环; system(“cls”); 清除内容后重新调用棋盘函数,输出棋盘,调用判断函数;判断之后继续落子,形成循环。

3)判断函数(以斜向获胜为例)

for(i=1;i<=4;i++)
  { if(a[s+i][t+i]!=a[s][t]) break;
 c++; }                                  //右下方遍历  
for(i=1;i<=4;i++) 
 { if(a[s-i][t-i]!=a[s][t]) break;
 d++;}                                         //左上方遍历
if(c+d>=4)                                 //斜向两边相同棋子加上中间大于五个获胜
{ cout<<"第"<<2-whoTurn%2<<"位选手获胜!"<<endl;
exit(0);}

此函数分四部分,分别判断横向,竖向,斜向,反斜向,由落子点向一个一个位置一个位置判断,遇到不相同的子即从落子点反向判断,将两边相同的棋子个数相加,再加上中间一个大于五个即获胜。

4、源代码及注释说明

#include<iostream>
#include<iomanip>
using namespace std;
#define N 15
int a[N + 1][N + 1] = { '0' };                    //定义一个16*16的区域
int huosheng1(int s,int t);
int huosheng2(int s,int t);
int huosheng3(int s,int t);
int huosheng4(int s,int t);
void coutqipan(void);
void playChess(void);                          // 各个函数声明
int whoTurn = 0;
int main()                                   //主函数
{
 coutqipan();
 while (1)
 { whoTurn++;
  playChess(); 
 }
 return 0;
}

void coutqipan()                           //输出棋盘
{
 int i, j;
char ch='A';
 for (i = 0; i <= N; i++)
 {
  for (j = 0; j <= N; j++)
  {
   if (0 == i)
   {   for(j=0;j<10;j++)
		   cout<<setw(2)<<j;
	   for(j=10;j<=N;j++)  
	   {cout<<setw(2)<<ch;                      //输出列标
	   ch=(ch+1);
	   }
   }
   else if (j == 0)                                   //输出行标
   cout<<setw(2)<<i;
   else if (1 == a[i][j])
   cout<<setw(2)<<'@';
   else if (2 == a[i][j])
   cout<<setw(2)<<'*';
   else
   cout<<setw(2)<<'.';
  }
  cout<<endl;
 }
}

void playChess(void)                          //下棋
{
 int i, j,count=0;
 if (1 == whoTurn% 2)                           //利用总下棋次数判断该哪位选手落子
 {
  cout<<"请第1位选手落子";
  cin>>i>>j;
  while (a[i][j] != 0)
  {
   cout<<"此位置已有棋子,请重新落子";
   cin>>i>>j;
  }
if(i==-1&&j==-1)                            //未分胜负时结束
  {
  cout<<"结束!"<<endl; 
  exit(0);} 
  a[i][j] = 1;                                 //第一位选手下的位置定义为1
  system("cls");                                  //清除棋盘
 coutqipan();                                         //调用棋盘的函数
  huosheng1(i,j);
huosheng2(i,j);
huosheng3(i,j);
huosheng4(i,j);                                          //调用四个判断函数
 }
 else
 {
  cout<<"请第2位选手落子";
  cin>>i>>j;
  while (a[i][j] != 0) 
  {
   cout<<"此位置已有棋子,请重新落子";
   cin>>i>>j;
  }
if(i==-1&&j==-1)                            //未分胜负时结束
  {
  cout<<"结束!"<<endl; 
  exit(0);} 
  a[i][j] = 2;                          //第二位选手下的位置定义为2
  system("cls");                                          //清除棋盘
 coutqipan();                                            //调用棋盘函数
huosheng1(i,j);
huosheng2(i,j);
huosheng3(i,j);
huosheng4(i,j);                                         //调用四个判断函数
 }
}
/*一落子点为中心,分向上下左右斜向八个方位遍历判断,一个方向上超过或等于五个棋子则获胜。*/
int huosheng1(int s,int t)                               //横向获胜
{ 	  
  int i,count=0;
 for(i=t+1;i<=t+4;i++) 
 {
 if(a[s][i]!=a[s][t]) break;
 count++;                                        //向右遍历
 }
 for(i=t-1;i>=t-4;i--) 
 {
 if(a[s][i]!=a[s][t]) break;
 count++;                                       //向左遍历
 }
if(count>=4)                               //左右两边相同棋子加上中间大于五个获胜
{
cout<<"第"<<2-whoTurn%2<<"位选手获胜!"<<endl;
exit(0);}
 return 0;
}

int huosheng2(int s,int t)                                //竖向获胜
{ 	   
int  i,count=0;
 for(i=s+1;i<=s+4;i++)
 {
 if(a[i][t]!=a[s][t]) break;
 count++;                                    //向下遍历
 }
 for(i=s-1;i>=s-4;i--) {
 if(a[i][t]!=a[s][t]) break;
 count++;                                       //向上遍历
 }
if(count>=4)                        //上下两边相同棋子加上中间大于五个获胜

{
cout<<"第"<<2-whoTurn%2<<"位选手获胜!"<<endl;
exit(0);}
 return 0;
}
 int huosheng3(int s,int t)                               //斜向获胜
{
 int  i,j,c=0,d=0;
 for(i=1;i<=4;i++)
  {
 if(a[s+i][t+i]!=a[s][t]) break;
 c++;                                           //右下方遍历
 }
 for(i=1;i<=4;i++) 
 {
 if(a[s-i][t-i]!=a[s][t]) break;
 d++;                                              //左上方遍历
 }
if(c+d>=4)                            //斜向两边相同棋子加上中间大于五个获胜
{ 
cout<<"第"<<2-whoTurn%2<<"位选手获胜!"<<endl;
exit(0);}
 return 0;
}
 int huosheng4(int s,int t)                                   //反斜向获胜
{
 int  i,j,c=0,d=0;
 for(i=1;i<=4;i++)
  {
 if(a[s+i][t-i]!=a[s][t]) break;
 c++;                                          //左下方遍历
 }
 for(i=1;i<=4;i++) 
 {if(a[s-i][t+i]!=a[s][t]) break;
 d++;                                              //右上方遍历
 }
 if(c+d>=4)                              //反斜向两边相同棋子加上中间大于五个获胜
 {
	 cout<<"第"<<2-whoTurn%2<<"位选手获胜!"<<endl;
 exit(0);}
 return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 12:31:35  更:2021-08-18 12:33:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 11:16:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码