用c语言实现三子棋

首先创建三个文本框:game.h(放在头文件内)test.c game.c(放在源文件中)

首先进行框架的搭建(放在test.c文件中)

game.h

#pragma once
#define ROW 3
#define COL 3
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);//判断输赢


test.c

# define _CRT_SECURE_NO_WARNINGS
#include "game.h"
#include<stdio.h>
#include<time.h>
void menu() {//简易菜单的打印
	printf("*********************\n");
	printf("****   1.play *******\n");
	printf("****   0.exit********\n");
}
void game() {
	char board[ROW][COL] = { 0 };
	InitBoard(board, ROW, COL);//首先要对棋盘进行初始化
	DisplayBoard(board, ROW, COL);//在初始化之后展示棋盘
	while (1){
		char ret = 0;
		PlayerMove(board, ROW, COL);//玩家下棋
		ret=IsWin(board,ROW,COL);//判断输赢
		if (ret != ' C ') {
			break;
		}
	DisplayBoard(board, ROW, COL);//在玩家下棋之后展示棋盘
	ComputerMove(board, ROW, COL);//电脑下棋
	ret = IsWin(board, ROW, COL);//判断输赢
	if (ret != ' C ') {
		break;
	}
	DisplayBoard(board, ROW, COL);//在电脑下棋之后展示棋盘
	if (ret != ' * ') {
		printf("玩家赢\n");
	}
	else if (ret != ' # ') {
		printf("电脑赢\n");
	}
	else {
		printf("平局\n");
	}
	}

}


int main() {
	srand((unsigned int)(time(NULL)));//srand用于生成随机数
	int input = 0;
	do {
		menu();
		printf("请选择:\n");
		scanf("%d", &input);
		switch(input){
			case 1:
				game();
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误\n");
				break;
		}
	} while (input);
	return 0;
}

 

 

game.c 

# define _CRT_SECURE_NO_WARNINGS 
#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++)
	{
		//打印数据
		//printf(" %c | %c | %c ",board[i][0],board[i][1],board[i][2]);
		//打印分割信息
		//printf("---|---|---\n");
		//如果这样打印,我们就会发现每一行数据地下都有一条横杠,显然,这不是我们想要得到的结果,所以我们需要换一种方式
		int j = 0;
		for (j = 0; j < col; j++)//我们不妨简化一下打印的过程:打印一个数据,再在他的后面加上竖杠,这样会使得程序看起来简洁不少
		{
			printf(" %c ", board[i][j]);
			//最后一列不需要打印|,所以我们用if来限制条件
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		//再打印分割信息
		if (i < row - 1)//最后一行不用打印分割行
		{
			int j = 0;
			for (j = 0; j < col; j++)//有多少列,打印多少对应分隔符
			{
				printf("---");
				printf("|");
			}
			printf("\n");
		}
	}

}
void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋:\n");
	while (1) {
		printf("请输入坐标:\n");
		scanf("%d %d", &x, &y);
		//但是要注意的是:玩家输入的坐标和数组的坐标不一致,所以我们要在玩家输入坐标的基础上减去1
		//同时还要检测输入的坐标是否合法
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ') {
				board[x - 1][y - 1] == ' * ';
				break;
			}

		}
		else {
			printf("输入的坐标非法\n");
		}
	}
}
void ComputerMove(char board[ROW][COL], int row, int col) {
	int x = 0;
	int y = 0;
	x = rand() % 3;//rand()用来生成随机值
	y = rand() % 3;//0到2
	while (1) {//如果被占用,重新生成坐标,只有下棋下对,才能结束循环
		if (board[x - 1][y - 1] == ' ') {
			board[x - 1][y - 1] == ' * ';
			break;
		}
	}



}
int isFull(char board[ROW][COL], int row, int col) {//如果满了 返回1 不满返回0
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++) {
			if (board[i][j] == ' ') {
				return 0;
			}
		}
	}
	return 1;
}
//玩家赢 返回'#' 电脑赢 返回'*' 平局 返回'Q' 继续 返回‘C’
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][0] == board[i][2] && board[i][0] != ' ') {
			return board[i][0];
		}
	}
	//列
	int j = 0;
	for (j = 0; j < row; j++) {
		if (board[0][j] == board[1][j] && board[2][j] == board[0][j] && board[0][j] != ' ') {
			return board[0][j];
		}
	}
	//斜对角线
	if (board[2][2] == board[1][1] && board[1][1] == board[0][0] && 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)) {
		return 'Q';
	}
	return 'C';//游戏继续
}
//如果没有人赢,就要判断是否平局

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/370640.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT生产力|chat gpt实战介绍

标注说| ⭐ : 使用稳定&#xff0c;推荐 | &#x1f604; : 免费使用 | &#x1f511; : 需要登陆或密码 | ✈️ : 需waiwang进行访问 | ChatGPT 1PoePoe - Fast, Helpful ...&#x1f511;&#x1f604;&#x1f517;2 AItianhuGPT4&#x1f604;⭐&#x1f517;3 PhantoNa…

14:中断

中断 1、中断的引入2、使用单片机外部中断来处理按键2.1、外部中断2.2、参考数据手册中示例代码写程序2.2.1、外部中断0的测试程序2.2.2、完整程序 1、中断的引入 任务&#xff1a;独立数码管循环显示0-9&#xff0c;同时按键控制LED1亮灭。 代码如下&#xff1a; #include …

[word] word页面视图放大后,影响打印吗? #笔记#学习方法

word页面视图放大后&#xff0c;影响打印吗&#xff1f; word文档的页面视图又叫普通视图&#xff0c;又叫打印视图&#xff0c;是系统默认的视图&#xff0c;是用户用的最多最常见的视图。 问&#xff1a;怎样打开页面视图&#xff1f; 答&#xff1a;两种方法 方法一、点…

彻底扒光QQ音乐,批量下载音乐和MV文件

购买了一年的QQ音乐绿钻豪华版&#xff0c;还有几天就到期了&#xff0c;虽然平时听音乐比较少&#xff0c;但是还比较喜欢听歌曲的。计划会员到期前下载一些音乐文件&#xff0c;继续针对QQ音乐网站源码分析和歌曲下载链接的进行研究。 平时通过APP和软件播放歌曲也是趋势&…

2024年最新幻兽帕鲁服务器搭建教程

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

【JavaEE进阶】 图书管理系统开发日记——伍

文章目录 &#x1f38b;前言&#x1f332;需求分析&#x1f384;约定前后端交互接口&#x1f333;实现服务器代码&#x1f6a9;控制层&#x1f6a9;业务层&#x1f6a9;数据层 &#x1f343;修改前端代码⭕总结 &#x1f38b;前言 这次我们来实现图书管理系统的增加图书模块。…

船舶监造系统:从设计到实现的全程解析

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

01-操作系统_名词_文件下载_反弹

操作系统_名词_文件下载_反弹 一、渗透测试1.1、POC、EXP、Payload与Shellcode1.2、后门1.3、木马1.4、反弹1.5、回显1.6、跳板1.7、黑白盒测试1.8、暴力破解1.9、社会工程学1.10、撞库1.11、ATT&CK 二、案例演示2.1、基础案例1&#xff1a;操作系统-用途&命令&权限…

AI-数学-高中-22-tanx的图像与性质

原作者视频&#xff1a;三角函数】9tanx的图像与性质&#xff08;易中档&#xff09;_哔哩哔哩_bilibili 做题时注意先画图&#xff0c;再计算。

电脑显示mfc140u.dll丢失怎么修复,这几个方法都可以解决

当打开软件时出现"mfc140u.dll丢失"的错误提示&#xff0c;通常是由于缺少或损坏了Microsoft Foundation Class (MFC)库文件导致的。MFC是Microsoft提供的一套用于开发Windows应用程序的类库&#xff0c;它包含了许多常用的功能和组件。 1、以下是可能导致"mfc…

BFS——双向广搜+A—star

有时候从一个点能扩展出来的情况很多&#xff0c;这样几层之后搜索空间就很大了&#xff0c;我们采用从两端同时进行搜索的策略&#xff0c;压缩搜索空间。 190. 字串变换(190. 字串变换 - AcWing题库) 思路&#xff1a;这题因为变化规则很多&#xff0c;所以我们一层一层往外…

Python实战:爬取小红书

有读者在公众号后台询问爬取小红书&#xff0c;今天他来了。 本文可以根据关键词&#xff0c;在小红书搜索相关笔记&#xff0c;并保存为excel表格。 爬取的字段包括笔记标题、作者、笔记链接、作者主页地址、作者头像、点赞量。 一、先看效果 1、爬取搜索页 2、爬取结果保存到…

2-12 SDATR的训练与测试

2.12 SDATR的训练与测试 使用环境:3卡服务器SDATR 服务器代码地址:/home/lihuanyu/code/036SDATR 本地代码地址:F:\BaiduNetdiskDownload\code\036SDATR 2.12.1 训练文件修改 输入数据修改 载入词汇修改 短点保存修改 权重保存修改 其他位置修改:

docker搭建Mysql集群准备(一)

docker搭建Mysql集群准备 Linux基本知识&#xff1a; 修改机器 IP&#xff0c;变成静态 IP vim /etc/sysconfig/network-scripts/ifcfg-ens33 文件 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic IPADDR192.168.190.67 NETMASK255.255.255.0 GAT…

优秀学习网站推荐-第一辑

原文地址&#xff1a;https://jaune162.blog/2024/02/15/study-website-recommend Developer Roadmaps&#xff08;开发者路线图&#xff09; 官网地址&#xff1a;https://roadmap.sh/ 该网站包含了各个方向、各个语言的开发人员从零开始学习的路线图。 下图为Java方向的学…

1997-2022年中央对各省份一般公共预算转移支付数据

1997-2022年中央对各省份一般公共预算转移支付数据 1、时间&#xff1a;1997-2022年 2、范围&#xff1a;31省 3、指标&#xff1a;一般公共预算转移支付 4、来源&#xff1a;wind 财政部 5、指标解释&#xff1a;一般性转移支付又称体制性转移支付&#xff0c;是指上级政…

回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于OOA-LSSVM鱼鹰算法…

Linux---进程间通信 | 管道 | PIPE | MKFIFO | 共享内存 | 消息队列

管道 管道是UNIX中最古老的进程间通信的形式&#xff0c;我们把从一个进程连接到另一个进程的数据流称为一个管道。 一个文件&#xff0c;可以被多个进程打开吗&#xff1f;可以&#xff0c;那如果一个进程打开文件&#xff0c;往文件里面写数据&#xff0c;另一个进程打开文…

SQL Server之DML触发器

一、如何创建一个触发器呢 触发器的定义语言如下&#xff1a; CREATE [ OR ALTER ] TRIGGER trigger_nameon {table_name | view_name}{for | After | Instead of }[ insert, update,delete ]assql_statement从这个定义语言我们可以知道如下信息&#xff1a; trigger_name&…

supervision区域行人计数和轨迹追踪初步尝试

1、背景介绍 最近&#xff0c;一位朋友向我介绍了定位与视觉融合的需求&#xff0c;我发现这个想法非常有价值。恰逢我了解到了Supervision框架&#xff0c;便决定尝试运用它来进行初步的测试。这样做不仅有助于探索可以实际应用的项目&#xff0c;还能促进我自己在研究创新方…