上一節我們講到了客戶端傳送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 黑白棋在西方和日本很流行。遊戲通過相互翻轉對方的棋子,最後以棋盤上誰的棋子多來判斷勝負。如果玩家在棋盤上沒有地方可以下子,則該玩家對手可以連下。雙方都沒有棋...