C语言实现 三子棋小游戏

三子棋小游戏

设计思路:

创建一个3*3的二维数组,每个元素都是一个char类型

  1. 创建棋盘,并且初始化棋盘,把棋盘所有位置都设置成空格;
  2. 打印空白棋盘;
  3. 玩家落子,让玩家输入一组坐标(行row,列col);
  4. 判断输赢;
  5. 电脑落子,电脑随机生成一组坐标,进行随机落子;
  6. 判断输赢;
代码实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_ROW 3
#define MAX_COL 3

//1.创建棋盘
//棋盘初始化
void init(char ChessBoard[MAX_ROW][MAX_COL]) {
     
	for (int row = 0; row < MAX_ROW; row++) {
     
		for(int col=0;col<MAX_COL;col++){
     
			ChessBoard[row][col] = ' ';
		}
	}
}
//2.打印棋盘
void Print(char ChessBoard[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 |", ChessBoard[row][col]);
		}
		printf("\n+---+---+---+\n");
	}
}
//3.玩家落子
void PlayerMove(char ChessBoard[MAX_ROW][MAX_COL]) {
     
	printf("玩家开始落子.....\n\n");
	while (1) {
     
		int row = 0;
		int col = 0;
		printf("请输入一组坐标(row,col):");//(row,col)相当于(y,x)
		scanf("%d %d", &row, &col);
		if (row < 0 || row >= MAX_ROW || col<0 || col>MAX_COL) {
     
			printf("您的输入越界,请重新输入!\n");
			continue;
		}
		if (ChessBoard[row][col] != ' ') {
     
			printf("您输入的地方已被占用,请重新输入!\n");
			continue;
		}
		ChessBoard[row][col] = 'x';
		break;
	}
}
void ComputerMove(char ChessBoard[MAX_ROW][MAX_COL]) {
     
	srand((unsigned int)time(0));
	while (1) {
     
		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; //返回0则表示 棋盘没满
			}
		}
	}
	return 1;//返回1则表示 棋盘已满
}
char isOver(char ChessBoard[MAX_ROW][MAX_COL]) {
     
	//扫描所有的行
	for (int row = 0; row < MAX_ROW; row++) {
     
		if (ChessBoard[row][0] != ' ' && ChessBoard[row][0] == ChessBoard[row][1] 
			&& ChessBoard[row][0] == ChessBoard[row][2]) {
     
			return ChessBoard[row][0];
		}
	}
	//扫描所有的列
	for (int col = 0; col < MAX_COL; col++) {
     
		if (ChessBoard[0][col] != ' ' && ChessBoard[0][col] == ChessBoard[1][col] 
			&& ChessBoard[0][col] == ChessBoard[2][col]) {
     
			return ChessBoard[0][col];
		}
	}
	//扫描对角线 1 
	if (ChessBoard[0][0] != ' ' && ChessBoard[0][0] == ChessBoard[1][1]
		&& ChessBoard[0][0] && ChessBoard[2][2]) {
     
		return ChessBoard[0][0];
	}
	//扫描对角线 2
	if (ChessBoard[0][2] != ' ' && ChessBoard[0][2] == ChessBoard[1][1] 
		&& ChessBoard[0][2] == ChessBoard[2][0]) {
     
		return ChessBoard[0][2];
	}
	if (isFull(ChessBoard)) {
     
		return 'h'; //和棋 
	}
	return ' ';
}
int main() {
     
	char ChessBoard[MAX_ROW][MAX_COL];
	init(ChessBoard);//1.棋盘初始化
	char winner = ' ';
	while (1) {
     
		system("cls");
		Print(ChessBoard);//2.打印棋盘
		PlayerMove(ChessBoard);//3.玩家落子
		Print(ChessBoard);
		winner = isOver(ChessBoard);
		if (winner != ' ') {
     
			break;
		}
		ComputerMove(ChessBoard);//4.电脑落子
		winner = isOver(ChessBoard);
		if (winner != ' ') {
     
			break;
		}
	}
	if (winner == 'x') {
     
		printf("恭喜你 赢了!\n");
	}
	else if (winner == 'o') {
     
		printf("很遗憾,你失败了\n");
	}
	else {
     
		printf("平局!\n");
	}
	system("pause");
	return 0;
}

代码剖析:

1.初始化棋盘,把棋盘所有位置都设置成空格; init函数实现
C语言实现 三子棋小游戏_第1张图片
2. 打印棋盘; Print函数实现
C语言实现 三子棋小游戏_第2张图片
3. 玩家落子;PlayerMove函数实现
C语言实现 三子棋小游戏_第3张图片

4.(1) 判断游戏是否结束; isOver函数
(2)判断是否平局;isFull函数

C语言实现 三子棋小游戏_第4张图片
5. 电脑随机落子;ComputerMove函数
C语言实现 三子棋小游戏_第5张图片

输出示例:

C语言实现 三子棋小游戏_第6张图片

将各个函数在主函数中正确调用即可!为了游戏体验感,不要忘了清屏和最终获胜结果的呈现哦~

你可能感兴趣的:(C,c语言)