三子棋游戏

 

首先,用C语言实现三子棋主要分为五大步骤:

1.建立game.c,game.h, 和主函数test.c

建立基本框架,test.c中主要实现主函数和大体模块代码,game.c中主要包含三子棋游戏的一些函数的实现,game.h中主要为游戏函数的声明和一些宏定义。

2.初始化棋盘,和打印菜单,棋盘

初始化棋盘:初始化棋盘全为‘ ’,为了更好的显示打印棋盘。

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] = ' ';
		}
	}
}

打印菜单:利用do while循环,执行一次再进行条件的判断,条件为判断input的值,为0退出。

void meau()
{
	printf("**********************\n");
	printf("******  1.play  ******\n");
	printf("******  0.exit  ******\n");
	printf("**********************\n");
}
int main()
{
	srand((unsigned int)time(NULL)); //利用时间戳生成随机数
	meau();
	int input=0;
	do
	{
		scanf("%d", &input);
		switch(input)
		{
		case 0:
			printf("退出\n");
			break;
		case 1:
			game();
			break;
		default:
			printf("输入错误,请重新输入。\n");
			break;
		}

	} while (input);

打印棋盘:

void display_board(char board[ROW][COL], int row, int col) //打印棋盘内容(进阶版)
{
	int i = 0;
	for (i = 0; i < row;i++)
	{
		//printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
		//打印一行数据 %c | %c | %c 
		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)      //最后一行不打印---|---|---
		{
			int j = 0;
			for (j = 0; j < col;j++)
			{
				printf("---");
				if (j<col-1)
				printf("|");//最后一列不打印|
			}
			printf("\n");
		}
	}
}

3.玩家下棋:

通过输入x,y坐标访问棋盘数组,判断board[x-1][y-1]是否为空格,如果是空格代表可以下棋,玩家下棋为'*',坐标输出错误或者,所填棋盘不为空格则输出:坐标输入错误,请重新输入。

void player_move(char board[ROW][COL], int row, int col)  //玩家下棋
{
	int x = 0;//玩家下棋的坐标
	int y = 0;
	printf("玩家下棋>");
	while (1)
	{
		printf("请输入要下的坐标:");
		scanf("%d%d", &x, &y);
		if (x>0&&x<=row&&y>0&&y<=col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("坐标输入错误,请重新输入。\n");
			}
		}
		else
		{
			printf("坐标输入错误,请重新输入。\n");
		}
	}
}

4.电脑下棋:电脑下棋利用rand()生成随机数,通过调用srand((unsigned int  )time(NULL)) ,利用时间戳产生随机数。rand()头文件为:<stdlib.h>,time()头文件为  <time.h>。

void computer_move(char board[ROW][COL], int row, int col)//电脑随机下棋
{
	printf("电脑下棋>\n");
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % row; //生成0~row-1的数,0~2
		y = rand() % col; //生成0~col-1的数,0~2
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}

}

5.判断游戏输赢:某一行或列或对角线为'*'或'#',则可判断输赢,返回'*'为玩家赢,返回'#'为电脑赢,返回'Q'则为平局,返回'C'则继续。

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];	//判断行:只要某一行为'*'或'#'就返回对于的符号。
	}
	int j = 0;
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
			return board[0][j];	//判断列:只要某一列为'*'或'#'就返回对于的符号。
	}
	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[1][1] != ' ')
		return board[1][1];

判断平局:如果没满足赢的条件而且棋盘上没空格了,则决定为平局。

//-------判断平局-----------
	if (Is_full(board, row, col))
	{
		return 'Q';
	}
	return 'C';

判断棋盘是否满了,满了返回1,没满返回0;遍历数组,看是否有空格

//如果棋盘满了返回1,没满返回0;
int Is_full(char board[ROW][COL], int row, int col)
{
	int i, j = 0;
	for (i = 0; i < row;i++)
	{
		for (j = 0; j < col;j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

玩游戏game()函数:

void game()
{
	//------初始化棋盘------------
	char ret = 0;
	char board[ROW][COL] = { 0 };//初始化棋盘
	init_board(board,ROW,COL);  //初始化棋盘全为空格
	display_board(board,ROW,COL);//打印棋盘
	//-------玩游戏----------------
	while (1)
	{
		player_move(board,ROW,COL); //玩家下棋
		display_board(board, ROW, COL);//打印棋盘
		ret=Is_win(board, ROW, COL);  //判断输赢
		if (ret != 'C')
			break;
		computer_move(board,ROW,COL); //电脑下棋
		display_board(board, ROW, COL);//打印棋盘
		ret = Is_win(board, ROW, COL);  //判断输赢
		if (ret != 'C')
			break;
	}
	//-------判断游戏输赢------
	//玩家赢返回'*'
	//电脑赢返回'#'
	//平局返回'Q'
	//继续返回'C'
	if (ret == '*')
		printf("玩家赢\n");
	else if (ret == '#')
	{
		printf("电脑赢\n");
	}
	else if (ret == 'Q')
	{
		printf("平局\n");
	}
}

通过while()循环不断让玩家和电脑下棋,判断是否不为'C',通过判断返回的符号判断游戏的输赢。

返回'*'为玩家赢,返回'#'为电脑赢,返回'Q'则为平局。

最后,游戏运行结果图:

结语:

三子棋游戏,虽然玩起来觉得挺简单的一个小游戏,但是自己通过C语言一步一步的搭建框架和一些功能函数的编写还是有些难度,虽然程序逻辑不难,但是毕竟第一次自己去编写和实现一个完整的游戏代码小程序,还是颇为有成就感的。其中我认为我当时编写的时候喜欢卡壳的地方就是打印棋盘和判断游戏输赢的这两部分。打印棋盘要寻找棋盘布局规律通过行列,for循环一步一步打印出来。判断游戏输赢,有电脑赢,玩家赢,平局,继续,四种状态。然后电脑赢和玩家赢又分为一行全为'*'或'#'或一列全为'*'或'#',对角线全为全为'*'或'#'。通过判断返回符号值来判断输赢,我觉得是该程序 的一大亮点。

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值