C语言实现三子棋

Posted -A7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言实现三子棋相关的知识,希望对你有一定的参考价值。

游戏规则

一个人和电脑玩家在九宫格上下棋 一个用x一个用o 率先将三个棋子连成一条直线的获胜~

逻辑梳理

1.创建棋盘
2.打印棋盘
3.玩家和电脑落子
4.判定胜负

源码实现


// An highlighted block
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_ROW 3
#define MAX_COL 3

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] = ' ';
			//创建棋盘,并进行初始化
			//将所有的棋盘都打印成空格
		}
	}

}

void print(char chessBoard[MAX_ROW][MAX_COL]){
	system("cls");
	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");
	}

}
//打印棋盘 
//将棋盘边框用符号打印
void playerMove(char chessBoard[MAX_ROW][MAX_COL]) {
	printf("请落子\\n");
	int row = 0;
	int col = 0;
	//合法性判定
	while (1) {
		printf("请输入要落子的位置(row)(col);\\n");
		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]) {
	printf("电脑落子\\n");
	//合法性判定
	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]) {
	// 遍历棋盘,有' '就说明没满,返回0,否则返回1
	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][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];
		}
	}
	if (chessBoard[0][0] != ' '
		&& chessBoard[0][0] == chessBoard[1][1]
		&& chessBoard[0][0] == chessBoard[2][2]) {
		return chessBoard[0][0];
	}
	if (chessBoard[0][2] != ' '
		&& chessBoard[0][2] == chessBoard[1][1]
		&& chessBoard[0][2] == chessBoard[2][0]) {
		return chessBoard[0][2];
	}
	// 和棋
	if (isFull(chessBoard)) {
		return chessBoard[0][2];
	}
	// 胜负未分
	return ' ';
}
int main() {
	char winner = ' ';
	srand(time((unsigned int)0));
	// 1. 创建棋盘、初始化棋盘
	char chessBoard[MAX_ROW][MAX_COL];
	init(chessBoard);
	while (1) {
		// 2. 打印棋盘
		print(chessBoard);
		// 3. 玩家落子
		playerMove(chessBoard);
		// 4. 判定胜负
		winner = isGameOver(chessBoard);
		if (winner != ' ') {
			// 游戏结束
			break;
		}
		print(chessBoard);
		// 5. 电脑落子
		computerMove(chessBoard);
		// 6. 判定胜负
		winner = isGameOver(chessBoard);
		if (winner != ' ') {
			break;
		}
	}
	print(chessBoard);
	if (winner == 'x') {
		printf("恭喜你赢啦~");
	}
	if (winner == 'o') {
		printf("太菜了,连人工智障都下不过!");
	}
	if (winner == 'H') {
		printf("你和人工智障差不多~");
	}
	return 0;
}

心得体会

写代码的时候一定要认真,要不然像这种唱的代码出了错就很麻烦 因为一个0 和空格没分清找了很多人请教
但是还是有收获的 ,只要你不断的在敲代码,下次碰到这些问题就能迎刃而解了。

以上是关于C语言实现三子棋的主要内容,如果未能解决你的问题,请参考以下文章

《C语言入门》三子棋C语言实现(详细版)

C语言游戏跟电脑battle三子棋

C语言实现三子棋游戏

详细解读C语言实现三子棋

三子棋(C语言实现)

c语言三子棋