日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

游戏好友系统

發(fā)布時(shí)間:2024/4/14 windows 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 游戏好友系统 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近實(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)求

  • 申請(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é)

    以上是生活随笔為你收集整理的游戏好友系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。