序言:
最近學習了Linxu下的檔案IO,琢磨著做個小游戲實踐一下,思來想去寫了個的點燈游戲,取名為“記憶大師”,游戲實作非常簡單,只用一維陣列即可實作(你們可能不知道只用一維陣列寫一個游戲是什么概念,我們一般只會用兩個字,,,,,),雖然簡單但是程序非常有趣,因此打算寫篇文章分享一下,
游戲運行:
1)主界面

主界面些許簡陋,作者想著可能大家喜歡簡約風吧,不糾結這個了,我們點擊“游戲說明”試試:
2)游戲說明
其實一開始作者并沒有添加游戲說明這一模塊,但是當他拿著這個游戲信心滿滿的去找同學測驗時,他們一臉懵逼地問:"這是啥?",于是他連夜寫了這個游戲說明

(游戲說明-1)

(游戲說明-2)

(游戲說明-3)

(游戲說明-4)

(游戲說明-5)
3)開始游戲
說了這么多可能有童鞋早就想玩兩把了,別急,我們這就點擊“開始游戲”
3.1 游戲開始后會依次隨機點亮若干個點(因為點亮的點是“轉瞬即滅”的,這里只示例了第一個點亮的點),我們的任務是記住它們的位置

3.2 當每一關展示完所有點亮的點后,就會提示我們作答

3.3 憑借作者超強的記憶力,剛剛點亮的是這三個點,點擊提交

3.4 答對啦,哈哈哈

3.5 第二關,第三關,第四關也輕松通過



3.6 第五關記錯了一個點,失敗了嗚嗚嗚

算了,太菜了,還是來說說實作程序吧
實作程序
1)棋盤設計
讀過嚴蔚敏版的《C語言資料結構》的童鞋可能對游戲主界面的那個”網狀圖“比較眼熟,沒錯,它就是《資料結構》第187頁的那張"一個表示交通網的例圖",可能有人要問了:為啥選擇這個做棋盤啊?咳咳,其實作者一開始是想做個交通咨詢系統的,并且花時間還原了書上那個"交通圖",但是后來想著交通咨詢系統沒有啥可玩性,后面在做這個”記憶大師“時需要設定棋盤,本來想做成規規矩矩5*5的正方形棋盤,后來無意間想起了之前畫好的交通圖,一拍腦袋,哎,這不剛好可以用來做棋盤嘛

《資料結構》上一張表示交通網的例圖
2)點亮\熄滅頂點
這個游戲需要滿足點擊一個點時點亮,再點擊熄滅,這是怎么做到的呢?
2.1 怎樣去存盤這些點
前面提到游戲里最復雜的資料結構是一維陣列,每錯,這25個點存盤在陣列vex[25]里:我們按從左往右,從上往下的順序給頂點編號為0-24,例如vex[4]表示從左到右,從上到下數的第5個點

2.2 點亮\熄滅
可以說這是整個設計耗時最久的一部分,這部分不需要敲代碼,而是需要找出這25個頂點的坐標:在開發板上,不斷點擊一個點,得到一個坐標范圍,然后把“點亮時的圖片”按這個坐標覆寫上去,然后一像素一像素的移動圖片測驗,直到該點“點亮時的圖片”完全覆寫原圖片,這樣的作業要進行25次
“熄滅的點”
![]()
“點亮的點”
用“點亮的點”完全覆寫“熄滅的點”可以達到頂點被點亮的視覺效果,反之則頂點被熄滅
拿到所有點的坐標后就好辦了,我們可以用一個陣列flag[25]來記錄這25個點的點亮\熄滅情況,并且約定:
1. flag[i] = 0表示vex[i]這個點是熄滅狀態
2. flag[i] = 1表示vex[i]這個點是點亮狀態
例如上面舉例的vex[4]它這部分的代碼如下:

當把25個點的坐標范圍都找出來,并且設定同上的代碼,就可以做到點擊任一一個點時點亮它啦
3)難度設定
有人可能要問了,游戲太難了怎么辦啊?沒關系,我們可以設定游戲難度,但是他又疑惑了:可是我沒看見設定難度的按鈕啊?這也是這個游戲有趣的一個點
這個游戲并沒有設定按鈕來選擇游戲難度,而是把這個按鈕轉移到了"點燈"上:游戲開始時,我們點亮的燈越多游戲難度越高(游戲難度指的是出題時的點燈間隔)實作函式如下:

可以看出當什么都不做直接開始游戲時,出題時點燈間隔為1200000微秒即1.2秒,而每點亮一個點間隔縮短40000微秒
4)系統請出題
每關開始時系統會為我們出題,即依次點亮若干個點,每關出題的個數(點亮的頂點數)Num遵循:Num = level + 2,其中level為關卡數(1,2,3,...8),這些題目是隨機生成的,我們需要用到亂數函式rand(),另外還需要一個陣列來保存題目:question[10](最多有8關,第8關有10個題目) 第level關需要生成level + 2個題目,并且這關的題目不能重復(即同一個點被點亮多次),隨機生成level + 2個不重復的0-24之間的亂數,生成的亂數所對應的點將被作為題目,隨后這些題目將依次點亮以展示給用戶
5)用戶請答題
系統出完題了,該輪到我們答題了,我們需要根據記憶點亮剛剛的題目,有人說我們需要一個陣列來保存我們的答案,的確可以這樣做,但是別忘了我們之前還定義了一個flag陣列用來記錄頂點的點亮\熄滅,那么我們的答案不就已經保存在這個flag陣列里了嘛
我們提交答案后,系統需要驗證我們的答案,這個就更簡單了,直接拿flag陣列和question陣列一對比不就知道答錯沒嘛,作者一開始確實也是這樣做的,但是由于作者技術太菜,經常玩到第6.7關就沒了,而且答錯了也不給任何提示,于是乎我又加了兩個陣列errorsign[]和rightsign[]
其中errnosign[]用來記錄用戶答錯或者少答的點,rightsign[]用來記錄相應的正確的點,檢驗答案即用for回圈遍歷flag和question陣列,當發現flag[i] != question[i]時:
1. 如果flag[i] == 1則說明用戶點亮了這個點但是題目里沒有這個點,于是errorsign將記錄這個點,
2. 如果flag[i] == 0則說明題目里有這個點但是用戶并沒有點亮這個點,于是rightsign將記錄這個點,
那么,當用戶答錯時,除了提示回答錯誤外,還指出了我們答錯的點和相應正確的點
值得注意的是:每次檢驗完答案后需要把flag陣列的元素全部置為零方便下一次出題和答題
結語:
啰啰嗦嗦說了這么多,但是游戲設計程序是挺有意思的,而且游戲也有趣,感興趣的同學不妨動自己手試試,有什么問題也可以給我留言哦,還有第一次寫博客難免會有瑕疵,還望大佬們海涵
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297220.html
標籤:其他
