C语言实现三子棋

       构建三子棋需要做的基本操作就是主函数,下面就是三子棋的框架,玩游戏的都知道游戏的开始就是菜单,所以菜单得先执行一次就用do...while循环其次就是想接着玩可以继续也可以退出。

//三子棋的主函数


int main()
{
	int input = 0;
	do
	{
        menu();//游戏菜单
	    printf("请输入你的选择:");
	    scanf("%d", &input);
		switch (input)//选择后出现的情况
		{
		case 1:
			game();//进入游戏
			break;
		case 0:
			printf("退出程序!");
			break;
		default:
			printf("选择错误!请重新输入");
			break;
		}

	} while(input);
	return 0;
}

       下面菜单的内容

//菜单


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

       接下来就是三子棋的实现了

1.初始化:设置棋盘大小为三行三列,初始化棋盘为空,并设定玩家(X或O)

2.选择:玩家先走还是电脑先走

3.移动:对选择进行移动,选择玩家则玩家先移动,反之电脑先移动,并且打印下完后的棋盘。

4.判断:无论是玩家还是电脑每下完一次都需要进行判断是否赢,其次就是看棋盘是否满,没满且没赢则继续下棋,直至棋盘满或一方赢则游戏结束

初始化棋盘

       棋盘可以想象成一个二维数组,初始化就是‘ ’(空格),没有任何什么棋子即未落子时。

void Init_Chess(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}
建立棋盘

       这个棋盘有局限性,仅限于三子棋盘,当然也可以写一个通用代码,这里我就不在展示了。

void Print_Chess(char arr[ROW][COL])
{
	printf("   1   2   3 \n");
	printf(" |---|---|---|\n");
	printf("1| %c | %c | %c |\n", arr[0][0], arr[0][1], arr[0][2]);
	printf(" |---|---|---|\n");
	printf("2| %c | %c | %c |\n", arr[1][0], arr[1][1], arr[1][2]);
	printf(" |---|---|---|\n");
	printf("3| %c | %c | %c |\n", arr[2][0], arr[2][1], arr[2][2]);
	printf(" |---|---|---|\n");
}

选择先落子一方 

       由玩家选择先下棋一方,选择1或0。

int First_Decide()
{
	int i = 0;
	printf("请选择(1.玩家 0.电脑):");
	scanf("%d", &i);
	return i;
}

移动

 假设电脑先移动

       电脑随即产生一个行及列构成一个坐标下棋,如果下的这个位置本身有棋子,则继续下棋,直至电脑占领一个位置就停止,其后就是打印电脑下棋后的棋盘。和之前的猜数字游戏一个原理,都是电脑随机产生。

void Computer_Chess(char arr[ROW][COL], int row, int col)
{
	printf("电脑下棋:\n");
	while (1)
	{
		srand((unsigned int)time(NULL));
		row = rand() % row ;//行  电脑随机选取[0,2]
		col = rand() % col ;列
		if (arr[row][col] == ' ')
		{
			arr[row][col] = 'O';
			break;
		}
	}
}
假设玩家先移动 

       玩家输入一个位置,位置为空则占领成功,相反已被占领的位置不能再占领需要重新输入位置占领,还有一种情况就是玩家输入错误,超过了3X3的棋盘,则提醒玩家位置不存在需要重新输入,其后则打印玩家下完后的棋盘。

void Player_Chess(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("请玩家输入你想要下的位置:");
	scanf("%d,%d", &x, &y);
	if (x > 0 && x <= row && y>0 && y <= col)
	{
		if (arr[x - 1][y - 1] == ' ')
		{
			arr[x - 1][y - 1] = 'X';
            break;
		}
		else
			printf("已被占领,请重新输入\n");
	}
	else
	{
		printf("选择位置不存在!请重新输入\n");
	}
}

判断

       接下来就是判断了,每次一方下完棋都需要判断是否赢。分三种情况:

1.某方赢了( 玩家赢或电脑赢)

     三子棋顾名思义就是三个子相连,现在讨论赢家的所有情况又分三种:

一行三个全部相同,有三行。

for (i = 0; i < row; i++)//行
{
	if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
		return arr[i][0];
}

一列三个全部相同,有三列。

for (j = 0; j < col; j++)//列
{
	if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[1][j] != ' ')
		return arr[1][j];
}
对角线

对角线相同,有两条。

//两条对角线
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
	return arr[0][0];
if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[1][1] != ' ')
	return arr[1][1];
2.棋盘满了(双方平局)

运用两层循环,找棋盘中是否还可以下棋的位置,如若没有则双方平局。

3.棋盘未满(继续下棋)

若有,则继续下棋。

int Is_Full(char arr[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 (arr[i][j] == ' ')
				return 0;//棋盘未满,有位置下棋
		}
	}
	return 1;//棋盘已满
}
int temp = Is_Full(arr, ROW, COL);
if (temp==1)
	return 'Q';
else
	return 'C';

最后就是打印结果了

void game()
{
	char arr[ROW][COL] = { 0 };//建立一个二维数组
	char ret = '0';
	Init_Chess(arr, ROW, COL);//初始化棋盘
	Print_Chess(arr);//打印棋盘
	int first = First_Decide();//选择先下棋的对象
	while (1)
	{
		if (first)//这个和first!=0等价
		{
			Player_Chess(arr, ROW, COL);
			Print_Chess(arr);
			ret = Is_Win(arr, ROW, COL);
			//judge(ret);
			if (ret != 'C')
				break;
			Computer_Chess(arr, ROW, COL);
			Print_Chess(arr);
			ret = Is_Win(arr, ROW, COL);
			if (ret != 'C')
				break;
		}
		else
		{
			Computer_Chess(arr, ROW, COL);
			Print_Chess(arr);
			ret = Is_Win(arr, ROW, COL);
			if (ret != 'C')
				break;
			Player_Chess(arr, ROW, COL);
			Print_Chess(arr);
			ret = Is_Win(arr, ROW, COL);
			if (ret !='C')
				break;
		}
	}
	if (ret == 'X')
		printf("玩家胜利!\n");
	else if (ret == "O")
		printf("电脑胜利!\n");
	else
		printf("平局!\n");
}

以上就是整个代码的分解过程了。

    全部代码发到下面了。

#include "chess.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

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

void Init_Chess(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

void Print_Chess(char arr[ROW][COL])
{
	printf("   1   2   3 \n");
	printf(" |---|---|---|\n");
	printf("1| %c | %c | %c |\n", arr[0][0], arr[0][1], arr[0][2]);
	printf(" |---|---|---|\n");
	printf("2| %c | %c | %c |\n", arr[1][0], arr[1][1], arr[1][2]);
	printf(" |---|---|---|\n");
	printf("3| %c | %c | %c |\n", arr[2][0], arr[2][1], arr[2][2]);
	printf(" |---|---|---|\n");
}

int First_Decide()
{
	int i = 0;
	printf("请选择(1.玩家 0.电脑):");
	scanf("%d", &i);
	return i;
}

void Player_Chess(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请玩家输入你想要下的位置:");
		scanf("%d,%d", &x, &y);
		if (x > 0 && x <= row && y>0 && y <= col)
		{
			if (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = 'X';
				break;
			}
			else
				printf("已被占领,请重新输入\n");
		}
		else
		{
			printf("选择位置不存在!请重新输入\n");
		}
	}
}

void Computer_Chess(char arr[ROW][COL], int row, int col)
{
	printf("电脑下棋:\n");
	while (1)
	{
		srand((unsigned int)time(NULL));
		row = rand() % row + 1;
		col = rand() % col + 1;
		if (arr[row - 1][col - 1] == ' ')
		{
			arr[row - 1][col - 1] = 'O';
			break;
		}
	}
}

int Is_Full(char arr[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 (arr[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

char Is_Win(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)//行
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
			return arr[i][0];
	}
	for (j = 0; j < col; j++)//列
	{
		if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[1][j] != ' ')
			return arr[1][j];
	}
	//两条对角线
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
		return arr[0][0];
	if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[1][1] != ' ')
		return arr[1][1];
	//棋盘是否满
	int temp = Is_Full(arr, ROW, COL);
	if (temp==1)
		return 'Q';
	else
		return 'C';
}

//judge(char ret)
//{
//	if (ret == 'X')
//		printf("玩家胜利!\n");
//	else
//		if (ret == "O")
//			printf("电脑胜利!\n");
//		else
//
//}

void game()
{
	char arr[ROW][COL] = { 0 };//建立一个二维数组
	char ret = '0';
	Init_Chess(arr, ROW, COL);//初始化棋盘
	Print_Chess(arr);//打印棋盘
	int first = First_Decide();//选择先下棋的对象
	while (1)
	{
		if (first)//这个和first!=0等价
		{
			Player_Chess(arr, ROW, COL);
			Print_Chess(arr);
			ret = Is_Win(arr, ROW, COL);
			//judge(ret);
			if (ret != 'C')
				break;
			Computer_Chess(arr, ROW, COL);
			Print_Chess(arr);
			ret = Is_Win(arr, ROW, COL);
			if (ret != 'C')
				break;
		}
		else
		{
			Computer_Chess(arr, ROW, COL);
			Print_Chess(arr);
			ret = Is_Win(arr, ROW, COL);
			if (ret != 'C')
				break;
			Player_Chess(arr, ROW, COL);
			Print_Chess(arr);
			ret = Is_Win(arr, ROW, COL);
			if (ret !='C')
				break;
		}
	}
	if (ret == 'X')
		printf("玩家胜利!\n");
	else
		if (ret == "O")
			printf("电脑胜利!\n");
		else
			printf("平局!\n");
}


int main()
{
	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;
}

  • 55
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 38
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值