写个三国杀
自己老早以前就想寫個局域網的三國殺,以前思考過其游戲邏輯的實現,覺得有點復雜,一直也沒有真正動手,上個周末,真正動手做了起來,2天里寫了大約2000來行代碼。算是把整個框架有了個大致的實現。下面把整個思路整理一下。
?
既然是輕量級的局域網版本,就沒必要把服務器和客戶端分開來做,就讓程序自帶服務端和客戶端,類似于quake,一個玩家創建了房間(主機),其他玩家可以搜索到局域網內的這個房間,并連接上來,然后主機點擊開始按鈕,游戲開始。既然client,server模式類似于quake,那么就干脆仿quake仿到底,2000來行代碼都是采用的c語言實現,沒有qt,沒有stl,沒有mfc,程序的架構也高仿quake,這是算是向偉大的quake致敬的一種方式吧。本來圖形繪制部分的代碼也考慮用opengl來實現,結果被卡在繪制圖片一直顯示一大塊白色這個問題上了,搜了半天只說可能是圖片尺寸的原因,opengl要求紋理大小要是2^n+2m像素大小。手工調節了下圖片尺寸也無濟于事。一怒之下,圖像接口全部換成了DirectDraw……
?
整個項目分成3個模塊:2個dll模塊,1個exe模塊。2個dll分別是處理游戲邏輯的Game.dll和處理圖像繪制的Ref.dll, exe模塊里面實現client和server, client每幀調用Ref.dll來繪制整個游戲界面,server每幀調用Game.dll來處理游戲邏輯,client和server之間通過網絡來通信,由于考慮到游戲要求可靠的網絡傳輸,所以選用了tcp。而要實現客戶端查找局域網類建立好的游戲主機的話,由于tcp沒有廣播功能,可以在server端再開個udp的socket,來響應client發的udp廣播消息。
?
Game模塊才是真正三國殺的實現,同時在內存里保存了整個戰局,它負責牌堆初始化,隨機抽牌,牌技能實現,技能響應,下面舉個殺閃簡單的例子來說明流程:玩家1對玩家2打出了一張殺(這個事件是由客戶端以網絡消息的形式發過來的),模塊調用殺的處理函數,處理函數里向客戶端發生一個請求閃的網絡消息,同時把這個請求閃的事件保存起來(入棧),客戶端收到消息后,知道要打出閃,如果打出來了就向服務端發生個請求響應成功的事件的網絡消息,沒打出來就發送響應失敗的網絡消息,服務端收到后,取出保存的請求閃的事件(出棧),如果是個成功的消息就結束處理,如果是失敗就進入傷害計算的的事件處理。
?
Ref模塊里面是繪制圖片和ui的實現,ui包括圖片按鈕,窗體等的實現。exe里調用這些來繪制整個游戲。
?
exe是程序的主體框架,沒想到有什么好說的……
?
最后,如果能寫好,當然要開源。
轉載于:https://www.cnblogs.com/hj046/archive/2011/09/21/2183001.html
總結
- 上一篇: 消费者行为学的典型营销案例
- 下一篇: 适合零基础学习Python的书籍