C语言-三子棋游戏代码+注释

这篇博客介绍了一个使用C语言编写的三子棋游戏。游戏规则是三子连珠获胜,玩家和电脑交替下棋。代码包括初始化棋盘、显示棋盘、玩家和电脑的移动以及判断输赢等功能。通过输入选择开始游戏或退出,游戏结束时会显示胜负结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三子棋

顾名思义三子相连则赢,反之则输

让我们用C代码来编写一个三子棋吧~

//头文件的包含 
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//符号的定义 
#define ROW 3
#define COL 3

//函数声明

void InitBoard(char board[ROW][COL],int row,int col);
//InitBoard函数 (初始化棋盘)
void DisplayBoard(char board[ROW][COL],int row,int col);
//DisplayBoard (打印棋盘) 
void PlayerMove(char board[ROW][COL],int row,int col);
//玩家走 
void ComputerMove(char board[ROW][COL],int row,int col);
//电脑走
char IsWin(char board[ROW][COL],int row,int col);
//判断输赢
 
void menu()
{
	printf("*******************************\n");
	printf("*************1.play************\n");
	printf("*************0.exit************\n");
	printf("*******************************\n");
}

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

void DisplayBoard(char board[ROW][COL],int row,int col)
{
	int i=0;
	for(i=0;i<row;i++)
	{
		int j=0;
		for(j=0;j<col;j++)
		{
			printf(" %c ",board[i][j]);	//每行每列打印数据
			if(j<col-1)
			{
				printf("|");	//在列数据之前打印'|'
			}
		}
		printf("\n");
		if(i<row-1)	
		{
			int j=0;
			for(j=0;j<col;j++)
			{
				printf("---");	
				if(j<col-1)
				{
					printf("|");
				}
			}
			printf("\n");
		
		}
	}
}
void PlayerMove(char board[ROW][COL],int row,int col)
{
	int x=0;
	int y=0;
	printf("玩家走:>\n");
	while(1)
	{
	printf("请输入下棋的坐标:>");
	scanf("%d %d",&x,&y);
	if(x>=1 && x<=row && y>=1 && y<=col) //条件要满足大于1且小于行数和列数 
	{
		if(board[x-1][y-1] == ' ')
		{
			board[x-1][y-1]='*';
			break;
		}
		else
		{
			printf("坐标被占用,请重新输入\n");
		}
	}
	else
	{
		printf("坐标非法,请重新输入\n");	
	}
	}
 
}
void ComputerMove(char board[ROW][COL],int row,int col)
{
	printf("电脑走:>\n");
	while(1)
	{
		int x=rand()%row;
		int y=rand()%col;
	
		//判断占用 
		if(board[x][y]==' ')
		{
			board[x][y]='#';
			break;
		}
	}
	
}
int IsFull(char board[ROW][COL],int row,int col)
{
	int i=0;
	int j=0;
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;i++)
		{
			if(board[i][j]==' ')
			{
				return 0;	//棋盘不满,含有空格 
			}
		}
	}
	return 1; //棋盘满了 
}
char IsWin(char board[ROW][COL],int row,int col)
{
	int i=0;
	//判断三行 
	for(i=0;i<row;i++)
	{
		if(board[i][0]==board[i][1] && board[i][1]==board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];	
		}
	}
	
	//判断三列 
	for(i=0;i<col;i++)
	if(board[0][i]==board[1][i] && board[1][i]==board[2][i] && board[i][1] != ' ')
	{
		return board[i][1];
	}
	
	//判断对角线 
	if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[1][1] != ' ') 
	{
		return board[1][1];
	} 
	if(board[0][2]==board[1][1] && board[1][1]==board[2][0] && board[1][1] != ' ') 
	{
		return board[1][1];
	} 
	
	//判断平局 
	//如果棋盘满了返回1,不满返回0  
	int ret=IsFull(board,row,col); 
	if(ret == 1)
	{
		return 'Q'; 
	}
	
	//继续
	return	'C'; 
}
void game()
{
	//存储数据 —二维数组
	char board[ROW][COL];
	//初始化棋盘 —初始化空格
	InitBoard(board,ROW,COL); 
	//打印棋盘 — 打印数组内容 
	DisplayBoard(board,ROW,COL); 
	char ret =0;//接受游戏状态 
	while(1)  
	{	
		//玩家下棋 
		PlayerMove(board,ROW,COL);
		DisplayBoard(board,ROW,COL);
		//判断玩家是否赢得比赛 
	 	ret = IsWin(board,ROW,COL); 
	 	if(ret != 'C')	//游戏继续 - 'C' 
	 	break;
		//电脑下棋
		ComputerMove(board,ROW,COL); 
		DisplayBoard(board,ROW,COL);
		//判断电脑是否赢得比赛 
		ret = IsWin(board,ROW,COL); 
		if(ret != 'C')
	 	break;
	}
	if(ret == '*')	//玩家赢了 - '*' 
	{
		printf("玩家赢了\n");
	}
	else if(ret == '#')	//电脑赢了 - '#'
	{
		printf("电脑赢了\n");
	}
	else	//平局 - 'Q'				
	{
		printf("平局\n");
	}
		DisplayBoard(board,ROW,COL);
}
int main()
{	
	int input=0;
	srand((unsigned int)time(NULL)); //时间戳 
	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;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHANGZH-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值