c语言实现三子棋游戏

c语言实现三子棋游戏,第1张

编程新手,如有其他见解或者更好的优化方案,欢迎评论区讨论。

要想实现三子棋游戏,首要的是建立一个游戏的整体框架,理清游戏的具体逻辑,将一个实际问题拆分成一个个小步骤,再用代码编译。

此框架仅供参考。

三子棋游戏。

1.游戏的整体框架

a.设置一个菜单提示用户如何进入与退出游戏 。 输入1开始玩,输入0退出。

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

b.要能够实现用户玩一局游戏可继续下一游戏,所以我们把整个游戏放入一个do while循环语句中。

void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));     //生成随机数
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();          //函数里实现游戏
			break;
		case 2:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);
}

2.三子棋游戏的逻辑实现

a.三子棋的棋盘构思

//  * | * | * 
// ---|---|---
//  # | # | * 
// ---|---|---
//  * | # | # 

b.创建一个字符数组,能够存放棋子的信息,即 * #,并初始化。


        //此处是define定义的ROW COL为3,若是想扩大棋盘,只需修改定义即可
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] = ' ';   //初始化为空格,打印出来不会显示
		}
	}
}

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)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

d.玩家输入坐标可在棋盘上下棋,但是要注意每走一次需打印一次棋盘

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

e.设置电脑下棋的 *** 作,需使用到随机数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;
		}
	}
}

f.最后即是逐个遍历,判断是否输赢,或者平局,此处省略判断平局(即判断数组是否已满)

char Iswin(char board[ROW][COL], int row, int col)
{
	int i = 0;
   //横3行,三子连线
	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++)
	{
   //竖3列,三子连线
		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[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
		return board[1][1];      //同上
	if (1 == Isfull(board, ROW, COL))
	{
		return 'Q';        //若棋盘已满,返回Q表示平局
	}
	return 'C';      //返回C表示,游戏未结束,继续游戏
}

g.放入循环将整个游戏逻辑串联起来

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

最后,展示一下游戏效果

**********************************
*******    1.  play        *******
*******    0.  exit        *******
**********************************
请选择:>1
   |   |
---|---|---
   |   |
---|---|---
   |   |
玩家走:>
请输入要下的坐标:>1 1
 * |   |
---|---|---
   |   |
---|---|---
   |   |
电脑走:>
 * |   |
---|---|---
   |   |
---|---|---
 # |   |
玩家走:>
请输入要下的坐标:>1 2
 * | * |
---|---|---
   |   |
---|---|---
 # |   |
电脑走:>
 * | * |
---|---|---
   | # |
---|---|---
 # |   |
玩家走:>
请输入要下的坐标:>1 3
 * | * | *
---|---|---
   | # |
---|---|---
 # |   |
玩家赢
**********************************
*******    1.  play        *******
*******    0.  exit        *******
**********************************
请选择:>

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/713310.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存