【C语言】实现网络对战五子棋
码云:传送门
项目说明:
该项目运用UDP技术可以实现跨电脑对战
使用说明
- 在linux环境且可以正常上网的情况下打开终端输入命令
- ifconfig 记录本机inet地址
- cd进入到项目目录 输入命令
- gcc -gobang_send.c -o send
- gcc -gobang_recv.c -o recv
- 首先运行接收端,端口号随机输入即可: ./recv 1234
- 新建终端进入项目目录 (inet为你本机地址): ./send inet 1234
send
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <getch.h>char role = '#';
char board[15][15];
int key_x = 7 , key_y = 7 , sock;
struct sockaddr_in dest_addr;
socklen_t addrlen = sizeof(dest_addr);typedef struct sockaddr* SAP;int init_gobang(const char* ip,short port)
{// 初始化网络sock = socket(AF_INET,SOCK_DGRAM,0);if(0 > sock){perror("socket");return EXIT_FAILURE;}dest_addr.sin_family = AF_INET;dest_addr.sin_port = htons(port);dest_addr.sin_addr.s_addr = inet_addr(ip);// 初始化棋盘for(int x=0; x<15; x++){for(int y=0; y<15; y++){board[x][y] = '*';}}return sock;
}void show_board(void)
{system("clear");for(int x=0; x<15; x++){for(int y=0; y<15; y++){printf(" %c",board[x][y]);}printf("\n");}
}void get_key(void)
{char buf[256];if(role == '@'){printf("等待对方落子...\n");int ret = recvfrom(sock,buf,sizeof(buf),0,(SAP)&dest_addr,&addrlen);if(0 >= ret){printf("对方逃跑了,恭喜你胜利了!\n");exit(EXIT_SUCCESS);}sscanf(buf,"%d %d",&key_x,&key_y);board[key_x][key_y] = '@';}else{printf("请你落子...\n");for(;;){printf("\33[%d;%dH",key_x+1,(key_y+1)*2);switch(getch()){case 183: key_x>0 && key_x--; break;case 184: key_x<14 && key_x++; break;case 185: key_y<14 && key_y++; break;case 186: key_y>0 && key_y--; break;case 10:if('*' == board[key_x][key_y]){board[key_x][key_y] = '#';sprintf(buf,"%d %d",key_x,key_y);int ret = sendto(sock,buf,strlen(buf)+1,0,(SAP)&dest_addr,addrlen);if(0 >= ret){printf("你掉线了!\n");exit(EXIT_FAILURE);}return;}}}}
}int count_key(int off_x,int off_y)
{int count = 0;for(int x=key_x+off_x,y=key_y+off_y; 0<=x && x<15 && 0<=y && y<15 && board[x][y] == board[key_x][key_y]; x+=off_x,y+=off_y){count++;}return count;
}bool check_board(void)
{if(count_key(-1,0)+count_key(+1,0) >= 4)return true;if(count_key(0,-1)+count_key(0,+1) >= 4)return true;if(count_key(-1,-1)+count_key(+1,+1) >= 4)return true;if(count_key(-1,+1)+count_key(+1,-1) >= 4)return true;return false;
}int main(int argc,char* const argv[])
{if(3 != argc){printf("User:gobang ip port\n");return EXIT_SUCCESS;}if(0 > init_gobang(argv[1],atoi(argv[2]))){printf("初始化网络错误!\n");return EXIT_FAILURE;}for(;;){// 显示棋盘show_board();// 落子get_key();if(check_board()){show_board();printf("恭喜%c胜利,游戏结束!\n",role);return EXIT_SUCCESS;}// 切换角色role = role=='@'?'#':'@';}
}
recv
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <getch.h>char role = '@';
char board[15][15];
int key_x = 7 , key_y = 7 , sock;
struct sockaddr_in from_addr;
socklen_t addrlen = sizeof(from_addr);typedef struct sockaddr* SAP;int init_gobang(short port)
{// 初始化网络sock = socket(AF_INET,SOCK_DGRAM,0);if(0 > sock){perror("socket");return EXIT_FAILURE;}struct sockaddr_in addr = {};addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = INADDR_ANY;if(bind(sock,(SAP)&addr,sizeof(addr))){perror("bind");return EXIT_FAILURE;}// 初始化棋盘for(int x=0; x<15; x++){for(int y=0; y<15; y++){board[x][y] = '*';}}return sock;
}void show_board(void)
{system("clear");for(int x=0; x<15; x++){for(int y=0; y<15; y++){printf(" %c",board[x][y]);}printf("\n");}
}void get_key(void)
{char buf[256];if(role == '@'){printf("等待对方落子...\n");int ret = recvfrom(sock,buf,sizeof(buf),0,(SAP)&from_addr,&addrlen);if(0 >= ret){printf("对方逃跑了,恭喜你胜利了!\n");exit(EXIT_SUCCESS);}sscanf(buf,"%d %d",&key_x,&key_y);board[key_x][key_y] = '#';}else{printf("请你落子...\n");for(;;){printf("\33[%d;%dH",key_x+1,(key_y+1)*2);switch(getch()){case 183: key_x>0 && key_x--; break;case 184: key_x<14 && key_x++; break;case 185: key_y<14 && key_y++; break;case 186: key_y>0 && key_y--; break;case 10:if('*' == board[key_x][key_y]){board[key_x][key_y] = '@';sprintf(buf,"%d %d",key_x,key_y);int ret = sendto(sock,buf,strlen(buf)+1,0,(SAP)&from_addr,addrlen);if(0 >= ret){printf("你掉线了!\n");exit(EXIT_FAILURE);}return;}}}}
}int count_key(int off_x,int off_y)
{int count = 0;for(int x=key_x+off_x,y=key_y+off_y; 0<=x && x<15 && 0<=y && y<15 && board[x][y] == board[key_x][key_y]; x+=off_x,y+=off_y){count++;}return count;
}bool check_board(void)
{if(count_key(-1,0)+count_key(+1,0) >= 4)return true;if(count_key(0,-1)+count_key(0,+1) >= 4)return true;if(count_key(-1,-1)+count_key(+1,+1) >= 4)return true;if(count_key(-1,+1)+count_key(+1,-1) >= 4)return true;return false;
}int main(int argc,char* const argv[])
{if(2 != argc){printf("User:gobang port\n");return EXIT_SUCCESS;}if(0 > init_gobang(atoi(argv[1]))){printf("初始化网络错误!\n");return EXIT_FAILURE;}for(;;){// 显示棋盘show_board();// 落子get_key();if(check_board()){show_board();printf("恭喜%c胜利,游戏结束!\n",role);return EXIT_SUCCESS;}// 切换角色role = role=='@'?'#':'@';}
}
【C语言】实现网络对战五子棋相关推荐
- 网络对战五子棋(来一起PK鸭)
网络对战五子棋(来一起PK鸭) 一.本地调用和RPC调用的区别 首先了解一下RPC~ RPC主要是解决了两个问题: 解决了分布式系统中,服务之间的调用问题 尤其是在远程调用的时候,可以让调用者感受不到 ...
- 【181018】VC++ 网络对战五子棋游戏(服务端+用户端)
VC++ 网络对战五子棋游戏(服务端+客户端),编译后先开启服务器端,服务端管理着各个用户之间的数据传递,用户端是多个的.就像游戏大厅一样.用户登录了后服务端将向用户端发送当前所有在线玩家列表数据.由 ...
- C#版网络对战五子棋以及Socket通信
前言 这个网络版五子棋游戏是今年四月初写的.当时觉得自己应该学一些网络编程的东西.而我课程设计的题目已经定了---做一个Everything. 那就帮我斐哥做个网络版的五子棋吧. 源码:htt ...
- C语言实现双人对战五子棋游戏
在编写五子棋游戏前首先对整个项目进行分析: 1.五子棋的界面绘制及显示 2.对输入的数据进行写入 3.判断输入的数据多对应的位置上是否可以下棋其中包括检测此位置是否为空及是否超出下棋的有效位置(越界超 ...
- java五子棋联网对战,毕业设计-- 用JAVA实现五子棋网络对战系统
毕业设计-- 用JAVA实现五子棋网络对战系统 本科生毕业设计(论文)本科生毕业设计(论文) 题 目 用 JAVA 实现五子棋网络对战系统 姓 名 xxxx 学 号 xxxxx 系 别 计算机工程系 ...
- 单机版五子棋java功能_java实现单机版和网络对战版五子棋程序
[实例简介] java实现单机版和网络对战版五子棋,功能包括计时.悔棋.聊天.显示双方状态等等.详细见https://blog.csdn.net/qq_37913997/article/details ...
- 五子棋网络对战 java实现
五子棋网络对战 java实现 最近期末考试,压力实在是太大了.专业不对口的痛苦,别人永远体会不来.闲暇之余,便想着巩固一下java的基础知识,以前看别人写的游戏,心里都觉得哇 好厉害啊,我什么时候才可 ...
- Java swing + socket 写的一个五子棋网络对战游戏
自从开始接触Swing以来,就喜欢写写各种管理系统,写多了就萌生了一种类似于实时在线对战的游戏,经过一番构思后就开始着手设计这个网络对战版本的五子棋了. 游戏代码包含两部分,常规的C/S模式(C代表客 ...
- 五子棋程序设计(C语言、人机对战、禁手)
五子棋程序设计(C语言.人机对战.禁手) 一.程序需求分析 1.1五子棋简介 五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏. 五子棋有两种玩法.玩法一:双方分别使用黑白两色的棋 ...
- java实现单机版和网络对战版五子棋
java实现单机版和网络对战版五子棋,功能包括计时.悔棋.聊天.显示双方状态等等. 选择com.fivechess.view中的SelectMenu.java开始游戏,效果如图: (1)单机版 点击& ...
最新文章
- Android Json处理框架
- 接口中默认方法和静态方法_接口中的默认方法和静态方法
- Linux能运行哪些行业软件,盘点支持Linux的经典Windows软件
- Windows中解压Linux中产生的tar.gz分卷压缩包
- 【JavaScript】英雄联盟官网作品介绍,轮播图的实现
- 优秀开源项目之二:流媒体直播系统Open Broadcaster Software
- Windows 10家庭版也能共享打印机(上)启用Guest账户
- 2022/7/2 Jenkins详细教程
- [AutoVue开发手册]第一篇——自定义Applet脚本
- AP计算机编程路上的照明灯----学校老师哈佛博士的伊利诺伊大学学生如何说
- 上海富爸爸_放弃高薪选择财务自由之路(转)
- turtle.write方法使用说明
- Android 图片添加白边
- 解决pip install (包名)报错问题
- cron表达式详解!!!!
- 鲁棒性、泛化的解释和区别
- HanLp的应用 - 转自GitHub开源代码介绍
- openbsd运行Linux应用程序,OpenBSD操作系统(1)——服务管理程序rcctl 类似linux下的service或syst...
- 根据银行卡号获取开户行及银行卡类型的demo(python、android 和ios)
- 华为公司如何开好经营分析会(战略落地的核心抓手)?