C语言实现三子棋游戏


前言

正所谓“兵马未动,粮草先行”,我们再写一个程序之前,应先想清楚他的流程,再动手。
下面是我想的游戏流程,供大家参考:
1.创建棋盘,并且初始化,首先把所有位置都设为空格。
2.打印棋盘。
3.玩家落子,让玩家输入一组坐标(row,col)进行落子。
4.判定获胜。
5.电脑进行落子,随机落子。
6.判定获胜。


一、创建棋盘

首先解决如何表示棋盘
在这里插入图片描述
我们便想到了二维数组,创建一个3*3的二维数组,每一个元素是一个char类型,因为后续落子时,‘x’表示玩家一,‘o’表示玩家二,空格表示未落子。


#define MAX_ROW 3
#define MAX_COL 3
//初始化棋盘
void init(char chess[MAX_ROW][MAX_COL]) {
	for (int row = 0; row < MAX_ROW; row++) {
		for (int col = 0; col < MAX_COL; col++){
			chess[row][col] = ' ';
		}
	}
}

二、打印棋盘

代码如下(示例):

//打印棋盘
void print(char chess[MAX_ROW][MAX_COL]) {
	printf("+---+---+---+\n");
	for (int row = 0; row < MAX_ROW; row++) {
		printf("|");
		for (int col = 0; col < MAX_COL; col++) {
			printf(" %c |", chess[row][col]);
		}
		printf("\n+---+---+---+\n");
	}
}

在这里插入图片描述

三、玩家落子

在此过程中需要考虑多种情况,玩家有可能会乱输.
代码如下(示例):

//玩家落子
void playerMove(char chessBoard[MAX_ROW][MAX_COL]) {
	while (1) {
		int row = 0;
		int col = 0;
		printf("请输入落子位置(row,col)\n");
		scanf("%d %d", &row, &col);
		if (row < 0 || row >= 3 || col < 0 || col >= 3) {
			printf("您的输入非法!请重新输入\n");
			continue;
		}
		 if (chessBoard[row][col] != ' ') {
			printf("该位置已经落子,请重新输入\n");
			continue;
		}
		    system("cls");//在下一个结果显示之前清屏
			chessBoard[row][col] = 'x';
			break;
	}
}

在这里插入图片描述

四、电脑落子

//电脑落子
void computerMove(char chessBoard[MAX_ROW][MAX_COL]) {
	srand((char)time(0));
	while (1) {
		system("cls");
		int row = rand() % MAX_ROW;
		int col = rand() % MAX_COL;
		if (chessBoard[row][col] != ' ') {
			continue;
		}
		chessBoard[row][col] = 'o';
		break;
	}
}

在这里插入图片描述

五、判断胜负

我们都知道三子棋判断胜负的标准,横三个,竖三个或者对角线.我们设定:玩家赢,输出’x’,电脑赢,输出’o’,胜负未分,还要继续输出’ ‘,和棋输出’p’.
另外,判断胜负未分的时候,我们就需要判断这个棋盘是否满,如果满了,就是和棋,未满就是胜负未分,需要继续.

//判断棋盘是否满
int isFull(char chessBoard[MAX_ROW][MAX_COL]) {
	for (int row = 0; row < MAX_ROW; row++) {
		for (int col = 0; col < MAX_COL; col++) {
			if (chessBoard[row][col] == ' ')
				return 0;
		}
	}
	return 1;
}
//判断获胜
char isGameover(char chessBoard[MAX_ROW][MAX_COL]) {
	for (int row = 0; row < MAX_ROW; row++) {
		if (chessBoard[row][0] != ' ' && 
			chessBoard[row][1] == chessBoard[row][0] && chessBoard[row][2] == chessBoard[row][0])
			return chessBoard[row][0];
	}
	for (int col = 0; col < MAX_COL; col++) {
		if (chessBoard[0][col] != ' ' &&
			chessBoard[1][col] == chessBoard[0][col] && chessBoard[2][col] == chessBoard[0][col])
			return chessBoard[0][col];
	}
	
	if (chessBoard[0][0] != ' ' && chessBoard[1][1] == chessBoard[0][0] && chessBoard[2][2] == chessBoard[0][0])
		return chessBoard[0][0];
	if (chessBoard[0][2] != ' ' && chessBoard[1][1] == chessBoard[0][2] && chessBoard[2][0] == chessBoard[0][2])
		return chessBoard[0][2];
	if (isFull(chessBoard))
		return 'q';
	else return ' ';
}

在这里插入图片描述

五、完整程序

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_ROW 3
#define MAX_COL 3
//初始化棋盘
void init(char chess[MAX_ROW][MAX_COL]) {
	for (int row = 0; row < MAX_ROW; row++) {
		for (int col = 0; col < MAX_COL; col++){
			chess[row][col] = ' ';
		}
	}
}
//打印棋盘
void print(char chess[MAX_ROW][MAX_COL]) {
	printf("+---+---+---+\n");
	for (int row = 0; row < MAX_ROW; row++) {
		printf("|");
		for (int col = 0; col < MAX_COL; col++) {
			printf(" %c |", chess[row][col]);
		}
		printf("\n+---+---+---+\n");
	}
}
//玩家落子
void playerMove(char chessBoard[MAX_ROW][MAX_COL]) {
	while (1) {
		int row = 0;
		int col = 0;
		printf("请输入落子位置(row,col)\n");
		scanf("%d %d", &row, &col);
		if (row < 0 || row >= 3 || col < 0 || col >= 3) {
			printf("您的输入非法!请重新输入\n");
			continue;
		}
		 if (chessBoard[row][col] != ' ') {
			printf("该位置已经落子,请重新输入\n");
			continue;
		}
		    system("cls");//在下一个结果显示之前清屏
			chessBoard[row][col] = 'x';
			break;
	}
}
//电脑落子
void computerMove(char chessBoard[MAX_ROW][MAX_COL]) {
	srand((char)time(0));
	while (1) {
		system("cls");
		int row = rand() % MAX_ROW;
		int col = rand() % MAX_COL;
		if (chessBoard[row][col] != ' ') {
			continue;
		}
		chessBoard[row][col] = 'o';
		break;
	}
}
//判断棋盘是否满
int isFull(char chessBoard[MAX_ROW][MAX_COL]) {
	for (int row = 0; row < MAX_ROW; row++) {
		for (int col = 0; col < MAX_COL; col++) {
			if (chessBoard[row][col] == ' ')
				return 0;
		}
	}
	return 1;
}
//判断获胜
char isGameover(char chessBoard[MAX_ROW][MAX_COL]) {
	for (int row = 0; row < MAX_ROW; row++) {
		if (chessBoard[row][0] != ' ' && 
			chessBoard[row][1] == chessBoard[row][0] && chessBoard[row][2] == chessBoard[row][0])
			return chessBoard[row][0];
	}
	for (int col = 0; col < MAX_COL; col++) {
		if (chessBoard[0][col] != ' ' &&
			chessBoard[1][col] == chessBoard[0][col] && chessBoard[2][col] == chessBoard[0][col])
			return chessBoard[0][col];
	}
	
	if (chessBoard[0][0] != ' ' && chessBoard[1][1] == chessBoard[0][0] && chessBoard[2][2] == chessBoard[0][0])
		return chessBoard[0][0];
	if (chessBoard[0][2] != ' ' && chessBoard[1][1] == chessBoard[0][2] && chessBoard[2][0] == chessBoard[0][2])
		return chessBoard[0][2];
	if (isFull(chessBoard))
		return 'q';
	else return ' ';
}
int main() {
	char winner = ' ';
	printf("欢迎来到三子棋游戏\n");
	char chessBoard[MAX_ROW][MAX_COL];
	init(chessBoard);
	while (1) {
		print(chessBoard);
		playerMove(chessBoard);
		winner=isGameover(chessBoard);
		if (winner != ' ')
			break;
		computerMove(chessBoard);
		winner = isGameover(chessBoard);
		if (winner != ' ')
			break;
	}
	print(chessBoard);
	if (winner == 'x')
		printf("恭喜您获胜\n");
	else if (winner == 'o')
		printf("很遗憾,电脑获胜\n");
	else
		printf("此局为和局\n");
	system("pause");
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dhdhdhdhg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值