五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成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; //玩家2
while (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代表玩家2
break;
}
}
else{ //玩家1VS玩家2
PlayChess(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;
}
文章浏览阅读6.2k次,点赞4次,收藏12次。内容:《青春有你2》选手图片爬取,生成选手图片的绝对路径,统计爬取的图片总数量。_python爬取青春有你人员 csdn
文章浏览阅读2.4w次,点赞12次,收藏51次。最近在学习怎么分布式Tensorflow训练深度学习模型,看官网教程看的云里雾里,最终结合着其它资料,终于对分布式Tensorflow有了些初步了解.gRPC (google remote procedure call)分布式Tensorflow底层的通信是gRPC gRPC首先是一个RPC,即远程过程调用,通俗的解释是:假设你在本机上执行一段代码num=add(a,b),它调用了一个过...
文章浏览阅读186次。文章目录基本介绍安装基本使用环境变量高级基本介绍将Python与bash 组合起来安装$ pip install xonsh基本使用$ xonsh$ 1+1$ print("NiHao")$ echo test$ ls$ top环境变量使用来定义环境变量,如来定义环境变量,如来定义环境变量,如HOME,但在更新os.environ时,需要设置$UPDATE_OS_ENVIRONEMNT为true>>> $GOAL="hello">>>_python xonsh
文章浏览阅读319次。java使用JDBC-ODBC桥接连接SQLServer数据库需要配置ODBC数据源,配置步骤如下:1.进入控制面板,找到管理工具2.看到ODBC数据源,有64位和32位的,如果你的数据库是64位的就要选择64位的,32位的数据库也要选择对应的版本,双击进去。3.进入程序后选择 系统DSN4.选择添加5.创建SQLServer的数据源6.起好名字,做好描述,选择好服务器后点击下一步7.这里默认就行..._jdbc-odbc配置
文章浏览阅读5.1k次。windows 系统纯净版官网下载地址http://www.imsdn.cn/operating-systems/windows-7/_纯净系统官网
文章浏览阅读1.4k次。D- PHY的物理层支持HS(High Speed)和LP(Low Power)两种工作模式HS模式:低压查分信号 功耗大 高速率(80M -1Gbps) 信号幅值(100mv-300mv)LP模式:单端信号 功耗小,速率低(< 10Mbps) 信号幅值(0-1.2V..._video through mode
文章浏览阅读6.7k次。一、对section header进行混淆由于linker不会对section header进行加载,所以对section header进行改动,不会影响so文件正常加载到内存,因此有些程序对section header进行了混淆,导致IDA无法正常进行静态分析。混淆方法:1.将section header table中的addr、offsize等字段值清0,如果清空的是dynsym段,就..._so混淆
文章浏览阅读580次。大数据 ,kafka connnect mysql 订阅日志_订阅mysql blog日志
文章浏览阅读5.6k次。解析json字符串中的类型对应如下:json格式scala格式整数java.lang.IntegerStringStringdictJSONObjectlistJSONArray测试代码如下:import net.minidev.json.parser.JSONParserimport net.minidev.json.{JSONArray..._net.minidev.json
文章浏览阅读93次。这几天在忙着弄informatica,对于一些基本用法到是感觉容易上手,但写惯了sql总感觉很多时候不方便,字段过多有时候找一个都不易,昨天又碰到下面这个问题,其实就是一个lag的用法 select t.*,rowid from..._用informatica而不是sql
文章浏览阅读508次,点赞10次,收藏8次。* 输入捕获触发方式选择,比如上升、下降沿捕获 *//* 输入捕获选择,用于设置映射关系 *//* 输入捕获分频系数 *//* 输入捕获滤波器设置 */_定时器捕获状态[7]:0
文章浏览阅读1.3k次。python 爬虫学到什么程度可以去找工作了,关于这点,和大家分享下我的理解。确立目标、了解需求首先我们要先定位自己的目标,当然我们先以爬虫工程师来做个说明。去招聘网上看看需求都有哪些,直接做个拉勾网爬虫(有需要的私信)出结果了:仔细看看,我们可以得出以下几点:1、 python 不是唯一可以做爬虫的,很多语言都可以,尤其是 java,同时掌握它们和拥有相关开发经验是很重要的加分项2、 大部分的公..._python爬虫实习生一般进公司后能做什么?