C语言五子棋,可以电脑对战,也可以玩家对战

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define Max_Row 15 //使用宏定义,以便以后修改棋盘大小
#define Max_Col 15 //使用宏定义,以便以后修改棋盘大小

char ChessBoard[Max_Row][Max_Col]; //定义棋盘

//初始化棋盘,把数组每个元素都设为空格,玩家落子为o,电脑落子为x
void Init() {     
	for (int row = 0; row < Max_Row; ++row) {
		for (int col = 0; col < Max_Col; ++col) {
			ChessBoard[row][col] =' ';
		}
	}
}

//打印棋盘
void Print() {
	printf("  0   1   2   3   4   5   6   7   8   9   10  11  12  13  14\n");
	for (int row = 0; row < Max_Row; ++row) {
		printf("| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |%d\n",
			ChessBoard[row][0],ChessBoard[row][1], ChessBoard[row][2],
			ChessBoard[row][3],ChessBoard[row][4],ChessBoard[row][5],
			ChessBoard[row][6],ChessBoard[row][7],ChessBoard[row][8],
			ChessBoard[row][9], ChessBoard[row][10], ChessBoard[row][11],
			ChessBoard[row][12], ChessBoard[row][13], ChessBoard[row][14], row);
		printf("|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n",row);
	}
}

//电脑对战:玩家落子
void PlayerMove() {
	printf("到您落子了\n");
	while (1) {
		printf("请输入您想要落子的坐标\n");
		int row, col;
		scanf("%d %d", &row, &col);
		//如果行数或者列数不合法,继续下一次循环
		if (row >= Max_Row || col >= Max_Col || row<0 || col<0) {
			printf("您的输入无效!\n");
			continue;
		}
		//如果落子的位置不是空格,提示玩家已落子,继续下一次循环
		if (ChessBoard[row][col] != ' ') {
			printf("您输入的位置已落子\n");
			continue;
		}
		ChessBoard[row][col] = 'o';
		break;
	}	
}
//电脑对战:电脑落子
void ComputerMove() {
	printf("电脑落子\n");
	while (1) {	
			int row, col;
			srand((unsigned int)time(0));
			row = rand() % 15;
			col = rand() % 15;
			if (ChessBoard[row][col] == ' ') {
				ChessBoard[row][col] = 'x';
				break;
			}
		}			
}
//玩家对战:玩家1落子
void PlayerMove1() {
	printf("到玩家1落子了\n");
	while (1) {
		printf("请输入玩家1想要落子的坐标\n");
		int row, col;
		scanf("%d %d", &row, &col);
		//如果行数或者列数不合法,继续下一次循环
		if (row >= Max_Row || col >= Max_Col || row<0 || col<0) {
			printf("您的输入无效!\n");
			continue;
		}
		//如果落子的位置不是空格,提示玩家已落子,继续下一次循环
		if (ChessBoard[row][col] != ' ') {
			printf("您输入的位置已落子\n");
			continue;
		}
		ChessBoard[row][col] = 'o';
		break;
	}
}
//玩家对战:玩家2落子
void PlayerMove2() {
	printf("到玩家2落子了\n");
	while (1) {
		printf("请输入玩家2想要落子的坐标\n");
		int row, col;
		scanf("%d %d", &row, &col);
		//如果行数或者列数不合法,继续下一次循环
		if (row >= Max_Row || col >= Max_Col || row<0 || col<0) {
			printf("您的输入无效!\n");
			continue;
		}
		//如果落子的位置不是空格,提示玩家已落子,继续下一次循环
		if (ChessBoard[row][col] != ' ') {
			printf("您输入的位置已落子\n");
			continue;
		}
		ChessBoard[row][col] = 'x';
		break;
	}
}

//判断比赛胜负
char JudgeWinner() {
	//先判断横着胜利的
    //遍历到倒数第五个格子,要判断和最后的四个格子是否相同,
	//所以为最大格数减4
	for (int row = 0; row < Max_Row; ++row) {
		for (int col = 0; col < (Max_Col - 4); ++col) {
			if (ChessBoard[row][col] != ' ') {
				if (ChessBoard[row][col] == ChessBoard[row][col + 1] &&
					ChessBoard[row][col] == ChessBoard[row][col + 2] &&
					ChessBoard[row][col] == ChessBoard[row][col + 3] &&
					ChessBoard[row][col] == ChessBoard[row][col + 4]) {
					return ChessBoard[row][col];
				}
			}	
		}
	}
	//向右斜着胜利的
	for (int row = 0; row<(Max_Row-4); ++row) {
		for (int col = 0; col < (Max_Col-4); ++col) {
			if (ChessBoard[row][col] != ' ') {
				if (ChessBoard[row][col] == ChessBoard[row + 1][col + 1] &&
					ChessBoard[row][col] == ChessBoard[row + 2][col + 2] &&
					ChessBoard[row][col] == ChessBoard[row + 3][col + 3] &&
					ChessBoard[row][col] == ChessBoard[row + 4][col + 4]) {
					return ChessBoard[row][col];
				}
			}	
		}
	}
	//判断竖着胜利的
	for (int row = 0; row < (Max_Row - 4); ++row) {
		for (int col = 0; col < Max_Col; ++col) {
			if (ChessBoard[row][col] != ' ') {
				if (ChessBoard[row][col] == ChessBoard[row + 1][col] &&
					ChessBoard[row][col] == ChessBoard[row + 2][col] &&
					ChessBoard[row][col] == ChessBoard[row + 3][col] &&
					ChessBoard[row][col] == ChessBoard[row + 4][col]) {
					return ChessBoard[row][col];
				}
			}	
		}
	}
		//判断向左斜着胜利的
	for (int row = 0; row < (Max_Row - 4); ++row) {
		for (int col = 4; col < Max_Col; ++col) {
			if (ChessBoard[row][col] != ' ') {
				if (ChessBoard[row][col] == ChessBoard[row + 1][col - 1] &&
					ChessBoard[row][col] == ChessBoard[row + 2][col - 2] &&
					ChessBoard[row][col] == ChessBoard[row + 3][col - 3] &&
					ChessBoard[row][col] == ChessBoard[row + 4][col - 4]) {
					return ChessBoard[row][col];
				}
			}	
		}
	}
	return ' ';
}


void GameComputer() {
	//1.初始化棋盘
	Init();
	char winner = ' ';
	while (1) {
		//2.打印棋盘
		Print();
		//3.玩家落子
		PlayerMove();
		//4.检测胜负
		winner=JudgeWinner();
		if (winner != ' ') {
			break;
		}
		//5.电脑落子
		ComputerMove();
		//6.检测胜负
		winner = JudgeWinner();
		if (winner != ' ') {
			break;
		}
	}
	Print();
	if (winner == 'o') {
		printf("您赢了\n");
	}
	if (winner == 'x') {
		printf("您输了\n");
	}
}
void GamePlayer() {
	//1.初始化棋盘
	Init();
	//2.打印棋盘
	Print();
	char winner = ' ';
	while (1) {
		//3.玩家1落子
		PlayerMove1();
		Print();
		//4.检测胜负
		winner = JudgeWinner();
		if (winner != ' ') {
			break;
		}
		//5.玩家2落子
		PlayerMove2();
		Print();
		//6.检测胜负
		winner = JudgeWinner();
		if (winner != ' ') {
			break;
		}
	}
	if (winner == 'o') {
		printf("玩家1赢了\n");
	}
	if (winner == 'x') {
		printf("玩家2赢了\n");
	}
}

int  Menu() {
	printf("欢迎来到五子棋!\n");
	printf("--------------------\n");
	printf("1.电脑对战\n");
	printf("2.玩家对战\n");
	printf("0.结束游戏\n");
	printf("--------------------\n");
	printf("请输入您的选择\n");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}


int main() {
	
	while (1) {
		int choice=Menu();
		if (choice == 1) {
		printf("电脑对战\n");
		GameComputer();
		}
		else if (choice == 2) {
		printf("玩家对战\n");
		GamePlayer();
		}
		else if (choice == 0) {
		printf("下次再见\n");
		break;
		}
		else {
		printf("请输入1或0\n");
		}
	}
	
	system("pause");
	return 0;
}

电脑对战:如下图

电脑对战
在这里插入图片描述
在这里插入图片描述
玩家对战:如下图
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Whitebury/article/details/88894261