C语言实现---三子棋

本文详细介绍了如何使用C语言编写一个简单的三子棋游戏,包括游戏菜单的创建、棋盘初始化、玩家和电脑下棋的逻辑以及判断输赢的算法。游戏由主函数、初始化函数、显示棋盘函数、玩家和电脑移动棋子的函数以及判断输赢的函数组成,实现了交互式的三子棋对战体验。
摘要由CSDN通过智能技术生成

本文讲述的是如何用C语言实现简单三子棋小游戏

目录

一、游戏的整体实现思路

二、游戏菜单的创建

三、游戏各部分函数的实现

(一)棋盘的初始化

(二)棋盘实际的展开

(三)玩家下棋

(四)电脑下棋

(五)判断输赢

四、游戏的实际运行


一、游戏的整体实现思路:

该游戏共需要三个文件:

  1. test.c      主函数的入口,用于测试游戏
  2. game.c     游戏中各个函数的实现
  3. game.h     游戏中各个函数的声明包含在此头文件中

 

二、游戏菜单的创建:

菜单函数menu()用于实现游戏的进入与退出,此外若玩家输入错误的指令则提示玩家重新输入

menu()函数的代码实现

void menu()
{
	printf("*******************************\n");
	printf("********    1. play      ******\n");
	printf("********    0. exit      ******\n");
	printf("*******************************\n");
}
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;
}

三种情况下程序运行的结果:

 


三、游戏各部分函数的实现:

(一)棋盘的初始化

初始化一个数组,并用函数InitBoard()对数组中的内容置为空格,为后面棋盘展开后所呈现的形式做铺垫

//初始化数组	
char board[ROW][COL] = {0};
//初始化棋盘
InitBoard(board, ROW, COL);

注:代码中的ROW 和 COL为#define定义的标识符常量,也是在头文件中的全局变量,日后若需要改变棋盘的大小可直接在头文件中改变两个常量的值即可

InitBoard()函数的代码实现

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

(二)棋盘实际的展开

用DisplayBoard()函数实现棋盘的展开

DisplayBoard()函数的代码实现

void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 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");
	}
}

实际运行程序的结果

 

(三)玩家下棋

用PlayerMove()函数实现玩家下棋的功能

玩家下棋功能的实现要考虑三个问题:

①玩家落子的坐标(若玩家落子坐标为(x,y)则实际在棋盘数组的中的位置应该是board[x-1][y-1])

②玩家落子的坐标是否已经被占用

③若玩家落子地点未被占用,则将该点中的元素替换为‘ * ’;若玩家落子地点已被占用,则提示玩家重新选点落子;若玩家落子坐标越界也提示玩家重新选点落子

不同情况下程序运行的结果

PlayerMove()函数的代码实现

void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋:>\n");

	while (1)
	{
		printf("请输入要下棋的坐标:>");
		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("坐标被占用,重新输入\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}

不同情况下程序运行的结果 

 

(四)电脑下棋

电脑需要自己生成规定范围内的随机数作为其落子的坐标,因此需要使用srand((unsigned int)time(NULL))和rand()来成随机数

srand((unsigned int)time(NULL));

w电脑下棋ComputerMove()函数的代码实现

void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋>:\n");

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

实际运行程序的结果 

 

(五)判断输赢

玩家和电脑每落子一次都到对棋盘中的棋子进行判断,可能的输赢结果有四种

①若玩家获胜则返回字符‘ * ’

②若电脑获胜则返回字符‘ # ’

③若无人获胜且棋盘还有空位游戏继续则返回字符‘ C ’

④若无人获胜且棋盘已满则平局返回字符‘ Q ’

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

		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if ('*' == ret)
	{
		printf("玩家赢\n");
	}
	else if ('#' == ret)
	{
		printf("电脑赢\n");
	}
	else if ('Q' == ret)
	{
		printf("平局\n");
	}
}

用IsWin()函数判断输赢情况

①若某一行都为同一种字符则获胜

②若某一列都为同一种字符则获胜

③若两对角线上其中有一条对角线上为同一种字符则获胜

IsWin()函数的代码实现

char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0; int j = 0; char a = '\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[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	//判断是否平局
	if (IsFull(board, row, col))
	{
		return 'Q';
	}
	//游戏继续
	return 'C';

判断棋盘是否已满(即平局) IsFull()函数的代码实现 

int IsFull(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;
}

游戏的整体逻辑实现

#include "game.h"

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

void game()
{
	//存放数据需要一个3*3的二维数组
	char board[ROW][COL] = {0};
	//初始化棋盘
	InitBoard(board, ROW, COL);
	//显示棋盘
	DisplayBoard(board, ROW, COL);
	char ret = 0;
	while (1)
	{	
		//玩家下棋
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}

		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if ('*' == ret)
	{
		printf("玩家赢\n");
	}
	else if ('#' == ret)
	{
		printf("电脑赢\n");
	}
	else if ('Q' == ret)
	{
		printf("平局\n");
	}
}

四、游戏的实际运行:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值