基於TCP的網路遊戲黑白棋系列(三) 遊戲大廳

2021-09-05 19:46:58 字數 2803 閱讀 6116

上一節我們講到了客戶端傳送login命令後,伺服器返回歡迎資訊,完成了乙個簡單的資料傳輸。這一節我們來完成遊戲大廳的基本功能,我們首先思考一下遊戲大廳的基本功能:

1 提供可供對弈的遊戲桌,遊戲大廳可供多桌玩家同時遊戲,為了考慮遊戲大廳伺服器的負載能力,應該設定乙個人數的上限和桌數的上限。實際上前面提到的功能抽象出來就是一些資料的狀態集合。

2 當玩家登入大廳,應該直觀的顯示當前大廳的就座情況,方便玩家選擇。此處應該考慮大廳的直觀顯示。

3 當玩家選擇某一位置就坐,遊戲大廳的相應狀態資料應發生更改,任何玩家都能看到大廳的就座情況的變化,方便做出選擇。比如a選擇坐在第一桌的黑方位置,則b應該看到該位置不可落坐,只能選擇其他位置就坐。

盡量從物件導向的角度考慮,我們應當把遊戲大廳,遊戲桌,玩家看做物件。建議大家使用物件導向的方法去思考,個人感覺伺服器客戶端通訊的網路程式主要涉及通訊協議(就是我們前面提到的命令,引數1,引數2等等)的分析,設計不好的話到最後你會發現邏輯複雜到難以控制的程度。

下面我們分別看一下這幾個物件(有刪減,具體請看源**)1//

遊戲大廳

2public

formserver317

//遊戲桌

18class

gametable

193132}

33class

player

3447}

當伺服器程式啟動的時候,需要初始化遊戲大廳的資料;而當客戶端登入到遊戲大廳後,按照前面列出的邏輯,我們需要把遊戲大廳的狀態在客戶端直觀的顯示出來。那怎麼才能得到遊戲大廳的狀態資料呢?沒錯,也是利用的客戶端伺服器之間的通訊。

當客戶端向伺服器傳送login命令後,伺服器處理完畢後,返回tables命令返回狀態資料

1private

void

receivedata(

object

obj)

2--]

", splitstring[

1], client.client.remoteendpoint);

12//

向客戶端傳送協議   

13//

格式 : tables,引數1

14//

引數1為遊戲大廳的遊戲桌就座情況

15sendstring ="

tables,"+

this

.getonlinestring();        

16service.sendtoone(user, sendstring);        

17break;18

default:19

break;20

}21}22

//返回如0100010101的字串  奇數字表示遊戲桌黑方的就座情況,偶數字相反,遊戲桌按序號排列連線

23private

string

getonlinestring()

2432}33

return

str;34}

客戶端接受到tables命令協議進行分析,直觀顯示遊戲大廳的就座情況,這裡為了簡單,採用了動態生成若干組checkbox控制項新增到panel的方法,比較簡單但能夠說明問題。checkbox選中表明已有玩家就座,如果未選中表明可以在此處落座。

這部分**就不列出來了,可以看一下原程式。

如果玩家選擇在某一位置落座,將出發checkbox的checkedchanged事件,並向伺服器傳送sitdown命令

1void

checkbox_checkedchanged(

object

sender, eventargs e)2,

", i, j));14}

15}

伺服器分析sitdown命令

1private

void

receivedata(

object

obj)

2在第桌第座入座

", user.username, tableindex +1

, side +1

));24

//得到對家座位號

25anotherside 

=(side +1

) %2;

26//

判斷對方是否有人

27if

(gametable[tableindex].gameplayer[anotherside].someone)28,

", anotherside,

32gametable[tableindex].gameplayer[anotherside].user.username);

33service.sendtoone(user, sendstring);34}

35//

同時告訴兩個使用者該使用者入座(也可能對方無人)

36//

傳送格式:sitdown,座位號,使用者名稱

37sendstring 

=string

.format(

"sitdown,,

", side, user.username);

38service.sendtoboth(gametable[tableindex], sendstring);

39//

重新將遊戲室各桌情況傳送給所有使用者

40service.sendtoall(userlist, 

"tables,"+

this

.getonlinestring());

41break;42

default:43

break;44

}45}46

到這裡,我們把遊戲大廳的簡單邏輯都處理了,下一節將介紹客戶端棋盤的呈現。

基於TCP的網路遊戲黑白棋系列教程開篇

看過網上很多的類似系列教程 包包版網路大廳的 橋牌系統 寫的很深入,感覺比較複雜,初學者不宜上手。我是在學習wcf的時候,發現自己對底層的傳輸原理都沒有搞明白,於是又回頭學習網路傳輸的一些知識,自己寫了乙個簡單的網路遊戲黑白棋,因此也想把學習的乙個過程記錄下來和初學者們一塊交流。我的只是小兒科,還請...

基於TCP的網路遊戲黑白棋系列(一) 建立連線

利用tcp開發網路應用程式,可以採用同步或者非同步的方式,這個遊戲採用的是同步的工作方式,比較簡單,系列教程也主要介紹同步的工作方式。網路通訊的前提就是客戶端和伺服器端的通訊,在伺服器端,程式需要不斷的監聽客戶端是否有連線請求,已保證多個客戶端的連線,伺服器通過套接字識別客戶端 而客戶端只需要指定哪...

基於SDL的C 黑白棋

寫了乙個基於sdl的黑白棋遊戲,分享一下。黑白棋,又叫翻轉棋 reversi 奧賽羅棋 othello 蘋果棋或反棋 anti reversi 黑白棋在西方和日本很流行。遊戲通過相互翻轉對方的棋子,最後以棋盤上誰的棋子多來判斷勝負。如果玩家在棋盤上沒有地方可以下子,則該玩家對手可以連下。雙方都沒有棋...