三子棋(C语言实现)

目录

前言

实现步骤

编写程序

创建游戏的菜单

 建立游戏棋盘

 玩家下棋

 判断输赢

 电脑下棋

代码


前言

对于一个初学者来说三子棋的程序还是有点多,为了更好的查看管理程序,调试起来更方便。我们这里用多文件的方式来实现三子棋的程序。

实现步骤

1、创建头文件和源文件

2、创建游戏的菜单

3、建立游戏棋盘

4、玩家下棋

5、判断输赢

6、电脑下棋

7、判断输赢

编写程序

我们这里建立一个头文件和两个源文件

game.h主要放要包含的头文件和自定义函数的声明,game.c里放游戏的算法实现,text.c里放游戏的一个框架。

创建游戏的菜单

下面这个就是游戏菜单的实现,程序运行后会先打印出menu函数里的内容,当我们输入1时会开始游戏,输入0会退出游戏,输入其他内容会提示错误。

 建立游戏棋盘

这里建立一个二维数组来做棋盘,ROW是行数COL是列数。建立好后要将棋盘初始化为空白方便后续代码的实现。

 然后将游戏棋盘打印出来,玩家才好下棋。

 玩家下棋

这里要注意的点是:

1、玩家下棋时输入的坐标数应该是1-3的,因为一般人数数是从1开始,而我们的数组下标是从0开始的,所以后面要减1。

2、要判断坐标是否被占用,是不是已经有棋子了。

3、判断坐标是不是在范围内。

 判断输赢

判断输赢这里判断的是一行或一列或者两条对角线中的一条有没有出现同样的三个棋子,在没有出现这种情况后,判断棋盘有没有满,满了就为平局,没有满游戏就继续。

 电脑下棋

电脑下棋主要是要生成随机值,我们这里用的是rand函数,用srand ((unsigned int)time(NULL));产生随机值。rand()%row会产生0-3的数。

 电脑下完棋后再判断一下输赢。

代码

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void menu()
{
	printf("**************************\n");
	printf("****  1.play  0.exit  ****\n");
	printf("**************************\n");
}
//游戏的整个算法实现
void game()
{
	char ret=0;
	//创建一个数组,存放走出的棋盘信息
	char board[ROW][COL] = { 0 };//初始化棋盘,全部空白
	InitBoard(board, ROW, COL);	//棋盘打印

	DisplayBoard(board, ROW, COL);	//下棋
	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
	{
		printf("平局!\n");
	}
}
void test()
{
	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);
}
int main()
{
	test();
	return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

//初始化棋盘,全部空白
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i;
	int j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i;
	for (i=0; i < row; i++)
	{
		int j;
		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 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");
		}
	}
}
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;
	    }
	}
}
//判断是否平局
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;//满了
}
char IsWin(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][2] != ' ')
		{
			return board[i][0];//返回*玩家赢,返回#电脑赢
		}
	}
	//判断一列
	for (i = 0; i < row; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[2][i] != ' ')
		{
			return board[0][i];//返回*玩家赢,返回#电脑赢
		}
	}
	//两条对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != ' ')
		return board[0][0];//返回*玩家赢,返回#电脑赢
	if (board[0][3] == board[1][1] && board[1][1] == board[3][0] && board[3][0] != ' ')
		return board[1][1];//返回*玩家赢,返回#电脑赢
	//判断是否平局
	if (1 == IsFull(board, ROW, COL))
	{
		return 'Q';//平局
	}
	return 'C';//没有输赢和平局继续游戏
}

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void InitBoard(char board[ROW][COL],int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
//告诉我四种游戏状态
//玩家赢   ‘*’
//电脑赢    '#'
//平局       'Q'
//继续      'C'
char IsWin(char board[ROW][COL], int row, int col);

 

 更多内容请移步个人博客:乌托邦  

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值