当前位置: 首页 > article >正文

Linux终端实战:从零构建命令行五子棋(双人对决)

1. 为什么要在终端写五子棋第一次在Linux终端里写五子棋时我也觉得这想法挺奇怪的——放着那么多图形界面不用干嘛非要跟黑底白字的命令行较劲但真正动手后才发现这个项目简直是Linux环境编程的完美练手项目。用C语言在终端实现五子棋就像用乐高积木搭城堡。没有现成的图形库依赖所有效果都要靠最基础的printf和字符组合实现。我特别喜欢这种从轮子造起的体验它能让你真正理解如何用二维数组模拟棋盘状态怎样用最简短的代码实现棋盘可视化胜负判断算法如何做到高效准确最让我惊喜的是这个项目天然适合模块化开发。你可以清晰地划分出几个功能模块棋盘显示模块负责把数组变成可视化的点阵用户输入模块处理坐标输入和校验游戏逻辑模块核心的胜负判定算法主循环控制协调各个模块的执行顺序2. 环境准备与项目搭建2.1 基础开发环境在开始编码前建议先准备好这些工具以Ubuntu为例sudo apt update sudo apt install build-essential gdb vim我习惯用vim写代码但你可以用任何喜欢的编辑器。关键是要确保gcc编译器能正常工作可以先用个hello world测试下环境。2.2 项目目录结构创建一个清晰的目录结构会让后续开发轻松很多mkdir -p Gobang/{src,include} touch Gobang/src/{main.c,game.c} Gobang/include/game.h touch Gobang/Makefile这样划分的好处是src目录放.c源文件include目录放头文件Makefile放在项目根目录3. 核心代码实现详解3.1 棋盘数据存储游戏最核心的就是这个15x15的二维数组#define ROW 15 #define COL 15 int board[ROW][COL] {0};我用数字表示棋盘状态0表示空位1表示玩家1黑子2表示玩家2白子初始化时用memset清空棋盘是个好习惯memset(board, 0, sizeof(board));3.2 棋盘可视化技巧终端下显示棋盘需要点小技巧这是我的实现方案void ShowBoard(int board[][COL], int row, int col) { printf(\033[2J\033[H); // 清屏指令 printf( ); for(int j0; jcol; j) printf(%2d , j1); printf(\n); for(int i0; irow; i) { printf(%2d , i1); for(int j0; jcol; j) { if(board[i][j] 0) printf( . ); else if(board[i][j] 1) printf(● ); else printf(○ ); } printf(\n); } }几个关键点使用\033[2J\033[H实现清屏避免重复打印用●和○符号模拟黑白棋子显示行列坐标方便玩家输入3.3 胜负判定算法这是整个项目最有趣的部分。我的实现思路是以最后落子点为中心向8个方向检测是否有5连珠enum Direction { LEFT, RIGHT, UP, DOWN, LEFT_UP, LEFT_DOWN, RIGHT_UP, RIGHT_DOWN }; int CheckLine(int board[][COL], int x, int y, enum Direction dir) { int count 1; int player board[x][y]; for(int i1; i5; i) { int nx x, ny y; switch(dir) { case LEFT: ny - i; break; // 其他7个方向同理... } if(nx0 || nxROW || ny0 || nyCOL) break; if(board[nx][ny] ! player) break; count; } return count 5; }实际使用时需要同时检查四个轴线水平、垂直、两个对角线int IsWin(int board[][COL], int x, int y) { return CheckLine(board,x,y,LEFT) CheckLine(board,x,y,RIGHT) 4 || CheckLine(board,x,y,UP) CheckLine(board,x,y,DOWN) 4 || // 对角线检查... }4. 项目优化与扩展4.1 使用Makefile管理构建一个好的Makefile能极大提升开发效率CC gcc CFLAGS -Iinclude -Wall -g SRC src/main.c src/game.c OBJ $(SRC:.c.o) game: $(OBJ) $(CC) -o $ $^ $(CFLAGS) clean: rm -f $(OBJ) game这样每次修改后只需运行make就能重新编译make clean可以清理构建产物。4.2 添加游戏进度保存想要实现游戏存档功能可以这样扩展void SaveGame(int board[][COL]) { FILE *fp fopen(save.dat, wb); fwrite(board, sizeof(int), ROW*COL, fp); fclose(fp); } void LoadGame(int board[][COL]) { FILE *fp fopen(save.dat, rb); if(fp) { fread(board, sizeof(int), ROW*COL, fp); fclose(fp); } }4.3 人机对战实现思路如果想升级为人机对战可以加入简单的AI逻辑优先防守检查玩家是否有4连珠需要拦截寻找自己的最佳落子点随机选择空位作为兜底策略一个极简的AI示例void AIPlay(int board[][COL], int player) { // 1. 尝试寻找能立即获胜的位置 // 2. 尝试阻止玩家获胜 // 3. 随机选择空位 while(1) { int x rand() % ROW; int y rand() % COL; if(board[x][y] 0) { board[x][y] player; break; } } }5. 常见问题排查5.1 输入坐标异常处理处理用户输入时要考虑各种异常情况void GetInput(int *x, int *y) { while(1) { printf(输入坐标(行 列): ); if(scanf(%d %d, x, y) ! 2) { while(getchar() ! \n); // 清空输入缓冲区 printf(输入格式错误\n); continue; } if(*x1 || *xROW || *y1 || *yCOL) { printf(坐标超出范围\n); continue; } if(board[*x-1][*y-1] ! 0) { printf(该位置已有棋子\n); continue; } break; } }5.2 内存越界问题二维数组操作最容易出现内存越界。建议所有数组访问前先检查边界使用ROW/COL宏代替直接数字开启gcc的-Wall选项显示所有警告5.3 跨平台兼容性问题如果要在Windows下运行需要修改清屏指令改为system(cls)处理文件路径差异注意Windows下换行符是\r\n6. 项目进阶方向完成基础版本后可以考虑这些扩展网络对战用socket实现联机功能图形界面整合ncurses库实现更美观的界面AI强化实现minimax算法或机器学习AI比赛功能加入计时系统、棋谱记录等我最近给项目加了个简单的ELO评分系统可以记录玩家水平变化。实现起来也就百来行代码但让游戏的可玩性提升了不少。

相关文章:

Linux终端实战:从零构建命令行五子棋(双人对决)

1. 为什么要在终端写五子棋? 第一次在Linux终端里写五子棋时,我也觉得这想法挺奇怪的——放着那么多图形界面不用,干嘛非要跟黑底白字的命令行较劲?但真正动手后才发现,这个项目简直是Linux环境编程的完美练手项目。 用…...

别再死记公式了!用‘等可能性’思维理解均匀分布:从游戏设计到A/B测试的常见误区

等可能性思维:重新定义均匀分布在业务决策中的价值 想象一下,你正在设计一款手游的抽奖系统。作为产品经理,你理所当然地认为"每个稀有道具的掉落概率应该相同"——这听起来很公平,对吧?但三个月后数据告诉你…...

如何攻克QQ音乐加密音频:QMCDecode的跨平台解码实战指南

如何攻克QQ音乐加密音频:QMCDecode的跨平台解码实战指南 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认…...

Qwen3-14B私有部署镜像实战:WebUI可视化对话与API服务搭建指南

Qwen3-14B私有部署镜像实战:WebUI可视化对话与API服务搭建指南 1. 镜像概述与核心优势 Qwen3-14B作为通义千问系列的中等规模大语言模型,在14B参数规模下展现出优秀的语言理解与生成能力。本私有部署镜像针对RTX 4090D 24GB显存环境进行了专项优化&…...

实测对比:xenomai 3.1与VxWorks 7在Cortex-A15平台上的实时性能差异(附Jitter数据)

Xenomai 3.1与VxWorks 7实时性能深度评测:Cortex-A15平台实测数据全解析 在工业控制、航空航天、医疗设备等对实时性要求极高的领域,操作系统的响应确定性往往直接决定系统成败。今天我们将基于双核Cortex-A15硬件平台,通过超过7200万次采样数…...

智慧树视频自动学习插件:3步告别手动刷课的烦恼

智慧树视频自动学习插件:3步告别手动刷课的烦恼 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台上一节接一节的视频课程感到疲惫吗&#x…...

UI-TARS-desktop完整指南:Qwen3-4B-Instruct + vLLM + GUI Agent的生产级部署方案

UI-TARS-desktop完整指南:Qwen3-4B-Instruct vLLM GUI Agent的生产级部署方案 想不想拥有一个能帮你操作电脑、浏览网页、处理文件的智能助手?今天要介绍的UI-TARS-desktop,就是这样一个开箱即用的AI智能体。它内置了强大的Qwen3-4B-Instr…...

Python环境翻车实录:Mamba无限解析依赖卡死?手把手教你排查与强制清理

Python环境依赖解析卡死实战:Mamba环境僵局全流程破解指南 遇到Mamba在创建环境时陷入无限解析依赖的困境,确实让人头疼。这种问题通常发生在处理复杂依赖关系时,尤其是当项目中存在多个相互冲突的包版本要求时。作为一名长期使用Python进行科…...

别让LaTeX投稿坑了你:BSPC、BMC等期刊的隐藏规则与文件提交全解析

别让LaTeX投稿坑了你:BSPC、BMC等期刊的隐藏规则与文件提交全解析 当你熬夜修改完论文最后一处公式,满心欢喜点击投稿按钮时,系统却弹出一连串编译错误——这可能是每个LaTeX用户都经历过的噩梦。不同于Word投稿的"所见即所得"&…...

YOLO11入门实战:从cd命令到python train,完整流程解析

YOLO11入门实战:从cd命令到python train,完整流程解析 1. 前言:为什么选择YOLO11? 如果你对计算机视觉感兴趣,或者想快速上手一个强大的目标检测模型,YOLO11绝对是一个值得尝试的选择。它继承了YOLO系列速…...

数据脱敏方法

数据脱敏(Data Masking)是一种通过特定规则对敏感数据进行变形、替换或屏蔽的技术,目的是在保留数据可用性的同时,降低数据泄露风险,满足合规要求(如 GDPR、个人信息保护法)。脱敏后的数据可用于开发、测试、分析、培训等非生产环境,或在生产环境对外展示时保护隐私。 …...

SPSSAU效度分析保姆级教程:手把手教你解读KMO值和共同度,搞定问卷数据验证

SPSSAU效度分析实战指南:从KMO值到共同度的深度解析 当你第一次拿到问卷数据时,面对效度分析结果中的各种数字和专业术语,是否感到无从下手?作为量化研究的核心环节,效度分析直接关系到研究结论的可靠性。本文将带你深…...

STM32F407VG驱动OV7670摄像头(无FIFO版)保姆级教程:从接线到显示完整流程

STM32F407VG驱动OV7670摄像头(无FIFO版)保姆级教程:从接线到显示完整流程 当你第一次拿到OV7670摄像头模块时,可能会被它密密麻麻的引脚吓到。这款售价仅几元的摄像头模块,配合STM32F407VG开发板,可以构建一…...

Win10家庭版升级专业版后,5分钟搞定VMware与Device Guard的兼容问题(附完整代码)

Win10专业版环境下VMware与Device Guard冲突的深度解决方案 当Windows 10家庭版用户升级到专业版后,往往会遇到一个棘手问题:VMware等虚拟机软件与系统内置的Device Guard和Credential Guard安全功能产生冲突。这种兼容性问题不仅影响虚拟机的正常使用&a…...

三、Prometheus企业级告警规则实战:rules.yml配置详解与最佳实践

1. Prometheus告警规则基础:从零理解rules.yml 第一次接触Prometheus告警配置时,我盯着rules.yml文件看了整整一个下午。这个看似简单的YAML文件,实际上承载着整个监控系统的"大脑"功能。简单来说,rules.yml就是告诉Pro…...

别再写复杂SQL了!用MongoDB聚合管道搞定电商订单数据分析(实战篇)

电商订单分析新范式:MongoDB聚合管道实战指南 当我们需要从海量订单数据中挖掘用户行为规律时,传统SQL的GROUP BY往往显得力不从心。想象这样一个场景:你的电商平台每天新增数十万订单,管理层需要实时掌握每个用户的消费特征——他…...

别再只跑分数了!手把手教你用VMAF Python库分析视频质量(附实战代码)

深度实战:用Python玩转VMAF视频质量分析 视频质量评估一直是多媒体处理领域的重要课题。在众多评估指标中,VMAF(视频多方法评估融合)因其接近人类视觉感知的特性而备受推崇。但很多开发者仅仅停留在跑分阶段,未能充分发挥VMAF的分析潜力。本文…...

Java 线程同步:锁机制、CountDownLatch、CyclicBarrier

在现代软件开发中,多线程编程已经成为一项基础技能。无论是为了提升系统吞吐量,还是充分利用多核处理器的计算能力,我们几乎无法回避并发编程。然而,多线程环境带来的不仅仅是性能提升,更是一系列棘手的挑战——当多个…...

工业相机“心跳”监测脚本(C++版) 支持海康 / Basler / 堡盟工业相机

工业相机“心跳”监测脚本(C版) 支持海康 / Basler / 堡盟,一套代码搞定多品牌在线状态监控!“产线半夜停机,发现相机离线了?” “PLC 发了触发信号,但相机没反应?” “现场网络一抖…...

中年人最贵的错觉,是靠“闭眼许愿”去赌一个残酷的未来

周四下班,北京下了场雨。我刚出地铁14号线,就被老同事大杨拽去了旁边的一家小饭馆。大杨今年39,在一家传统IT企业干了八年客户总监,背着大兴一套房的上万块月供,家里还有个刚上小学的吞金兽。几杯扎啤下肚,…...

多智能体强化学习协作:在模拟环境中训练协作与竞争策略

多智能体强化学习协作:在模拟环境中训练协作与竞争策略 引言 欢迎来到深度强化学习的前沿世界!在这篇文章中,我们将探索一个令人兴奋的领域——多智能体强化学习(MARL, Multi-Agent Reinforcement Learning),特别是在协作与竞争策略训练方面的应用。想象一下,一组机器…...

语义分割入门:抛开公式,用动画和代码图解FCN中的‘反卷积’与‘跳跃连接’到底在做什么

语义分割实战:用动画思维理解FCN中的反卷积与跳跃连接 当第一次接触语义分割时,我被那些能将图片中每个像素都精确分类的神经网络深深吸引。但真正让我困惑的是——网络如何从一张缩小的特征图恢复出与原图相同尺寸的预测结果?这就像看着魔术…...

用STM32F103C8T6驱动TM1638模块:一个完整的人机交互小项目(附代码避坑点)

STM32F103C8T6与TM1638模块实战:打造智能交互终端全流程解析 在嵌入式开发领域,将微控制器与显示驱动模块有机结合是构建人机交互界面的基础技能。STM32F103C8T6作为经典的ARM Cortex-M3内核微控制器,搭配TM1638这款集LED驱动、键盘扫描于一体…...

SenseVoiceSmall实战:如何让AI听懂你的喜怒哀乐?附完整部署指南

SenseVoiceSmall实战:如何让AI听懂你的喜怒哀乐?附完整部署指南 1. 引言:当语音识别遇上情感理解 想象一下,当你对着智能音箱说"我太高兴了"和"我太生气了"时,设备能听出你语气中的不同情绪吗&a…...

Qwen-Image-2512惊艳案例:生成符合NES/Genesis/SNES硬件调色板限制的像素图

Qwen-Image-2512惊艳案例:生成符合NES/Genesis/SNES硬件调色板限制的像素图 1. 复古游戏像素艺术的新可能 还记得小时候玩过的那些8-bit和16-bit游戏吗?那些由有限色彩构成的像素世界,如今通过AI技术焕发了新生。Qwen-Image-2512结合Pixel …...

嵌入式系统启动三部曲:从U-Boot引导到Rootfs挂载

1. 嵌入式系统启动的三大支柱 第一次接触嵌入式Linux开发时,我被系统启动流程搞得晕头转向。直到后来才发现,整个启动过程就像一场精心编排的三幕剧,U-Boot、Kernel和Rootfs就是三位不可或缺的主角。让我用最直白的语言给你讲讲它们是怎么配合…...

DeepSeek-OCR-2快速上手:CSDN博客作者亲授Gradio界面操作要点

DeepSeek-OCR-2快速上手:CSDN博客作者亲授Gradio界面操作要点 本文由CSDN博客作者基于实际使用经验撰写,旨在帮助用户快速掌握DeepSeek-OCR-2的Gradio界面操作 1. 认识DeepSeek-OCR-2:重新定义OCR识别 DeepSeek-OCR-2是2026年1月发布的开源O…...

别再让HAL和RTOS抢Systick了!STM32F4用CubeMX配置FreeRTOS时,改用TIM1做HAL时钟源的保姆级教程

解决STM32F4中HAL与FreeRTOS时钟源冲突的实战指南 在嵌入式开发中,系统时钟的精确性往往决定了整个项目的稳定性。许多开发者在使用STM32CubeMX配置FreeRTOS时,可能都遇到过这样一个警告提示:"强烈建议HAL库使用除Systick以外的时钟源&q…...

别再为Multisim 14.3汉化头疼了!保姆级图文教程,从激活到界面中文化一步到位

Multisim 14.3汉化与激活全流程实战指南 电子工程师和学生们在初次接触Multisim 14.3时,往往会遇到两个关键障碍:软件激活和界面汉化。这两个看似简单的步骤,却可能因为细节处理不当而导致整个安装过程功亏一篑。本文将深入解析激活与汉化的每…...

嵌入式开发选型指南:Cortex-M3/M4项目中,ARM、Thumb、Thumb-2指令集到底该怎么选?

Cortex-M3/M4指令集选型实战:从编译选项到性能调优 当你用Keil或IAR新建一个STM32工程时,编译器选项里那个小小的"-mthumb"参数背后,藏着影响整个项目性能的秘密。去年我们团队在开发工业级电机控制器时,就因为一个指令…...