用c语言实现三子棋,它来了!!

三子棋

三子棋介绍

  三子棋又叫井字棋、圈圈叉叉、一条龙等等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。

描述

  用c语言编写一个三子棋。

基本流程

1.创建一个用户交互菜单;
2.创建一个棋盘并初始化;
3.打印一个棋盘;
4.玩家落子(玩家通过输入行列坐标落子);
5.判定胜负关系;
6.电脑落子(电脑采用随机落子的方式落子);
7.判定胜负关系;
8.游戏结束。

代码实现

用户交互菜单

int menu(){
	printf("=====================\n");
	printf("1.开始游戏\n");
	printf("0.结束游戏\n");
	printf("=====================\n");
	printf("请输入您的选择:");
		int choice = 0;
		scanf("%d", &choice);
		return choice;
}

我们首先创建一个用户交互菜单来实现与用户的交互。

打印棋盘

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

  我们通过一个函数来打印棋盘,棋盘的边框用+号和-号来完成,再通过一个for循环来实现每行每个格子的边框实现。这里的%c是输入一个字符。

棋盘初始化

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 playerMove(char ChessBoard[MAX_ROW][MAX_COL]){//玩家落子
	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 (ChessBoard[row][col] != ' '){
			printf("此处已经落子!\n");
			continue;
		}
		ChessBoard[row][col] = 'x';
		break;
	}
}

  玩家采用输入行列的方式坐标的方式来落子,同时我们需要排除玩家出入的坐标是否正确的问题,如果玩家输入的坐标超出了范围,则提示玩家输入错误,重新输入,如果玩家输入的坐标的格子已经有一个元素了,则提醒玩家此处已经落子。当玩家正确落子时,我们规定落子的元素为‘X’。

电脑落子

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

  电脑落子时,我们采用随机数的方式来让电脑落子,在后面的main()函数中使用srand((unsigned int)time(0)),unsigned int的作用是强制转换类型,这里是转换成int型。

判定胜负关系

char iswin(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[col][0] != ' ' &&ChessBoard[col][0] == ChessBoard[col][1] &&
			ChessBoard[col][0] == ChessBoard[col][2]){
			return ChessBoard[col][0];
		}
	}
	if (ChessBoard[0][0] !=' '  && ChessBoard[0][0] == ChessBoard[1][1] &&
		ChessBoard[0][0] == ChessBoard[2][2]){
		return ChessBoard[0][0];
	}
	if (ChessBoard[2][0] != ' ' && ChessBoard[2][0] == ChessBoard[1][1] &&
		ChessBoard[2][0] == ChessBoard[0][2]){
		return ChessBoard[2][0];
	}
	if (isfull(ChessBoard)){
		return 'q';
	}
	return ' ';
}

  在游戏介绍中我们知道三子棋获胜的方式就是在一条直线上有3个相同的元素,这样则判定为胜利。

判定和棋情况

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;
}

  和棋情况的描述就是在棋盘中再没有空格,且玩家与电脑双方都没有获胜的情况。

game()函数

void game(){
	char ChessBoard[MAX_ROW][MAX_COL] = { 0 };
	Init(ChessBoard);
	char winner = ' ';
	while (1){
		PrintChessBoard(ChessBoard);//打印棋盘
		playerMove(ChessBoard);//玩家落子
		winner = iswin(ChessBoard);//胜负判定
		if (winner != ' '){
			break;
		}
		computerMove(ChessBoard);
		winner = iswin(ChessBoard);
		if (winner != ' '){
			break;
		}
	}
	PrintChessBoard(ChessBoard);
	if (winner == 'x'){
		printf("恭喜您,战胜了人工智障!\n");
	}
	if (winner == 'o'){
		printf("很遗憾,您连人工智障都不如!\n");
	}
	if (winner == 'q'){
		printf("您和人工智障五五开!\n");
	}
}

  在game()函数中,我们就要引用我们刚才所写的棋盘初始化,打印棋盘,判定胜负关系等函数。这里要注意的是在玩家和电脑落子时,我们都要对其进行一一判定。

总代码

#include<stdio.h>//三子棋
#include<windows.h>
#pragma warning(disable:4996)
#include<time.h>
#define MAX_ROW 3
#define MAX_COL 3
//1.首先打印棋盘(并让棋盘初始化)
//2.玩家落子
//3.判定胜负
//4.电脑落子
//5.判定胜负
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 PrintChessBoard(char ChessBoard[MAX_ROW][MAX_COL]){//打印棋盘
	printf("+---+---+---+\n");
	for (int row = 0; row < MAX_ROW; row++){
		printf("|  %c|  %c|  %c|\n", ChessBoard[row][0], ChessBoard[row][1], ChessBoard[row][2]);
		printf("+---+---+---+\n");
	}
}
void playerMove(char ChessBoard[MAX_ROW][MAX_COL]){//玩家落子
	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 (ChessBoard[row][col] != ' '){
			printf("此处已经落子!\n");
			continue;
		}
		ChessBoard[row][col] = 'x';
		break;
	}
}

void computerMove(char ChessBoard[MAX_ROW][MAX_COL]){//电脑落子
	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;
			}
		}
	}
	return 1;
}
char iswin(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[col][0] != ' ' &&ChessBoard[col][0] == ChessBoard[col][1] &&
			ChessBoard[col][0] == ChessBoard[col][2]){
			return ChessBoard[col][0];
		}
	}
	if (ChessBoard[0][0] !=' '  && ChessBoard[0][0] == ChessBoard[1][1] &&
		ChessBoard[0][0] == ChessBoard[2][2]){
		return ChessBoard[0][0];
	}
	if (ChessBoard[2][0] != ' ' && ChessBoard[2][0] == ChessBoard[1][1] &&
		ChessBoard[2][0] == ChessBoard[0][2]){
		return ChessBoard[2][0];
	}
	if (isfull(ChessBoard)){
		return 'q';
	}
	return ' ';
}

void game(){
	char ChessBoard[MAX_ROW][MAX_COL] = { 0 };
	Init(ChessBoard);
	char winner = ' ';
	while (1){
		PrintChessBoard(ChessBoard);//打印棋盘
		playerMove(ChessBoard);//玩家落子
		winner = iswin(ChessBoard);//胜负判定
		if (winner != ' '){
			break;
		}
		computerMove(ChessBoard);
		winner = iswin(ChessBoard);
		if (winner != ' '){
			break;
		}
	}
	PrintChessBoard(ChessBoard);
	if (winner == 'x'){
		printf("恭喜您,战胜了人工智障!\n");
	}
	if (winner == 'o'){
		printf("很遗憾,您连人工智障都不如!\n");
	}
	if (winner == 'q'){
		printf("您和人工智障五五开!\n");
	}
}
int menu(){
	printf("=====================\n");
	printf("1.开始游戏\n");
	printf("0.结束游戏\n");
	printf("=====================\n");
	printf("请输入您的选择:");
		int choice = 0;
		scanf("%d", &choice);
		return choice;
}
int main(){
	srand((unsigned int)time(0));
	while (1){
		int choice = menu();//创建一个简单的用户交互菜单
		if (choice == 1){
			game();
		}
		else if (choice == 0){
			printf("Goodbye!\n");
			break;
		}
		else{
			printf("您的输入有误,请重新输入!\n");
		}
}
	system("pause");
	return 0;
}

  ok ,文章就先到这里了,希望这篇文章能够帮助到你对指针的认识,若有不足或者不正之处,希望谅解并欢迎批评指正!

  如果本文章对你有帮助,哪怕一点点,那就请点一个赞呗,谢谢~~

  • 237
    点赞
  • 387
    收藏
    觉得还不错? 一键收藏
  • 25
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值