c语言 写一个五子棋

news2025/5/20 3:48:08

c语言

IsWin判赢

display 画 10 x 10 的棋盘

判断落子的坐标是否已有棋子

判断落子坐标范围是否超出范围

// 五子棋
#include <stdio.h>
#include <stdlib.h>

// 画棋盘 10 x 10的棋盘,len为行数
void display(char map[][10], int len)
{
	system("clear");
	printf("   0 1 2 3 4 5 6 7 8 9\n");
	for (int i = 0; i < len; i++) {
		printf("%d ", i);
		for (int j = 0; j < 10; j++) {
			printf("|%c", map[i][j]);
		}
		printf("|\n");
	}
}

// 判断是否赢棋
int IsWin(char map[][10], int len, int x, int y)
{
	int xx;
	int yy;
	int saves = 0;
	int count = 1;
	// 判断是否棋盘下满
	for (int i = 0; i < len; i++) {
		for (int j = 0; j < 10; j++) {
			if (map[i][j] == ' ') {
				saves += 1;
			}
		}
	}
	if (saves == 0) {
		printf("棋盘下满,平局!\n");
		return -1;
	}
	//判断赢棋,从横、纵、斜、反斜四个方向判断
	// 横向判断
	// count == 1 是因为下面 for循环判断是从坐标的横移左一个、横移右一个开始判断的
    for (yy = y-1; yy > -1; yy--) {
		if (map[x][yy] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	for (yy = y+1; yy < 10; yy++) {
		if (map[x][yy] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	if (count >= 5) {
		if (map[x][y] == 'O') {
			printf("白棋赢\n");
			return 1;
		} else {
			printf("黑棋赢\n");
			return 2;
		}
	}
    count = 1;
	// 纵向判断
    for (xx = x-1; xx > -1; xx--) {
		if (map[xx][y] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	for (xx = x+1; xx < len; xx++) {
		if (map[xx][y] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	if (count >= 5) {
		if (map[x][y] == 'O') {
			printf("白棋赢\n");
			return 1;
		} else {
			printf("黑棋赢\n");
			return 2;
		}
	}
    count = 1;
	// 反斜方向判断
    for (xx = x-1,yy = y + 1; xx > -1 && yy < 10; xx--,yy++) {
		if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	for (xx= x+1,yy = y-1; xx < len && yy > -1; yy--,xx++) {
		if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	if (count >= 5) {
		if (map[x][y] == 'O') {
			printf("白棋赢\n");
			return 1;
		} else {
			printf("黑棋赢\n");
			return 2;
		}
	}
    count = 1;
	// 斜线 方向判断
    for (xx = x-1,yy = y - 1; xx > -1 && yy > -1; xx--,yy--) {
		if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	for (xx= x+1,yy = y+1; xx < len && yy < 10; yy++,xx++) {
		if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	if (count >= 5) {
		if (map[x][y] == 'O') {
			printf("白棋赢\n");
			return 1;
		} else {
			printf("黑棋赢\n");
			return 2;
		}
	}
	return 0;
}

int main(void)
{
	char map[10][10] = {};
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                map[i][j] = ' ';
            }
        }
	display(map, 10);
	int x = 0, y = 0,ret = -1;
	while (1) {
		while (1) {
	        printf("白旗落子\n"); // 'O'
	        printf("请输入横坐标:");
	        scanf("%d", &x);
	        printf("请输入纵坐标:");
	        scanf("%d", &y);
	        if (x >= 0 && x <= 9 && y >=0 && y <= 9) {
	            if (map[x][y] != ' ') {
		    	    printf("该坐标已落子,请重新输入坐标\n");
		    		continue;
		    	} else {
		    		map[x][y] = 'O';
	                display(map, 10);
					break;
		    	}
	        }
		    else {
		    	printf("输入坐标超出棋盘范围,请重新输入\n");
		    	continue;
		    }
		}
        ret = IsWin(map, 10, x, y);
		if (ret != 0) {
			break;
		}
		while (1) {
	        printf("黑旗落子\n"); // 'X'
	        printf("请输入横坐标:");
	        scanf("%d", &x);
	        printf("请输入纵坐标:");
	        scanf("%d", &y);
	        if (x >= 0 && x <= 9 && y >=0 && y <= 9) {
	            if (map[x][y] != ' ') {
		    	    printf("该坐标已落子,请重新输入坐标!\n");
		    		continue;
		    	} else {
		    		map[x][y] = 'X';
	                display(map, 10);
					break;
		    	}
	        }
		    else {
		    	printf("输入坐标超出棋盘范围,请重新输入!\n");
		    	continue;
		    }
		}
        ret = IsWin(map, 10, x, y);
        if (ret != 0) {
            break;
		}
	}
	return 0;
}    

     

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redisson分布式锁-锁的可重入、可重试、WatchDog超时续约、multLock联锁(一文全讲透,超详细!!!)

本文涉及到使用Redis实现基础分布式锁以及Lua脚本的内容&#xff0c;如有需要可以先参考博主的上一篇文章&#xff1a;Redis实现-优惠卷秒杀(基础版本) 一、功能介绍 (1)前面分布式锁存在的问题 在JDK当中就存在一种可重入锁ReentrantLock&#xff0c;可重入指的是在同一线…

语言模型:AM-Thinking-v1 能和大参数语言模型媲美的 32B 单卡推理模型

介绍 a-m-team 是北科 &#xff08;Ke.com&#xff09; 的一个内部团队&#xff0c;致力于探索 AGI 技术。这是一个专注于增强推理能力的 32B 密集语言模型。 a-m-team / AM-Thinking-v1 是其旗下的一个语言模型&#xff0c;采用低成本的方式能实现和大参数模型媲美。 DeepSe…

ChatGPT:OpenAI Codex—一款基于云的软件工程 AI 代理,赋能 ChatGPT,革新软件开发模式

ChatGPT&#xff1a;OpenAI Codex—一款基于云的软件工程 AI 代理&#xff0c;赋能 ChatGPT&#xff0c;革新软件开发模式 导读&#xff1a;2025年5月16日&#xff0c;OpenAI 发布了 Codex&#xff0c;一个基于云的软件工程 AI 代理&#xff0c;它集成在 ChatGPT 中&#xff0c…

智能视觉检测技术:制造业质量管控的“隐形守护者”

在工业4.0浪潮的推动下&#xff0c;制造业正经历一场以智能化为核心的变革。传统人工质检模式因效率低、误差率高、成本高昂等问题&#xff0c;逐渐难以满足现代生产对高精度、高速度的需求。智能视觉检测技术作为人工智能与机器视觉融合的产物&#xff0c;正成为制造业质量管控…

利用html制作简历网页和求职信息网页

前言 大家好&#xff0c;我是maybe。今天下午初步学习了html的基础知识。做了两个小网页&#xff0c;一个网页是简历网页&#xff0c;一个网页是求职信息填写网页。跟大家分享一波~ 说明:我不打算上传图片。所以如果有朋友按照我的代码运行网页&#xff0c;会出现一个没有图片…

卷积神经网络进阶:转置卷积与棋盘效应详解

【内容摘要】 本文深入解析卷积神经网络中的转置卷积&#xff08;反卷积&#xff09;技术&#xff0c;重点阐述标准卷积与转置卷积的计算过程、转置卷积的上采样作用&#xff0c;以及其常见问题——棋盘效应的产生原因与解决方法&#xff0c;为图像分割、超分辨率等任务提供理论…

2025年5月13日第一轮

1.百词斩 2.安全状态和死锁 3.银行家算法和状态图 4.Vue运行 5.英语听力 6.词汇 7.英语 长篇:数学竞赛 8.数学 间断点类型和数量 The rapid development of artificial intelligence has led to widerspareasd concreasns about job displacemant.As AI technology conti…

小结:Android系统架构

https://developer.android.com/topic/architecture?hlzh-cn Android系统的架构&#xff0c;分为四个主要层次&#xff1a;应用程序层、应用框架层、库和运行时层以及Linux内核层。&#xff1a; 1. 应用程序层&#xff08;Applications&#xff09; 功能&#xff1a;这一层包…

基于C#的MQTT通信实战:从EMQX搭建到发布订阅全解析

MQTT(Message Queueing Telemetry Transport) 消息队列遥测传输&#xff0c;在物联网领域应用的很广泛&#xff0c;它是基于Publish/Subscribe模式&#xff0c;具有简单易用&#xff0c;支持QoS&#xff0c;传输效率高的特点。 它被设计用于低带宽&#xff0c;不稳定或高延迟的…

ISP中拖影问题的处理

有时候会出现如下的阴影问题该如何处理呢&#xff1f;本文将提供几个思路。 1、降低曝光时间 如果曝光时间过大&#xff0c;会统计整个曝光时间内的图像信息&#xff0c;就会导致拖影的产生&#xff0c;这个时候可以考虑降低一下曝光时间。 2、时域降噪过大 只要明白时域降噪…

SQLMesh 模型管理指南:从创建到验证的全流程解析

本文全面介绍SQLMesh这一现代化数据转换工具的核心功能&#xff0c;重点讲解模型创建、编辑、验证和删除的全生命周期管理方法。通过具体示例和最佳实践&#xff0c;帮助数据工程师掌握SQLMesh的高效工作流程&#xff0c;包括增量模型配置、变更影响评估、安全回滚机制等关键操…

HarmonyOS AVPlayer 音频播放器

鸿蒙文档中心&#xff1a;使用AVPlayer播放视频(ArkTS)文档中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-playback 这张图描述的是 HarmonyOS AVPlayer 音频播放器的状态流转过程&#xff0c;展示了 AVPlayer 在不同状态之间的切换条件和关键操作…

⭐️白嫖的阿里云认证⭐️ 第二弹【课时1:提示词(Prompt)技巧】for 「大模型Clouder认证:利用大模型提升内容生产能力」

「大模型Clouder认证:利用大模型提升内容生产能力」这个认证目前在阿里云认证中心还是免费的,简单几步就可以申请考试,有两次的免费考试机会。而且,这个课程中的内容对于所有普通用户来说都非常实用,课程整体长度也就3节课,非常快速就能学完。心动不如行动,赶紧开始吧!…

Filament引擎(一) ——渲染框架设计

filament是谷歌开源的一个基于物理渲染(PBR)的轻量级、高性能的实时渲染框架&#xff0c;其框架架构设计并不复杂&#xff0c;后端RHI的设计也比较简单。重点其实在于项目中材质、光照模型背后的方程式和理论&#xff0c;以及对它们的实现。相关的信息&#xff0c;可以参考官方…

c++从入门到精通(六)--特殊工具与技术-完结篇

文章目录 特殊工具与技术-完结篇控制内存分配运行时类型识别成员指针嵌套类局部类固有的不可抑制特性位域volatile限定符链接指示 extern "C" 特殊工具与技术-完结篇 控制内存分配 重载new和delete&#xff1a; ​ 如果应用程序希望控制内存分配的过程&#xff0c;…

MCP实战:在扣子空间用扣子工作流MCP,一句话生成儿童故事rap视频

扣子最近迎来重要更新&#xff0c;支持将扣子工作流一键发布成MCP&#xff0c;在扣子空间里使用。 这个功能非常有用&#xff0c;因为我有很多业务工作流是在扣子平台上做的&#xff0c;两者打通之后&#xff0c;就可以在扣子空间里直接通过对话方式调用扣子工作流了&#xff0…

SpringBoot基础项目搭建

资料链接&#xff1a;https://download.csdn.net/download/ly1h1/90855288?spm1001.2014.3001.5501 1.准备工作 1.1 安装IntelliJ IDEA 2023.3.4 (Ultimate Edition) 1.2 采用apache-maven-3.6.3 1.2.1 maven配置文件设置 1.2.2 IDEA配置maven 1.3 JDK采用17版本 2.手动创建…

【拥抱AI】Deer-Flow字节跳动开源的多智能体深度研究框架

最近发现一款可以对标甚至可能超越GPT-Researcher的AI深度研究应用&#xff0c;Deer-Flow&#xff08;Deep Exploration and Efficient Research Flow&#xff09;作为字节跳动近期开源的重量级项目&#xff0c;正以其模块化、灵活性和人机协同能力引发广泛关注。该项目基于 La…

前端获取用户的公网 IP 地址

可以使用免费的免费的公共服务网站 一&#xff1a;https://www.ipify.org/ 获取 JSON 格式的 IP 地址 // 旧地址不好使 // https://api.ipify.org/?formatjson // 新地址 https://api64.ipify.org/?formatjson 二&#xff1a;https://ipinfo.io/ https://ipinfo.io/ 三&a…

云电竞服务器 工作原理

云电竞服务器工作原理详解 一、核心架构原理 虚拟化资源池‌ 通过 ‌KVM/VMware‌ 等虚拟化技术将物理服务器&#xff08;含NVIDIA GPU集群&#xff09;抽象为可动态分配的算力资源池&#xff0c;每个用户独享独立虚拟机实例&#xff0c;实现硬件资源的按需分配与隔离运行。 …