没什么好发的,发给黑白棋水一水,如果有人能发现问题就更好了。

/*
Othello.cpp
黑白棋,实现随时结束并判断胜负的功能
成功运行于Visual Studio 2013
*/ #include <iostream>
#include <string.h>
using namespace std;
#define N 9
char _ChessBoard[N][N] = {" "};
char _ChessBoardBefore[N][N] = { " " }; //初始化棋盘
void initChessBoard(){
_ChessBoard[4][4] = 'x';
_ChessBoard[5][5] = 'x';
_ChessBoard[4][5] = 'o';
_ChessBoard[5][4] = 'o';
} void printChessBoard(char _ChessBoard[N][N]){ //画棋盘
printf(" A B C D E F G H\n");
printf(" |---|---|---|---|---|---|---|---|\n");
for (int i = 1; i < N; ++i)
{
printf("%2d ", i);
printf("| %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]);
printf(" |---|---|---|---|---|---|---|---|\n");
}
cout << endl;
} //检查落子的位置并落子
int check(int i, int j, int flag){
int rightflag = 0;//落子正确与否标记
int x, y;
x = i; y = j;
if (flag == 0 && _ChessBoard[i][j] == NULL)//x子落子
{
//分为八个方向,分别判断是否可以落子并且实现反转
x = i; y = j;
x++;//x正向
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x + 1][y] == 'x'&&x!=i)
{
while (x > i){
_ChessBoard[x][y] = 'x';//o反转为x
x--;
}
rightflag = 1;//进入循环说明此落子位置正确
break;
}
x++;
}
//与上类似,方向换位y正向
x = i; y = j;
y++;
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x][y+1] == 'x'&&y != j)
{
while (y > j){
_ChessBoard[x][y] = 'x';
y--;
}
rightflag = 1;
break;
}
y++;
} x = i; y = j;
x--;
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x-1][y] == 'x'&&x != i)
{
while (x<i){
_ChessBoard[x][y] = 'x';
x++;
}
rightflag = 1;
break;
}
x--;
} x = i; y = j;
y--;
while ((_ChessBoard[x][y] != 'x') && (_ChessBoard[x][y] != NULL))
{
if (_ChessBoard[x][y - 1] == 'x'&&y != j)
{
while (y < j){
_ChessBoard[x][y] = 'x';
y++;
}
rightflag = 1;
break;
}
y--;
} x = i; y = j;
x++; y++;
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x + 1][y + 1] == 'x'&&y != j)
{
while (y > j){
_ChessBoard[x][y] = 'x';
x--; y--;
}
rightflag = 1;
break;
}
x++; y++;
} x = i; y = j;
x--; y++;
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x - 1][y + 1] == 'x'&&y != j)
{
while (y > j){
_ChessBoard[x][y] = 'x';
x++; y--;
}
rightflag = 1;
break;
}
x--; y++;
} x = i; y = j;
x++; y--;
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x + 1][y - 1] == 'x'&&y != j)
{
while (y < j){
_ChessBoard[x][y] = 'x';
x--; y++;
}
rightflag = 1;
break;
}
x++; y--;
} x = i; y = j;
x--; y--;
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x - 1][y - 1] == 'x'&&y != j)
{
while (y < j){
_ChessBoard[x][y] = 'x';
x++; y++;
}
rightflag = 1;
break;
}
x--; y--;
}
}
else if (flag == 1 && _ChessBoard[i][j] == NULL)
{
x = i; y = j;
x++;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x + 1][y] == 'o'&&x != i)
{
while (x > i){
_ChessBoard[x][y] = 'o';
x--;
}
rightflag = 1;
break;
}
x++;
} x = i; y = j;
y++;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x][y + 1] == 'o'&&y != j)
{
while (y > j){
_ChessBoard[x][y] = 'o';
y--;
}
rightflag = 1;
break;
}
y++;
} x = i; y = j;
x--;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x - 1][y] == 'o'&&x != i)
{
while (x<i){
_ChessBoard[x][y] = 'o';
x++;
}
rightflag = 1;
break;
}
x--;
} x = i; y = j;
y--;
while ((_ChessBoard[x][y] != 'o') && (_ChessBoard[x][y] != NULL))
{
if (_ChessBoard[x][y - 1] == 'o'&&y != j)
{
while (y < j){
_ChessBoard[x][y] = 'o';
y++;
}
rightflag = 1;
break;
}
y--;
} x = i; y = j;
x++; y++;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x + 1][y + 1] == 'o'&&y != j)
{
while (y > j){
_ChessBoard[x][y] = 'o';
x--; y--;
}
rightflag = 1;
break;
}
x++; y++;
} x = i; y = j;
x--; y++;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x - 1][y + 1] == 'o'&&y != j)
{
while (y > j){
_ChessBoard[x][y] = 'o';
x++; y--;
}
rightflag = 1;
break;
}
x--; y++;
} x = i; y = j;
x++; y--;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x + 1][y - 1] == 'o'&&y != j)
{
while (y < j){
_ChessBoard[x][y] = 'o';
x--; y++;
}
rightflag = 1;
break;
}
x++; y--;
} x = i; y = j;
x--; y--;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x - 1][y - 1] == 'o'&&y != j)
{
while (y < j){
_ChessBoard[x][y] = 'o';
x++; y++;
}
rightflag = 1;
break;
}
x--; y--;
}
if (rightflag != 1) rightflag = 0;
}
else if (_ChessBoard[i][j] != NULL)
{
rightflag = 0;
}
return rightflag;
} //检查棋盘
int checkBefore(int i, int j, int flag){
int rightflag = 0;
int x, y;
x = i; y = j;
if (flag == 0 && _ChessBoard[i][j] == NULL)
{
x = i; y = j;
x++;
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x + 1][y] == 'x'&&x != i)
{
while (x > i){
x--;
}
rightflag = 1;
break;
}
x++;
} x = i; y = j;
y++;
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x][y + 1] == 'x'&&y != j)
{
while (y > j){
y--;
}
rightflag = 1;
break;
}
y++;
} x = i; y = j;
x--;
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x - 1][y] == 'x'&&x != i)
{
while (x<i){
x++;
}
rightflag = 1;
break;
}
x--;
} x = i; y = j;
y--;
while ((_ChessBoard[x][y] != 'x') && (_ChessBoard[x][y] != NULL))
{
if (_ChessBoard[x][y - 1] == 'x'&&y != j)
{
while (y < j){
y++;
}
rightflag = 1;
break;
}
y--;
} x = i; y = j;
x++; y++;
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x + 1][y + 1] == 'x'&&y != j)
{
while (y > j){
x--; y--;
}
rightflag = 1;
break;
}
x++; y++;
} x = i; y = j;
x--; y++;
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x - 1][y + 1] == 'x'&&y != j)
{
while (y > j){
x++; y--;
}
rightflag = 1;
break;
}
x--; y++;
} x = i; y = j;
x++; y--;
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x + 1][y - 1] == 'x'&&y != j)
{
while (y < j){
x--; y++;
}
rightflag = 1;
break;
}
x++; y--;
} x = i; y = j;
x--; y--;
while (_ChessBoard[x][y] != 'x'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x - 1][y - 1] == 'x'&&y != j)
{
while (y < j){
x++; y++;
}
rightflag = 1;
break;
}
x--; y--;
}
}
else if (flag == 1 && _ChessBoard[i][j] == NULL)
{
x = i; y = j;
x++;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x + 1][y] == 'o'&&x != i)
{
while (x > i){
x--;
}
rightflag = 1;
break;
}
x++;
} x = i; y = j;
y++;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x][y + 1] == 'o'&&y != j)
{
while (y > j){
y--;
}
rightflag = 1;
break;
}
y++;
} x = i; y = j;
x--;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x - 1][y] == 'o'&&x != i)
{
while (x<i){
x++;
}
rightflag = 1;
break;
}
x--;
} x = i; y = j;
y--;
while ((_ChessBoard[x][y] != 'o') && (_ChessBoard[x][y] != NULL))
{
if (_ChessBoard[x][y - 1] == 'o'&&y != j)
{
while (y < j){
y++;
}
rightflag = 1;
break;
}
y--;
} x = i; y = j;
x++; y++;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x + 1][y + 1] == 'o'&&y != j)
{
while (y > j){
x--; y--;
}
rightflag = 1;
break;
}
x++; y++;
} x = i; y = j;
x--; y++;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x - 1][y + 1] == 'o'&&y != j)
{
while (y > j){
x++; y--;
}
rightflag = 1;
break;
}
x--; y++;
} x = i; y = j;
x++; y--;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x + 1][y - 1] == 'o'&&y != j)
{
while (y < j){
x--; y++;
}
rightflag = 1;
break;
}
x++; y--;
} x = i; y = j;
x--; y--;
while (_ChessBoard[x][y] != 'o'&&_ChessBoard[x][y] != NULL)
{
if (_ChessBoard[x - 1][y - 1] == 'o'&&y != j)
{
while (y < j){
x++; y++;
}
rightflag = 1;
break;
}
x--; y--;
}
if (rightflag != 1) rightflag = 0;
}
else if (_ChessBoard[i][j] != NULL)
{
rightflag = 0;
}
return rightflag;
} //复制棋盘
void copyBoard(){
int i, j;
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
_ChessBoardBefore[i][j] = _ChessBoard[i][j];
}
}
} //判断胜负
void whoWin()
{
int player1 = 0, player2 = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (_ChessBoard[i][j] == 'x') player1++;
else if (_ChessBoard[i][j] == 'o') player2++;
}
}
if (player1>player2) cout << "x获胜" << endl;
else if (player1 < player2) cout << "o获胜" << endl;
else cout << "平局" << endl;
} void fallChess(){ //落子
int flag = 0;
int i, j;
int winFlag = 0;
int rightflag;
int k = 0, t = 0;
char j0;
initChessBoard();
printChessBoard(_ChessBoard);
while (1)
{
t = 0; //游戏是否需要结束的标记
copyBoard();//复制棋盘
if (flag == 2) flag = 0;//换手
for (int x = 0; x < N; x++)//找出可以落子的位置
{
for (int y = 0; y < N; y++)
{
rightflag = checkBefore(x, y, flag);
if (rightflag) _ChessBoardBefore[x][y] = 'Y';
else k++;
}
}
printf("可落子的位置,用Y标记\n");
printChessBoard(_ChessBoardBefore);//画出标记有可落子位置的棋盘 if (k == 0)//若k为零,则此时落子方无子可落
{
printf("无法落子,换手\n");
t++;
}
if (t == 2)//若t=2,则两方都无子可落,被动触发游戏结束
{
whoWin();//判定胜负
printf("游戏结束\n");
break;
}
cout << "请输入您要落子的位置,格式如 5 F(数值在1-8之间,字母在A-H之间,如输入10 X则游戏结束)" << endl;
int isright=0;
while (isright==0)
{
cin >> i >> j0;//输入位置
j = j0 - 'A' + 1;//将字母转换为数字
isright = checkBefore(i, j, flag);//判断输入是否可以落子
if (isright == 0) cout << "输入错误" << endl;
if (i == 10) break;//若输入i=10,则主动结束游戏
}
check(i, j, flag);//将中间的棋子反转
if (flag == 0)//落子
{
_ChessBoard[i][j] = 'x';
}
else if (flag == 1)
{
_ChessBoard[i][j] = 'o';
}
printf("落子后的棋盘\n");
printChessBoard(_ChessBoard);//打印棋盘
flag++;//换手
if (i == 10)//主动触发游戏结束
{
whoWin();
printf("游戏结束\n");
break;
}
}
} int main(){
cout << "游戏规则:把自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜八个方向内有一个自己的棋子,则被夹在中间的对方棋子全部翻转会成为自己的棋子。夹住的位置上必须全部是对手的棋子,不能有空格。并且,只有在可以翻转棋子的地方才可以下子。一步棋可以在数个方向上翻棋,任何被夹住的棋子都必须被翻转过来,棋手无权选择不去翻某个棋子必须是刚下的子夹对方才能够翻对方的子,因翻转对方的棋子而夹住的子是不能被翻的。" << endl;
fallChess();
system("pause");
return 0;
}

c++小练习——黑白棋的更多相关文章

  1. python3+tkinter实现的黑白棋,代码完整 100%能运行

    今天分享给大家的是采用Python3+tkinter制作而成的小项目--黑白棋 tkinter是Python内置的图形化模块,简单易用,一般的小型UI程序可以快速用它实现,具体的tkinter相关知识 ...

  2. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)

    黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...

  3. 【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋

    Description 黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是 ...

  4. [SDOI2011]黑白棋

    Description 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 ...

  5. 【BZOJ2281】【Sdoi2011】黑白棋 解题报告

    [BZOJ2281][Sdoi2011]黑白棋 Description ​ 小A和小B又想到了一个新的游戏. ​ 这个游戏是在一个\(1\)*\(n\)的棋盘上进行的,棋盘上有\(k\)个棋子,一半是 ...

  6. [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)

    2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 626  Solved: 390[Submit][Status][ ...

  7. Bzoj 2281 [Sdoi2011]黑白棋 题解

    2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 592  Solved: 362[Submit][Status][ ...

  8. js+canvas黑白棋

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 用Dart写的黑白棋游戏

    2013年11月,Dart语言1.0稳定版SDK发布,普天同庆.从此,网页编程不再纠结了. 在我看来,Dart语法简直就是C#的升级版,太像了.之所以喜欢Ruby的一个重要理由是支持mixin功能,而 ...

  10. [CareerCup] 8.8 Othello Game 黑白棋游戏

    8.8 Othello is played as follows: Each Othello piece is white on one side and black on the other. Wh ...

随机推荐

  1. 在Apache Cassandra数据库软件中报告高严重性RCE安全漏洞

    研究人员披露了ApacheCassandra一个现已修补的高严重性安全漏洞的细节,如果这个漏洞得不到解决,可能会被滥用来获取受影响安装的远程代码执行(RCE). DevOps公司JFrog的安全研究员 ...

  2. 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(完)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  3. 输入法词库解析(一)百度自定义方案.def

    详细代码:https://github.com/cxcn/dtool 前言 .def 是百度手机输入法-更多设置-自定义输入方案所使用的格式. 解析 码表偏移量 0x6D # 占用字节数 描述 a 1 ...

  4. C语言大作业---学生信息管理系统

    xxxx信息管理系统 简介 因为大作业规定的踩分项就那么多,为了不浪费时间 + 得分,就写成这样.现在看看,命名不规范,书写风格糟糕,全塞在一个源代码中······ 不过,应付大作业是没问题的 实验报 ...

  5. 重要参考步骤---ProxySQL Cluster 集群搭建步骤

    环境 proxysql-1:192.168.20.202 proxysql-2:192.168.20.203 均采用yum方式安装 # cat <<EOF | tee /etc/yum.r ...

  6. 使用KVM的命令行方式安装centos7虚拟机

    前提条件 1.宿主机上已经安装KVM软件,参考网址:https://www.cnblogs.com/sanduzxcvbnm/p/15538881.html 2.已经上传centos7镜像到宿主机里 ...

  7. RabbitMQ原理和架构图解(附6大工作模式)

    为什么要使用RabbitMQ? 1.解耦 系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦. 2.异步 将消息写入消息队列,非必要的业务逻辑以异步的方式运 ...

  8. Django 出现 frame because it set X-Frame-Options to deny 错误

    一.背景 使用django3 进行开发时,由于项目前端页面使用iframe框架,浏览器错误提示信息如下 Refused to display 'http://127.0.0.1:8000/' in a ...

  9. varchar与varchar2的区别

    1. varchar2所有字符都占两字节处理(一般情况下),varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节. 2. varchar2把空串等同于null处理,而varchar ...

  10. 洛谷P1395 会议 (树的重心)

    这道题考察了树的重心的性质,所有点到中心的距离之和是最小的,所以我们一遍dfs求出树的重心,在跑一次dfs统计距离之和. 1 #include<bits/stdc++.h> 2 using ...