源代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <time.h>
/*
用 C 写一个三子棋
*/
//逻辑:
//1. 画一个棋盘 --> 用二维数组实现
//2. 规定用户先下棋 x
//3. 判断游戏是否结束
//4. 电脑再下棋 o
//5. 判断游戏是否结束
//从 2 开始重复上述操作
//画一个初始棋盘
//行列都为3
#define ROW 3
#define COL 3
char chess[ROW][COL];
//初始化二维数组
void init() {
for (int row = 0; row < ROW; row++) {
for (int col = 0; col < COL; col++) {
chess[row][col] = ' ';
}
}
}
void chessboard() {
//绘画边界
for (int row = 0; row < ROW; row++) {
printf(" %c | %c | %c \n", chess[row][0], chess[row][1], chess[row][2]);
if (row != 2) {
printf("---|---|---\n");
}
}
}
//用户先下棋
void playerFall() {
//规定下棋的位置
int row = 0;
int col = 0;
printf("请用户输入你要落子的位置(row col)\n");
while (1) {
scanf("%d %d", &row, &col);
if (row < 0 || row >= ROW || col < 0 || col >= COL) {
printf("你的输入有误请重新落子\n");
continue;
}
if (chess[row][col] != ' ') {
printf("该位置已经有棋子,请重新落子\n");
continue;
}
chess[row][col] = 'X';
break;
}
system("cls");
chessboard();
}
//电脑下棋
void computerFall() {
//规定下棋的位置
int row = 0;
int col = 0;
while (1) {
row = rand() % 3;
col = rand() % 3;
if (chess[row][col] != ' ') {
continue;
}
chess[row][col] = 'O';
break;
}
system("cls");
chessboard();
}
//判断游戏状态
enum state {
FAIL,
WIN,
KEEP,
DRAW,
}nowState;
int gameState() {
//判断每行连成三子的情况
for (int row = 0; row < ROW; row++) {
if (chess[row][0] == chess[row][1] &&
chess[row][0] == chess[row][2] &&
chess[row][0] != ' ') {
if (chess[row][0] == 'X') {
nowState = WIN;
return nowState;
} else {
nowState = FAIL;
return nowState;
}
}
}
//判断每列连成三子的情况
for (int col = 0; col < COL; col++) {
if (chess[0][col] == chess[1][col] &&
chess[0][col] == chess[2][col] &&
chess[0][col] != ' ') {
if (chess[0][col] == 'X') {
nowState = WIN;
return nowState;
} else {
nowState = FAIL;
return nowState;
}
}
}
//判断对角线连成三子的情况
if ((chess[0][0] == chess[1][1] &&
chess[0][0] == chess[2][2] &&
chess[0][0] != ' ') ||
(chess[2][0] == chess[1][1] &&
chess[2][0] == chess[0][2] &&
chess[2][0] != ' ')) {
if (chess[2][0] == 'X') {
nowState = WIN;
return nowState;
} else {
nowState = FAIL;
return nowState;
}
}
//判断游戏是否继续
for (int row = 0; row < ROW; row++) {
for (int col = 0; col < COL; col++) {
if (chess[row][col] == ' ') {
nowState = KEEP;
return nowState;
}
}
}
//判断是否下满棋盘依然未分出胜负的情况
nowState = DRAW;
return nowState;
}
int main() {
init();
srand((unsigned int)time(NULL));
chessboard();
while (1) {
playerFall();
if (gameState() != KEEP) {
printf("游戏结束\n");
break;
}
computerFall();
if (gameState() != KEEP) {
printf("游戏结束\n");
break;
}
}
if (gameState() == FAIL) {
printf("玩家失败!!!\n");
} else if (gameState() == WIN) {
printf("玩家胜利!!!\n");
} else {
printf("和棋!!!\n");
}
system("pause");
return 0;
}