【入门级c语言编程】如何用c写出三子棋。最详解最方面的教程

目录

“游戏整体思路”

“游戏菜单的创建”

 “游戏主体核心的实现”

                1·棋盘的初始化               

                2·棋盘的展现

                3·玩家下棋

                4·电脑自动下棋 

                5·游戏胜负的判断 

“游戏运行实况”
 


                                                         “游戏整体思路”                                                         

建立3个项目:

test.c---也是游戏最重要的一个文件,用来构成游戏。

game.c---写出引用的函数。

game.h---引用test.c的头文件

                                  

     “游戏菜单的创建”

我们建立游戏菜单可以引用一个menu()函数,在函数中写更能方便让自己理解思路。

游戏菜单要提供以下功能:

1.play---让玩家开始游戏

2.exit---玩家可以离开游戏。

3.当玩家输入错误时提示玩家。

展示一下代码段,有部分注释,可以理解:

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

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	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;
}

“游戏主体核心的实现”

1·棋盘的初始化  

void game()
{
	char board[ROW][COL] = { 0 };//存放数据需要3*3的二维数组
	InitBoard(board, ROW, COL);   
	DisplayBoard(board, ROW, COL);

然后我们讲把每个数组元素放入空格

代码如下:

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] = ' ';
		}
	}
}
memset(&board[0][0], ' ', row * col * sizeof(board[0][0]))

上面这两种都能写出元素带有空格·。

2·棋盘的展现

首先我们看下棋盘是长啥样的。

 

 棋盘是由---和|组成我们把第一排的---和|看成一组进行循环。第二排以此类举。

代码如下:

void DisplayBoard(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++)
		{
			 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");
	}
}

  3·玩家下棋

玩家要判断以下规则:
1.玩家是否落子。

2.落子区域是否有子。

3.接收玩家的落子。

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

 注意的是我们玩家落子是*,电脑落子是#。

4·电脑自动下棋

自动下棋需要这几个头文件:

  1. <stdlib.h>
  2. <time.h> 

使用rand和srand完成此代码。代码如下:

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;
		}
	}
srand((unsigned int)time(NULL));

 

5·游戏胜负的判断 

 判断游戏的胜负更是游戏中更重要的一步

我们使用iwin()的函数包含其代码:

在这一函数中,我们需要实现以下几个逻辑:

  1. 要返回四种不同的状态
  2. 玩家赢     -->  返回'*'
  3. 电脑赢     -->  返回'#'
  4. 平局         -->  返回'Q'
  5. 游戏继续  -->  返回'C'

首先我们要确立判断函数再整个游戏主体中的位置和作用,逻辑如下:

void game()
{
	char board[ROW][COL] = { 0 };//存放数据需要3*3的二维数组
	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)
		printf("玩家赢\n");
	else if ('#' == ret)
		printf("电脑赢\n");
	else if ('Q' == ret)
		printf("平局\n");//判断输赢
}

iwin函数中代码判断获胜规则:

  1. 判断行
  2. 判断列
  3. 判断对角线
  4. 判断棋盘是否已经放满   -- >  确认游戏是否继续(需要一个Is_full()函数来实现这一功能)

代码如下:

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][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';
}

 “游戏运行实况”

 

 这也是整个游戏的全部内容。

总结

代码固然不是很难,但我完成此代码花费了大量时间。其实完成代码要求更应该是对算法的理解。

猜你喜欢

转载自blog.csdn.net/m0_73228832/article/details/128755929
今日推荐