五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜。

规则

(1)对局双方各执一色棋子。
(2)空棋盘开局。
(3)黑先、白后,交替下子,每次只能下一子。
(4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
(5)黑方的第一枚棋子可下在棋盘任意交叉点上。
(6)轮流下子是双方的权利,但允许任何一方放弃下子权(即:PASS权)
  五子棋对局,执行黑方指定开局、三手可交换、五手两打的规定。整个对局过程中黑方有禁手,白方无禁手。黑方禁手有三三禁手、四四禁手和长连禁手三种。

实现方案

 通过缩小棋盘来抑制五子棋先行的优势,在这里使用15路棋盘。

(1)提供3个选择模式

(2)输入坐标(注意横纵坐标之间需要空格)

(3)输入非法坐标

(4)判断输赢

  • 判断行是否满足条件
  • 判断列是否满足条件
  • 判断主对角线是否满足条件
  • 判断副对角线是否满足条件

之后可选择yes再来一局,也可以选择no退出游戏。

源代码如下:

#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>using namespace std;const int N = 15;       //15*15的棋盘
const char ChessBoard = ' ';  //棋盘标志
const char flag1 = 'o';    //玩家1或电脑标志
const char flag2 = 'x';    //玩家2标志typedef struct Position{    //坐标int row;        //行int col;        //列
}Position;class GoBang{     //五子棋类
public:GoBang(){InitChessBoard();      //初始化棋盘}void Play(){      //下棋Position Play1;   //玩家1或电脑Position Play2;   //玩家2while (1){int mode = ChoiceMode();while (1){if (mode == 1){       //电脑VS玩家ComputerChess(Play1, flag1);            //电脑走if (GetVictory(Play1, 0, flag1)){       //0代表电脑,为真则表示电脑获胜break;}PlayChess(Play2, 2, flag2);         //玩家2走if (GetVictory(Play2, 2, flag2)){       //2代表玩家2break;}}else{               //玩家1VS玩家2PlayChess(Play1, 1, flag1);         //玩家1走if (GetVictory(Play1, 1, flag1)){       //玩家1赢break;}PlayChess(Play2, 2, flag2);         //玩家2走if (GetVictory(Play2, 2, flag2)){       //玩家2赢break;}}}cout << "======再来一局=======" << endl;cout << "yes or no :";  char s[] = "yes";cin >> s;if (strcmp(s, "no") == 0){break;}}}protected:void InitChessBoard(){          //初始化棋盘for (int i = 0; i < N + 1; ++i){for (int j = 0; j < N + 1; ++j){_ChessBoard[i][j] = ChessBoard;}}}int ChoiceMode(){           //选择模式system("cls");//系统调用,清屏InitChessBoard();       //重新初始化棋盘cout << "*************************************************" << endl;cout << "******************0、退出************************" << endl;cout << "******************1、电脑VS玩家******************" << endl;cout << "******************2、玩家VS玩家******************" << endl;cout << "*************************************************" << endl;while (1){int i = 0;cout << "请选择模式:";cin >> i;if (i == 0){       //退出exit(1);}if (i == 1 || i == 2){return i;}else{cout << "非法输入,请重新输入!" << endl;}}}void PrintChessBoard(){        //打印棋盘printf("     1   2   3   4   5   6   7   8   9  10  11  12  13  14  15\n");printf("   |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");for (int i = 1; i < N + 1; ++i){printf("%2d ", i);printf("| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |\n", _ChessBoard[i][1], _ChessBoard[i][2], _ChessBoard[i][3], _ChessBoard[i][4], _ChessBoard[i][5], _ChessBoard[i][6], _ChessBoard[i][7], _ChessBoard[i][8], _ChessBoard[i][9], _ChessBoard[i][10], _ChessBoard[i][11], _ChessBoard[i][12], _ChessBoard[i][13], _ChessBoard[i][14], _ChessBoard[i][15]);printf("   |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");}cout << endl;}void ComputerChess(Position& pos, char flag){     //电脑走//PrintChessBoard();      //打印棋盘int x = 0;int y = 0;while (1){                    //循环查找空位置x = (rand() % N) + 1;      //产生从1~N的随机数srand((unsigned int)time(NULL));y = (rand() % N) + 1;      //产生从1~N的随机数srand((unsigned int)time(NULL));if (_ChessBoard[x][y] == ChessBoard){       //如果这个位置为空(没有棋子),跳出循环,下棋break;}}pos.row = x;pos.col = y;_ChessBoard[pos.row][pos.col] = flag;}void PlayChess(Position& pos, int player, char flag){PrintChessBoard();      //打印棋盘while (1){printf("请玩家%d输入坐标:", player);cin >> pos.row >> pos.col;if (JudgeValue(pos) == 1){        //判断坐标是否合法break;}cout << "坐标不合法,请重新输入:" << endl;}_ChessBoard[pos.row][pos.col] = flag;}int JudgeValue(const Position& pos){       //判断坐标的合法性//1.在棋盘上if (pos.row > 0 && pos.row <= N && pos.col > 0 && pos.col <= N){//2.所在位置为空(没有棋子)if (_ChessBoard[pos.row][pos.col] == ChessBoard){return 1;      //合法} }return 0;       //非法}int JudgeVictory(Position pos, char flag){     //判断是否有玩家获胜(底层判断)int begin = 0;int end = 0;//1.判断行是否满足条件(pos.col - 4) > 0 ? begin = (pos.col - 4) : begin = 1;(pos.col + 4) > N ? end = N : end = (pos.col + 4);for (int i = pos.row, j = begin; j + 4 <= end; ++j){if (_ChessBoard[i][j] == flag && _ChessBoard[i][j + 1] == flag &&_ChessBoard[i][j + 2] == flag && _ChessBoard[i][j + 3] == flag &&_ChessBoard[i][j + 4] == flag)return 1;}//2.判断列是否满足条件(pos.row - 4) > 0 ? begin = (pos.row - 4) : begin = 1;(pos.row + 4) > N ? end = N : end = (pos.row + 4);for (int j = pos.col, i = begin ; i + 4 <= end; ++i){if (_ChessBoard[i][j] == flag && _ChessBoard[i + 1][j] == flag &&_ChessBoard[i + 2][j] == flag && _ChessBoard[i + 3][j] == flag &&_ChessBoard[i + 4][j] == flag)return 1;}//3.判断主对角线是否满足条件int len = 0;    //相对长度int start = 0;int finish = 0;pos.row > pos.col ? len = pos.col - 1 : len = pos.row - 1;if (len > 4){len = 4;}begin = pos.row - len;       //横坐标起始位置start = pos.col - len;       //纵坐标起始位置pos.row > pos.col ? len = N - pos.row : len = N - pos.col;if (len > 4){len = 4;}end = pos.row + len;         //横坐标结束位置finish = pos.col + len;      //纵坐标结束位置for (int i = begin, j = start; (i + 4 <= end) && (j + 4 <= finish); ++i, ++j){if (_ChessBoard[i][j] == flag && _ChessBoard[i + 1][j + 1] == flag &&_ChessBoard[i + 2][j + 2] == flag && _ChessBoard[i + 3][j + 3] == flag &&_ChessBoard[i + 4][j + 4] == flag)return 1;}//4.判断副对角线是否满足条件(pos.row - 1) > (N - pos.col) ? len = N - pos.col : len = pos.row - 1;if (len > 4){len = 4;}begin = pos.row - len;       //横坐标起始位置start = pos.col + len;       //纵坐标起始位置(N - pos.row) > (pos.col - 1) ? len = pos.col - 1 : len = N - pos.row;if (len > 4){len = 4;}end = pos.row + len;         //横坐标结束位置finish = pos.col - len;      //纵坐标结束位置 for (int i = begin, j = start; (i + 4 <= end) && (j - 4 >= finish); ++i, --j){if (_ChessBoard[i][j] == flag && _ChessBoard[i + 1][j - 1] == flag &&_ChessBoard[i + 2][j - 2] == flag && _ChessBoard[i + 3][j - 3] == flag &&_ChessBoard[i + 4][j - 4] == flag)return 1;}//该位置并未下棋for (int x = 1; x < N + 1; ++x){for (int y = 1; y < N + 1; ++y){if (_ChessBoard[x][y] == ChessBoard){return 0;       //未下棋}}}return -1;      //和局}bool GetVictory(Position& pos, int player, char flag){       //判断具体哪位玩家赢if (JudgeVictory(pos, flag) != 0){    //判断有无人获胜if (JudgeVictory(pos, flag) == 1){     //判断是否有人获胜,1表示获胜PrintChessBoard();     //打印棋盘if (player == 0){cout << "电脑获胜!" << endl;}else{printf("恭喜玩家%d获胜!\n", player);}}else{printf("和局!\n");}return true;      //有人获胜}   return false;         //没人获胜}private:char _ChessBoard[N + 1][N + 1];    //棋盘
};int main(){GoBang g;g.Play();system("pause");return 0;
}

C++实现简单五子棋游戏相关推荐

  1. 编写五子棋的完整python代码_python制作简单五子棋游戏

    本文实例为大家分享了python五子棋游戏的具体代码,供大家参考,具体内容如下 #五子棋 '" 矩阵做棋盘 16*16 "+" 打印棋盘 for for 游戏是否结束 开 ...

  2. python写游戏棋牌游戏_使用python实现简单五子棋游戏

    使用python实现简单五子棋游戏 发布时间:2020-08-29 06:12:30 来源:脚本之家 阅读:73 作者:weixin_42874933 用python实现五子棋简单人机模式的练习过程, ...

  3. python简单网格五子棋_python实现简单五子棋游戏

    本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 from graphics import * from math import * import numpy a ...

  4. 用c语言做一个五子棋程序,C语言制作简单五子棋游戏

    原标题:C语言制作简单五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是不 ...

  5. 第18篇 Qt实现简单五子棋游戏(二)算法说明

    第18篇 Qt实现简单五子棋游戏(二)算法说明 5.算法说明 5.1.画棋盘: void drawChessboard(); 5.2.画棋子:void drawChess(); 5.3.鼠标点击响应: ...

  6. python五子棋算法_python实现简单五子棋游戏

    本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 from graphics import * from math import * import numpy a ...

  7. python制作五子棋_python制作简单五子棋游戏

    python制作简单五子棋游戏 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python制作简单五子棋游戏.txt ] (友情提示:右键点上行txt文档名->目标另存 ...

  8. python写五子棋游戏下载_python实现简单五子棋游戏

    本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 from graphics import * from math import * import numpy a ...

  9. 简单五子棋游戏c语言简单,C语言制作简单的五子棋游戏

    原标题:C语言制作简单的五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是 ...

  10. 用python实现简单五子棋游戏的练习过程

    用python实现五子棋简单人机模式的练习过程 第一次写博客,我尽力把它写好. 最近在初学python,今天就用自己的一些粗浅理解,来记录一下这几天的python简单人机五子棋游戏的练习,下面是实现过 ...

最新文章

  1. C#实现网页截图功能
  2. vat可以退税吗_【涨知识】企业对外投资可以申请出口退税吗?
  3. 《MySQL实战45讲》实践篇 9-15讲 学习笔记
  4. SSM集成Mybatis和Druid
  5. 转载 linux系统调用和库函数调用的区别
  6. 命令查看IPV6的IP,路由,邻居信息
  7. 一个开源的网页画板,真的太方便了
  8. 哈希算法(哈希函数)基本
  9. 数字图像处理——灰度级、动态范围、对比度
  10. iwnpi 5621ds RF测试指令
  11. android屏蔽表情输入法,Android中EditText屏蔽第三方输入法表情的方法示例
  12. java基础第四课(封装,继承,接口)
  13. 俞敏洪一分钟励志演讲
  14. WPF TextBlock自定义内容_se7en3_新浪博客
  15. 【智能优化算法】基于黑猩猩算法求解多目标优化问题附matlab代码
  16. php函数几种写法,PHP让人不知道的匿名函数的几种写法(附代码)
  17. 【基于matlab的mqam调制与解调系统】
  18. 5分钟看懂区块链-区块链技术最最最好使用技巧
  19. Dplayer直播m3u8流
  20. 前端第五次培训(JS语法)

热门文章

  1. 【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
  2. 江苏开票系统安全接入服务器地址,江苏省增值税发票选择确认平台网址:https://fpdk.jiangsu.chinatax.gov.cn:81...
  3. 坚果云 我的电脑图标_如何删除“我的坚果云”这个图标?
  4. USB转双串口产品设计-RS232串口
  5. Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is inse
  6. 安装QT时遇到:canot start “d:\qt\vcredist\vcredist_x64.exe/norestart/q“:process failed to start :请求的操作需要提升
  7. 显示一个立方体的一点透视投影图;(用数组存放正方体的各顶点坐标)。
  8. 尼日利亚4g频段_世界各国全球主要4g频段资料
  9. 计算机桌面文件能单独设密码吗,win7文件夹设置密码_给单独一个文件夹设密码...
  10. cs系统如何上云服务器,cs架构程序怎么连接云服务器