【c语言】 我使用c语言基础做了一个老少皆宜的”国民小游戏(三字棋)“

C语言实现三字棋小游戏

前言

本三字棋小游戏是依靠二维数组为核心来实现的,可以更加好理解掌握c语言数组的概念知识,依靠做小游戏项目,把学到了知识在输出出来加已巩固,最后有源代码

游戏效果

在这里插入图片描述

游戏实现

1.做出游戏菜单

2.游戏棋盘的创建

3.游戏开始下棋

4.判断游戏结束

5.源代码
1.菜单的实现
在这里插入图片描述
写一个菜单函数menu()

	printf("******************\n");
	printf("****  1.play ******\n");
	printf("****  0.exit *****\n");
	printf("******************\n");

在到main函数中调用


2.游戏棋盘的创建
在这里插入图片描述
这里可以看见玩家的落子的位置,和电脑落子的位置都给记录下来了,所以这里写一个game()函数
1.创建存储数据的容器
在这里插入图片描述

char board[3][3];
  • 这里有个问题就是要是以后我们不想只玩三字棋,想玩五子棋,或者十字棋怎么办呢
  • 数组大小写死了,缺少了灵活性,所以我们试着把数组大小写都头文件去,以后只要应用一下头文件就可以获取变量了,而且以后修改只需要改头文件里面的变量就可以了。
    在这里插入图片描述
    创建一个头文件,里面定义数组大小

在这里插入图片描述
创建一个game.c的文件,函数的实现在这个文件里

#pragma once
#define ROW 3
#define COL 3

在这里插入图片描述
前台引用一下头文件,这样就可以到处使用刚刚定义的变量了

2.初始化棋盘

  • 其实初始化棋盘,就是往棋盘里面放空格

    这里的参数是要传过去一个棋盘,和具体的几行几列,才好把每一个二维数组添加空格子进去
    在这里插入图片描述

头文件里面声明一下


game函数里面,定义一个初始化棋盘函数

InitBorad(board,ROW,COL);

在这里插入图片描述


初始化棋盘函数的实现,是在game.c文件里面实现
在这里插入图片描述

void InitBorad(char borad[ROW][COL], int row, int col)
{
    
    
		int i = 0;
		int j = 0;
		for (i=0 ; i < row; i++)
		{
    
    
			for ( j = 0; j < col; j++)
			{
    
    
				borad[i][j] = ' ';
			}
		}
}

2.打印棋盘

  • 在game.h定义打印棋盘函数
    在这里插入图片描述
  • 在主方法test.c文件,引入打印棋盘函数
    在这里插入图片描述
  • 实现打印棋盘函数
void DisplayBoard(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)
		{
    
    
			int j = 0;
			for (j = 0; j < col; j++)
			{
    
    
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

在这里插入图片描述

3.游戏开始下棋

- 玩家下棋

game.h里面定义函数

在这里插入图片描述

void PlayerMove(char board[ROW][COL],int row,int col);

test.c里面引用函数
在这里插入图片描述

PlayerMove(board,ROW,COL);  
DisplayBoard(board, ROW, COL);  //玩家下好棋 打印棋盘

game.c里面实现玩家下棋函数
在这里插入图片描述

void PlayerMove(char board[ROW][COL], int row, int col) 
{
    
    
	int x = 0;
	int y = 0;
	printf("玩家下>\n");
	while (1)
	{
    
    
		printf("请输入下棋的坐标:>");
		scanf("%d %d\n",&x,&y);
		if (x>=1 && x<=row && y>=1 && y<=col)  //判断下棋落子 是否在坐标内  
		{
    
    
			if (board[x-1][y-1] == ' ') //因为用户 并不是程序员不知道数组是从0开始的,所以减1
			{
    
    
				board[x - 1][y - 1] == '*';  //用户下子 *代替
				break;
			}
			else
			{
    
    
				printf("坐标已有棋,请重新输入\n");
			}
		}
		else
		{
    
    
			printf("坐标非法,请重新输入\n");
		}
	}
}

- 电脑下棋
在game.h里面定义一个电脑下棋函数
在这里插入图片描述

void ComputerMover( char board[ROW][COL],int row, int col);

在主方法main里面引用
在这里插入图片描述

在game.c里面实现电脑下棋
在这里插入图片描述

void ComputerMover(char board[ROW][COL], int row, int col)	
{
    
    
	printf("电脑下:>\n");
	while (1)
	{
    
    
		int x = rand() % row;   //%3 就是余数0-2 
		int y = rand() % col;
		if (board[x][y] ==' ') //电脑判断是否是可下的地方
		{
    
    
			board[x][y] = '#'; //电脑下棋
			break;
		}

	}

}

注意rand()函数要搭配srand()函数一起使用
在这里插入图片描述
随机数需要引用的头文件,直接在game.h 文件里面引用
在这里插入图片描述

4.判断输赢

  • 在写之前,我们是否需要定一个规矩,游戏输赢有4种情况
    1.玩家赢了 - *
    2.电脑赢了 - #
    3.平局 - Q
    4.游戏继续 - C

    立下这个规则,我们才正式开始


    在game.h定义函数
    在这里插入图片描述

char IsWin(char board[ROW][COL], int row, int col);

在test.c 写入以下代码
在这里插入图片描述

char ret = 0;   //接受游戏状态 
	while (1)
	{
    
    
		//玩家玩
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);  //玩家下好棋 打印棋盘

		ret = IsWin(board, ROW, COL);    //判断输赢
		if (ret != 'C') //C是我们的继续,如果我们不是C 那就是其他的结局 那么游戏结束
		{
    
    
			break;
		}
		//电脑玩
		ComputerMover(board, ROW, COL);
		DisplayBoard(board, ROW, COL);  //电脑下好棋 打印棋盘
		ret = IsWin(board, ROW, COL);	//判断输赢
		if (ret != 'C') //C是我们的继续,如果我们不是C 那就是其他的结局 那么游戏结束
		{
    
    
			break;
		}
		
	}
	if (ret == '*')
	{
    
    
		printf("玩家赢了");

	}
	else if (ret == '#')
	{
    
    
		printf("电脑赢了");

	}else
	{
    
    
		printf("平局\n");
	}
	DisplayBoard(board, ROW, COL);  //电脑下好棋 打印棋盘

在game.c实现函数
在这里插入图片描述

//判断游戏是否有输赢
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][1] !=' ')
		{
    
    
			return board[i][1]; //不管里面是什么元素 都要返回回去
		}
	}
	//判断三列
	for (i = 0; i < col; i++)
	{
    
    
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[2][i] != ' ')
		{
    
    
			return board[1][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];
	}
	//判断平局
	//如果棋盘满了返回1 ,不满返回 0
	int ret = IsFull(board, row, col);   //是否棋盘满

		if (ret ==  1 )
		{
    
    
			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; //满了返回1
}

好了以上就是三字棋小游戏的代码了,快来自己动手实现一下吧,这需要一定的二维数组基础知识,其实代码实现不难,尝试去做就可以了。

三字棋源代码

猜你喜欢

转载自blog.csdn.net/qq_46874327/article/details/116324231