五子棋对战(网络版)

五子棋对战(网络版)

服务端:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>  // 用于 usleep
#include <getch.h>
#include <network.h>//这是自己写的网络连接的工具,前面的文章有介绍https://blog.csdn.net/m0_57538342/article/details/142388027?fromshare=blogdetail&sharetype=blogdetail&sharerId=142388027&sharerefer=PC&sharesource=m0_57538342&sharefrom=from_linkchar current_player = '$';  // 当前玩家
// 定义棋盘
char chessboard[15][15] = 
{{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}
};
int path_x = 0, path_y = 0; // 记录光标位置
Network *server_nw, *client_nw; // 网络连接void print_chessboard() // 打印棋盘
{for (int i = 0; i < 15; i++){for (int j = 0; j < 15; j++){if (i == path_x && j == path_y) {printf(" %c",current_player); // 显示光标位置} else {printf(" %c", chessboard[i][j]);}}printf("\n");}
}
// 计算某个方向有连续的棋子数
int count_direction(int go_x, int go_y)
{int count = 0;for (int x = path_x + go_x, y = path_y + go_y; x >= 0 && x < 15 && y >= 0 && y < 15; x += go_x, y += go_y){if (chessboard[x][y] == chessboard[path_x][path_y]){count++;}else{break;}}return count;
}
// 判断是否有连续的棋子
bool has_continuous_chess(int x, int y)
{if (chessboard[x][y] != '#'){path_x = x;path_y = y;if (count_direction(1, 0) + count_direction(-1, 0) >= 4){return true;}if (count_direction(0, 1) + count_direction(0, -1) >= 4){return true;}if (count_direction(1, 1) + count_direction(-1, -1) >= 4){return true;}if (count_direction(1, -1) + count_direction(-1, 1) >= 4){return true;}}return false;
}int main(int argc, const char *argv[]) 
{// 初始化服务端网络server_nw = init_nw(SOCK_STREAM,atoi(argv[2]),argv[1],true);client_nw = accept_nw(server_nw);bool game_over = false;while (!game_over) {system("clear");print_chessboard();printf("当前玩家:%c\n", current_player);// 玩家操作if (current_player == '$') {int ch = getch(); // 获取键盘输入switch (ch) {case 183: if (path_x > 0) path_x--; break; // 上箭头case 184: if (path_x < 14) path_x++; break; // 下箭头case 185: if (path_y < 14) path_y++; break; // 右箭头case 186: if (path_y > 0) path_y--; break; // 左箭头case '\n': // 回车键,落子if (chessboard[path_x][path_y] == '#') {chessboard[path_x][path_y] = current_player;// 发送落子位置给客户端int move[2] = {path_x, path_y};send_nw(client_nw, move, sizeof(move));if (has_continuous_chess(path_x, path_y)) {system("clear");print_chessboard();printf("玩家 %c 获胜!\n", current_player);game_over = true;}current_player = (current_player == '@') ? '$' : '@';}break;}} else {// 接收客户端的操作int move[2];recv_nw(client_nw, move, sizeof(move));chessboard[move[0]][move[1]] = current_player;system("clear");print_chessboard();printf("当前玩家:%c\n", current_player);if (has_continuous_chess(move[0], move[1])) {system("clear");print_chessboard();printf("玩家 %c 获胜!\n", current_player);game_over = true;}current_player = (current_player == '@') ? '$' : '@';// 切换玩家}}close_nw(client_nw);close_nw(server_nw);return 0;
}

客户端

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <getch.h>
#include <network.h>char current_player = '$'; // 当前玩家
// 定义棋盘
char chessboard[15][15] = 
{{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}
};
int path_x = 0, path_y = 0; // 记录光标位置
Network *client_nw;void print_chessboard() // 打印棋盘
{for (int i = 0; i < 15; i++){for (int j = 0; j < 15; j++){if (i == path_x && j == path_y) {printf(" %c",current_player); // 显示光标位置} else {printf(" %c", chessboard[i][j]);}}printf("\n");}
}
// 计算某个方向有连续的棋子数
int count_direction(int go_x, int go_y)
{int count = 0;for (int x = path_x + go_x, y = path_y + go_y; x >= 0 && x < 15 && y >= 0 && y < 15; x += go_x, y += go_y){if (chessboard[x][y] == chessboard[path_x][path_y]){count++;}else{break;}}return count;
}
// 判断是否有连续的棋子
bool has_continuous_chess(int x, int y)
{if (chessboard[x][y] != '#'){path_x = x;path_y = y;if (count_direction(1, 0) + count_direction(-1, 0) >= 4){return true;}if (count_direction(0, 1) + count_direction(0, -1) >= 4){return true;}if (count_direction(1, 1) + count_direction(-1, -1) >= 4){return true;}if (count_direction(1, -1) + count_direction(-1, 1) >= 4){return true;}}return false;
}int main(int argc, const char *argv[]) 
{// 初始化客户端网络client_nw = init_nw(SOCK_STREAM,atoi(argv[2]),argv[1],false);bool game_over = false;while (!game_over) {system("clear");print_chessboard();printf("当前玩家:%c\n", current_player);if (current_player == '@') {int ch = getch(); // 获取键盘输入switch (ch) {case 183: if (path_x > 0) path_x--; break;case 184: if (path_x < 14) path_x++; break;case 185: if (path_y < 14) path_y++; break;case 186: if (path_y > 0) path_y--; break;case '\n': // 回车键,落子if (chessboard[path_x][path_y] == '#') {chessboard[path_x][path_y] = current_player;// 发送落子位置给服务端int move[2] = {path_x, path_y};send_nw(client_nw, move, sizeof(move));if (has_continuous_chess(path_x, path_y)) {system("clear");print_chessboard();printf("玩家 %c 获胜!\n", current_player);game_over = true;}current_player = (current_player == '@') ? '$' : '@'; // 切换玩家}break;}} else {// 接收服务端的操作int move[2];recv_nw(client_nw, move, sizeof(move));chessboard[move[0]][move[1]] = current_player;system("clear");print_chessboard();printf("当前玩家:%c\n", current_player);if (has_continuous_chess(move[0], move[1])) {system("clear");print_chessboard();printf("玩家 %c 获胜!\n", current_player);game_over = true;}current_player = (current_player == '@') ? '$' : '@';}}close_nw(client_nw);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

块匹配算法简介(上)

图像中的运动估计方法大致分为两类:光流法和块匹配算法(BMA,Block Matching Algorithm)。本文将介绍BMA的相关内容,包括基本原理、相似度计算准则与常见的几种搜索方法,如三步法、四步法、钻石搜索法等。 1. 背景 视频中相邻帧往往存在大量的相似内容,即只有局部的一些…

Golang | Leetcode Golang题解之第417题太平洋大西洋水流问题

题目&#xff1a; 题解&#xff1a; type pair struct{ x, y int } var dirs []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}func pacificAtlantic(heights [][]int) (ans [][]int) {m, n : len(heights), len(heights[0])pacific : make([][]bool, m)atlantic : make([][]bool, …

ansible远程自动化运维、常用模块详解

一、ansible是基于python开发的配置管理和应用部署工具&#xff1b;也是自动化运维的重要工具&#xff1b;可以批量配置、部署、管理上千台主机&#xff1b;只需要在一台主机配置ansible就可以完成其它主机的操作。 1.操作模式&#xff1a; 模块化操作&#xff0c;命令行执行…

Vue 依赖注入组件通信:provide / inject 使用详解

引言 在 Vue.js 中&#xff0c;我们经常会遇到组件之间需要共享数据的情况。一种常见的解决方案是通过 props 和 $emit 事件来进行数据传递&#xff0c;但对于多层嵌套的组件结构或共享状态的场景&#xff0c;这种方式显得繁琐而不直观。 幸运的是&#xff0c;Vue.js 提供了一…

web渗透—RCE

一&#xff1a;代码执行 相关函数 1、eval()函数 assert()函数 (1)原理&#xff1a;将用户提交或者传递的字符串当作php代码执行 (2)passby:单引号绕过&#xff1a;闭合注释&#xff1b;开启GPC的话就无法绕过&#xff08;GPC就是将单引号转换为"反斜杠单引号"&a…

希亦超声波清洗机值得购买吗?百元清洁技术之王,大揭秘!

现代社会的高速发展&#xff0c;很多人由于工作繁忙的原因&#xff0c;根本没有时间去清洗自己的日常物品&#xff0c;要知道这些日常物品堆积灰尘之后是很容易就滋生细菌的&#xff0c;并且还会对人体的健康造成一定的危害&#xff01;这个时候很多人就会选择购买一台超声波清…

什么是CSRF攻击,该如何防护CSRF攻击

CSRF攻击&#xff08;跨站请求伪造&#xff0c;Cross-Site Request Forgery&#xff09;是一种网络攻击手段&#xff0c;攻击者利用已通过身份验证的用户&#xff0c;诱导他们在不知情的情况下执行未授权操作。这种攻击通常发生在用户登录到可信网站并且有活动的会话时&#xf…

Python编码系列—Python组合模式:构建灵活的对象组合

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

cv2.bitwise_or 提取ROI区域

原图如下所示&#xff0c;想提取圆形ROI区域&#xff0c;红色框 img np.ones(ori_img.shape, dtype"uint8") img img * 255 cv2.circle(img, (50,50), 50, 0, -1) self.bitwiseOr cv2.bitwise_or(ori_img, circle)使用一个和原图尺寸一致的图像做mask,图白圆黑 以…

MySQL:索引02——使用索引

目录 引言 1、自动创建索引 2、手动创建索引 2.1 主键索引 2.2 查看索引信息 2.3 唯一索引 2.4 普通索引 2.5 复合索引 3、删除索引 3.1 主键索引 3.2 其他索引 4、查看执行计划 4.1 不加条件&#xff0c;查询所有 4.2 使用主键查询 4.3 子查询使用索引 4.4 普通索…

【架构设计】多级缓存:应用案例与问题解决策略

【架构设计】多级缓存&#xff1a;应用案例与问题解决策略 多级缓存系统的工作原理及其在提升应用性能方面的关键作用。通过对比本地缓存与分布式缓存的特点 | 原创作者/编辑&#xff1a;凯哥Java | 分类&#xff1a;架构设计系列教程 多级缓存…

在基准测试和规划测试中选Flat还是Ramp-up?

Flat测试和Ramp-up测试是各有优势的&#xff0c;下面我们就通过介绍几种实用的性能测试策略来分析这两种加压策略的着重方向。 基准测试 基准测试是一种测量和评估软件性能指标的活动&#xff0c;通过基准测试建立一个已知的性能水平&#xff08;称为基准线&#xff09;&…

WPS生成目录

导航窗格&#xff1a;视图->导航窗格 可修改标题的样式&#xff0c;之后的标题直接套用即可 修改其他标题样式也是这样 添加编号&#xff1a;可以选上面的模版 也可自定义编号 生成目录&#xff1a;引用->目录->选用一个 但是我想把目录插到另一页 当我添加几个标题…

Spark-RDD持久化

一、Spark的三种持久化机制 1、cache 它是persist的一种简化方式&#xff0c;作用是将RDD缓存到内存中&#xff0c;以便后续快速访问&#xff0c;提高计算效率。cache操作是懒执行的&#xff0c;即执行action算子时才会触发。 2、persist 它提供了不同的存储级别&#xff0…

无人机黑飞打击技术详解

随着无人机技术的普及&#xff0c;无人机“黑飞”&#xff08;未经授权或违反规定的飞行&#xff09;现象日益严重&#xff0c;对公共安全、隐私保护及重要设施安全构成了严重威胁。为有效应对这一挑战&#xff0c;各国政府和安全机构纷纷研发并部署了一系列无人机黑飞打击技术…

HTML简介

HTML简介 1.HTML概述2.HTML元素3.HTML属性4.HTML 注释5.HTML颜色 1.HTML概述 HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言HTML 不是一种编程语言&#xff0c;而是一种标记语言标记语言是一套标记标签HTML 使用标记标签来描述网页 例子&#xff1a; <htm…

Kotlin cancel CoroutineScope.launch的任务后仍运行

Kotlin cancel CoroutineScope.launch的任务后仍运行 import kotlinx.coroutines.*fun main() {runBlocking {val coroutineScope CoroutineScope(Dispatchers.IO)val job coroutineScope.launch {var i 0while (i < Int.MAX_VALUE) {iprintln(i)}}// 2ms 取消协程delay(…

2.计算机网络基础

2. 计算机网络基础 (1) 计算机网络的定义 计算机网络是指将地理位置不同、具有独立功能的多个计算机系统通过通信线路和设备连接起来,以功能完善的网络软件实现网络中资源共享的系统。最简单的定义是:计算机网络是一些互相连接的、自治的计算机系统的集合。最庞大的计算机网…

在 PostGIS 中进行千万级空间数据的空间查询和关键字查询

一、目的 本测试在探究在有限的计算机配置下&#xff0c;如何高效地对千万级的空间数据进行空间查询和关键字查询。通过实际操作和测试&#xff0c;评估不同查询策略的性能&#xff0c;为处理大规模空间数据提供可行的解决方案。 计算机配置如下&#xff1a; 内存&#xff0…

声网SDK脚本运行错误

文章目录 运行步骤无法运行.bat电脑出现警告--更改执行策略若无出现-更新power shell搜索最新版本的 PowerShell安装新版本 仍无法解决-手动下载第三方库 2024-9-9运行步骤 无法运行.bat 电脑出现警告–更改执行策略 若无出现-更新power shell 搜索最新版本的 PowerShell 在…