趣味小游戏——井字棋

目录

 一.前言

二.主体框架

三.游戏内容的实现

四.结语


一.前言

  想必大家在小时候或多或少的都接触过井字棋吧,那么今天我就来带大家了解如何在编程中实现这一游戏吧。

二.主体框架

#include 

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

int main()//要运行游戏我们先创建一个主函数
{

	int input = 0;
	do
	{
        menu();//在游戏开始前先给出一个优美的游戏界面
		printf("欢迎来到三子棋游戏,请选择:\n");
		printf("输入1开始游戏,输入0结束游戏\n");//提示玩家如何开始游戏
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("游戏开始\n");
			game();//游戏主体
			break;//当输入1时,玩家就会开始游戏,在游戏进行完后跳出循环
		case 0:
			printf("游戏已退出\n");
			break;//当输入0时,玩家退出
		default:
			printf("输入错误,请重新输入\n");//输入其他值时,返回输入阶段
		}
	}while (input);//当输入为0(假)时循环结束,当输入非0(真)时循环再次进行
}

  在主体执行逻辑完成后我们再对具体的游戏主体再做设计。

三.游戏内容的实现

  井字棋的游戏步骤大致为下

#include 
#define ROW 3
#define COL 3
//在这里使用宏定义可以方便之后对数据进行修改,不用再对后面的多个地方进行改动

void game()
{
	char board[ROW][COL];//生成棋盘
	ini_board(board, ROW, COL);//1.初始化棋盘
	printf_board(board, ROW, COL);//2.打印棋盘
	while(1)//玩家和电脑下棋步骤
	{
		player_move(board, ROW, COL);//3.玩家下棋
		printf_board(board, ROW, COL);
		char ret = is_win(board, ROW, COL);//5.判断是否有人胜出
		if (ret != 'C')
		{
			break;
		}
		computer_move(board, ROW, COL);//4.电脑下棋
		printf_board(board, ROW, COL);
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	char ret = is_win(board, ROW, COL);
	judge(ret);//6.判定游戏结果
}

在这之中我们将具体化各个步骤,设计出相应的函数

1.初始化棋盘

void ini_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++)//对每列元素进行操作
		{
			board[i][j] = ' ';//对每一元素进行操作,使他们的内容都为一个' '空字符
		}
	}
}

2.打印棋盘

void printf_board( char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)//对每行元素进行操作
	{
		printf("   |   |   \n");
        //一行仅有三个元素将其一一包围在由' '形成的九宫格正中,且不同元素间用'|'间隔开来
		printf(" %c | %c | %c \n", board[i][0],board[i][1],board[i][2]);
		printf("   |   |   \n");
		if(i < col-1)//每行元素间以'-'与'|'分割,且最后一行之后无需再做分割
		{
			printf("---|---|---\n");
		}
	}
}

运行到此处时的效果如下

趣味小游戏——井字棋_第1张图片

3.玩家下棋

void player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋\n");
	printf("请输入下棋位置:");
	while (1)//万一玩家输入错误,可以不断循环,直到玩家输入正确
	{
		scanf("%d %d", &x, &y);//输入玩家想下的坐标
		if (x <= 3 && y <= 3 && x >= 1 && y >= 1)
		{
            //玩家是不知道数组元素的下标是从0开始的,因此在输入时需要判定输入值是否在1-3之间
            //而不是在0-2之间
			if (board[x - 1][y - 1] == ' ')
            //只有在此元素未是' '时,才准许玩家下在此处
			{
				board[x - 1][y - 1] = '*';//玩家下棋使对应元素被*占据
				break;//在玩家输入正确后退出循环
			}
			else
			{
				printf("坐标已被占用,请重新输入:");//此时玩家所输入的坐标已被*或#占用
			}
		}
		else
		{
			printf("坐标非法,请重新输入:");//此时玩家所输入的坐标不在1-3这个范围内
		}
	}
}

运行起来如下图

趣味小游戏——井字棋_第2张图片    趣味小游戏——井字棋_第3张图片

 4.电脑下棋

void computer_move(char board[ROW][COL], int row, int col)
{
	srand((unsigned int)time(NULL));//通过时间戳来获取伪随机值
	printf("电脑下棋\n");
	while (1)
	{
		int x = rand() % 3;//获得0-2的随机数
		int y = rand() % 3;
		if (board[x][y] == ' ')//只有当对应元素为' '时才进行落子替换
		{
			board[x][y] = '#';//将' '替换成#
			break;//结束循环
		}
	}
}

 5.判断结果

在这里我们规定根据不同情况返回不同的值(表示不同含义)

//* - 玩家获胜        //# - 电脑获胜        //Q - 平局        //C - 没有输赢游戏继续

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][1] != ' ')
			return board[i][1];
        //对每列是否有三个元素相同且连成一条线
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][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];
	}
    //判定是否所有元素都被占据,即判断是否还有元素为' '
    //若还有的话说明棋局还未结束
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 'C';
		}
	}
    //以上条件均不满足时,说明所有位置均被占据且没有赢家,即平局
	return 'Q';
}
void judge(int ret)
{
	if (ret == '*')
		printf("玩家获胜\n");
	if (ret == '#')
		printf("电脑获胜\n");
	if (ret == 'Q')
		printf("平局\n");
}

至此我们便完成了井字棋的制作(虽然电脑看起来不是很聪明的样子)。

四.结语

  此次我们研究了井字棋的运行方式,希望读者能从中获取到一定知识。

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