三子棋小游戏编写教程,详细思路

三子棋游戏

思路:
int main( )
1.先写一个基本的菜单与玩家进行交互int Menu()
2. 判断玩家是否进入游戏while(1)
1进入,0退出
3.写游戏内容(Game函数)void Game()
①创建棋盘char chessBoard[MAX_ROW][MAX_COL] = { 0 };
并初始化为空棋盘void init(char chessBoard[MAX_ROW][MAX_COL]){
在while循环中进行②③④⑤⑥
②打印棋盘void printChessBoard(char chessBoard[MAX_ROW][MAX_COL]){
更新游戏的实时进度
③玩家落子(输入坐标)void playerMove(char chessBoard[MAX_ROW][MAX_COL]){
④判断胜负int isWinner(char chessBoard[MAX_ROW][MAX_COL]){
排除空棋盘时的bug,检查是否未分胜负,判断玩家胜负或和棋
⑤电脑落子(随机落子)void computerMove(char chessBoard[MAX_ROW][MAX_COL]){
⑥再次判断胜负char chessBoard[MAX_ROW][MAX_COL]){
写完代码检查bug
开始编写:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
#include <time.h>

#define MAX_ROW 3 //定义最大 行 列 数为3
#define MAX_COL 3
//思路:1.打印菜单进行交互		2.判断是否进入游戏 
	//3.写game函数:
		//①创建棋盘并且初始化棋盘(每个位置都设为' ') 
		//②打印棋盘(第一次打印时为空棋盘)
		//③玩家落子(输入坐标)'x'表示玩家棋子
		//④判断胜负
		//⑤电脑落子(随机落子)'o'表示电脑棋子
		//⑥判断胜负

//1.先写一个基本的交互菜单
int Menu(){
	printf("----------------------\n");
	printf("1.开始游戏\n");
	printf("0.结束游戏\n");
	printf("----------------------\n");
	printf("请输入您的选择:\n");
	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");
	}
}
	//void printChessBoard(char chessBoard[MAX_ROW][MAX_COL]){
	//	for (int row = 0; row < MAX_ROW; row++){
	//		for (int col = 0; col < MAX_COL; col++){
	//			printf("%c", chessBoard[row][col]);
	//		}
	//		printf("\n");//打印完一行进行换行
	//	}
	//}
//玩家落子的函数
void playerMove(char chessBoard[MAX_ROW][MAX_COL]){
	while (1){
		printf("请输入您要落点的坐标:\n");
		int row;
		int col;
		scanf("%d %d", &row, &col);
		//落子前 检验玩家输入位置是否非法,是否被占用
		if (row< 0 || row >= MAX_ROW 
			|| col < 0 || col >= MAX_COL){
			//位置非法
			printf("您输入的坐标有误,请重新输入!\n");
			continue;
		}
		if (chessBoard[row][col] != ' '){
			//位置不为空,被占用
			printf("此处已有棋子");
			continue;
		}
		//落子,用'x'表示玩家的棋子
		chessBoard[row][col] = 'x';
		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;//满了
}
//判断胜负的函数
//'x'表示玩家获胜 'o'表示电脑获胜  'q'表示和棋  ' '表示胜负未分
int isWinner(char chessBoard[MAX_ROW][MAX_COL]){
	//检查所有行是否均为'x'或'o'
	for (int row = 0; row < MAX_ROW; row++){
		if (chessBoard[row][0] != ' '//排除空棋盘胜利的bug
			&&chessBoard[row][0] == chessBoard[row][1]
			&& chessBoard[row][0] == chessBoard[row][2]){
			return chessBoard[row][0];//直接返回,此时返回为'x'则为玩家笙,'o'为电脑胜
		}
	}
	//检查所有列 原理同上
	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 'q';
		}
		return ' ';//表示胜负未分
	}
}
//电脑落子的函数 (随机落子)
void computerMove(char chessBoard[MAX_ROW][MAX_COL]){
	while (1){
		//电脑随机落子,% MAX保证落子坐标在范围[0,2]内,
		int row = rand() % MAX_ROW;
		int col = rand() % MAX_COL;
		if (chessBoard[row][col] != ' '){
			//需要保证随机坐标不能是已经有子的位置
			continue;
		}
		//落子
		chessBoard[row][col] = 'o';
		break;
	}
}
//初始化为空棋盘
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] = ' ';
		}
	}
}
//3.写game()函数
void Game(){
	//①创建棋盘 (二维数组)
	//char chessBoard[3][3]=>char chessBoard[MAX_ROW][MAX_COL] 直接写数字bug多,定义两个变量
	char chessBoard[MAX_ROW][MAX_COL] = { 0 };
	//初始化为空棋盘
	init(chessBoard);	
	char winner = ' ';
	while (1){
		//② 打印棋盘 
		printChessBoard(chessBoard);
		//③ 玩家落子 
		playerMove(chessBoard);
		//④ 判断胜负 
		winner = isWinner(chessBoard);
		if (winner != ' '){
			break;
		}
		//⑤ 电脑落子 
		computerMove(chessBoard);
		//⑥ 判断胜负 
		winner = isWinner(chessBoard);
		if (winner != ' '){
			break;
		}
	}
	printChessBoard(chessBoard);
	if (winner == 'x'){
		printf("恭喜您获得了胜利!\n");
	}
	else if (winner == 'o'){
		printf("很遗憾,您输了!\n");
	}
	else {
		printf("和棋!\n");
	}
}


int main(){
	srand((unsigned int)time(0));//将time_t强制转换成unsigned int!!!
	//while循环 2.判断是否进入游戏
	while (1){
		int choice = Menu();
		if (choice == 1){
			Game();//3.在外部写一个game函数
		}
		else if (choice == 0){
			printf("goodbye!\n");
			break;
		}
		else {
			printf("您的输入有误,请重新输入!\n");
		}
	}
	system("pause");
	return 0;
}

以上就是三子棋游戏的代码,
创建棋盘要记得给玩家建立棋格,优化玩家游戏体验。
srand()是一个伪随机值,要用time(0)时间戳使其真正随机,记得#include <time.h>,
电脑随机落子,使用% MAX保证落子坐标在范围[0,2]内:
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
希望这篇文章能给您带来帮助!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值