三子棋游戏实现

三子棋游戏实现条件

1.test.c - 测试的逻辑
2.game.h - 用来声明函数等
3.game.c - 游戏的实现

游戏条件:
1.我们需要创建一个二维数组棋盘
2.初始化棋盘
3.打印棋盘(3*3棋盘或者更多)
4.玩家下棋
5.电脑下棋
6.判断输赢

打印游戏菜单

1.调用test函数来进行打印和选择玩不玩游戏,最少执行一次,我们使用do while循环语句 代码如下(看注释):

void test()
{
	int input = 0;
	do
	{
		menu();//打印菜单
		scanf("%d", &input);//输入一个数
		switch(input)//把输入的数作为witch语句的判断条件
		{
			case 1://如果input是1,直接进入游戏
				printf("Game of three chess\n");
				game();//game函数
				break;
			case 0://如果是输入的是0直接退出游戏
				printf("Byebye!\n");
				break;//跳出语句
			default://如果不是1也不是0,提示输入错误,重新输入
				printf("Input worong,try again!\n");
				break;
		}
	} while (input);//只有是0的时候才跳出循环
}
//主函数
int main()
{
	test();
	return 0;
}

在这里插入图片描述

紧接着进入game()函数内部 我们可以看到 创建棋盘 初始化棋盘 打印棋盘 玩家下棋 电脑下棋
然后每次玩家下完棋都要打印棋盘和判断输赢

void game()
{
	char board[ROW][COL] = { 0 };//创建二维数组棋盘
	char ret = 0;
	srand((unsigned)time(NULL));//rand函数生成随时会变的随机值,在使用rand函数之前需要使用srand
	init_board(board, ROW, COL);//初始化棋盘
	print_board(board, ROW, COL);//打印棋盘

	while (1)
	{
		player_board(board, ROW, COL);//玩家下棋
		print_board(board, ROW, COL);
		ret = is_win(board, ROW, COL);//判断输赢
		if (ret != 'C')//如果is_win函数返回的是'C'条件不成立,继续下棋
		{
			break;//如果返回的不是'C'跳出循环
		}

		computer_board(board, ROW, COL);//电脑下棋
		print_board(board, ROW, COL);
		ret = is_win(board, ROW, COL);//判断输赢
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')//返回'*'则玩家赢
	{
		printf("Player win!\n");
	}
	if (ret == '#')//返回'#'电脑赢
	{
		printf("Computer win!\n");
	}
	if (ret == 'N')//返回'N'棋盘满,没人赢
	{
		printf("Nobody win:)\n");
	}

}

顺便讲一下在game.c文件中写函数的实现,我们需要在game.h中来进行声明 game.h内部的函数声明:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 3
#define COL 3

//声明初始化函数
void init_board(char board[ROW][COL], int row, int col);
//声明打印函数
void print_board(char board[ROW][COL], int row, int col);
//玩家下棋
void player_board(char board[ROW][COL], int row, int col);
//电脑下棋
void computer_board(char board[ROW][COL], int row, int col);
//判断输赢
char is_win(char board[ROW][COL], int row, int col);

1.初始化棋盘


//初始化棋盘
void init_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//每行数组的元素
	for (i = 0; i < row; i++)
	{
		int j = 0;
		//每列数组的元素
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';//把空格赋给数组每个元素
		}
	}
}

2.打印棋盘

先打印" %c | %c | %c " 再打印 “—|—|—”**

void print_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//打印行
	for (i = 0; i < row; i++)
	{
		//打印每一列的元素
		int j = 0;
		for (j = 0; j < col; j++)//如果col是3,我们从0开始到2会打印三次
		{
			printf(" %c ", board[i][j]);//%c两边各有一个空格
			if (j < col - 1)//如果col是3,我们从0开始到2会打印三次
			{               //但是我们需要打印最后一个,以便于好看
				printf("|");
			}
		}
		printf("\n");//每列打印完换行

		//打印每一列的元素
		if (i < row - 1)//和上面一个道理不需要打印最后一个
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)//同上
				{
					printf("|");
				}
			}
		}
		printf("\n");//打印完每列的元素换行
	}
}

3.玩家下棋

//玩家下棋

void player_board(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("Player:");
		scanf("%d %d", &x, &y);//把输入的值放到x,y里
        //玩家不像程序员,他们认为1就是1,比如数字arr[0][0]的位置代表第一个元素,但玩家认为是[1][1],例如三行三列,就是每行1-3每列1-3而不是0-2
		if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
		{
			if (board[x - 1][y - 1] == ' ')//我们需要-1来和我们棋盘数组的元素对应,然后如果是空格的话我们就把输入的坐标放'*'进去
			{
				board[x - 1][y - 1] = '*';
				break;//'*'成功放进后跳出循环
			}
			else
			{
				printf("Coordinates are already occupied\n");
			}//如果条件不满足对应的if语句,那就是坐标已经被占用
		}
		else
		{
			printf("illegal coordinates\n");//不满足对应的if语句,打印非法坐标
		}
	}
}

4.电脑下棋

void computer_board(char board[ROW][COL], int row, int col)
{
	printf("Computer\n");//打印电脑

	while (1)
	{
		int x = rand() % row;//rand函数来生成随机值,%取模来控制每行随机值范围
		int y = rand() % col;//使用rand函数之前需要使用srand函数,在前面game()函数内部我可以看到srand((unsigned)time(NULL));
		if (board[x][y] == ' ')//如果棋盘上有空格,把'#'放进对应的坐标
		{
			board[x][y] = '#';
			break;//成功放进'#'后,跳出循环
		}
	}
}

5.判断输赢

假设3*3棋盘,三行元素一样或者三列元素一样,或者对角元素一样(空格除外)视为获胜

'*'代表玩家赢
'#'代表电脑赢
'C’游戏继续
'N’游戏平局

//判断输赢
char is_win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//判断三行
	for (i = 0; i < row; i++)
	{    //判断每行的元素是否相等,但是不能等于空格
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];//如果条件成立,随便返回一个值就能判断谁赢
		}
	}
	//判断三列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	//判断对角
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
	{
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
	{
		return board[0][2];
	}

	if (is_full(board, ROW, COL) == 1)//判断棋盘是否满了,只在这个函数内部使用,看下面代码
	{
		return 'N';//条件满足的话返回'N',棋盘满了。
	}
	return 'C';//条件不满足返回'C',游戏继续
}

5.1判断棋盘是否满了:

//判断棋盘是否满了
int is_full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')//看棋盘上是否还有空格
			{
				return 0;//如果有空格返回0,游戏继续
			}
		}
	}
	return 1;//没空格返回1
}

完整的代码:

test.c

#include "game.h"

//打印菜单
void menu()
{
	printf("************************************\n");
	printf("*********      1.play      *********\n");
	printf("*********      0.exit      *********\n");
	printf("************************************\n");

}

void game()
{
	char board[ROW][COL] = { 0 };
	char ret = 0;
	srand((unsigned)time(NULL));
	init_board(board, ROW, COL);//初始化棋盘
	print_board(board, ROW, COL);//打印棋盘

	while (1)
	{
		player_board(board, ROW, COL);//玩家下棋
		print_board(board, ROW, COL);
		ret = is_win(board, ROW, COL);//判断输赢
		if (ret != 'C')
		{
			break;
		}

		computer_board(board, ROW, COL);//电脑下棋
		print_board(board, ROW, COL);
		ret = is_win(board, ROW, COL);//判断输赢
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("Player win!\n");
	}
	if (ret == '#')
	{
		printf("Computer win!\n");
	}
	if (ret == 'N')
	{
		printf("Nobody win:)\n");
	}

}

void test()
{
	int input = 0;
	do
	{
		menu();//打印菜单
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				printf("Game of three chess\n");
				game();
				break;
			case 0:
				printf("Byebye!\n");
				break;
			default:
				printf("Input worong,try again!\n");
				break;
		}
	} while (input);
}
//主函数
int main()
{
	test();
	return 0;
}

geme.c

#include "game.h"

//初始化棋盘
void init_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

//打印棋盘
void print_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//打印行
	for (i = 0; i < row; i++)
	{
		//打印每一列的元素
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");

		//打印每一列的元素
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

//玩家下棋

void player_board(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("Player:");
		scanf("%d %d", &x, &y);

		if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("Coordinates are already occupied\n");
			}
		}
		else
		{
			printf("illegal coordinates\n");
		}
	}
}

//电脑下棋
void computer_board(char board[ROW][COL], int row, int col)
{
	printf("Computer\n");

	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

//判断棋盘是否满了
int is_full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

//判断输赢
char is_win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//判断三行
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}
	//判断三列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	//判断对角
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
	{
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
	{
		return board[0][2];
	}

	if (is_full(board, ROW, COL) == 1)
	{
		return 'N';
	}
	return 'C';
}

game.h

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 3
#define COL 3

//声明初始化函数
void init_board(char board[ROW][COL], int row, int col);
//声明打印函数
void print_board(char board[ROW][COL], int row, int col);
//玩家下棋
void player_board(char board[ROW][COL], int row, int col);
//电脑下棋
void computer_board(char board[ROW][COL], int row, int col);
//判断输赢
char is_win(char board[ROW][COL], int row, int col);

创作不易,如有错误还望指出谢谢大家

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会敲代码的小张:)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值