C++实现简单五子棋游戏
五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成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++实现简单五子棋游戏相关推荐
- 编写五子棋的完整python代码_python制作简单五子棋游戏
本文实例为大家分享了python五子棋游戏的具体代码,供大家参考,具体内容如下 #五子棋 '" 矩阵做棋盘 16*16 "+" 打印棋盘 for for 游戏是否结束 开 ...
- python写游戏棋牌游戏_使用python实现简单五子棋游戏
使用python实现简单五子棋游戏 发布时间:2020-08-29 06:12:30 来源:脚本之家 阅读:73 作者:weixin_42874933 用python实现五子棋简单人机模式的练习过程, ...
- python简单网格五子棋_python实现简单五子棋游戏
本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 from graphics import * from math import * import numpy a ...
- 用c语言做一个五子棋程序,C语言制作简单五子棋游戏
原标题:C语言制作简单五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是不 ...
- 第18篇 Qt实现简单五子棋游戏(二)算法说明
第18篇 Qt实现简单五子棋游戏(二)算法说明 5.算法说明 5.1.画棋盘: void drawChessboard(); 5.2.画棋子:void drawChess(); 5.3.鼠标点击响应: ...
- python五子棋算法_python实现简单五子棋游戏
本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 from graphics import * from math import * import numpy a ...
- python制作五子棋_python制作简单五子棋游戏
python制作简单五子棋游戏 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python制作简单五子棋游戏.txt ] (友情提示:右键点上行txt文档名->目标另存 ...
- python写五子棋游戏下载_python实现简单五子棋游戏
本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 from graphics import * from math import * import numpy a ...
- 简单五子棋游戏c语言简单,C语言制作简单的五子棋游戏
原标题:C语言制作简单的五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是 ...
- 用python实现简单五子棋游戏的练习过程
用python实现五子棋简单人机模式的练习过程 第一次写博客,我尽力把它写好. 最近在初学python,今天就用自己的一些粗浅理解,来记录一下这几天的python简单人机五子棋游戏的练习,下面是实现过 ...
最新文章
- C#实现网页截图功能
- vat可以退税吗_【涨知识】企业对外投资可以申请出口退税吗?
- 《MySQL实战45讲》实践篇 9-15讲 学习笔记
- SSM集成Mybatis和Druid
- 转载 linux系统调用和库函数调用的区别
- 命令查看IPV6的IP,路由,邻居信息
- 一个开源的网页画板,真的太方便了
- 哈希算法(哈希函数)基本
- 数字图像处理——灰度级、动态范围、对比度
- iwnpi 5621ds RF测试指令
- android屏蔽表情输入法,Android中EditText屏蔽第三方输入法表情的方法示例
- java基础第四课(封装,继承,接口)
- 俞敏洪一分钟励志演讲
- WPF TextBlock自定义内容_se7en3_新浪博客
- 【智能优化算法】基于黑猩猩算法求解多目标优化问题附matlab代码
- php函数几种写法,PHP让人不知道的匿名函数的几种写法(附代码)
- 【基于matlab的mqam调制与解调系统】
- 5分钟看懂区块链-区块链技术最最最好使用技巧
- Dplayer直播m3u8流
- 前端第五次培训(JS语法)
热门文章
- 【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
- 江苏开票系统安全接入服务器地址,江苏省增值税发票选择确认平台网址:https://fpdk.jiangsu.chinatax.gov.cn:81...
- 坚果云 我的电脑图标_如何删除“我的坚果云”这个图标?
- USB转双串口产品设计-RS232串口
- Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is inse
- 安装QT时遇到:canot start “d:\qt\vcredist\vcredist_x64.exe/norestart/q“:process failed to start :请求的操作需要提升
- 显示一个立方体的一点透视投影图;(用数组存放正方体的各顶点坐标)。
- 尼日利亚4g频段_世界各国全球主要4g频段资料
- 计算机桌面文件能单独设密码吗,win7文件夹设置密码_给单独一个文件夹设密码...
- cs系统如何上云服务器,cs架构程序怎么连接云服务器