用c语言编写一个简单的三子棋小游戏程序

今天小周末打算编写一个简单的三子棋游戏程序,与电脑来一场pk。
一、首先我们需要棋盘和棋子才能进行游戏。
1,在这里我们用二维数组来表示棋盘(一个简单的3*3棋盘)。
2,“ x ” “ o ” “ ”(空),三个字符来表示棋子。
二、核心流程
a、初始化棋盘
b、打印棋盘
c、让玩家落子(采用输入坐标的方式)
d、检查是否结束
e、电脑落子(随机下)
f、检查是否结束
g、循环进行b

A:创建一个新函数将棋盘初始化

//初始化棋盘
void Init(char board[Max_Row][Max_Col]){
	for (int row = 0; row < Max_Row; ++row){
		for (int col = 0; col < Max_Col; ++col){
			board[row][col] = ' ';
		}
	}
}

B打印一个3*3棋盘

void print(char board[Max_Row][Max_Col]){
	printf("|---|---|---|\n");
	for (int row = 0; row < Max_Row; ++row){
		printf("| %c | %c | %c |\n", board[row][0], board[row][1], board[row][2]);
		printf("|---|---|---|\n");
	}
}

效果图如下:
在这里插入图片描述
C让玩家落子(采用输入坐标的方式)
这里也采用函数的方法

void PlayerMove(char board[Max_Row][Max_Col]){
	while (1){
		printf("请输入坐标,(row col)\n");
		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 (board[row][col] != ' '){
			printf("该位置有子了,请重新输入\n");
			continue;
		}
		board[row][col] = 'x';//玩家落子为x
		break;
	}
}

D判断最终的结果
分为4种情况游戏结束

  1. 每一行的符号相等
  2. 每一列的符号相等
  3. 对角线的符号相等(又分为左右两对角线)
  4. 棋盘满了,却无123,即为和棋

因此创建两个函数,Isfull函数判断棋盘是否下满了棋子

//棋盘满了返回1,没有满返回0
int Isfull(char board[Max_Row][Max_Col]){
	for (int row = 0; row < Max_Row; ++row){
		for (int col = 0; col < Max_Col; ++col){
			if (board[row][col] == ' '){
				return 0;
			}
		}
	}
	return 1;
}

//返回值的类型是char
//1,玩家胜利 x
//2,电脑胜利 o
//3,和棋     =  
//4,未分胜负‘ ’
char Iswin(char board[Max_Row][Max_Col]){
	//行
	for (int row = 0; row < Max_Row; ++row){
		if (board[row][0] == board[row][1] && board[row][0] == board[row][2] && board[row][0] != ' '){
			return board[row][0];
		}
	}
	//列
	for (int col = 0; col < Max_Col; ++col){
		if (board[0][col] == board[1][col] && board[0][col] == board[2][col] && board[0][col] != ' '){
			return board[0][col];
		}
	}
	//对角线
	if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' '){
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[0][0] == board[2][0] && board[0][2] != ' '){
		return board[0][2];
	}
	//棋盘是否下满棋子
	if (Isfull(board)){
		return '=';
	}
	else{
		//胜负未分
		return ' ';
	}
}

E电脑落子(随机下)

void ComputerMove(char board[Max_Row][Max_Col]){
	//随机落子
	while (1){
		int row = rand() % Max_Row;
		int col = rand() % Max_Col;
		if (board[row][col] != ' '){
			continue;
		}
		board[row][col] = 'o';
		break;
	}
}

主函数

int main(){
	char chess_board[Max_Row][Max_Col];
	char result = ' ';
	//1 初始化棋盘
	Init(chess_board);
	while (1){
		//2 打印棋盘
		print(chess_board);
		//3 玩家落子
		PlayerMove(chess_board);
		//4 判定游戏是否结束
		result = Iswin(chess_board);
		if (result != ' '){
			break;
		}
		//5电脑落子
		ComputerMove(chess_board);
		//6判断游戏是否结束
		result = Iswin(chess_board);
		if (result != ' '){
			break;

		}
	}
	print(chess_board);
	if (result == 'x'){
		printf("您赢了\n");
	}
	else if (result == 'o'){
		printf("您输了\n");
	}
	else if(result== '='){
		printf("和棋\n");
	}
	system("pause"); 
	return 0;
}

总代码如下:

#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 board[Max_Row][Max_Col]){
	for (int row = 0; row < Max_Row; ++row){
		for (int col = 0; col < Max_Col; ++col){
			board[row][col] = ' ';
		}
	}
	srand(time(0));
}

void print(char board[Max_Row][Max_Col]){
	printf("|---|---|---|\n");
	for (int row = 0; row < Max_Row; ++row){
		printf("| %c | %c | %c |\n", board[row][0], board[row][1], board[row][2]);
		printf("|---|---|---|\n");
	}
}

void PlayerMove(char board[Max_Row][Max_Col]){
	while (1){
		printf("请输入坐标,(row col)\n");
		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 (board[row][col] != ' '){
			printf("该位置有子了,请重新输入\n");
			continue;
		}
		board[row][col] = 'x';
		break;
	}
}

//满了返回1,没有满返回0
int Isfull(char board[Max_Row][Max_Col]){
	for (int row = 0; row < Max_Row; ++row){
		for (int col = 0; col < Max_Col; ++col){
			if (board[row][col] == ' '){
				return 0;
			}
		}
	}
	return 1;
}

//返回值的类型是char
//1,玩家胜利 x
//2,电脑胜利 o
//3,和棋     =  
//4,未分胜负‘ ’
char Iswin(char board[Max_Row][Max_Col]){
	//行
	for (int row = 0; row < Max_Row; ++row){
		if (board[row][0] == board[row][1] && board[row][0] == board[row][2] && board[row][0] != ' '){
			return board[row][0];
		}
	}
	//列
	for (int col = 0; col < Max_Col; ++col){
		if (board[0][col] == board[1][col] && board[0][col] == board[2][col] && board[0][col] != ' '){
			return board[0][col];
		}
	}
	//对角线
	if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' '){
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[0][0] == board[2][0] && board[0][2] != ' '){
		return board[0][2];
	}
	if (Isfull(board)){
		return '=';
	}
	else{
		//胜负未分
		return ' ';
	}
}
void ComputerMove(char board[Max_Row][Max_Col]){
	//随机落子
	while (1){
		int row = rand() % Max_Row;
		int col = rand() % Max_Col;
		if (board[row][col] != ' '){
			continue;
		}
		board[row][col] = 'o';
		break;
	}
}

int main(){
	char chess_board[Max_Row][Max_Col];
	char result = ' ';
	//1 初始化棋盘
	Init(chess_board);
	while (1){
		//2 打印棋盘
		print(chess_board);
		//3 玩家落子
		PlayerMove(chess_board);
		//4 判定游戏是否结束
		result = Iswin(chess_board);
		if (result != ' '){
			break;
		}
		//5电脑落子
		ComputerMove(chess_board);
		//6判断游戏是否结束
		result = Iswin(chess_board);
		if (result != ' '){
			break;

		}
	}
	print(chess_board);
	if (result == 'x'){
		printf("您赢了\n");
	}
	else if (result == 'o'){
		printf("您输了\n");
	}
	else if(result== '='){
		printf("和棋\n");
	}
	system("pause"); 
	return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值