三子棋游戏 c程序实现

三子棋游戏实现步骤
用一个二维数组来表示棋盘(3*3),初始化打印为“ ”
用x表示玩家落子,用o表示电脑落子
玩家落子提示玩家输入一组坐标
电脑落子,随便找一个空格位置落子
判断:玩家胜利
电脑胜利
和棋
主程序步骤
先对棋盘进行初始化 Init(g_broad)
打印棋盘(初试棋盘全为空格)Print(g_broad)
玩家落子 检验游戏是否结束
电脑落子 检验游戏是否结束
循环执行第三部

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

#define ROW 3
#define COL 3

char g_broad[ROW][COL];

int Menu(int choice)
{
	int i;
	printf("======================\n");
	printf("1.play game\n");
	printf("2.exit game\n");
	printf("======================\n");
	printf("请输入你的选择:\n");
	scanf("%d", &i);
	return i;

}

void Init(char broad[ROW][COL])
{
	int row, col;
	for(row = 0; row < ROW; row++)
	{
		for(col = 0; col < COL; col++)
		{
			broad[row][col] = ' ';
		}
	}
}

void Print(char broad[ROW][COL])
{
	int row;
	for(row = 0; row < ROW; row++)
	{
		printf("| %c | %c | %c |\n", broad[row][0],
			broad[row][1], broad[row][2]);
		if(row < ROW -1)
		{
			printf(" ---|---|---\n");
		}
	}
}

void Playermove(char broad[ROW][COL])
{
	int row, col;
	printf("玩家落子!\n");
	while(1)
	{
		printf("请输入你要下的位置(row, col):\n");
		scanf("%d %d", &row, &col);
		if(row < 0 || row >= ROW || col < 0 || col >= COL)
		{
			printf("您输入的坐标非法,请您重新输入!\n");
			continue;
		}
		if(broad[row][col] != ' ')
		{
			printf("您输入的位置已经有子了,请重新输入!\n");
			continue;
		}
		broad[row][col] = 'x';
		break;
	}
}

void Computermove(char broad[ROW][COL])
{
	int row, col;
	printf("电脑落子!\n");
	while(1)
	{
		row = rand() % ROW;
		col = rand() % COL;
		if(broad[row][col] != ' ')
		{
			//重新输入
			continue;
		}
		broad[row][col] = 'o';
		break;
	}
}

int Isfull(char broad[ROW][COL])
{
	int row, col;
	for(row = 0; row < ROW; row++)
	{
		for(col = 0; col < COL; col++)
		{
			if(broad[row][col] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

char Checkwinner(char broad[ROW][COL])
{
	int row;
	int col;
	for(row = 0; row < ROW; row++)
	{
		//检查每行的相同
		if(broad[row][0] == broad[row][1]
		&& broad[row][0] == broad[row][2]
		&& broad[row][0] != ' ')
		{
			return broad[row][0];
		}
	}
	for(col = 0; col < COL; col++)
	{
		//检查每列的相同
		if(broad[0][col] == broad[1][col]
		&& broad[0][col] == broad[2][col]
		&& broad[0][col] != ' ')
		{
			return broad[0][col];
		}
	}
		//检查主对角线
	if(broad[0][0] == broad[1][1]
		&& broad[0][0] == broad[2][2]
		&& broad[0][0] != ' ')
		{
			return broad[0][0];
		}
		//检查从对角线
	if(broad[2][0] == broad[1][1]
		&& broad[2][0] == broad[0][2]
		&& broad[2][0] != ' ')
		{
			return broad[0][2];
		}
		//判断是否和棋 定义函数Isfull
	if(Isfull(broad))
		{
			return 'q';
		}
	else
		{
			return ' ';
		}
	
}

void Game()
{
	char winner = ' ';
	//随机种子的设置只需要程序启动的时候设置一次就好
	//srand((unsigned int)time(0));
	//对棋盘进行初始化
	Init(g_broad);
	
	while(1)
	{
		//打印棋盘
		Print(g_broad);
		//玩家落子
		Playermove(g_broad);
		//判断是否胜利,winner为‘x’玩家,‘o’电脑,‘q’和棋
		winner = Checkwinner(g_broad);
		if(winner != ' ')
		{
			break;
		}
		//电脑落子
		Computermove(g_broad);
		winner = Checkwinner(g_broad);
		if(winner != ' ')
		{
			break;
		}
	}

	Print(g_broad);

	if(winner == 'x')
	{
		printf("恭喜玩家胜利!\n");
	}
	else if(winner == 'o')
	{
		printf("很遗憾电脑胜!\n");
	}
	else if(winner == 'q')
	{
		printf("此局平局!\n");
	}
	else
	{
		printf("程序出错!\n");
	}
}

int main()
{
	int choice = 0;
	srand((unsigned int)time(0));
    //choice = Menu(choice);
	while(1)
	{
		choice = Menu(choice);
		if(choice == 1)
		{
			Game();
		}
		else
		{
			printf("goodbye!\n");
			break;
		}
	}
	system("pause");
	return 0;
}

运行结果演示:

在这里插入图片描述
在这里插入图片描述

再附上更改[row, col]之后的五子棋程序代码

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define ROW 5
#define COL 5

char g_broad[ROW][ROW];

int Mneu(int i)
{
	printf("==================\n");
	printf("1.PLAY GAME!\n");
	printf("2.EXIT GAME!\n");
	printf("==================\n");
	printf("请输入您的选择:");
	scanf("%d", &i);
	return i;
}

void Init(char broad[ROW][COL])
{
	memset(broad, ' ', ROW * COL);
	/*int row, col;
	for(row = 0; row < ROW; row++)
	{
		for(col = 0; col < COL; col++)
		{
			broad[row][col] = ' ';
		}
	}
	*/
}

void Print(char broad[ROW][COL])
{
	int row;
	for(row = 0; row < ROW; row++)
	{
		printf("| %c | %c | %c | %c | %c |\n", broad[row][0], 
			broad[row][1], broad[row][2], broad[row][3], broad[row][4]);
		if(row < ROW - 1)
		{
			printf("|___|___|___|___|___|\n");
		}
	}
}

void Playermove(char broad[ROW][COL])
{
	int row = 0;
	int col = 0;
	printf("玩家落子!\n");
	while(1)
	{
	    printf("请输入您要下的位置:");
	    scanf("%d %d", &row, &col);
	    if(row < 0 || row >= ROW || col < 0 || col >= COL)
		{
			printf("您的输入非法!请重新输入:");
			continue;
		}
		if(broad[row][col] != ' ')
		{
			printf("此位置已经有子了!请您重新输入:");
			continue;
		}
		broad[row][col] = 'x';
		break;
	}
}

void Computermove(char broad[ROW][COL])
{
	int row = 0;
	int col = 0;
	printf("电脑落子!\n");
	while(1)
	{
		row = rand() % ROW;
		col = rand() % COL;
		if(broad[row][col] != ' ')
		{
			continue;
		}
		broad[row][col] = 'o';
		break;
	}
}

int Isfull(char broad[ROW][COL])
{
	int row = 0;
	int col = 0;
	for(row = 0; row < ROW; row++)
	{
		for(col = 0; col < COL; col++)
		{
			if(broad[row][col] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

char Checkwinner(char broad[ROW][COL])
{
	int row;
	int col;
	for(row = 0; row < ROW; row++)
	{
		if(broad[row][0] == broad[row][1] 
		&& broad[row][0] == broad[row][2]
		&& broad[row][0] == broad[row][3]
		&& broad[row][0] == broad[row][4]
		&& broad[row][0] != ' ')
		{
			return broad[row][0];
		}
	}
	for(col = 0; col < COL; col++)
	{
		if(broad[0][col] == broad[1][col] 
		&& broad[0][col] == broad[2][col]
		&& broad[0][col] == broad[3][col]
		&& broad[0][col] == broad[4][col]
		&& broad[0][col] != ' ')
		{
			return broad[0][col];
		}
	}
	if(broad[0][0] == broad[1][1] 
	&& broad[0][0] == broad[2][2]
	&& broad[0][0] == broad[3][3]
	&& broad[0][0] == broad[4][4]
	&& broad[0][0] != ' ')
	{
		return broad[0][0];
	}
	if(broad[4][0] == broad[3][1] 
	&& broad[4][0] == broad[2][2]
	&& broad[4][0] == broad[1][3]
	&& broad[4][0] == broad[0][4]
	&& broad[4][0] != ' ')
	{
		return broad[4][0];
	}
	if(Isfull(g_broad))
	{
		return 'q';
	}
	else
	{
		return ' ';
	}
}

void Game()
{
	char winner = ' ';
	clock_t start, finish;
	start = clock();
	srand((unsigned int)time(0));
	Init(g_broad);
	while(1)
	{
		Print(g_broad);
		Playermove(g_broad);
		winner = Checkwinner(g_broad);
		if(winner != ' ')
		{
			break;
		}
		Computermove(g_broad);
		winner = Checkwinner(g_broad);
		if(winner != ' ')
		{
			break;
		}
	}
	Print(g_broad);
	finish = clock();
	if(winner == 'x')
	{
		printf("恭喜玩家胜利!\n");
	}
	else if(winner == 'o')
	{
		printf("很遗憾!居然让傻子电脑赢了!\n");
	}
	else if(winner == 'q')
	{
		printf("此局平局!\n");
	}
	else
	{
		printf("抱歉!程序出错!\n");
	}
	printf("总共用时:%d秒\n", (int) (finish - start) / CLOCKS_PER_SEC );
}

int main()
{
	int choice = 0;
	while(1)
	{
		choice = Mneu(choice);
		if(choice == 1)
		{
			Game();
		}
		else
		{
			printf("byebye!\n");
			break;
		}
	}
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值