首先來說說關於遊戲開發中需要的一些基礎知識。
第乙個基礎知識就是:鍊錶的使用。
對於鍊錶的使用,首先涉及到的就是結構的定義。以下是我定義的乙個結構:
//使用者資訊結構
ruserinfo= record
userid:string[20];
***:boolean;
face:byte;
score:integer;
end;
puserinfo = ^ ruserinfo;
在這個結構中大家需要注意userid:string[20];的定義方法。我見過有人是這樣定義的:userid:string; 我覺得這樣定義是不正確的。對於string[20]來說,這樣定義說明了它是乙個short string型別,而這種型別的長度是255。可是定義成string的話它的長度應該是2g。乙個結構不能占用這麼大的空間。所以我建議大家在定義結構物件的時候string型別盡量定義成string方式。
對於鍊錶的時候其次就是向鍊錶中加入指標和從鍊錶中刪除指標。
加入指標使用add,刪除指標使用delete 例如:
//新增鍊錶
new(p_user);
p_user.userid:= userid;
p_user.***:= ***;
p_user.face:= face;
p_user.score:= score;
userlist.add(p_user);
//刪除鍊錶
if p_user.userid = userid then
begin
userlist.delete(i);
dispose(p_user);
end;
在新增和刪除鍊錶的使用中一定要注意,在加入之前使用new函式在刪除以後一定要使用dispose函式。我見的最多的錯誤就是在新增前使用了new但是在刪除以後沒有使用dispose來釋放自己申請的空間。這樣會造成記憶體洩露。
2:鍊錶的巢狀。
在我後面關於開發遊戲的例子中會講到在定義鍊錶的時候使用巢狀的方式。
例如:對於乙個遊戲來說,我們可以給它定義乙個gameid來作為這個遊戲的編號。而乙個遊戲可以分成好幾個房間(我們使用房間編號roomid來標記)。對於房間來說,裡面會包含很多的使用者。那如何使用乙個鍊錶來儲存這個資訊,並且讓我們以後查詢起來非常方便呢?我是這樣定義的:
//使用者資訊
ruserinfo = record
userid:string[20]; //使用者編號
用來唯一確定乙個使用者
username:string[20]; //使用者名稱
用於顯示使用
userpaw:string[20]; //使用者的密碼
use***ce:integer; //使用者頭像
user***:boolean; //使用者性別
… … //省略使用者其它資訊
end;
puserinfo = ^ ruserinfo;
//房間資訊
rroominfo = record
roomid:integer; //房間編號
userlist:tlist; //房間使用者鍊錶
用來儲存puserinfo
end;
proominfo = ^ rroominfo;
//遊戲資訊
rgameinfo = record
gameid:string[2]; //遊戲編號
roomlist:tlist; //房間鍊錶
用來儲存proomlist
end;
pgameinfo = ^ rgameinfo;
這樣定義出了乙個使用巢狀的結構。
使用的時候和單一的鍊錶結構使用沒有區別。例如
在某房間加入乙個使用者(假設gamelist為遊戲鍊錶)。
procedure adduserinfo(gameid:string;roomid:integer;userinfo:ruserinfo);
varp_gameinfo:pgameinfo;
p_roominfo:proominfo;
p_userinfo:puserinfo;
i:integer;
begin
for i:=0 to gamelist.count-1 do
begin
p_gameinfo:= gamelist.items[i];
if p_gameinfo.gameid = gameid then
begin
for j:=0 to p_gameinfo. roomlist.count-1 do
begin
p_roominfo:= p_gameinfo. roomlist.items[j];
if p_roominfo. roomid = roomid then
begin
new(p_userinfo);
p_userinfo^:= userinfo;
p_roominfo. userlist.add(p_userinfo);
break;
end;
end;
end;
end;
end;
至於查詢、刪除都和上面的例子相差不大。
3:函式鍊錶的使用。
對於棋牌類遊戲中函式鍊錶的使用主要表現於:服務端框架和具體遊戲邏輯處理dll中。由於服務端框架部分已經實現了一些函式(例如資料傳送函式、使用者狀態改變函式、桌子狀態改變函式等等),沒有必要再讓dll實現這個功能(或者不易實現這個功能)。所以我們只要將這些函式的指標傳入就可以直接使用它們。具體的傳入方式可以檢視我的blog文章《
delphi
下使用指標的簡單總結》
中的3:函式指標的使用。為了保障閱讀的連續性,我將當時的**在這裡也貼出來:
senddatafun: procedure(casetype: byte; usersocket: rusersocket; data: array of char; datalen: integer);
function modulesenddata(funplist: tlist): boolean; stdcall; export;
begin
senddatafun := funplist.items[0];
end;
在exe中的**是:
linstance:=loadlibrary(pchar(temp));
if linstance>0 then
begin
//將傳送資料的指標傳入dll外掛程式中
@givemodulefun:=getprocaddress(linstance,'modulesenddata');
if @givemodulefun<>nil then
begin
m_funlist:=tlist.create;
//傳送資料
t_pointer:=@dllsenddata;
m_funlist.add(t_pointer);
givemodulefun(m_funlist);
end;
end;
是不是將鍊錶使用的很熟練就可以開始開發遊戲了呢?不是。對於網路棋牌類遊戲來說。我的理解應該是兩個部分非常重要:1:網路通訊部分。2:介面實現部分。
delphi
開發網路通訊部分。
fxh7622
使用Delphi編寫棋牌類遊戲 設計篇 1
通過對以前 3篇文章的 大家應該對編寫棋牌類遊戲的基礎知識有一定的了解了。但是如何使用這些基礎知識編寫出乙個可擴充套件性功能完善的遊戲呢?今天我們就來 一下如何設計一款棋牌類遊戲的框架。以下是我所設計的遊戲服務端框架 今天先來 一下中心伺服器的設計。中心伺服器,顧名思義應該是整個服務端框架中排程所有...
棋牌類遊戲測試
1,遊戲規則 在正確流程下完成,分別考慮勝負情況。在異常情況下完成,如中途退出,對手退出等情況。2,勝負情況下的收益變化 在每一種情況下獲勝的獎勵情況 棋牌獲勝有很多判斷,比如三條,同花等 每種獲勝條件獲得的收益是不同的。在輸掉或退出比賽情況下,是否有扣除情況 視遊戲設定而言 或者獲勝出現多人情況下...
棋牌類遊戲策劃的幾點思考
遊戲的策劃主要任務是由策劃部門完成,在這個過程中容易出現的情況是策劃人員要求的不合理 可能該測試人員不太了解遊戲開發 或是程式設計師理解錯了策劃人員的要求。所以個人在這裡認為要想寫好遊戲就要與策劃人員及客戶很好的交流。最近做的是乙個類似公升級的遊戲,對於這個遊戲,我想我犯了一點傻,遊戲是邊想邊寫,連...