首页 > 其他分享 >三子棋的实现

三子棋的实现

时间:2023-08-11 20:00:58浏览次数:38  
标签:实现 三子 char int board printf COL ROW

1.game.h头文件

#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//初始化棋盘
void init(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);

2.test.c源文件

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

void game()
{
	char ret=0;
	char board[ROW][COL]={0};
	//初始化棋盘的函数
	init(board,ROW,COL);
	displayboard(board,ROW,COL);//打印棋盘
	//下棋
	while(1)
	{
		
	   playermove(board,ROW,COL);
       //判断输赢
        ret=iswin(board,ROW,COL);
		if(ret!='!')
		 {
		   break;
		 }	 
	   displayboard(board,ROW,COL);
	   computermove(board,ROW,COL);
       //判断输赢
	   ret=iswin(board,ROW,COL);
	   if(ret!='!')
		 {
		   break;
		 } 
	   displayboard(board,ROW,COL);	 	    
	}
	if(ret=='*')
	   {
		   printf("玩家赢\n");
		   displayboard(board,ROW,COL);
	   }
	   else if(ret=='#')
	   {
		   printf("电脑赢\n");
		   displayboard(board,ROW,COL);
	   }
	   else
	   {
		   printf("平局\n");
	   }  
	  
}
int main()
{	
	int i=0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//打印菜单
		printf("请输入:");
		scanf("%d",&i);
		switch(i)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,重新输入\n");
			break;
		}
	}while(i);
	return 0;
}


3.game.c源文件

#include"game.h"
void init(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;
	int j=0;
	for(i=0;i<row;i++)
	{
		//打印数据
		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("玩家下棋:");
	while(1)
	{
		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;
		}
	}
}


int is_full(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;
	int j=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];
		}
		//列
		if(board[0][j]==board[1][j]&&board[1][j]==board[2][j]&&board[0][j]!=' ')
		{
			return board[1][j];
		}
		//对角线
		if(board[0][0]==board[1][1]&&board[1][1]==board[2][2]&&board[0][0]!=' ')
		{
			return board[1][1];
		}
		if(board[0][2]==board[1][1]&&board[1][1]==board[2][0]&&board[0][2]!=' ')
		{
			return board[1][1];
		}
	}
	//没人赢,平局
	if(is_full(board,row,col))
	{
		return '~';
	}
	//继续
	return '!';
}


标签:实现,三子,char,int,board,printf,COL,ROW
From: https://blog.51cto.com/u_16190077/7051952

相关文章

  • Flutter实现将base64解码为image格式,并展示到页面上
    在Flutter中,你可以使用Image.memory来将Base64解码为图像并将其显示在页面上。下面是一个将Base64解码为图像并展示的示例代码:import'dart:convert';import'package:flutter/material.dart';classBase64ImageextendsStatelessWidget{finalStringbase64String;Bas......
  • 王道408---冒泡排序、快速排序、直接插入排序、希尔排序、二路归并排序、简单选择排序
    一、冒泡排序冒泡排序属于交换类的排序//时间复杂度:O(n^2)//空间复杂度:O(1)//稳定排序算法#include<stdio.h>#include<iostream>usingnamespacestd;intarr[16];voiddebug(){for(inti=1;i<16;i++){printf("%d",arr[i]);}puts("......
  • 开启想象翅膀:轻松实现文本生成模型的创作应用,支持LLaMA、ChatGLM、UDA、GPT2等模型,开
    开启想象翅膀:轻松实现文本生成模型的创作应用,支持LLaMA、ChatGLM、UDA、GPT2等模型,开箱即用1.介绍TextGen实现了多种文本生成模型,包括:LLaMA、ChatGLM、UDA、GPT2、Seq2Seq、BART、T5、SongNet等模型,开箱即用。1.1最新更新[2023/06/15]v1.0.0版本:新增ChatGLM/LLaMA/Bloom模......
  • 12个ggplot2扩展包帮你实现更强大的可视化
    ggplot2自从2007年推出以来,成为世界范围内下载最频繁、使用最广泛的R包之一。许多人包括ggplot2的创建人HadleyWickham将这一成功归功于ggplot2背后的哲学。这个软件包的灵感来源于LelandWilkinson编写的《图形语法》一书,在此书中将graphs分解成scales和layers,并将原始数据与表......
  • 微信开发之一键修改好友标签的技术实现
    移除标签下的好友:把需移除的好友所有标签查出来(通讯录详情接口返回标签id,数据库需缓存),去掉想移出的标签id,labelIdList参数放进其他所有标签id。增加标签新好友:把需添加的好友所有标签查出来(通讯录详情接口返回标签id,数据库需缓存),labelIdList参数放进新标签id和原有所有标签id。某......
  • Windows中实现类似tail -f 的命令
    1.说明需要在PowerShell中使用,Shift+鼠标右键,即可出现打开PowerShell窗口的命令,如图:打开之后是这样的2实时查看文件命令类似于Linux中的"tail-f<文件名>"的命令2.1语法结构完整写法get-content[-wait][-encoding字符编码][File]缩写,与完整写法效果是一样的gc[-wait][-en......
  • 微信开发之一键修改好友标签的技术实现
    移除标签下的好友:把需移除的好友所有标签查出来(通讯录详情接口返回标签id,数据库需缓存),去掉想移出的标签id,labelIdList参数放进其他所有标签id。增加标签新好友:把需添加的好友所有标签查出来(通讯录详情接口返回标签id,数据库需缓存),labelIdList参数放进新标签id和原有所有标签......
  • 微信开发之获取标签好友的技术实现
    简要描述:获取标签列表请求URL:http://域名地址/getContactLabelList请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回参数:参数名必选类型说明wId是String登录实例标识请求参数示例{"wId":"349be9b5-8734-45ce-811d-4e10ca568c67"}成功返回......
  • nginx源码分析之http解码实现
    分析nginx是如何解析并且存储http请求的。对非法甚至恶意请求的识别能力和处理方式。可以发现nginx采用状态机来解析http协议,有一定容错能力,但并不全面相关配置 跟解码有关的配置 merge_slashes 语法merge_slasheson|off默认值on上下文httpserver说明支持解析请求行时,合并相......
  • 使用LabVIEW 实现物体识别、图像分割、文字识别、人脸识别等深度视觉
    前言哈喽,各位朋友们,这里是virobotics(仪酷智能),这两天有朋友私信问之前给大家介绍的工具包都可以实现什么功能,最新的一些模型能否使用工具包加载,今天就给大家介绍一下博主目前使用工具包已经实现的深度视觉模型及案例下表为前期写过的一些范例介绍,朋友们可以按需点击查看名字......