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

【项目实战1】五子棋游戏

目录

C语言编程实现五子棋::

game.h

game.c

                        1.打印菜单

                        2.打印棋盘

                        3.玩家下棋

                        4.判断五子连珠

                        5.判断输赢

                        6.游戏运行

game.c完整源代码展示

test.c


C语言编程实现五子棋::

game.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#define ROW 20
#define COL 20
#define PLAYER1 1
#define PLAYER2 2
#define NEXT 0
#define PLAYER1_WIN 1
#define PLAYER2_WIN 2
#define DRAW 3 
enum Dir
{LEFT,RIGHT,UP,DOWN,LEFT_UP,LEFT_DOWN,RIGHT_UP,RIGHT_DOWN
};
void Menu();
void Game();

game.c

1.打印菜单

void Menu()
{printf("#############################\n");printf("#######   五子棋游戏   ######\n");printf("#######1.Play    0.Exit######\n");printf("#############################\n");printf("#############################\n");printf("Please Select:");
}

2.打印棋盘

void ShowBoard(int board[ROW][COL], int row, int col)
{//清屏system("cls");printf("  ");int i = 1;for (i = 1;i <= col;i++){printf("%3d", i);}printf("\n");for (i = 0;i < row;i++){int j = 0;printf("%2d ", i + 1);for (j = 0;j < col;j++){if (board[i][j] == 0){printf(" . ");}else if (board[i][j] == PLAYER1){printf(" # ");}else{printf(" o ");}}printf("\n");}
}

3.玩家下棋

void PlayerMove(int board[ROW][COL], int row, int col, int who)
{while (1){printf("Player[%d] Please Enter your Pos:", who);scanf("%d %d", &x, &y);if (x < 1 || x > row || y < 1 || y > col){printf("输入坐标不合法!\n");continue;}else if (board[x - 1][y - 1] != 0){printf("Pos Is Occupied!\n");continue;}else{board[x - 1][y - 1] = who;break;}}
}

4.判断五子连珠

int ChessCount(int board[ROW][COL], int row, int col,enum Dir d)
{int _x = x - 1;int _y = y - 1;int count = 0;while (1){switch (d){case LEFT:_y--;break;case RIGHT:_y++;break;case UP:_x--;break;case DOWN:_x++;break;case LEFT_UP:_x--;_y--;break;case LEFT_DOWN:_x++;_y--;break;case RIGHT_UP:_x--;_y++;break;case RIGHT_DOWN:_x++;_y++;break;default://Do Nothingbreak;}//不合法if (_x < 0 || _x > row - 1 || _y < 0 || _y > col - 1){break;}//合法if (board[x - 1][y - 1] == board[_x][_y]){count++;}else{break;}}return count;
}

5.判断输赢

int IsWin(int board[ROW][COL], int row, int col)
{//在当前位置(x,y)处int count1 = ChessCount(board, row, col, LEFT) + ChessCount(board, row, col, RIGHT) + 1;int count2 = ChessCount(board, row, col, UP) + ChessCount(board, row, col, DOWN) + 1;int count3 = ChessCount(board, row, col, LEFT_UP) + ChessCount(board, row, col, RIGHT_DOWN) + 1;int count4 = ChessCount(board, row, col, LEFT_DOWN) + ChessCount(board, row, col, RIGHT_UP)+ 1;if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5){if (board[x - 1][y - 1] == PLAYER1){return PLAYER1_WIN;}else{return PLAYER2_WIN;}}int i = 0;for (i = 0;i < row;i++){int j = 0;for (j = 0;i < col;j++){if (board[i][j] == 0){return NEXT;}}}return DRAW;
}

6.游戏运行

void Game()
{int board[ROW][COL];memset(board, 0, sizeof(board));int result = NEXT;do{ShowBoard(board, ROW, COL);PlayerMove(board, ROW, COL, PLAYER1);result = IsWin(board, ROW, COL);ShowBoard(board, ROW, COL);if (NEXT != result){break;}ShowBoard(board, ROW, COL);PlayerMove(board, ROW, COL, PLAYER2);result = IsWin(board, ROW, COL);if (NEXT != result){break;}} while (1);//用户1赢 用户2赢 平局switch (result){case PLAYER1_WIN:printf("恭喜用户1,你已经赢了!\n");break;case PLAYER2_WIN:printf("恭喜用户2,你已经赢了!\n");break;case DRAW:printf("平局,和气生财!\n");break;default:break;}system("pause");ShowBoard(board, ROW, COL);
}

game.c完整源代码展示:

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
int x = 0;
int y = 0;
void Menu()
{printf("#############################\n");printf("#######   五子棋游戏   ######\n");printf("#######1.Play    0.Exit######\n");printf("#############################\n");printf("#############################\n");printf("Please Select:");
}
//按照(x,y)作为起点,按照特定的方向,求连续相对的最大个数
int ChessCount(int board[ROW][COL], int row, int col,enum Dir d)
{int _x = x - 1;int _y = y - 1;int count = 0;while (1){switch (d){case LEFT:_y--;break;case RIGHT:_y++;break;case UP:_x--;break;case DOWN:_x++;break;case LEFT_UP:_x--;_y--;break;case LEFT_DOWN:_x++;_y--;break;case RIGHT_UP:_x--;_y++;break;case RIGHT_DOWN:_x++;_y++;break;default://Do Nothingbreak;}//不合法if (_x < 0 || _x > row - 1 || _y < 0 || _y > col - 1){break;}//合法if (board[x - 1][y - 1] == board[_x][_y]){count++;}else{break;}}return count;
}
//4种返回值 NEXT:继续 PLAYER1_WIN:用户1赢 PLAYER2_WIN:用户2赢 DRAW:平局
int IsWin(int board[ROW][COL], int row, int col)
{//在当前位置(x,y)处int count1 = ChessCount(board, row, col, LEFT) + ChessCount(board, row, col, RIGHT) + 1;int count2 = ChessCount(board, row, col, UP) + ChessCount(board, row, col, DOWN) + 1;int count3 = ChessCount(board, row, col, LEFT_UP) + ChessCount(board, row, col, RIGHT_DOWN) + 1;int count4 = ChessCount(board, row, col, LEFT_DOWN) + ChessCount(board, row, col, RIGHT_UP)+ 1;if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5){if (board[x - 1][y - 1] == PLAYER1){return PLAYER1_WIN;}else{return PLAYER2_WIN;}}int i = 0;for (i = 0;i < row;i++){int j = 0;for (j = 0;i < col;j++){if (board[i][j] == 0){return NEXT;}}}return DRAW;
}
void ShowBoard(int board[ROW][COL], int row, int col)
{//清屏system("cls");printf("  ");int i = 1;for (i = 1;i <= col;i++){printf("%3d", i);}printf("\n");for (i = 0;i < row;i++){int j = 0;printf("%2d ", i + 1);for (j = 0;j < col;j++){if (board[i][j] == 0){printf(" . ");}else if (board[i][j] == PLAYER1){printf(" # ");}else{printf(" o ");}}printf("\n");}
}
void PlayerMove(int board[ROW][COL], int row, int col, int who)
{while (1){printf("Player[%d] Please Enter your Pos:", who);scanf("%d %d", &x, &y);if (x < 1 || x > row || y < 1 || y > col){printf("输入坐标不合法!\n");continue;}else if (board[x - 1][y - 1] != 0){printf("Pos Is Occupied!\n");continue;}else{board[x - 1][y - 1] = who;break;}}
}
void Game()
{int board[ROW][COL];memset(board, 0, sizeof(board));int result = NEXT;do{ShowBoard(board, ROW, COL);PlayerMove(board, ROW, COL, PLAYER1);result = IsWin(board, ROW, COL);ShowBoard(board, ROW, COL);if (NEXT != result){break;}ShowBoard(board, ROW, COL);PlayerMove(board, ROW, COL, PLAYER2);result = IsWin(board, ROW, COL);if (NEXT != result){break;}} while (1);//用户1赢 用户2赢 平局switch (result){case PLAYER1_WIN:printf("恭喜用户1,你已经赢了!\n");break;case PLAYER2_WIN:printf("恭喜用户2,你已经赢了!\n");break;case DRAW:printf("平局,和气生财!\n");break;default:break;}system("pause");ShowBoard(board, ROW, COL);
}

test.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
int main()
{int select = 0;int quit = 0;while (quit == 0){Menu();scanf("%d", &select);switch (select){case 1:Game();break;case 0:quit = 1;printf("游戏结束\n");break;default:printf("输入错误,请重新输入!\n");break;}}return 0;
}

相关文章:

【项目实战1】五子棋游戏

目录 C语言编程实现五子棋&#xff1a;&#xff1a; game.h game.c 1.打印菜单 2.打印棋盘 3.玩家下棋 4.判断五子连珠 5.判断输赢 6.游戏运行 game.c完整源代码展示 test.c C语言编程实现五子棋&#xff1a;&#xff1a; game.h #pragma once #include<stdio.h> …...

HTML5 动画效果:淡入淡出(Fade In/Out)详解

HTML5 动画效果&#xff1a;淡入淡出&#xff08;Fade In/Out&#xff09;详解 淡入淡出&#xff08;Fade In/Out&#xff09;是一种常见的动画效果&#xff0c;使元素逐渐显现或消失&#xff0c;增强用户体验。以下是淡入淡出的详细介绍及实现示例。 1. 淡入淡出的特点 平滑…...

Conmi的正确答案——Cordova使用“src-cordova/config.xml”编辑“Android平台”的“uses-permission”

Cordova版本&#xff1a;12.0.0 (cordova-lib12.0.1) 1、配置例程&#xff1a; <platform name"android"><config-file target"AndroidManifest.xml" parent"/manifest"><uses-permission android:name"android.permission…...

在Mysql环境下对数据进行增删改查

一、插入数据&#xff1a; insert into 表名 [(字段名)] values (字段对应的值1,字段对应的值2,…)[,(字段对应的值1,字段对应的值2,…)]; insert into students (id,name,age,height,gender,cls_id,is_delete) values (0,小明,18,180.00,2,1,0)在学生表中插入“小明”数据的…...

Spring 设计模式:经典设计模式

Spring 设计模式&#xff1a;经典设计模式 引言 Spring 框架广泛使用了经典设计模式。 这些模式在 Spring 内部发挥着重要作用。 通过理解这些设计模式在 Spring 中的应用&#xff0c;开发者可以更深入地掌握 Spring 框架的设计哲学和实现细节。 经典设计模式 控制反转&am…...

OneFlow和PyTorch在性能上有哪些区别?

OneFlow 和 PyTorch 在性能上的区别主要体现在以下几个方面&#xff1a; 本篇文章的目录 分布式训练性能 硬件利用率和显存优化 模型训练速度 OneFlow&#xff1a;默认采用静态图模式&#xff0c;在模型训练前会对计算图进行编译优化&#xff0c;能够减少运行时的开销&…...

win下搭建elk并集成springboot

一、ELK 是什么&#xff1f; ELK 实际上是三个工具的集合&#xff0c;Elasticsearch Logstash Kibana&#xff0c;这三个工具组合形成了一套实用、易用的监控架构&#xff0c;很多公司利用它来搭建可视化的海量日志分析平台。 ElasticSearch ElasticSearch 是一个基于 Lucen…...

H7-TOOL固件2.27发布,新增加40多款芯片脱机烧录,含多款车轨芯片,发布LUA API手册,CAN助手增加负载率,错误状态信息检测

H7-TOOL详细介绍&#xff08;含操作手册&#xff09;&#xff1a;H7-TOOL开发工具&#xff0c;1拖4/16脱机烧录&#xff0c;高速DAPLINK&#xff0c;RTOS Trace&#xff0c;CAN/串口助手, 示波器, RTT等&#xff0c;支持WiFi&#xff0c;以太网&#xff0c;高速USB和手持 - H7-…...

STM32+WIFI获取网络时间+8位数码管显示+0.96OLED显

资料下载地址&#xff1a;STM32WIFI获取网络时间8位数码管显示0.96OLED 1、项目介绍 主控芯片STM32C8T6 接线&#xff1a;串口1&#xff1a;PA9 PA10 OELD &#xff1a;PB6 PB7 数码管使用&#xff1a;MAX7219 8位数码管 Max7219_pinCLK PAout(5) Max7219_pinC…...

以太网ICMP协议(ping指令)——FPGA学习笔记25

--素材来源原子哥 一、IP协议 1、IP简介 IP是Internet Protocol(网际互连协议)的缩写。IP 协议是 TCP/IP 协议簇中的核心协议&#xff0c;它为上层协议提供无状态、无连接、不可靠的服务。IP 协议规定了数据传输时的基本单元和格式 。 IP协议是 OSI 参考模型中网络层…...

从零手写线性回归模型:PyTorch 实现深度学习入门教程

系列文章目录 01-PyTorch新手必看&#xff1a;张量是什么&#xff1f;5 分钟教你快速创建张量&#xff01; 02-张量运算真简单&#xff01;PyTorch 数值计算操作完全指南 03-Numpy 还是 PyTorch&#xff1f;张量与 Numpy 的神奇转换技巧 04-揭秘数据处理神器&#xff1a;PyTor…...

【Cesium】自定义材质,添加带有方向的滚动路线

【Cesium】自定义材质&#xff0c;添加带有方向的滚动路线 &#x1f356; 前言&#x1f3b6;一、实现过程✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 【Cesium】自定义材质&#xff0c;添加带有方向的滚动路线 &#x1f3b6;一、…...

C 语言奇幻之旅 - 第11篇:C 语言动态内存管理

目录 引言1. 内存分配函数1.1 malloc 函数实际开发场景&#xff1a;动态数组 1.2 calloc 函数实际开发场景&#xff1a;初始化数据结构 1.3 realloc 函数实际开发场景&#xff1a;动态调整数据结构大小 2. 内存释放2.1 free 函数 3. 内存泄漏与调试3.1 常见内存问题3.2 内存调试…...

IDEA 撤销 merge 操作(详解)

作为一个开发者&#xff0c;我们都知道Git是一个非常重要的版本控制工具&#xff0c;尤其是在协作开发的过程中。然而&#xff0c;在使用Git的过程中难免会踩一些坑&#xff0c;今天我来给大家分享一个我曾经遇到的问题&#xff1a;在使用IDEA中进行merge操作后如何撤销错误的合…...

swarm天气智能体调用流程

Swarm 框架的调用流程&#xff1a; 入口点 (examples/weather_agent/run.py): run_demo_loop(weather_agent, streamTrue)初始化流程: # swarm/repl/repl.py -> run_demo_loop() client Swarm() # 创建 Swarm 实例消息处理流程: # swarm/core.py class Swarm:def run(…...

LED背光驱动芯片RT9293应用电路

一&#xff09;简介&#xff1a; RT9293 是一款高频、异步的 Boost 升压型 LED 定电流驱动控制器&#xff0c;其工作原理如下&#xff1a; 1&#xff09;基本电路结构及原理 RT9293的主要功能为上图的Q1. Boost 电路核心原理&#xff1a;基于电感和电容的特性实现升压功能。当…...

二叉树的二叉链表和三叉链表

在二叉树的数据结构中&#xff0c;通常有两种链表存储方式&#xff1a;二叉链表和三叉链表。这里&#xff0c;我们先澄清一下概念&#xff0c;通常我们讨论的是二叉链表&#xff0c;它用于存储二叉树的节点。而“三叉链表”这个术语在二叉树的上下文中不常见&#xff0c;可能是…...

【学习路线】Python 算法(人工智能)详细知识点学习路径(附学习资源)

学习本路线内容之前&#xff0c;请先学习Python的基础知识 其他路线&#xff1a; Python基础 >> Python进阶 >> Python爬虫 >> Python数据分析&#xff08;数据科学&#xff09; >> Python 算法&#xff08;人工智能&#xff09; >> Pyth…...

C++直接内存管理new和delete

0、前言 C语言定义了两个运算符来分配和释放动态内存。运算符new分配内存&#xff0c;delete释放new分配的内存。 1、new动态内存的分配 1.1、new动态分配和初始化对象 1&#xff09;、new内存分配 在自由的空间分配的内存是无名的&#xff0c;new无法为其分配的对象…...

Linux 内核中网络接口的创建与管理

在 Linux 系统中,网络接口(如 eth0、wlan0 等)是计算机与外部网络通信的桥梁。无论是物理网卡还是虚拟网络接口,它们的创建和管理都依赖于 Linux 内核的复杂机制。本文将深入探讨 Linux 内核中网络接口的创建过程、命名规则、路由选择以及内核如何将网络接口映射到实际的硬…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...