日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

五子棋网络对战 java实现

發布時間:2024/1/8 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五子棋网络对战 java实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

五子棋網絡對戰 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 OutputStreamWriterClient.getoutputStream();br= new BufferedReader(new OutputStreamReaderClient.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 OutputStreamWriterClient.getoutputStream();br= new BufferedReader(new OutputStreamReaderClient.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实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。