三子棋游戏

大家都玩过五子棋,其实三子棋与五子棋是一样的,只是棋子的数量不同而已。

先定义两个常量  #define ROW 3       #define COL 3

1.先对棋盘进行初始化,每个没有落子的位置都是空格,所以可以用空格赋值给当前位置的字符。

void init()//棋盘初始化
{
    for (int row = 0; row < ROW; row++)
    {
        for (int col = 0; col < COL;col++)
            g_board[row][col]=' ';
    }
}

2.打印棋盘,打印一个九宫格,并用for循环把初始化的空格字符赋值给给九宫格中的空格。

void print()//打印棋盘
{
    printf("\t\t\t\t ___ ___ ___ \n");
    for (int row= 0; row< ROW; row++)
    {
        printf("\t\t\t\t| %c | %c | %c |\n", g_board[row][0],g_board[row][1],g_board[row][2]);
        printf("\t\t\t\t|___|___|___|\n");
    }
}
3.打印完棋盘就开始游戏

(1)提示玩家落子=>玩家输入坐标=>判断坐标是否合法=>判断坐标位置是否为空格=>判断是否平局,判断是否结束游戏

两种情况:如果不是空格,说明输入位置已经有子,需重新输入坐标。

                  如果为空格,就把该位置赋值为X,作为玩家落的子,就判断是否平局(没有空格则平局),在判断是否连成线,连城线,玩家胜,游戏结束,如果没有连成线,然后提示电脑落子

(2)电脑随机产生两个[0,2]的整数作为电脑落子的位置坐标=>判断落子位置是否为空格,如果为空格则重新产生两个数作为坐标,否则 就将“o”赋值给这个位置,判断是否为平局,是否结束游戏。

(3)如果检查后发现电脑赢了或者平局,就退出游戏,否则提示玩家落子,就到了第一步。

print();
        playmove();
        print();
        winner=checkwinner();
        if (winner != ' ')
            break;
        computermove();
        winner=checkwinner();
        if (winner != ' ')
            break;
    }    
    if (winner == 'X')
    {
        print();
        printf("                 \t恭喜您赢了!!!\n");
    }
    else if (winner == 'C')
    {
        print();
        printf("          \t  很遗憾您输了!!!\n");
    }
    else 
    {
        print(); 
        printf("                 \t和棋\n");
    }

需要定义一个checkwinner函数,来判断是否结束游戏。

判断输赢的函数,需要从所有的行、列、斜线检查,是否连成一条线,根据空格的数量判断是否平局。

         //winner=='x' 玩家胜
        //winner=='o' 电脑胜
        //winner==' '胜负未定continue到while语句
        //else 和棋

完整代码如下:

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

#define ROW 3
#define COL 3

char g_board[ROW][COL];//定义全局变量

void init()//棋盘初始化
{
	for (int row = 0; row < ROW; row++)
	{
		for (int col = 0; col < COL;col++)
			g_board[row][col]=' ';
	}
}

void print()//打印棋盘
{
	printf("\t\t\t\t ___ ___ ___ \n");
	for (int row= 0; row< ROW; row++)
	{
		printf("\t\t\t\t| %c | %c | %c |\n", g_board[row][0],g_board[row][1],g_board[row][2]);
		printf("\t\t\t\t|___|___|___|\n");
	}
}

void playmove()//玩家落子
{
	printf("请玩家落子!\n");
	printf("请玩家输入落子的位置坐标:(row col)");
	while (1)
	{
		int row; int col;
		scanf_s("%d %d", &row, &col);
		if (row < 0 || row >= ROW || col < 0 || col >= COL)
		{
			printf("坐标位置非法,请重新输入:(row col)");
			continue;
		}
		if (g_board[row][col] !=' ')
		{
			printf("该位置已落子,请重新输入:(row col)");
			continue;
		}
		g_board[row][col] = 'X';
		break;
	}
}

void computermove( )//电脑落子
{
	printf("别着急,我正在思考!\n");
	while (1)
	{
		int row = rand() % ROW;
		int col = rand() % COL;
		if (g_board[row][col] != ' ')
		{
			continue;
		}
		g_board[row][col] = 'C';
		printf("我落子的位置为(%d %d)\n", row, col);
		break;
	}
}

char checkwinner()//判断输赢,检查所有的行、列、斜线方向
{
	for (int row = 0; row < ROW; row++)//检查所有的行
	{
		if (g_board[row][0] == g_board[row][1] &&
			g_board[row][1] == g_board[row][2] &&
			g_board[row][0] != ' ')
		{
			return g_board[row][1];
		}
	}
	for (int col = 0; col < COL; col++)//检查所有的列
	{
		if (g_board[0][col] == g_board[1][col] &&
			g_board[1][col] == g_board[2][col] &&
			g_board[1][col] != ' ')
		{
			return g_board[1][col];
		}
	}
	if (g_board[0][0] == g_board[1][1] &&
		g_board[2][2] == g_board[1][1]&&
		g_board[0][0] !=0)//检查两条对角线
		return g_board[1][1];
	if (g_board[0][2] == g_board[1][1] &&
		g_board[2][0] == g_board[1][1] &&
		g_board[1][1] != 0)//检查两条对角线
		return g_board[1][1];
	//判断胜负未定情况:有空格,胜负未定
	for (int row = 0; row < ROW; row++)
	{
		for (int col = 0; col < COL; col++)
		{
			if (g_board[row][col] == ' ')
			{
				return ' ';
			}
		}
	}
}
int main()
{
	srand((unsigned int)time(0));
	printf("\n\n");
	init();
	char winner;
	while (1)
	{ 
		//winner=='x' 玩家胜
		//winner=='o' 电脑胜
		//winner==' '胜负未定continue到while语句
		//else 和棋
		print();
		playmove();
		print();
		winner=checkwinner();
		if (winner != ' ')
			break;
		computermove();
		winner=checkwinner();
		if (winner != ' ')
			break;
	}	
	if (winner == 'X')
	{
		print();
		printf("                 \t恭喜您赢了!!!\n");
	}
	else if (winner == 'C')
	{
		print();
		printf("          \t  很遗憾您输了!!!\n");
	}
	else 
	{
		print(); 
		printf("                 \t和棋\n");
	}
	printf("\n\n");
	system("pause");
	return 0; 
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值