目录
井字棋
本文用C/C++,杠杠单单地实现下井字棋。
一、实现思路
规则:玩家先手下棋,电脑随机下棋。每下一步棋进行判断是否结束。
函数
InitChessBoard 函数 :初始化棋盘,棋盘数组每个元素都初始化为0。
printChessBoard函数:打印棋盘。
playerChess函数:玩家下棋,获取下棋坐标。
comChess函数:电脑下棋,生成随机数,下在合法的地方。
isOver函数:判断是否结束,可能赢可能输可能平局。
is_full函数:判断棋盘是否满了,用来判断平局。
二、代码
1、头文件
这里把表示空白,X棋,O棋进行了宏定义,方便需要时修改。
#include <iostream>
using namespace std;
#define ROW 3
#define COL 3
#define BLANK '_'
#define PLAYER 'O'
#define COMPUTER 'X'
void InitChessBoard(int ChessBoard[ROW][COL]);
void printChessBoard(int ChessBoard[ROW][COL]);
void playerChess(int ChessBoard[ROW][COL]);
void comChess(int ChessBoard[ROW][COL]);
int isOver(int ChessBoard[ROW][COL]);
int is_full(int ChessBoard[ROW][COL]);
play函数
主菜单
void play() {
srand(time(NULL));
int input;
do {
cout << "1.game" << endl << "0.quit" << endl;
cin >> input;
switch (input)
{
case 1:
game();
break;
case 0:
cout << "退出";
break;
default:
break;
}
} while (input);
}
game函数
整体逻辑
void game() {
int ChessBoard[3][3] = { 0 };
int ret=0;
//初始化打印
printChessBoard(ChessBoard);
while (1) {
//玩家下棋
playerChess(ChessBoard);
printChessBoard(ChessBoard);
ret = isOver(ChessBoard);
if (ret) break;
//电脑下棋
comChess(ChessBoard);
printChessBoard(ChessBoard);
ret = isOver(ChessBoard);
if (ret) break;
}
switch (ret)
{
case 1:
cout << "YOU WIN !"<<endl;
break;
case 2:
cout << "COM WIN !"<<endl;
break;
case 3:
cout << "平局";
break;
default:
break;
}
}
InitChessBoard 函数
初始化二维数组全为0,表示全空。1为玩家棋子,2为电脑棋子。
//初始化
void InitChessBoard(int ChessBoard[ROW][COL]) {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
ChessBoard[i][j] = 0;
}
}
}
printChessBoard函数
打印数组对应状态的格子
也可以一开始用char 存每个字符,而不是用int数组来判断。
//打印
void printChessBoard(int ChessBoard[ROW][COL]) {
system("cls");
//根据棋子种类决定打印什么
char chess;
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
chess = ChessBoard[i][j]==0? BLANK: (ChessBoard[i][j]==1?PLAYER:COMPUTER);
cout << chess<<' ';
}
cout << endl;
}
}
playerChess函数
获取玩家输入x y 坐标,判断是否合法。
//玩家下棋
void playerChess(int ChessBoard[ROW][COL]) {
int x, y;
do {
cin >> y >> x;//倒置
x--, y--;//为了让玩家从(1,1)开始
//判断是否合法
if (x >=ROW || x < 0 || y < 0 || y>=COL) {
cout << "非法坐标"<<endl;
continue;
}
if (ChessBoard[x][y]) {
cout << "重复"<<endl;
continue;
}
break;
} while (1);//重新
ChessBoard[x][y] = 1;
}
comChess函数
生成x,y 随机数(0-2)直到合法(不重复)
//电脑下棋
void comChess(int ChessBoard[ROW][COL]) {
int x, y;
do {
x = rand() % ROW; //%ROW 取从0到ROW的数
y = rand() % COL;
if (ChessBoard[x][y]) continue;
break;
} while (1);
ChessBoard[x][y] = 2;
}
isOver函数
横竖判断,斜着判断3个是否相同:第一个是否等于第二个,第二个是否等于第三个,且不等于0。相同时返回对应的值,表示是谁赢。
//赢局判断
int isOver(int ChessBoard[ROW][COL]) {
//横竖判断
for (int i = 0; i < ROW; i++) {
if (ChessBoard[i][0] == ChessBoard[i][1] && ChessBoard[i][1] == ChessBoard[i][2] && ChessBoard[i][0] != 0)
return ChessBoard[i][0];
}
for (int i = 0; i < COL; i++) {
if (ChessBoard[0][i] == ChessBoard[1][i] && ChessBoard[1][i] == ChessBoard[2][i] && ChessBoard[0][i] != 0)
return ChessBoard[0][i];
}
//斜着判断
if (ChessBoard[0][0] == ChessBoard[1][1] && ChessBoard[2][2] == ChessBoard[1][1] && ChessBoard[1][1] != 0)
return ChessBoard[1][1];
if (ChessBoard[2][0] == ChessBoard[1][1] && ChessBoard[0][2] == ChessBoard[1][1] && ChessBoard[1][1] != 0)
return ChessBoard[1][1];
//平局判断
if (is_full(ChessBoard))
return 3;
//都不满足
return 0;
}
is_full函数
遍历棋盘,遇到空白说明没满。
//判断是否满了
int is_full(int ChessBoard[ROW][COL]) {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (!ChessBoard[i][j]) //遇到0返回0,说明还有空白
return 0;
}
}
//满了,返回1
return 1;
}
三、结果
WIN
LOSE