5-C语言-三子棋

2023-11-18

问题:

        用C语言实现三子棋。

思路:

  • 整体思路

    1.肯定先出现菜单,之后在判断,是否退出。

    出现菜单,肯定就会有选择,不同的选择,进入不同的函数。而选择的话,用switch实现分支选择。

    2.实现基本思路,选择1,进入游戏。选择2退出游戏,其他情况,重新输入。

    3.而三子棋游戏,首先需要有一个三子棋棋盘,棋盘在这里相当于二维数组,一次先初始化棋盘,即数组,给棋盘每个位置变为空格。

    4.而打印棋盘则需要研究下,为了更美观,我们想打印一个小格子一个小格子,观察发现,每一行打印,打印两种东西,第一次打印一行数据,每个数据后面又仅跟一个|,第二行则打印---,相当于小格子的下边界线,每次打印分割线后面紧跟一个|。

    5.这就实现了打印函数,

    6.随后便开始玩家下棋,和电脑下棋的操作。即玩家输入坐标,然后对应数组进行赋值即可。

    7.每次下棋时,都会进行一次判定,如果得到的判定结果不是'C'(继续),则跳出循环,进行相应的输出,判断输赢。

 代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
//菜单 
void menu()//菜单 
{
	printf("******** 三子棋!***********\n");
	printf("**************************\n");
	printf("***** 1.开始游戏 ***********\n");
	printf("***** 2.结束游戏 ***********\n");
	printf("**************************\n");

}
void initchess(char str[ROW][COL],int row,int col)//初始化棋盘 
{
	int i=0;
	for(i=0;i<row;i++)
	{
		int j=0;
		for(j=0;j<col;j++)
		str[i][j]=' ';
	}
}
void playermove(char str[ROW][COL],int row,int col)//玩家下棋 
{
	printf("输入坐标\n");
	int x=0,y=0;
	while(1)
	{
		scanf("%d %d",&x,&y);
		if(x>=1 && x<=row && y>=1 &&y<=col)
		{
			if(str[x-1][y-1] == ' ')
			{
				str[x-1][y-1]='*';
				break;
			}
			else
				printf("该区域已被落子,请重新输入\n");
		}
		else
			printf("输入范围有误,请重新输入\n"); 	
	} 
}
void display(char str[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 ",str[i][j]);
			if(j<col-1)
			printf("|");
		}
		printf("\n");
		int w=0;
		for(w=0;w<col;w++)
		{
			printf("---");
			if(w<col-1)
				printf("|"); 
		}
		printf("\n");
	}
}
void computermove(char str[ROW][COL],int row,int col)//电脑下棋 
{
	printf("电脑下棋\n");
	int x=0;
	int y=0;
	while(1)
	{
		x=rand()%3;
		y=rand()%3;
		if(str[x][y]==' ')
		{
			str[x][y]='$';
			break;
		}
		
	}
	
}
int isfull(char str[ROW][COL],int row,int col)//判断棋盘是否满了 
{
	int i=0;
	for(i=0;i<row;i++)
	{
		int j=0;
		for(j=0;j<col;j++)
		{
			if(str[i][j]==' ')
				return 0;
		}
	}
	return 1;
}
char iswiner(char str[ROW][COL],int row,int col)
{
	//赢
		//行
		int i=0;
		for(i=0;i<row;i++)
		{
			if(str[i][0]==str[i][1] && str[i][1]==str[i][2] && str[i][0]!=' ')
				return str[i][0];
		} 
		//列
		for(i=0;i<col;i++)
		{
			if(str[0][i]==str[1][i] && str[1][i]==str[2][i] && str[0][i]!=' ')
				return str[0][i];
		} 
		//斜着 
			if(str[0][0]==str[1][1] && str[1][1] == str[2][2] && str[1][1]!=' ')
				return str[1][1]; 
			if(str[0][2]==str[1][1] && str[1][1] == str[2][0] && str[1][1]!=' ')
				return str[1][1]; 
	//平局 
			if(isfull(str,ROW,COL)==1)
				return 'Q';
	// 继续 
				return 'C';
}
void game()
{
	char str[ROW][COL]={0};
	printf("游戏开始\n");
	initchess(str,ROW,COL);
	display(str,ROW,COL);
	int ret=0;
	while(1)
	{
		
		playermove(str,ROW,COL);//玩家下棋 
		display(str,ROW,COL);
		system("cls");
		ret =iswiner(str,ROW,COL); 
		if(ret !='C')
			break;
		computermove(str,ROW,COL);//电脑下棋 
		display(str,ROW,COL);
		ret =iswiner(str,ROW,COL); 
		if(ret !='C')
			break;
	} 
	if(ret == '*')
		printf("你赢了,兄弟(⊙﹏⊙)\n");
	else if(ret =='$')
		printf("电脑赢了\n");
	else if(ret =='Q')
		printf("平局了\n");
	else
		printf("出错了\n"); 
	
	 
}
int main()
{
	srand((unsigned int)time(NULL));
	int input=0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d",&input);
		switch(input)
		{
			case 1:
				//printf("game\n");
				game();
				break;
			case 2:
				printf("结束\n");
				break;
			default:
				printf("输入有误,重新输入\n"); 
				break;
		}
		
	}while(input!=2);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

5-C语言-三子棋 的相关文章

随机推荐

  • 使用Aspect切面实现系统日志并存入数据库

    使用Aspect切面实现系统日志并存入数据库 1 pom xml中 加入Maven依赖
  • 标准C++库用法

    本文中提到的函数库有
  • JOIN与INNER JOIN区别

    一 指代不同 1 JOIN 用于根据两个或多个表中的列之间的关系 从这些表中查询数据 2 INNER JOIN 组合两个表中的记录 只要在公共字段之中有相符的值 二 特点不同 1 JOIN 每个主键的值都是唯一的 这样做的目的是在不重复每个
  • JS求任意字符串中出现最多的字符以及出现的次数

    随意定义一个字符串 var str 111iiiw2shhfel000 定义函数 function num str 定义一个空对象 因为这边要求出现最多次数 以及出现的字符 这边使用对象的方式再合适不过了 键值对的形式 var obj 求出
  • 在idea使用本地jetty

    参考 https www jetbrains com idea help run debug configuration jetty server html背景 web开发当中 我觉得服务层的代码尽量用单元测试来测 这样可减少启动web容器
  • HTTP代理编程:Python实用技巧与代码实例

    今天我要与大家分享一些关于HTTP代理编程的实用技巧和Python代码实例 作为一名HTTP代理产品供应商 希望通过这篇文章 帮助你们掌握一些高效且实用的编程技巧 提高开发和使用HTTP代理产品的能力 一 使用Python的requests
  • 小数转化为二进制

    小数转换为二进制方法 a 0 125 10 0 125 10 转化为二进制方法 取每次结果的小数乘以2得到b 取b的整数位 如果b为1 0结束计算得到结果 0 125 2 0 25 gt 取整数部分 0 0 25 2 0 5 gt 0 0
  • 【C#】.Net Framework框架下使用SQLike以及基本概念

    2023年 第32周 第2篇文章 给自己一个目标 然后坚持总会有收货 不信你试试 在C 的 NET Framework框架下 有很多轻量级数据库选择 比如 SQLike就是其中一款 一起来了解SQLike的简单使用吧 目录 一 轻量级数据库
  • 关于VUE 配置文件config详解内容

    const path require path module exports 区分打包环境与开发环境 process env NODE ENV production 打包环境 process env NODE ENV development
  • 【知识蒸馏】知识蒸馏(Knowledge Distillation)技术详解

    参考论文 Knowledge Distillation A Survey 1 前言 近年来 深度学习在学术界和工业界取得了巨大的成功 根本原因在于其可拓展性和编码大规模数据的能力 但是 深度学习的主要挑战在于 受限制于资源容量 深度神经模型
  • C++ 使用海康威视SDK将视频推流到rtmp服务器

    研究FFmpeg有两三年了 一直没写过这方面的文章 今天记一下 由于工作关系 需要将化工企业内部的视频发布到一个部署在公网的视频服务器 然后由相关人员浏览 由于是化工企业 企业严禁外部的机器直接访问视频网络 最多提供一个跳板机 因此 两年多
  • 干洗店小程序,洗鞋店小程序,互联网洗鞋店,企业干洗方案,干洗行业小程序,上门取衣小程序,预约干洗小程序,校园干洗店小程序,工厂干洗店小程序,干洗店小程序开发;

    干洗店小程序 洗鞋店小程序 互联网洗鞋店 企业干洗方案 干洗行业小程序 上门取衣小程序 预约干洗小程序 校园干洗店小程序 工厂干洗店小程序 干洗店小程序开发 微信干洗店小程序 一 核心功能介绍 1 支持上门取送 送货到店 寄存网点 智能衣柜
  • oracle9i升级oracle10g

    author skate time 2009 09 11 网上看到一篇oracle9i升级oracle10g的文章 觉得不错 记录下来 你可以参考汪海的文章 http wzwanghai spaces live com 37AFBD116
  • day3作业

    在家目录下创建目录名为 shuren ubuntu ubuntu mkdir shuren 在shuren目录下创建d1 d2 d3 注意d2在d1目录下 d3在d2目录下 ubuntu ubuntu mkdir shuren d1 d2
  • java 数组作为方法参数

    数组作为方法参数 例 定义方法 打印输出数组元素的值 public void printArray int arr 数组明指向数组的第一个的元素 数组作为方法参数的方法调用 数组作为方法参数 当传参的时候 传递的是数组的名字 而在方法中定义
  • React 组件通讯

    目录 1 组件通讯 概念 1 组件的特点 2 知道组件通讯意义 总结 2 组件通讯 props 基本使用 1 传递数据和接收数据的过程 2 函数组件使用 props 3 类组件使用 props 总结 3 组件通讯 props 注意事项 1
  • Mybatis的缓存(实例)

    目录 概念 实例 Mybatis中的一级缓存 清空一级缓存的时机 Mybatis中的二级缓存 总结 gt 项目源码 概念 缓存 存于内存中的临时数据 使用缓存优点 减少和数据库的交互次数 提高执行效率 缓存适用于 经常查询并且不经常改变的
  • GO连接数据库--踩坑(超详细)

    当使用go语言对数据进行连接时需要几部操作 1 数据库侧 需要允许远程连接 具体操作方法详见 本地主机连接阿里云数据库 自建数据库 排雷 秋为春的博客 CSDN博客 2 GO侧 1 需要引入go sql driver驱动 常见的引入方法有两
  • FPGA同步复位和异步复位的区别以及设计处理

    FPGA复位信号的设计处理 同步复位 同步复位 同步复位信号跟触发器的时钟是同步的 只有在时钟的跳变沿到来之后才会生效 对应verilog代码如下 这种写法会被编译器综合成同步复位 always posedge clk begin if r
  • 5-C语言-三子棋

    问题 用C语言实现三子棋 思路 整体思路 1 肯定先出现菜单 之后在判断 是否退出 出现菜单 肯定就会有选择 不同的选择 进入不同的函数 而选择的话 用switch实现分支选择 2 实现基本思路 选择1 进入游戏 选择2退出游戏 其他情况