网站建设资讯

NEWS

网站建设资讯

【C语言】三子棋小游戏的实现-创新互联

C语言实现三子棋
  • 游戏框架的搭建
    • 游戏菜单的打印
    • 玩游戏的逻辑实现
    • 分文件执行
  • 游戏逻辑的实现
    • 棋盘初始化
    • 下棋逻辑的初始化
    • player_move函数computer_move函数和is_win函数的实现
  • 总结

成都创新互联-专业网站定制、快速模板网站建设、高性价比上城网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式上城网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖上城地区。费用合理售后完善,十多年实体公司更值得信赖。游戏框架的搭建 游戏菜单的打印

我们封装一个menu()函数实现菜单的打印
我们在这里写一个简单的菜单

void menu()
{printf("*************************\n");
	printf("******  1.play      *****\n");
	printf("******  0.exit      *****\n");
	printf("*************************\n");
}

效果如下
在这里插入图片描述

玩游戏的逻辑实现

我们想让这个游戏可以一直玩,需要循环来控制
我们封装一个test()函数来实现

void test()
{int input = 0;
	do
	{menu();//每次输入都打印菜单
		printf("请输入:>");
		scanf("%d", &input);
		switch (input)
		{case 1://如果选择1,游戏开始
			game();
			break;
		case 0://如果选择0,跳出switch重新开始选择
			printf("退出游戏\n");
			break;
		default://输入其他,提示输入错误,跳出后重新输入
			printf("请重新输入\n");
		}
	} while (input);
}

在case1中我们封装了game()函数来实现游戏的逻辑

分文件执行

因为我们这个游戏需要的函数比较多
所以我们在同一个项目中创建一个test.c文件用来测试,game.c文件来实现游戏逻辑,game.h文件来存放项目的头文件 和函数的声明.
在这里插入图片描述

游戏逻辑的实现 棋盘初始化

我们想要下棋首先需要一个棋盘来存放我的棋子
所以我我创建一个二维数组来存放棋子

#define ROW 3
#define COL 3
char board[ROW][COL];

我们封装一个函数 int_board 将数组中所有元素初始化为空格

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

为了使代码能够在我这个基础上改成其他大小的棋盘,我定义两个常量ROW和COL作为棋盘的长和宽

接下来我们需要打印一个下图所展现的的可视化棋盘
在这里插入图片描述
我们封装一个 print_board函数来实现我们棋盘的打印

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

	}
}
下棋逻辑的初始化

我们想和电脑下棋
并且我下一步 电脑下一步如此循环直到 分出游戏胜负
每下一步棋就打印出我们的棋盘看看棋子下在了哪里
规定玩家下棋为‘ * ’
电脑下棋为‘ # ’
封装函数player_move作为玩家下棋的逻辑
封装函数computer_move作为电脑下棋的逻辑
函数is_win作为判断输赢的函数

while (1)
	{//玩家移动
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
		{	break;
		}
		
		//电脑移动
		computer_move(board, ROW, COL);
		print_board(board, ROW, COL);
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
		{	break;
		}
	}
	if (ret == '#')
		printf("电脑赢了\n");
	if (ret == '*')
		printf("玩家赢了\n");
	if (ret == 'Q')
		printf("平局\n");

}
//判断输赢的代码要告诉我:电脑赢了?玩家赢了?玩家赢?游戏继续?
//电脑赢:#
//玩家赢:*
//平局:Q
//游戏继续:C
player_move函数computer_move函数和is_win函数的实现

player_move函数的实现

void player_move(char board[ROW][COL],int row, int col)
{printf("玩家移动\n");
	printf("请输入坐标:");//提示信息
	int x = 0;
	int y = 0;//下棋的坐标
	while (1)
	{scanf("%d%d", &x, &y);
		if (x >0 && x< row + 1 && y>0 && y< col + 1)
		{	if (board[x - 1][y - 1] == ' ')//如果此处是空格,说明没有棋子,可以下在这里
			{		board[x - 1][y - 1] = '*';
				break;
			}
			else//如果此处不是空格 说明已被占用
				printf("该坐标已被占用,请重新输入\n");
		}
		else//若输入坐标不在数组范围内 重新输入
		{	printf("输入错误,请重新输入\n");
		}
	}
}

computer_move函数的实现

我在此处给电脑的下棋逻辑是随机下棋

void computer_move(char board[ROW][COL], int row, int col)
{printf("电脑移动\n");
	while (1)
	{//调用rand函数时要使用srand函数,否则产生伪随机数
	//但srand函数不能循环调用,所以我把srand放在test函数中,不在此处展现
		int x = rand() % row;//产生0 - row-1之间的随机数
		int y = rand() % col;
		if (board[x][y] == ' ')//如果是空格,下棋
		{	board[x][y] = '#';
			break;
		}
	}
}

is_win函数的实现

逻辑是判断每行每列和对角线是否排满
如果排满就赢得游戏

char is_win(char board[ROW][COL], int row, int col)
{int cnt = 0;
	int i = 0;
	for (i = 0; i< row; i++)//判断每行
	{int j = 0;
		cnt = 0;
		for (j = 1; j< col; j++)
		{	if (board[i][j] == board[i][j - 1] && board[i][j] != ' ')
			{		cnt++;
			}
			if (cnt == col-1)
			{		return board[i][j];//电脑赢返回‘#’,玩家赢返回‘*’
			}
		}
	}
	for (i = 0; i< col; i++)//判断每列
	{int j = 0;
		cnt = 0;
		for (j = 1; j< row; j++)
		{	if(board[j][i]==board[j-1][i] && board[j][i]!=' ')
			{		cnt++;
			}
			if (cnt == row-1)
			{		return board[j][i];//电脑赢返回‘#’,玩家赢返回‘*’
			}
		}
	}
	//对角线
	cnt = 0;
	for (i = 1; i< col; i++)
	{int j = i;
		if (board[i][j] == board[i - 1][j - 1] && board[i][j] != ' ')
		{	cnt++;
		}
		if (cnt == col - 1)
		{	return board[i][j];//电脑赢返回‘#’,玩家赢返回‘*’
		}
	}
	cnt = 0;
	for (i = 0; i< col-1; i++)
	{int j = col - i - 1;
		if (board[i][j] == board[i + 1][j - 1] && board[i][j] != ' ')
		{	cnt++;
		}
		if (cnt == col - 1)
		{	return board[i][j];//电脑赢返回‘#’,玩家赢返回‘*’
		}
	}
	if (is_full(board, row, col) == 1)//判断棋盘是否充满
	{return 'Q';//充满就是平局 返回‘Q’
	}
	return 'C';//如果一轮过后谁都没赢,游戏继续
}

此处在判断棋盘是否充满时封装了is_full函数来判断
所以我们要对is_full函数定义

int is_full(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++)
		{	if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
总结

到此我们的三子棋小游戏的基本逻辑已经实现
游戏项目具体在链接: link
希望我的代码能对你产生帮助

IDE VS2022

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章标题:【C语言】三子棋小游戏的实现-创新互联
当前地址:http://njwzjz.com/article/coshss.html