三子棋

 在三子棋游戏中,首先输出一个菜单,供玩家选择进行游戏或是退出游戏

游戏规则:

'o'代表玩家落子(玩家落子从键盘输入对应的坐标)

'#'代表电脑落子(电脑落子随机生成)

在一个3*3的棋盘中,当玩家的棋子在一行、一列或对角线上连成一条线时,则玩家胜利,同理,则是电脑胜利

如果棋盘上的棋子落满时。还没有分出胜负,则是平局

玩家输入错误时,可以重新输入

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define row 3
#define clo 3
#define m 2
#define n 0
void menu()    //打印菜单
{
	printf("**********三子棋游戏**********\n");
	printf("**********0-开始游戏**********\n");
	printf("**********1-退出游戏**********\n");
}
void chessboard(char arr[row][clo])       //打印棋盘并初始化
{
	
		printf("-------------\n");
		printf("| %c | %c | %c |\n", arr[0][0], arr[0][1], arr[0][2]);
	    printf("-------------\n");
		printf("| %c | %c | %c |\n", arr[1][0], arr[1][1], arr[1][2]);
		printf("-------------\n");
		printf("| %c | %c | %c |\n", arr[2][0], arr[2][1], arr[2][2]);
		printf("-------------\n");
}
void player(char arr[row][clo])   //玩家落子
{
	int i = 0, j = 0;
	
		printf("请输入您想要落子的坐标");
			scanf_s("%d %d",&i,&j );
			if (i < 0 || i>2 || j < 0 || j>2 || arr[i][j] != ' ')//输入不符合要求或是要落子的地方已经有棋,则显示输入有误
			{
				printf("您的输入有误,请重新输入:");
				scanf_s("%d %d", &i, &j);
			}
			   
				if (arr[i][j] == ' ')//arr[i][j]这里应该用i,j,之前是arr[row][clo],结果输入坐标之后的棋盘只是一张空棋盘并没有o
				{
				arr[i][j] = 'o'; //用o替换掉棋盘中原来的空格
				chessboard(arr);//打印落子之后的棋盘
				}                 
		
}
void computer(char arr[row][clo])//电脑落子
{
	srand ( time(0));
	int x = rand() % (m - n + 1) + n;
	int y = rand() % (m - n + 1) + n;//生成0-2的随机数
		printf("电脑开始落子!\n");
		while (arr[x][y] != ' ')//当随机生成的坐标不为空格时,继续生成随机数,将子落在是空格的地方
		{
			x = rand() % (m - n + 1) + n;
			y = rand() % (m - n + 1) + n;
		}
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '#';
			chessboard(arr);
		}
}
int check(char arr[row][clo])//判断谁是赢家
{
	int i = 0, j = 0;
	int count = 0;//计算不是空格的数量
	if (((arr[0][0] == arr[0][1]) && (arr[0][1] == arr[0][2]) && (arr[0][2] == 'o'))         //当一行或一列或斜角线的o连成3个时,则玩家胜
		|| ((arr[1][0] == arr[1][1]) && (arr[1][1] == arr[1][2]) && (arr[1][2] == 'o'))
		|| ((arr[2][0] == arr[2][1]) && (arr[2][1] == arr[2][2]) && (arr[2][2] == 'o'))
		|| ((arr[0][0] == arr[1][0]) && (arr[1][0] == arr[2][0]) && (arr[2][0] == 'o'))
		|| ((arr[0][1] == arr[1][1]) && (arr[1][1] == arr[2][1]) && (arr[2][1] == 'o'))
		|| ((arr[0][2] == arr[1][2]) && (arr[1][2] == arr[2][2]) && (arr[2][2] == 'o'))
		|| ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'o'))
		|| ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'o')))
		return 1;//返回game并输出玩家胜利
	if (((arr[0][0] == arr[0][1]) && (arr[0][1] == arr[0][2]) && (arr[0][2] == '#'))             //当一行或一列或斜角线的#连成3个时,则电脑胜
		|| ((arr[1][0] == arr[1][1]) && (arr[1][1] == arr[1][2]) && (arr[1][2] == '#'))
		|| ((arr[2][0] == arr[2][1]) && (arr[2][1] == arr[2][2]) && (arr[2][2] == '#'))
		|| ((arr[0][0] == arr[1][0]) && (arr[1][0] == arr[2][0]) && (arr[2][0] == '#'))
		|| ((arr[0][1] == arr[1][1]) && (arr[1][1] == arr[2][1]) && (arr[2][1] == '#'))
		|| ((arr[0][2] == arr[1][2]) && (arr[1][2] == arr[2][2]) && (arr[2][2] == '#'))
		|| ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == '#'))
		|| ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == '#')))
		return 2;//返回game并输出电脑胜利
	for (i=0,j = 0; j<3,j < 3;i++, j++)
	{
		if (arr[i][j] != ' ')
			count++;
	}
	if (count == 9)
		printf("平局");
}
void game(char arr[row][clo])//开始游戏
{
	  system("cls");
      chessboard(arr);//打印棋盘并初始化棋盘
      printf("请玩家先开始!\n");
      while (1)
         {
	           player(arr);//玩家落子
	           computer(arr);//电脑落子
			   check(arr);//判断谁是赢家
			   if ((check(arr)) == 1)
			   {
				   printf("恭喜玩家胜利!\n");
				   break;
			   }
			   if ((check(arr)) == 2)
			   {
				   printf("电脑胜利!\n");
				   break;
			   }
          }

}
int main()
{
	int i = 0, j = 0;
	char arr[row][clo] = { { ' ', ' ', ' ' }, { ' ', ' ', ' ' }, { ' ', ' ', ' ' } };//棋盘初始化利用二维数组初始化
	int a = 0;
	menu();//打印菜单
	printf("请输入您的选择!");
	scanf_s("%d", &a);
	if (a == 0)                 //玩家选择0之后,开始游戏
	{
		game(arr);
	}
	else                       //玩家选择1之后,退出游戏
	{
		system("cls");
		printf("您已经退出游戏!\n");
	}
	system("pause");
	return 0;
}

1.菜单界面 

 

.2.开始游戏

 3.电脑胜利

 

4.玩家胜利

 

5.输入有误

6.退出游戏

 

 自己玩了几局,很难出现平局 

还有这个代码自己虽然能理清思路,但总觉得太过于繁琐,期待在后序的学习中,能将其优化!

ヾ(◍°∇°◍)ノ゙

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值