用C语言写一个简单的三子棋,实现玩家与电脑的对战

源代码:

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_42957923/article/details/83998670