游戏好友系统
最近實(shí)現(xiàn)了游戲好友系統(tǒng)。第一次按照自己的方法實(shí)現(xiàn),覺得代碼有些冗余,估計(jì)是思路問題。特在此記錄,一是為了以后維護(hù),二是向和我一樣沒有啥經(jīng)驗(yàn)的程序員提供一個(gè)思路,更希望大家不吝賜教提供更好的設(shè)計(jì)思路。
需求:
a)根據(jù)當(dāng)前玩家等級(jí)獲取10個(gè)正負(fù)20級(jí)其他玩家列表
b) ?獲取的其他玩家最近一次登錄時(shí)間不得大于1天
c)當(dāng)其他玩家列表內(nèi)玩家數(shù)量<10,則放松篩選條件
d)獲取其他玩家列表,推送至玩家添加好友UI
e)玩家點(diǎn)擊申請(qǐng)向申請(qǐng)玩家發(fā)送添加好友請(qǐng)求
f) 玩家可以對(duì)列表內(nèi)其他玩家1鍵全部申請(qǐng)?zhí)砑?/p>
g)被申請(qǐng)玩家同意后該好友添加成功,若對(duì)方拒絕不返回信息
h)每個(gè)玩家應(yīng)有1個(gè)ID
i)A玩家知道B玩家ID,A玩家可通過ID直接向B玩家發(fā)送添加好友請(qǐng)求
a)當(dāng)其他玩家申請(qǐng)與當(dāng)前玩家成為好友時(shí),該玩家信息出現(xiàn)至申請(qǐng)列表
b)同意與該玩家成為好友,則該玩家移至當(dāng)前玩家好友列表且申請(qǐng)列表內(nèi)清除該玩家信息
c)拒絕與該玩家成為好友,則申請(qǐng)列表內(nèi)清除該玩家信息
d)玩家可以對(duì)申請(qǐng)列表內(nèi)玩家1鍵全部同意添加
e)玩家可以對(duì)申請(qǐng)列表內(nèi)玩家1鍵全部拒絕添加
a)與當(dāng)前玩家已成為好友的其他玩家刷新在此列表
b) 好友之間可以送心
c)玩家A向玩家B送心則玩家B可在好友列表內(nèi)領(lǐng)取玩家A送的心
d)當(dāng)前玩家可以向其擁有的所有好友1鍵送心
e)當(dāng)前玩家可以1鍵收取其好友送的心
f)每日可領(lǐng)取的心數(shù)量有上限
?
我的設(shè)計(jì)思路:
我是按照"請(qǐng)求-回答"的形式設(shè)計(jì),將用戶的操作分為請(qǐng)求和對(duì)請(qǐng)求的回答。
請(qǐng)求:添加好友 ? ? ? ? ? ? ? ? ? ? ? ? 回答:接受 , 拒絕
請(qǐng)求:好友送心 ? ? ? ? ? ? ? ? ? ? ? ? 回答?:領(lǐng)取 , 不領(lǐng)取(過時(shí)心自動(dòng)消失)
每種請(qǐng)求被設(shè)計(jì)成一個(gè)消息,例如:A 在 某時(shí) 向 B 發(fā)送了一條 申請(qǐng)好友 的請(qǐng)求,這時(shí),當(dāng)服務(wù)器收到這個(gè)協(xié)議后,封裝一封消息,并插入到數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)字段如下:
表項(xiàng): id , fromid , toid , msgtype , isread , srecvtime. ?( msgtype:我將每個(gè)操作分類,如1就是申請(qǐng)好友 , isread:表示申請(qǐng)的對(duì)象是否對(duì)此作出了回應(yīng),無(wú)論是同意或是拒絕都會(huì)對(duì)此作出回應(yīng),即將isread 置為1,
srecvtime:服務(wù)器收到的時(shí)間?)
例如: id 為 ?1 的用戶向 2發(fā)送了申請(qǐng)好友請(qǐng)求 , 則會(huì)記錄 1 , 1 , 2 , 1 (申請(qǐng)) , 0(還未被確認(rèn)) , 1446454554(收到消息的時(shí)間)
但要說明的是,若此時(shí)B在線則這條消息將由B插入數(shù)據(jù)庫(kù),表示B收到了一條來自A的申請(qǐng)好友的消息,并在自己的 被申請(qǐng)列表 中將A的ID加入 ,若B不在線,則該記錄由A插入,表示A向B申請(qǐng)好友,并在自己的 ?已申請(qǐng)好友列表中將B的ID加入。 當(dāng)B看到這條消息時(shí),B會(huì)對(duì)此進(jìn)行回復(fù) , 接受或者拒絕 , 這兩個(gè)操作都是對(duì)A發(fā)出的申請(qǐng)的回復(fù) , 此時(shí)若 A 還在線 , 則B會(huì)在服務(wù)器內(nèi)部向A發(fā)送消息,“我同意或拒絕你的請(qǐng) 求” , 則A會(huì)將之前自己的申請(qǐng)記錄中的isread 標(biāo)記為1,表示這條申請(qǐng)已經(jīng)作廢。同時(shí),若是收到同意的消息 , 則A會(huì)在數(shù)據(jù)庫(kù)中插入記錄表明A和B已經(jīng)是好友; 若此時(shí)A不在線了 , 則對(duì)A的申請(qǐng)記錄作出回應(yīng)的操 作由B完成,即B將isread置為1,表示B拒絕A的好友請(qǐng)求。 此時(shí)u_friendmsg(用于記錄消息的表)中有一條記錄:?1 , 1 , 2 , 1 (申請(qǐng)) , 1(被確認(rèn)) , 1446454554(收到消息的時(shí)間) ,此時(shí)由于isread = 1 表示這條消息已經(jīng)被確認(rèn)。若B同意A的請(qǐng)求則u_friend中會(huì)有記錄,表明兩者一是好友關(guān)系。那么B是如何判斷要對(duì)哪條記錄作出回應(yīng)的呢,這里可以根據(jù)id字段,和srecvtime字段。
這種方式下,當(dāng)我需要好友列表的時(shí)候,直接搜索u_friend 中 friendid( id , uid , friendid , ... ) 字段便可,當(dāng)需要申請(qǐng)列表時(shí),搜索u_friendmsg中"toid"為當(dāng)前用戶id并且"isread"字段為0(未處理)的記錄即可。
由于目前在使用 "skynet"(當(dāng)前階段,僅限使用,慚愧) , 簡(jiǎn)單說一下申請(qǐng)好友,拒絕或同意的過程:
1.A 在線 , 在搜索好友或在推薦列表中申請(qǐng)某個(gè)玩家B后,這是A在服務(wù)端的數(shù)據(jù)變化為 A維護(hù)的一個(gè)已申請(qǐng)好友列表(申請(qǐng)其他人)中添加上B的ID,并創(chuàng)建一條消息,內(nèi)容如上所述。
2.此時(shí)B有在線和不在線兩種可能。若B在線,則將這條消息發(fā)送到B處理,這是B將這條消息插入數(shù)據(jù)庫(kù),并B自己的“被申請(qǐng)”列表中加上A的ID。若B不在線則有A向數(shù)據(jù)庫(kù)插入這條消息。當(dāng)B在上線后搜索u_friendmsg中toid為自己的并且isread = 0的記錄,便可得到自己的申請(qǐng)列表(被申請(qǐng))
3.B對(duì)這條申請(qǐng)有兩個(gè)選擇,拒絕或接受。若A請(qǐng)求時(shí)B在線且拒絕了A的請(qǐng)求,此時(shí)B向A發(fā)送一條消息,告訴A我拒絕你的申請(qǐng),則A若此時(shí)仍在線的話,便會(huì)將之前的申請(qǐng)列表中移除B的ID,并且對(duì)自己之前的請(qǐng)求操作進(jìn)行確認(rèn),即把 isread 改為1。若A不在線,則由B來完成確認(rèn)操作,并將A的 ID,從自己的被申請(qǐng)列表中移除;若B接受了好友請(qǐng)求 , B首先在自己的好友列表中加入A的ID,此時(shí)若A在線的話,便將消息發(fā)給A告訴A我接受你的申請(qǐng),此時(shí)A若在線,便對(duì)之前的消息進(jìn)行確認(rèn),并在自己的好友列表中加入B的ID,并向u_friend中插入記錄兩條記錄( 1 , 1 , 2 ...) , ( 2 , 2 , 1 )表示已經(jīng)是好友 ,若A此時(shí)不在線,插入好友和確認(rèn)的操作由B進(jìn)行。剩下送心和接受心的操作過程大體類似
?? skynet中判斷是否在線的方法很多,我們是在用戶登錄的時(shí)候,在datacenter中注冊(cè)此用戶,在離線的時(shí)候刪除,這樣通過調(diào)用 dc.set{ userid = 1 ,...} , dc.get( 1 )操作來判斷用戶此時(shí)是否在線并獲取其數(shù)據(jù)。
由于操作不一定實(shí)時(shí),因此很可能出現(xiàn)A申請(qǐng)好友,B在幾天后才看到,所以服務(wù)器發(fā)送給客戶端的數(shù)據(jù)中有個(gè)專門的時(shí)間字段(srecvtime)來標(biāo)示記錄,也就是,這個(gè)字段由服務(wù)器下發(fā),當(dāng)B接受申請(qǐng)的時(shí)候,向服務(wù)器發(fā)送數(shù)據(jù)時(shí)要把這個(gè)時(shí)間標(biāo)識(shí)再傳回來,我不清楚這樣做是否合適。請(qǐng)高手指教。
思路是這樣,代碼感覺還需優(yōu)化,過幾天再貼,希望能對(duì)像我這樣的新手帶來幫助。待續(xù)。。。。
轉(zhuǎn)載于:https://www.cnblogs.com/newbeeyu/p/5253178.html
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
- 上一篇: Delphi第三方组件安装DCU.PAS
- 下一篇: nopcommerce商城系统--源代码