首页 > 其他分享 >C语言实现井字棋

C语言实现井字棋

时间:2023-12-30 21:33:50浏览次数:34  
标签:char 实现 C语言 井字棋 int board printf COL ROW

首先简述一下:九宫格的棋盘,连成三个连续的即为胜

现在拆分三子棋的步骤

(1)打印菜单,1开始 0退出

(2)初始化棋盘

(3)打印棋盘

(4)玩家下棋,子为’*’

(5)判断

(6)电脑下棋,为‘#’

(7)判断

(8)返回步骤三

现在分析过后,对其进行编写

写game.h(头文件) game.c(游戏主体,函数文件)  test.c(测试)

我们创建的棋盘大致为

C语言实现井字棋_循环

下边先写game.h

#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 

void InitBoard(char board[ROW][COL],int row,int col);
void DisplayBoard(char board[ROW][COL],int row,int col);
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);

game.c

#include<stdio.h>
#include"game.h"

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)
		{
			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)
		{
			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)
{
	int x=0;
	int y=0;
	printf("电脑走:>\n");
	while(1)
	{
		x=rand()%row;
		y=rand()%col;
		if(board[x][y]==' ')
		{
			board[x][y]='#';
			break;		
		}	
	}
}
//判断是否下满
//下满则返回1,为判断是否平局
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;j++)
		{
			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[1][i]!=' ')
			return board[1][i];
	}
  //对角线
	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];
	if(IsFull(board,ROW,COL)==1)
	{
		return 'Q';
	}
	return 'c';

}

test.c

#include"game.h"
#include <unistd.h>
//菜单
void menu()
{
	printf("******************************\n");
	printf("*****play:1   not play:0 *****\n");
	printf("******************************\n");
}



//游戏过程
void game()
{	
	char ret = 0;
	char board[ROW][COL]={0};
	InitBoard(board,ROW,COL);
	DisplayBoard(board,ROW,COL);
	while(1)
	{
		PlayerMove(board,ROW,COL);
		system("cls");
		DisplayBoard(board,ROW,COL);
		ret=IsWin(board,ROW,COL);
		if(ret!='c')
		{
			break;	
		}
		ComputerMove(board,ROW,COL);
		sleep(1);
		system("cls");
		DisplayBoard(board,ROW,COL);
		ret=IsWin(board,ROW,COL);
		if(ret!='c')
		{
			break;
		}
    }
	if(ret=='*')
		printf("玩家胜!\n");
	else if(ret=='#')
		printf("电脑胜!\n");
	else
		printf("平局\n");
	sleep(2);
	system("cls");
}



void test()
{
	int input=0;
	srand((unsigned int)time(NULL));//为给电脑提供随机数字的准备
	do 
	{
		menu();
		printf("请选择:>");
	    scanf("%d",&input);
		switch(input)
		{
			case 1:
				system("cls");
				printf("三子棋开始\n");
				game();
				break;
			case 0:
				printf("游戏结束\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		} 
	
	}
	while(input);
}

int main( ) 
{
	test();
	return 0;
}

现在井字棋已经实现了

如有错误,请指出,也欢迎讨论


标签:char,实现,C语言,井字棋,int,board,printf,COL,ROW
From: https://blog.51cto.com/u_16298371/9041955

相关文章

  • 大数据分析与可视化 之 实验10 Pandas实现数据分析
    实验10Pandas实现数据分析实验学时:2学时实验类型:验证实验要求:必修一、实验目的掌握Pandas的字符串函数。掌握Pandas统计汇总函数。掌握Pandas排序、分组、合并与级联函数。能利用上述函数进行综合数据分析。二、实验要求通过编程实现使用Pandas字符串函数进行文本......
  • 大数据分析与可视化 之 实验03 Numpy实现数据分析
    实验03Numpy实现数据分析实验学时:2学时实验类型:验证实验要求:必修一、实验目的掌握Numpy的字符串函数掌握Numpy统计函数掌握Numpy排序、分组、线性代数函数二、实验要求通过编程实现使用Numpy字符串函数进行文本处理,使用统计函数进行数据分析等常用操作。三、实验内......
  • 用滚轮实现文字的适应
    用滚轮实现文字的适应<!DOCTYPEhtml><html><head><title>页面标题</title><style> #model{ width:30%;height:300px;overflow-y:scroll;background:yellow;}::-webkit-scrollbar{ display:none;......
  • 12PCIE实现同屏输出到HDMI显示器
    软件版本:vitis2021.1(vivado2021.1)操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!12.1概述和前面关于"PCIE图片输出到HDMI显示器"的内容基本一致,本方案通过上位机的抓屏功能,把屏幕的图像数据实时发送......
  • 《图解支付系统设计与实现》之基本概念与设计概要
    这是《图解支付系统设计与实现》系列文章的第一篇。本系列文章是偏实战的,本章内容讲清楚支付系统是什么,主要解决什么问题,部分核心流程,以及一些后面会频繁使用到的术语。至于支付起源,在线支付发展历程等知识,感兴趣的同学可以参考网络上其它文章或书籍。欢迎转载转发,转载请注明出处。......
  • 《图解支付系统设计与实现》之详解收单结算拒付
    这是《图解支付系统设计与实现》系统文章中的第(2)篇。本章主要讲清楚支付系统中收单结算涉及的基本概念,产品架构、系统架构,以及一些核心的流程和相关领域模型、状态机设计,并顺便讲讲和收单结算非常紧密的拒付。收单结算是支付系统最重要的子域之一,行业内经常把有牌照的支付平台称为......
  • 脚本简单实现粒子系统的一些功能
    明明有粒子系统了为什么还要用脚本来模拟呢?当然是存在一些特殊情况钻了粒子系统的死角,无法使用粒子,所以才会使用,例如UI1,曲线类——通常最常见的情况就是需要通过曲线来控制某个值,达到类粒子系统的效果,下面是一段伪代码示例publicclassTest:MonoBehaviour{publicAnim......
  • MySQL索引的实现
    1、MySQL索引的实现原理:索引本质上就是一种通过减少查询需要遍历行数,加快查询性能的数据结构,避免数据库进行全表扫描,好比书的目录,让你更快的找到内容。(一个表最多16个索引)1.1、索引的优缺点:(1)索引的优点:减少查询需要检索的行数,加快查询速度,避免进行全表扫描,这也是创建索引的最主要的......
  • 在Vue3中实现前端导出Excel功能
    在Vue3中,可以使用第三方库如xlsx来导出Excel文件。以下是一个基本示例:一、Vue3常规写法安装xlsx库首先,你需要安装xlsx库。使用以下命令进行安装:npminstallxlsx导入函数在Vue组件中,导入所需的函数:import{writeFile}from'xlsx';创建模拟数据创建一个函数来生成Excel文件的数......
  • C语言小案例
    二维数组输出题目描述:输入一个整数N,输出一个N行N列的二维矩阵,矩阵中的元素用\1~N*N顺序螺旋填充。输入格式一个整数N(N<=10)输出格式输出N行N列的矩阵,元素之间用一个空格隔开,行末不要有多余的空格。样例输入数据3输出数据123894765代码示例如下:#include<stdio.h>voids......