用简单C语言写一个小游戏:三子棋

用简单的C语言来实现小时候玩的三子棋游戏,下面是人机对战,当然这个代码的电脑对手是人工智障而不是人工智能

 一 写代码前明确下棋时的步骤与顺序

1.创建一个3*3的棋盘.

2.将上面创建的棋盘中每个格初始化成' '状态.

3.打印出初始化完成的棋盘

4.玩家落子

5.电脑落子

6.判断胜负

写代码之前梳理好大概的思路,先写出初步的主函数

int main() {
	char winner = ' ';
	//1.创建一个棋盘,并初始化.
	char board[MAX_ROW][MAX_COL] = { 0 };
	//2.init函数将棋盘每个格子初始化成' '.
	init(board);
	while (1) {
		//3.打印棋盘
		printBoard(board);
		//4.玩家落子
		playerMove(board);
		//5.判断胜负
		winner = checkWinner(board);
		if (winner != ' ') {
			//胜负已分
			break;
		}
		//6.电脑落子
		computerMove(board);
		//7.判断胜负
		winner = checkWinner(board);
		if (winner != ' ') {
			//胜负已分
			break;
		}
	}

在创建棋盘是char board[][]的[]中不要写3,写3在后面看代码时不能明确分清3代表什么

因此建议定义宏

#define MAX_ROW  3
#define MAX_COL  3

 这样可以清楚的看出[]中的内容代表什么,提高可读性.

 二 根据初步的主函数完成想要的代码

 1.写一个函数来初始化棋盘

//将棋盘初始化成' '
void init(char board[MAX_ROW][MAX_COL]) {
	for (int row = 0; row < MAX_ROW; row++) {
		for(int col = 0; col < MAX_COL; col++) {
			board[row][col] = ' ';
		}
	}
	//设计随机种子
	srand((unsigned int) time(0));
}

 2.打印棋盘

void printBoard(char board[MAX_ROW][MAX_COL]) {
	system("cls");
	for (int row = 0; row < MAX_ROW; row++) {
		printf("+---+---+---+\n");
		for (int col = 0; col < MAX_COL; col++) {
			printf("| %c ", board[row][col]);
		}
		printf("|");
		printf("\n");
	}
	printf("+---+---+---+\n");
}

 system("cls")是让每次打印棋盘前清除之前的棋盘这样能让界面清晰一些

(使用的是简单的C来完成程序所以打印的棋盘也比较简陋)

3.玩家落子

void playerMove(char board[MAX_ROW][MAX_COL]) {
	printf("请玩家落子!");
	while (1) {
		printf("请输入落子的位置(row col):");
		int row = 0;
		int col = 0;
		scanf("%d %d", &row, &col);
		//输入后验证输入内容是否合法.
		if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
			printf("输入有误.请重新输入!\n");
			continue;
		}
		if (board[row][col] != ' ') {
			printf("当前位置已有棋子,请重新输入!\n");
			continue;
		}
		board[row][col] = 'x';
		break;
	}
}

 以输入坐标的方式来实现落子,并且要检测玩家落子是否合理,以免输入无效的坐标.

4.电脑落子

void computerMove(char board[MAX_ROW][MAX_COL]) {
	printf("轮到电脑落子");
	while (1) {
		int row = rand() % MAX_ROW;
		int col = rand() % MAX_COL;
		if (board[row][col] != ' ') {
			continue;
		}
		board[row][col] = 'o';
		break;
	}
}

 电脑落子采用随机数的方式来进行落子,因此需要设置随机种子,将它写在初始化棋盘函数内,每次初始化一次进行一次随机种子的设置

由于是随机落子因此实现的不是人工智能而是人工智障.

5.判断胜负

int checkWinner(char board[MAX_ROW][MAX_COL]) {
	//检查所有行
	for (int row = 0; row < MAX_ROW; row++) {
		if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][0] == board[row][2]) {
			return board[row][0];
		}
	}
	//检查所有列
	for (int col = 0; col < MAX_COL; col++) {
		if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) {
			return board[0][col];
		}
	}
	//检查对角线
	if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') {
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ') {
		return board[0][2];
	}
	if (isFull(board)) {
		return 'q';
	}
	return ' ';
}

检查每行 每列  对角线是否有三个相同的棋子从而判断胜负.

int isFull(char board[MAX_ROW][MAX_COL]) {
	for (int row = 0; row < MAX_ROW; row++) {
		for (int col = 0; col < MAX_COL; col++) {
			if (board[row][col] == ' ') {
				//棋盘没满
				return 0;
			}
		}
	}
	return 1;
}

 检查棋盘有没有下满(可能出现和棋)

 这就实现一个简单的三子棋游戏

在主函数中玩家落子后应也判断一次胜负,以免出现玩家胜利电脑再落子的情况.

三 结合上述,三子棋的代码如下

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>

#define MAX_ROW  3
#define MAX_COL  3

//将棋盘初始化成' '
void init(char board[MAX_ROW][MAX_COL]) {
	for (int row = 0; row < MAX_ROW; row++) {
		for(int col = 0; col < MAX_COL; col++) {
			board[row][col] = ' ';
		}
	}
	//设计随机种子
	srand((unsigned int) time(0));
}
void printBoard(char board[MAX_ROW][MAX_COL]) {
	system("cls");
	for (int row = 0; row < MAX_ROW; row++) {
		printf("+---+---+---+\n");
		for (int col = 0; col < MAX_COL; col++) {
			printf("| %c ", board[row][col]);
		}
		printf("|");
		printf("\n");
	}
	printf("+---+---+---+\n");
}
void playerMove(char board[MAX_ROW][MAX_COL]) {
	printf("请玩家落子!");
	while (1) {
		printf("请输入落子的位置(row col):");
		int row = 0;
		int col = 0;
		scanf("%d %d", &row, &col);
		//输入后验证输入内容是否合法.
		if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
			printf("输入有误.请重新输入!\n");
			continue;
		}
		if (board[row][col] != ' ') {
			printf("当前位置已有棋子,请重新输入!\n");
			continue;
		}
		board[row][col] = 'x';
		break;
	}
}
void computerMove(char board[MAX_ROW][MAX_COL]) {
	printf("轮到电脑落子");
	while (1) {
		int row = rand() % MAX_ROW;
		int col = rand() % MAX_COL;
		if (board[row][col] != ' ') {
			continue;
		}
		board[row][col] = 'o';
		break;
	}
}
int isFull(char board[MAX_ROW][MAX_COL]) {
	for (int row = 0; row < MAX_ROW; row++) {
		for (int col = 0; col < MAX_COL; col++) {
			if (board[row][col] == ' ') {
				//棋盘没满
				return 0;
			}
		}
	}
	return 1;
}
int checkWinner(char board[MAX_ROW][MAX_COL]) {
	//检查所有行
	for (int row = 0; row < MAX_ROW; row++) {
		if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][0] == board[row][2]) {
			return board[row][0];
		}
	}
	//检查所有列
	for (int col = 0; col < MAX_COL; col++) {
		if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) {
			return board[0][col];
		}
	}
	//检查对角线
	if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') {
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ') {
		return board[0][2];
	}
	if (isFull(board)) {
		return 'q';
	}
	return ' ';
}
int main() {
	char winner = ' ';
	//1.创建一个棋盘,并初始化.
	char board[MAX_ROW][MAX_COL] = { 0 };
	//2.init函数将棋盘每个格子初始化成' '.
	init(board);
	while (1) {
		//3.打印棋盘
		printBoard(board);
		//4.玩家落子
		playerMove(board);
		//5.判断胜负
		winner = checkWinner(board);
		if (winner != ' ') {
			//胜负已分
			break;
		}
		//6.电脑落子
		computerMove(board);
		//7.判断胜负
		winner = checkWinner(board);
		if (winner != ' ') {
			//胜负已分
			break;
		}
	}
	if (winner == 'x') {
		printf("恭喜你,你赢了!\n");
	}else if(winner=='o') {
		printf("你真菜连人工智障都玩不过\n");
	}else {
		printf("你和人工智障五五开\n");
	}
	return 0;
}

运行界面如下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值