求五子棋 c++代码

2024-11-17 07:44:21
推荐回答(2个)
回答1:

这是编写的人人对战,虽然不是人机对战,但是希望对你可以提供点帮助,
问题还是自己研究的掌握的好...只需要别人给点思路,自己实践

#include
using namespace std;
#include //string.h

const int M=16;//行数
const int N=16;//列数

void showboard(char board[M][N])
{
// 1-2-1 显示每列的列号,列号不够两位在左边补空格
cout << " ";
for(int i=1; i<=N; i++)
cout << (i<10?" ":" ") << i;
cout << endl;
// 1-2-2 反复显示每一行
for(int i=0; i// 1-2-2-1 先显示行号
cout << (i<9?" ":" ") << i+1 << " ";
// 1-2-2-2 再显示棋盘每一列的棋子
for(int j=0; j cout << board[i][j] << " ";
cout << endl;
}
}
inline bool out(int row, int col)
{
return (row<1||row>M||col<1||col>N);
}
struct Size{
int row;
int col;
};
bool place(char board[M][N], bool blackwhite)
{
// 4-1 准备棋子
const char chess = blackwhite?'X':'O';
// 4-2 让玩家选择要下的位置(行列号),无效重来
int row, col;
do{
cout << "请" << (blackwhite?"黑方":"白方") << "下棋:";
cin >> row >> col;
// 4-2-1 不在棋盘中无效
// 4-2-2 那个位置已经有棋子了也无效
}while(out(row,col)||board[row-1][col-1]!='.');
// 4-3 把棋子放在棋盘上玩家选择的位置
board[row-1][col-1] = chess;
// 4-4 显示棋盘
showboard(board);
// 4-5 检查是否获胜
Size d[8]={ {0,1},{0,-1}, {-1,1},{1,-1},
{-1,0},{1,0}, {-1,-1},{1,1} };
int cnt, r, c;
// 4-5-1 反复检查从选定位置出发的8个(4对)方向,
for(int i=0; i<8; i++){
if((i&1)==0) cnt=1;//如果是偶数
r = row, c = col;
for(;;){
r += d[i].row, c += d[i].col;
// 4-5-2 统计跟新下的棋子同色的连续的棋子,
if(out(r,c)||board[r-1][c-1]!=chess) break;
++cnt;
}
// 4-5-3 任何一对方向上连续同色棋子数达到5个,当前玩家获胜。
if(cnt>=5){
cout << (blackwhite?"黑方胜":"白方胜") << endl;
return true;
}
}
return false;
}
int main()
{
//1、准备棋盘
// 1-1 定义一个二维数组,全部放上'.'
char board[M][N];
memset(board,'.',M*N);
// 1-2 显示棋盘
showboard(board);
//2、黑先
// 2-1 准备一个逻辑变量表示黑白方,初始为黑方
bool blackwhite = true;
//3、只要棋盘还有空位就反复4~5
// 3-1 循环,条件是空位数大于0
int space = M*N;
while(space>0){
//4、下一颗棋子,如果获胜,游戏就结束
if(place(board, blackwhite)) return 0;
//5、否则换对方
// 5-1 把逻辑变量的值反一下
blackwhite = !blackwhite;
}
//6、没有空位了就是和棋,游戏也结束
cout << "和棋" << endl;
return 0;
}

回答2:

这个就是一个2维数组的问题了,没有什么难度的了