C语言三字棋游戏先简单介绍一下三子棋的规则,方便我们接下来的编程和理解。规则如下: 在九宫格棋盘上,只要将自己的三个棋子走成一条线(横、竖、对角线),对方就算输了。

先简单介绍一下三子棋的规则:

在九宫格棋盘上,只要将自己的三个棋子走成一条线(横、竖、对角线),对方就算输了

按照我们以前玩的游戏进入页面首先得有菜单,那给我们的游戏也来个简单的菜单,提示用户操作!!!

int Menu()
{
	printf("**********************************\n");
	printf("************* 1.play *************\n");
	printf("************* 0.exit *************\n");
	printf("**********************************\n");
	int choose;
	printf("请选择:");
	scanf("%d", &choose);
	return (choose);
}

要想开始游戏就得有棋盘,那就写个函数来实现棋盘,刚开始棋盘上是没有棋子的哦,就初始化之,让棋盘为空。

//初始化
void InitBoard(char arr[ROW][COL], int row, int col) //产生一个3*3数组,初始化为空格。
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
			arr[i][j] = ' ';
	}
}
//显示棋盘
void DisplayBoard(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
		if (i != 2)
			printf("---|---|---\n");
	}
}

有了棋盘就可以开始下棋了,电脑又该如何走呢?电脑走需要让电脑产生随机坐标,然后在数组的这个坐标位置放入一个“X”作为电脑的棋子。

//电脑走
void ComputerMove(char arr[ROW][COL], int row, int col)
{
	printf("电脑下棋中!!!\n");
	srand((unsigned)time(NULL));//产生随机数
	while (1)
	{
			int x = rand() % 3;//对3取余赋给数组的下标
			int y = rand() % 3;
			if (arr[x][y] == ' ')
			{
				arr[x][y] = 'X';
				break;
			}
	}
	DisplayBoard(arr, ROW, COL);
}

电脑下完,就该人下了。

//人走
void PlayerMOve(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	do
	{
		printf("请输入你棋子的坐标>");
		scanf("%d%d", &x, &y);
		if ((x >= 1 && x <= row) && (y >= 1 && y <= col)) //人们不习惯(0,0)这个坐标,而是习惯输入(1,1)。
		{
			if (arr[x - 1][y - 1] == ' ')//再把传参减一
			{
				arr[x - 1][y - 1] = 'O';
				break;
			}
			else printf("你放到别人的棋子上了\n");
		}
		else printf(" 输入有误请重新输入>");
	} while (arr[x][y] == ' ');
	DisplayBoard(arr, ROW, COL);//显示棋盘
}
电脑和人都下完了,就要判断输赢了 。根据前面提到的规则,来写我们的判断函数。

//判断输赢
char IsWin(char arr[ROW][COL], int row, int col)
{
	int i;
	for (i = 0; i < row; i++)
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] )//判断列是否相同
		{
			if (arr[i][1] == 'X')
			{
				printf("你连电脑都打不过好菜!!!\n");
				return 1;
			}
				
			if (arr[i][1] == 'O')
			{
				printf("恭喜你你赢了!!!\n");
				return 1;
			}
		}
		
	}
	for (i = 0; i < col; i++)
	{
		if (arr[0][i] == arr[1][i] && arr[1][i] ==arr[2][i] )//判断行是否相同
		{
			if (arr[1][i] == 'X')
			{
				printf("你连电脑都打不过好菜!!!\n");
				return 1;
			}

			if (arr[1][i] == 'O')
			{
				printf("恭喜你你赢了!!!\n");
				return 1;
			}
		}
		
	}
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1])//判断左斜线是否相同
	{
		if (arr[1][1] == 'X')
		{
			printf("你连电脑都打不过好菜!!!\n");
			return 1;
		}

		if (arr[1][1] == 'O')
		{
			printf("恭喜你你赢了!!!\n");
			return 1;
		}
	}
	if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[1][1])//判断右斜线是否相同
	{
		if (arr[1][1] == 'X')
		{
			printf("你连电脑都打不过好菜!!!\n");
			return 1;
		}

		if (arr[1][1] == 'O')
		{
			printf("恭喜你你赢了!!!\n");
			return 1;
		}
	}
	else if (IsFull(arr, row, col))
	return 0;
}
由于可能出现棋盘下满,却没人获胜的情况, 所以我们需要在其中判断一下平局的情况,我们就写个IsFull函数来判断棋盘是否下满。
//判断棋盘是否下满
int IsFull(char arr[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
上面的都是零散的功能模块,如果要让整个程序正常运行起来,就把它们组合起来。
void Game()
{
	int i = 0;
	int ret = 0;
	char arr[ROW][COL];
	InitBoard(arr, ROW, COL);
	DisplayBoard(arr, ROW, COL);
	ret = IsWin(arr, ROW, COL);
	printf("请选择谁先走< 1.电脑先走  2.我先走 >");
	int choose;
	scanf("%d", &choose);
	if (choose == 2)
	{
		while (1)
		{
			PlayerMOve(arr, ROW, COL);
			ComputerMove(arr, ROW, COL);
			ret = IsWin(arr, ROW, COL);
			if (ret == 1)
				break;
		}
	}
	else if (choose == 1)
	{
		while (1)
		{
			ComputerMove(arr, ROW, COL);
			PlayerMOve(arr, ROW, COL);
			ret = IsWin(arr, ROW, COL);
			if (ret == 1)
				break;
		}
	}
	if (ret == 0)
	{
		printf("平局\n");
	}
}
把上边的这些函数都放在一个头文件里
# ifndef __SANZIQI_H__
# define __SANZIQI_H__
# define ROW 3
# define COL 3
//初始化
void InitBoard(char arr[ROW][COL], int row, int col);
//显示棋盘
void DisplayBoard(char arr[ROW][COL], int row, int col);
//电脑走
void ComputerMove(char arr[ROW][COL], int row, int col);
//人走
void PlayerMOve(char arr[ROW][COL], int row, int col);
//判断输赢
char IsWin(char arr[ROW][COL], int row, int col);
//判断棋盘是否下满
int IsFull(char arr[ROW][COL], int row, int col);
//游戏
void Game();
//菜单
int Menu();
# endif
最后再写个游戏测试部分
# include <stdio.h>
# include <stdlib.h>
# include "三子棋.h"

int main()
{
	int choose = 0;
	do
	{
		choose = Menu();
		switch(choose)
		{
		case 1:
			Game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入有误\n");
			break;
		}
	} while (choose);
	system("pause");
	return 0;
}








  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值