五子棋网络对战 java实现

 最近期末考试,压力实在是太大了。专业不对口的痛苦,别人永远体会不来。闲暇之余,便想着巩固一下java的基础知识,以前看别人写的游戏,心里都觉得哇 好厉害啊,我什么时候才可以写出自己的游戏,当然我最想做的不是游戏,因为我感觉我只有欣赏美的能力,却没有制造美的能力。好了,废话这么多,哎,我就是喜欢啰嗦。

**

视频传送门:在线演示

**

游戏消息传输构思:

​ 首先呢,写一个程序,最重要的就是构思啦,那么首先想到的是网络实现的方式,在这里我们可以用http协议去传输我们的数据,也可以采用封装的TCP/ip的socket去实现我们想要的功能,在网络这个世界,一切皆socket,包括你熟知的http协议,浏览器与web服务器初次连接时就是用socket实现的,学过java的都知道Tomcat这个web服务器吧,那么这就好了,Tomcat给客户端传输数据也是socket连接的,你也可以通过socket实现自己的web服务器了,好了,传输协议确定了,那么接下来就要考虑游戏构思了

游戏构思:

​ 既然要写网络游戏嘛,那么肯定要有一个客户端,一个服务端对吧。这是最典型的C/S(Client/Server),对于WEB而言的话,那么是B/S(Browser/Server).那么我们就选择一个最简单的C/S模型吧。

1. Server实现大致思路

​ 然后呢,服务端接受客户端的连接,然后保存每一个客户端连接的socket对象,每连接一个客户端,则开启一个线程去读当前客户端消息的线程,然后定义我们游戏的消息头,消息头很重要,能够微量防止不法连接。然后就是对消息体的一些处理逻辑了。到这里先不要考虑连接数,实际上,这么写是最笨的做法,想想,万一有一万个连接,难道就要开一万个线程去读每个socket客户端的消息吗?对于很大的连接数,这里就不要考虑了,我们只追求基本功能能够实现即可,刚开始不要考虑那么多。你只要知道这是一个最简单的游戏的制作过程

Server implements :(伪代码)

class Server {static Map<Socket,String> Clients = new HashMap<>(Socket,String);ServerSocket serverSocket;main(){//监听本机6666端口serverSocket = new ServerSocket(6666)Client =  serverSocket.accpet();//服务端开启监听new HandleClient(Client).start();//启动当前客户端监听//连接上则添加到map列表,名字默认为空Clients.put(Client,"");}
}
class HandleClient extends Thread{Socket Client;BufferedReader br;//当前Socket的Reader对象BufferedWriter bw;//当前Socket的Wirter对象BufferedWriter otherbw //另一个玩家的writer对象HandleClient(Socket Client){this.Client = Client;}public void run(){bw = new BufferedWriter(new OutputStreamWriter(Client.getoutputStream());br= new BufferedReader(new OutputStreamReader(Client.getinputStream());  while(true){String msg =  bf.readLine();String msgStr[] = msg.split(":");//定义消息头,消息如果满足消息头if(msgStr[0].equals("MSGTYPE")){//。。。。消息解析处理过程//对消息体用“#” 切割 拿到消息的Key,如果当前消息是发来自己的名字  ,// 那么 就把这个连接添加到Serverif(msgStr[1].splint("#")[0].equals("MYNAME")){//更新改Socket玩家的姓名Server.Clients.put(Client,msgStr[1].splint("#")[1]);   //接下来 的代码就不写了 直接看我的工程即可,服务端游戏思路大致就是这样。就是这样切割消息体来进入相应的处理}}}}
}

思考:

​ 这里为什么HandleClient类里我还写了一个 《BufferedWriter otherbw //另一个玩家的writer对象》 这句代码,你可能有所疑惑,为什么都有了一个bw,还要一个otherbw,但是你忘了吗,我们要写的五子棋是双人对战的,这里 这个服务器的当前线程,当有人加入到房间,或者是自己创建的房间,有人加入进来,拿Server的静态对象Clients找到加入房间玩家的Socket,接着拿到输出流,不就可以直接给他发消息了吗?这里要好好想想了啊,这里是重点

1. Client实现大致思路

​ 然后,客户端实现过程当眼也很简单了啊,直接建立一个Socket对象去连接服务端,然后发送相应的消息体,服务端响应后,返回给客户端对应的消息。这里我给大家举一个完整的消息例子。

Client--------------->Server (连接成功)

BEGIN:

发送MyName--------->Server (保存到Server的Clients对象里)

发送创建房间---------->Server (向服务器发送一条创建房间的消息,服务器记录当前玩家创建了房间,然后调用bw.write(“MSGTYPE:CreateRoomSuccess\r\n”))通知当前玩家建立房间成功

Gameing:

点击棋盘,触发监听器 ,发送落子坐标---------->Server(接受到当前玩家的落子坐标信息,转发给另一个 玩家,怎么转发呢?前面不是直接拿到了otherbw,那么这时候直接调用加入玩家的bw即可向对方发消息。)

Client implements :(伪代码)

class Client{main(){new Room();}
}
class Room extends Jframe{static String MyName; //自己的名字static Socket socket;BufferedReader br;//当前Socket的Reader对象BufferedWriter bw;//当前Socket的Wirter对象BufferedWriter otherbw //另一个玩家的writer对象Jframe(){//MouseLister 实现监听鼠标点击事件addMouseListener(new MouseListener{// 如果点击到某个坐标是开始游戏if(x>=xxx&&x<=xxx&&y>=xxx&&y<=xxx){String name = JOptionPane.showInternalInputDialog(null,"请给你取一个个性的名字把!")if(socket==null){//这里的localhost默认是本机的地址 // 如果你的Hosts文件没有定义localhost,那么改成                         127.0.0.1socket =  new Socket("localhost",6666);bw = new BufferedWriter(new OutputStreamWriter(Client.getoutputStream());br= new BufferedReader(new OutputStreamReader(Client.getinputStream());  }//进入游戏窗口new PlayGmae();//开启线程读取消息 ,为什么要开启线程读取消息?因为//readLine()方法是阻塞的,要是不开线程,那么主线                                  程就会卡了。new ReadMsg().start();}})}
}//读取消息
class ReadMsg extends Thread(){public void run(){while(true){String msg =  br.readLine();String msgStr = msg.splint(":");if(msgStr[0].equals("MSGTYPE")){....//相关处理过程}}
}// 实现相关界面class PlayGame extends Jframe{PlayGame(){//实现相关界面 addMouseListener(new MouseListener{//增加点击 区域 消息监听 比如不同区域 有不同的功能啊// 开始游戏 棋盘 认输 悔棋等等 都有自己的坐标信息啊。点击执行相关的功能// eg :当前区域 :认输if(x>=xxx&&x<=xxx&&y>=xxx&&y<=xxx){int staus=   JOptionPane.showInternalConfirmDialog(this,
"确认要认输吗", );if(staus==0){bw.write("MSGTYPE:GAMEING#renshu");}});}}

游戏截图:

1. Server

Server我没有写界面直接启动就好了,不过要想观察后台信息,在控制台输入 "java -jar Server.jar"即可
服务端后台消息:

2.Client
直接双击打开即可,也可以在控制台输入 "java -jar Client.jar"即可观察后台信息
Begin:

取名字:

空房间列表:

创建的房间

有房间:

加入房间玩家:

开始游戏:

聊天内容:

关于作者:

总结:

好了,这就是游戏实现的大致思路,感觉就是这么一步一步来的,这个游戏断断续续,都怪考试太多了,哎,我写了两周才完成了所有功能…,一边复习,一边考试。其实大多时间都再调试BUG,要么是点击出问题,要么是创建房间加入出问题…各种问题,当然,要想实现自己想要的游戏,努力一下还是挺好的。到现在为止,游戏可以创建多个房间,如果游戏厅房间太多则多页显示,可以自由加入任何创建的房间

关于待补充的:

游戏还有 很多要完善的地方,比如 房间观战,送♥动画特效,人机对战,哎,有时间我再完善,没时间,这个小项目就到这里,新的2019,要继续努力,送给每一个看到此篇文章的人,愿你们都能开心过好每一天。

1. My github address:

五子棋网路多人对战(一定给个Star鼓励下嘛)
我已经把工程所有资源包括代码都放到了github上了,不要忘记给我一个start呀

五子棋网络对战 java实现相关推荐

  1. java五子棋联网对战,毕业设计-- 用JAVA实现五子棋网络对战系统

    毕业设计-- 用JAVA实现五子棋网络对战系统 本科生毕业设计(论文)本科生毕业设计(论文) 题 目 用 JAVA 实现五子棋网络对战系统 姓 名 xxxx 学 号 xxxxx 系 别 计算机工程系 ...

  2. Java swing + socket 写的一个五子棋网络对战游戏

    自从开始接触Swing以来,就喜欢写写各种管理系统,写多了就萌生了一种类似于实时在线对战的游戏,经过一番构思后就开始着手设计这个网络对战版本的五子棋了. 游戏代码包含两部分,常规的C/S模式(C代表客 ...

  3. 单机版五子棋java功能_java实现单机版和网络对战版五子棋程序

    [实例简介] java实现单机版和网络对战版五子棋,功能包括计时.悔棋.聊天.显示双方状态等等.详细见https://blog.csdn.net/qq_37913997/article/details ...

  4. java实现单机版和网络对战版五子棋

    java实现单机版和网络对战版五子棋,功能包括计时.悔棋.聊天.显示双方状态等等. 选择com.fivechess.view中的SelectMenu.java开始游戏,效果如图: (1)单机版 点击& ...

  5. 五子棋联机对战(JAVA实现)含源码

    本次面向对象编程课程设计,是制作一款五子棋联机对战游戏.在上学期做过一款五子棋单机版,其耦合度低,便将其拿来直接制作联机版本. 主要应用的技术:C/S架构 JAVA swing,JAVA socket ...

  6. 五子棋服务端程序java_9网上五子棋对战(java)服务端源码

    9网上五子棋对战(java)服务端源码 网上五子棋对战(java)服务端源码 /* 五子棋游戏是本人在学习java swing时写的一个程序,程序分两部分:服务器端和客户端.运行程序时先运行服务器端, ...

  7. java五子棋人机对战_实现简单的人机对战五子棋(实践)

    五子棋人机对战实践项目 总的任务和目标 完成一个人机对战的五子棋项目,基本效果如下: 第一部分 Java绘图原理 1.   基本概念 像素,坐标 2.   组件自定义绘图原理 3.   Graphic ...

  8. 网络对战五子棋(来一起PK鸭)

    网络对战五子棋(来一起PK鸭) 一.本地调用和RPC调用的区别 首先了解一下RPC~ RPC主要是解决了两个问题: 解决了分布式系统中,服务之间的调用问题 尤其是在远程调用的时候,可以让调用者感受不到 ...

  9. Java用最少代码实现五子棋-玩家对战模式-人机对战模式-电脑策略对战

    Java用最少代码实现五子棋-玩家对战模式-人机对战模式-电脑策略对战 玩家对战模式 背景说明 代码实现 人机对战模式 背景说明 完整代码实现 电脑根据优势分数对战 背景说明 完整代码实现 小结 玩家 ...

最新文章

  1. 全网最全最详细的Windows下安装Anaconda2 / Anaconda3(图文详解)
  2. 转:【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)...
  3. laravel + Vue 前后端分离 之 项目配置- 生产环境部署
  4. 设计模式 -(5)装饰模式(结构型)
  5. 【Python】精选30张炫酷的动态交互式图表,Pandas一键生成,通俗易懂
  6. ApacheCN Angular 译文集 20211114 更新
  7. AWT_Swing_JPasswordField密码框(Java)
  8. android 扫描照片功能,巧把安卓手机打造成扫描仪:拍照识别文档、手写笔记转PDF(图)...
  9. 《财富》推荐的75本必读书 !!推荐看看!受益匪浅
  10. 怎么为PE添加输入法
  11. 石头剪子布(字符串)c语言,石头、剪刀、布程序,C语言模拟
  12. Python爬虫:用最普通的方法爬取ts文件并合成为mp4格式
  13. nginx 域名解析
  14. 创业者面对困难-不轻言放弃
  15. 中科院,量子计算机,中科院传来喜讯,中国量子技术领先世界,美:中国学者都不睡觉吗...
  16. 数据赋能 兴业惠民 | 山东省第三届数据应用创新创业大赛潍坊分赛场火热报名中
  17. [附源码]Node.js计算机毕业设计广东理工学院大学生社团管理系统Express
  18. 【贪心算法】Leetcode 714. 买卖股票的最佳时机含手续费
  19. selenium之chromedriver与chrome版本映射表(最新版!)
  20. python coding ansi_使用Python把UTF8转ANSI编码

热门文章

  1. 大数据学习——hive阶段:启动HiveServer2启动报TezConfiguration类NoClassDefFoundError错误
  2. PHP 对接美团大众点评团购券(门票)
  3. 基于STM32F103C8T6的充电桩计费系统(程序+原理图+PCB+论文)
  4. 网站添加百度分享工具的好处
  5. video 播放视频被x5内核浏览器劫持时的处理记录
  6. FX5U MODBUS_TCP通讯
  7. 微软编程规范(文档)
  8. 论文图片绘制 Python绘制多分类混淆矩阵及可视化(颜色随正确率渐变)
  9. mysql LAST_DAY() 函数
  10. 2021年秋招面经分享·地平线【芯片设计研发工程师】