終于到了分析+代碼的時(shí)候了,我想這樣,此篇第一部分先上我之前做了一半的版本(做到投票環(huán)節(jié),后因?qū)W期末考試就擱置了),通過之前的版本來增強(qiáng)大家對游戲從上一篇那一大堆規(guī)則到實(shí)現(xiàn)代碼的過渡。第二部分再討論第一部分不足的地方,以及初步考慮的解決辦法。


上圖是整個(gè)項(xiàng)目的資源管理器截圖,MVC,共三個(gè)頁面:Home/Index,Home/Login,Play/Index。以及兩個(gè)Controller,七個(gè)Model。
0. Views
先來看個(gè)界面吧

Home/Index
無論是旁觀還是玩家,都要寫個(gè)昵稱才能進(jìn)入,當(dāng)時(shí)考慮到在微信界面打開會(huì)可能退出頁面去朋友圈刷一下在回到頁面來繼續(xù)游戲的情況(也就是關(guān)掉瀏覽器再回來),就用了session來處理這個(gè)問題,但偶爾會(huì)出現(xiàn)的Session失效問題我還是沒徹底搞定,計(jì)劃在新版本中KO掉這個(gè)問題。

Home/Login
相當(dāng)于已經(jīng)進(jìn)入了QQ房間的某個(gè)桌子,大家也許已經(jīng)注意到了四點(diǎn):
(1)項(xiàng)目叫CatGhost(哈哈~)Catch+ghost=Catghost
(2)頁面有相同之處,就是Views/Shared的功勞

<a href="/">首頁</a> <a href="@Url.Action("Restart", "Home")" onclick="return confirm('確定要結(jié)束本局,并重新開始?')">重開一局</a> <a href="@Url.Action("Signout", "Home")">完全退出</a> <div> @RenderBody() <hr /> <footer> <p>© @DateTime.Now.Year - Zapup</p> </footer> </div>
(3)輸入昵稱進(jìn)入后,直接進(jìn)入了桌子,而不是房間。沒錯(cuò),為了不作死,偷懶作了只有一個(gè)桌子的房間,故只能有一桌人玩這個(gè)游戲~
(4)為了便于測試,報(bào)名上限是3人。測試時(shí),因Session關(guān)系,再啟動(dòng)一個(gè)新實(shí)例也是同一個(gè)張三,所以我用了其他瀏覽器(當(dāng)時(shí)湊齊6個(gè)瀏覽器測試的感覺也是心好累,故可先設(shè)3個(gè)人玩的,以測試好人、白癡、鬼所看到的界面)。
人數(shù)設(shè)定在Web.config,并在Models/Setting中調(diào)用


PRivate Setting(){ this._civilianCount = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["CivilianCount"]); this._ghostCount = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["GhostCount"]); this._idioCount = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["IdioCount"]);}
 
當(dāng)有人(六爺)進(jìn)入房間并作出要報(bào)名參加還是旁觀的選擇后,張三的頁面會(huì)變化(定時(shí)刷新)
PS:因考慮到流量問題,移動(dòng)端要搞jq刷新,那絕壁弄死人了,所以我用了HTML5的服務(wù)器發(fā)送事件(W3SCHOOL的地址),每秒按1k算(1分鐘就得60k),一局游戲一小時(shí),就得60k*60=3600k=3.5M(感覺5M之內(nèi)都還可以,但肯定還有極大的優(yōu)化空間)

計(jì)算流量

等待游戲開始
此處兩點(diǎn):
(1)要發(fā)言會(huì)提示“請等待游戲開始”
(2)可以看到玩家的之間的箭頭,表示了發(fā)言順序,也就是座位(因?yàn)樵诰W(wǎng)絡(luò)中你坐哪都一樣,反正是隨機(jī)分配角色的)。是不是想起來德州撲克的圓桌?可以坐在想做的人旁邊的那種。好吧~我承認(rèn)我又偷懶沒想做得那么專業(yè)[委屈]

唐五進(jìn)入
當(dāng)唐五點(diǎn)下“報(bào)名”鍵以后,出現(xiàn)下面界面:

游戲開始
其中做的操作有:從題庫取詞(先寫死在程序里)、隨機(jī)分配角色(這是真隨機(jī),后續(xù)分析各Model就知道了),并開始過了不是鬼的人,因?yàn)橐呀?jīng)到了鬼可以討論并制定誰開始發(fā)言的環(huán)節(jié)(看到鬼的界面中有三個(gè)人名的按鈕沒?),此時(shí)非鬼想發(fā)言,會(huì)被系統(tǒng)阻止。

鬼討論環(huán)節(jié)
當(dāng)所有的鬼都指定了同一個(gè)發(fā)言人時(shí),出現(xiàn)了下面界面:

開始發(fā)言
此時(shí),非六爺發(fā)言,會(huì)被系統(tǒng)阻止(阻止的截圖比較沒意義就不上了)。

第一輪結(jié)束,第二輪開始
是不是發(fā)現(xiàn)張三(鬼)根據(jù)六爺和唐五的話開始渾水摸魚了?好的,第二輪像第一輪一樣發(fā)言(因?yàn)槲沂致貓D晚了點(diǎn)):

開始投票
大家有注意到了兩點(diǎn)吧:
(1)沒錯(cuò),之前的聊天記錄消失了(因?yàn)槲沂致龥]截圖到第二輪的,第二輪是六爺開始懷疑張三,唐五不確定,張三繼續(xù)狡辯),為什么記錄消失了,這也是為了考記憶力,不讓你去回翻誰說過了什么、誰懷疑過誰、誰投過誰。
(2)投票怎么沒有棄權(quán)?是的,的確應(yīng)該有棄權(quán)票,都說了我只做到投票嘛~~還沒做完就要復(fù)習(xí)考試了嘛~~~
所以到此為止,截圖完畢,大體意思就是這個(gè)feel,要考慮的細(xì)節(jié)還有好多。下面是看業(yè)務(wù)邏輯部分的考慮:
(下面的部分今天有些事兒就更新不完了,爭取近兩天搞定!先上個(gè)提綱)
1. Models
2. Common:
WebCommon負(fù)責(zé)獲取各種Session

public static class WebCommon { public static Audience GetAudienceFromSession() { return HttpContext.Current.Session["player"] as Audience; } public static Civilian GetCivilianFromSession() { return HttpContext.Current.Session["player"] as Civilian; } public static Ghost GetGhostFromSession() { return HttpContext.Current.Session["player"] as Ghost; } public static void RenewPlayerSession(Audience newAudience) { HttpContext.Current.Session["player"] = newAudience; } public static void AddPlayerSession(Audience audience) { HttpContext.Current.Session.Add("player", audience); } public static void RemovePlayerSession() { HttpContext.Current.Session.Remove("player"); } }
AudienceFilterAttribute負(fù)責(zé)在過濾聽眾,即區(qū)分玩家與旁觀者的操作和界面

public class AudienceFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { HttpContextBase context = filterContext.HttpContext; if (context.Session["player"] == null) { context.Response.Redirect("/"); return; } base.OnActionExecuting(filterContext); } }
過濾在Controller中調(diào)用

[AudienceFilter]public class PlayController : Controller{}public class HomeController : Controller{[HttpPost] [AudienceFilter] public ActionResult Logout(){//...} [AudienceFilter] public ActionResult Signout(){//...} [AudienceFilter] public ActionResult Restart(){//...}}
3. Controller
新聞熱點(diǎn)
疑難解答
圖片精選