前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >三子棋游戏(详解+代码)

三子棋游戏(详解+代码)

作者头像
ahao
发布2024-03-19 18:47:59
560
发布2024-03-19 18:47:59
举报
文章被收录于专栏:学习学习

三子棋游戏(详解+代码)

今天我们将用C语言实现九宫格三子棋游戏,本篇博客将对此进行详解,文章最后有完整代码。

一、打印游戏菜单

首先我们打印一个游戏菜单函数,用数字1代表进入三子棋游戏,数字0退出游戏

代码语言:javascript
复制
void menu()
{
	printf("*********************\n");
	printf("*****1.进入游戏******\n");
	printf("*****2.退出游戏******\n");
	printf("*********************\n");
}
二、基本构建游戏的框架

我们接下来可以进行游戏的构思,先不用管游戏如何实现 我们用input申请一个空间,作为进入游戏和退出游戏的指令操作 这里我们可以用do while循环,无论条件是否满足,首先打印游戏的菜单

代码语言:javascript
复制
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请输入数字->:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("进入游戏\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);
	return 0;
}

代码就可以展示出以下的效果

三、三子棋游戏的实现

接下来我们就用game函数来实现三子棋游戏 这里我们在头文件game.h里用define定义两个常量ROW 、COL为3

初始化棋盘

首先我们初始化棋盘的各个棋盘格,定义InitBoard函数,x为棋盘的横坐标,y为棋盘的纵坐标 ,定义棋盘为board[ROW][COL]

代码语言:javascript
复制
void InitBoard(char board[ROW][COL], int x, int y)
{
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			board[i][j] = ' ';
		}
	}
}

通过以上的代码,每个棋盘格都被初始化为一个空格了

打印棋盘

初始化棋盘后我们就可以定义一个DisplayBoard函数打印空的棋盘 我们可以用两个for循环进行嵌套,首先打印 “ | ”,打印两个“ | ”后就进行换行,打印纵向的分界线“ —|—|—”,打印两个分界线

代码语言:javascript
复制
void DisplayBoard(char board[ROW][COL], int x, int y)
{
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			printf(" %c ", board[i][j]); 
			// 此处的输出%c前后都加了空格,打印出来会更加美观
			if(j<y-1)
			printf("|");
		}
		printf("\n");
		if (i < x - 1)
		{
			printf("---|---|---\n");
		}
	}
}

打印出来的效果如图

玩家下棋

将棋盘格打印出来之后玩家可以进行下棋了,但是这里注意,玩家下棋时肯定是不会认为有(0,0)坐标的,所以我们在进行落子判断是有进行纵坐标和横坐标的“-1”操作,我们用“*”作为玩家的棋子

代码语言:javascript
复制
void PlayerMove(char board[ROW][COL], int x, int y)
{
	int a = 0;
	int b = 0;
	printf("玩家下棋\n");
	printf("请输入坐标->:");
	while (1)
	{
		scanf("%d %d", &a, &b);
		if (a >= 1 && a <= ROW && b >= 1 && b <= ROW)
		{
			if (board[a - 1][b - 1] == ' ')
			{
				board[a - 1][b - 1] = '*';
				break;
			}
			//若玩家落子的棋盘格是空格则填入“*”
			else
				printf("该坐标已经有棋子,不能落子,请重新输入坐标->:");
		}
		    else 
			    printf("输入坐标不合法,请重新输入->:");
			    //玩家输入的坐标横坐标或者纵坐标不在1~3的范围内
	}
}

效果如图

电脑玩家下棋

玩家下棋后,电脑玩家下棋,我们就用“#”作为电脑玩家的棋子,我们用rand函数随机生成两个个0~2内的数字,使用rand函数我们要记得用srand(unsigned int(time(NULL)))放入main函数,生成随机的“种子”, rand函数才能真正地实现随机数

代码语言:javascript
复制
void ComputerMove(char board[ROW][COL], int x, int y)
{
	printf("电脑玩家\n");
	int a = rand() % 3;
	int b = rand() % 3;
	while (1)//如果随机生成的坐标玩家已经落子就继续进行循环
	{
		if(a >= 0 && a <= ROW-1 &&b >= 0 && b <= ROW - 1)
		{
			if (board[a][b] == ' ')
			{
				board[a][b] = '#';
				break;
			}
		}
	}
}

效果如图

判断输赢

下棋之后我们就创建一个判断输赢的函数,如果还没有赢就继续下棋,棋盘满了之后没有胜负之分就是平局 首先我们用1代表玩家赢了 、2代表电脑赢了 、3代表平局 、 4代表继续 我们用两个for循环进行嵌套,创建一个判断棋盘是否已满的IsFull函数

代码语言:javascript
复制
int IsFull(char board[ROW][COL], int x, int y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < x; i++)
	{
		for (j = 0; j < y; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
int Win(char board[ROW][COL], int x, int y)
{
	//1--玩家赢了   2--电脑赢了   3--平局    4--继续
	int i = 0;
	int j = 0;
	for (i = 0; i < x; i++)
	{
		if (board[i][0] == board[i][1] && board[i][2] == board[i][1] && board[i][0] == '*')
			return 1;
	}
	for (j = 0; j < y; j++)
	{
		if (board[0][j] == board[1][j] && board[2][j] == board[1][j] && board[0][j] == '#')
			return 2;
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '*')
		return 1;
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '*')
		return 1;
		//对角线全是*的情况,玩家赢
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '#')
		return 2;
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '#')
		return 2;
		//对角线全是#的情况,电脑玩家赢
	if (IsFull(board, x, y) == 1)
		return 3;//棋盘全满了,未能分出胜负,平局
	else
		return 4;//继续下棋
}
game函数的构建

下面我们就可以将多个函数进行整合,放进game函数 我们定义一个变量ret来存放Win函数返回的值,来判断游戏的胜负 我们可以使用while循环,而后面的循环条件就用1,以便于游戏胜负已分之后,可以接着玩

代码语言:javascript
复制
void game()
{
	//首先初始化棋盘里面的内容为空格
	char board[ROW][COL] = { 0 };
	int ret = 0;
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		//玩家落子下棋
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = Win(board, ROW, COL);
		if (ret != 4)
			break;
	//每进行一次下棋,就进行一次输赢的判断,只要不等于4就会停止循环,本次游戏结束
		//电脑玩家落子下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = Win(board, ROW, COL);
		if (ret != 4)
			break;
	}
		if (ret == 1)
		{
			printf("玩家赢\n");
		}
		else if (ret == 2)
			printf("电脑玩家赢\n");
		else
			printf("平局\n");
}

到这里,三子棋游戏就完成了!

下面是三子棋游戏的完整代码 game.h(头文件包括了函数的声明)

代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL], int, int);
void DisplayBoard(char board[ROW][COL], int, int);
void PlayerMove(char board[ROW][COL], int, int);
void ComputerMove(char board[ROW][COL], int, int);
int Win(char board[ROW][COL], int, int);
int IsFull(char board[ROW][COL], int, int);

game.c(函数定义)

代码语言:javascript
复制
#include "game.h"
void InitBoard(char board[ROW][COL], int x, int y)
{
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			board[i][j] = ' ';
		}
	}
}
void DisplayBoard(char board[ROW][COL], int x, int y)
{
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			printf(" %c ", board[i][j]);
			if(j<y-1)
			printf("|");
		}
		printf("\n");
		if (i < x - 1)
		{
			printf("---|---|---\n");
		}
	}
}
void PlayerMove(char board[ROW][COL], int x, int y)
{
	int a = 0;
	int b = 0;
	printf("玩家下棋\n");
	printf("请输入坐标->:");
	while (1)
	{
		scanf("%d %d", &a, &b);
		if (a >= 1 && a <= ROW && b >= 1 && b <= ROW)
		{
			if (board[a - 1][b - 1] == ' ')
			{
				board[a - 1][b - 1] = '*';
				break;
			}
			else
				printf("该坐标已经有棋子,不能落子,请重新输入坐标->:");
		}
		
		else 
			printf("输入坐标不合法,请重新输入->:");
	}
}
void ComputerMove(char board[ROW][COL], int x, int y)
{
	printf("电脑玩家\n");
	int a = rand() % 3;
	int b = rand() % 3;
	while (1)
	{
		if(a >= 0 && a <= ROW-1 &&b >= 0 && b <= ROW - 1)
		{
			if (board[a][b] == ' ')
			{
				board[a][b] = '#';
				break;
			}
		}
	}
}
int IsFull(char board[ROW][COL], int x, int y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < x; i++)
	{
		for (j = 0; j < y; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
int Win(char board[ROW][COL], int x, int y)
{
	//1--玩家赢了   2--电脑赢了   3--平局    4--继续
	int i = 0;
	int j = 0;
	for (i = 0; i < x; i++)
	{
		if (board[i][0] == board[i][1] && board[i][2] == board[i][1] && board[i][0] == '*')
			return 1;
	}
	for (j = 0; j < y; j++)
	{
		if (board[0][j] == board[1][j] && board[2][j] == board[1][j] && board[0][j] == '#')
			return 2;
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '*')
		return 1;
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '*')
		return 1;
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '#')
		return 2;
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '#')
		return 2;
	if (IsFull(board, x, y) == 1)
		return 3;
	else
		return 4;

}

test.c

代码语言:javascript
复制
#include"game.h"
void menu()
{
	printf("*********************\n");
	printf("*****1.进入游戏******\n");
	printf("*****2.退出游戏******\n");
	printf("*********************\n");
}

void game()
{
	//首先初始化棋盘里面的内容为空格
	char board[ROW][COL] = { 0 };
	int ret = 0;
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		//玩家落子下棋
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = Win(board, ROW, COL);
		if (ret != 4)
			break;
		//电脑玩家落子下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = Win(board, ROW, COL);
		if (ret != 4)
			break;
	}
		if (ret == 1)
		{
			printf("玩家赢\n");
		}
		else if (ret == 2)
			printf("电脑玩家赢\n");
		else
			printf("平局\n");
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do 
	{
		menu();
		printf("请输入数字->:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);
	return 0;
}

好了,以上就是今天的分享了,下次再见!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 三子棋游戏(详解+代码)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档