C语言实现游戏——三子棋

C语言实现游戏——三子棋

​ 相对于前端而言,底层的C语言无论是在学习的成就感还是学习乐趣方面都不如HTML等页面显示来得精彩,但后端C语言程序员也有自己的乐趣。今天狗子将详细介绍利用C语言来实现三子棋游戏。

1 项目介绍及规划

三子棋是一种民间传统游戏,又叫九宫棋。这种游戏,通常二人采用对战模式。双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。因而,项目实现中需要考虑到和棋。

C语言实现游戏——三子棋_第1张图片

​ 项目的设计需要三个文件,分别位头文件game.h和源文件game.c及test.c。其中,头文件中存储项目需要用到的函数声明;源文件test.c是整个项目的核心;而源文件game.c是辅助,便于test.c调用游戏实现的逻辑。

2 项目的详解

2.1 初始化界面

要实现下图三子棋游戏的初始化界面,需要用到菜单函数。

C语言实现游戏——三子棋_第2张图片

菜单函数如下:

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

2.2 显示棋盘

三子棋的九宫格棋盘具体如下图所示:

C语言实现游戏——三子棋_第3张图片

棋盘函数如下:

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

2.3 对战下棋的实现

玩家及电脑下棋的实现如下图所示。

C语言实现游戏——三子棋_第4张图片

玩家下棋函数逻辑:

void player_move(char board[ROW][COL],int row,int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋:>\n");
	while(1)
	{
		printf("请输入要下棋的坐标:>");
		scanf("%d %d",&x,&y);
		//1.坐标的合法性
		//2.坐标是否被占用
		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 computer_move(char board[ROW][COL],int row,int col)
{
	printf("电脑下棋:>\n");

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

3 项目实现

3.1 test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include"game.h"
//三字棋游戏
//
void menu()
{
	printf("*******************************\n");
	printf("********** 1. play ************\n");
	printf("********** 0. exit ************\n");
	printf("*******************************\n");
}

void game()
{
	char ret = 0;
	//数据的存储需要一个3*3的二维数组
	char board[ROW][COL] = {0};
	initBoard(board,ROW,COL);
	display_board(board,ROW,COL);
	//玩游戏
	while(1)
	{
		player_move(board,ROW,COL);
		ret = is_win(board,ROW,COL);
		if(ret != 'C')
			break;

		display_board(board,ROW,COL);

		computer_move(board,ROW,COL);
		if(ret != 'C')
			break;
		display_board(board,ROW,COL);
	}
	if(ret == '*')
	{
		printf("玩家赢\n");
	}
	else if(ret == '#')
	{
		printf("电脑赢\n");
	}
	else if(ret == 'Q')
	{
		printf("平局\n");
	}
	display_board(board,ROW,COL);
}
//玩家赢 - '*'
//电脑赢 - '#'
//平局 - 'Q'
//游戏继续 - 'C'

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("选择错误,请重新选择");
			break;
		}
	}while(input);
	return 0;
}

3.2 game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

void initBoard(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++)
		{
			board[i][j] = ' ';
		}
	}
}

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

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

	while(1)
	{
		printf("请输入要下棋的坐标:>");
		scanf("%d %d",&x,&y);
		//1.坐标的合法性
		//2.坐标是否被占用
		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 computer_move(char board[ROW][COL],int row,int col)
{
	printf("电脑下棋:>\n");

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

//如果棋盘满了,返回1
//如果不满,返回0
static 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;
}

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];
		}
	}
	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(is_full(board,row,col) == 1)
	{
		return 'Q';
	}
	//继续
	return 'C';
}

3.3 game.h

#pragma one
#include
#include
#include

#define ROW 3
#define COL 3

//初始化棋盘
void initBoard(char board[ROW][COL],int row,int col);

//打印棋盘
void display_board(char board[ROW][COL],int row,int col);

//玩家下棋
void player_move(char board[ROW][COL],int row,int col);

//电脑下棋
void computer_move(char board[ROW][COL],int row,int col);

//判断游戏状态
char is_win(char board[ROW][COL],int row,int col);

如果您有什么问题,请在下面留言哦~汪汪会及时回复

你可能感兴趣的:(c语言)