2020级C语言大作业 - 三国杀
三國殺 C語言大作業
分享20級同學大一上學期用C語言(及少量C++)實現的簡化版三國殺游戲。由于同學們剛學了三個月的編程,實現還不夠完善,工程代碼、圖片音樂素材可以從百度網盤下載:
鏈接:https://pan.baidu.com/s/1CP72EbOgt_t8V2Jw5xGmeQ
提取碼:ba5h
1 設計思路
本游戲參考了網絡上的同名游戲,并通過EasyX插件用C語言編寫實現,玩家通過鼠標選擇卡牌并使用,達成擊殺效果即獲得游戲勝利。在還原的同時保證界面相對更美觀簡潔,且保證人機的操作更加貼近真人游戲思路。加入更多卡牌的同時也提高的游戲的體驗與趣味性。
2 功能描述
游戲主體基本功能就是接受玩家的鼠標輸入,并做出相應的反應,實現界面選擇和游戲功能。其分部分介紹如下:
2.1 初始化
初始化函數分為三塊,一塊為startuppicture()函數,功能為給相應的牌賦予圖像;一塊為startupdenglu()函數,功能為放置進入游戲界面,點擊進入游戲即可加載游戲;一塊為startup()函數,其基本功能如下:
1.初始化畫布(initgraph()函數),并放置基本圖像,輸出哪方回合、回合數等,使游戲具有回合制的感覺;
2.給牌組賦予相應序號,并進行洗牌(xipai()函數),利于后面引用并使手牌具有隨機性;
3.初始化玩家和人機手牌,玩家先出牌,并輸出人機手牌數,開啟背景音樂;
2.2 牌基本信息
【南蠻入侵】2張,【無懈可擊】4張,【萬箭齊發】2張,【閃】15張,【桃】8張,【酒】4張,【殺】20張,【順手牽羊】4張,【過河拆橋】4張,【決斗】3張,【八卦陣】2張,【麒麟弓】【貫石斧】【青釭劍】【赤兔】【爪黃飛電】各一張。
雙方武將均為張飛(技能,出殺的數量無限制);
2.3 鼠標點擊
游戲運用update()函數,儲存輸入的鼠標信息;
2.4 玩家出牌和牌的移動
游戲運用playerfenxi()函數,對輸入的鼠標信息分析并進行牌的移動(playershow()函數):
1.點擊該牌微上移,再次點擊該牌或點擊取消回歸原來位置;
2.對微上移的牌點擊確定打出該牌;
3.點擊結束進行下一回合;
2.5 人機出牌
游戲運用npcshow()函數,使人機能出的牌盡可能的出完;
2.6 棄牌
游戲運用discard()函數,對牌數多于人物生命值的人物棄掉多的牌數,其中玩家為點擊棄牌,人機為隨機棄牌;
2.7 回合交替
游戲運用nextHuihe(int card2[])函數,回合結束和棄牌結束后,增加對方兩張牌;
2.8 牌效果
玩家效果在playerpaieffect()函數里,人機效果在npcshow()函數里;
1.一方出殺或萬箭齊發另一方出閃(playerchushan()函數和npcshow()函數 );
2.一方出南蠻入侵另一方出殺(nanman()函數);
3.一方出決斗由對方開始,雙方輪流出殺(juedou()函數);
4.貫石斧效果,若打出的殺被對面閃抵消,可棄兩張牌強制扣血(guanshi()函數,玩家和人機均為隨機棄牌);
5.麒麟弓效果,若對方遭到殺扣血,則可棄掉對方一張馬(qiling()函數,玩家和人機均棄對方第一張馬);
5.八卦陣效果,判斷為0生效,為1則不生效(玩家Playerbagua()函數,人機Npcbagua()函數);
6.無懈可擊效果,一方打出順手牽羊或過河拆橋或決斗或萬箭齊發,可使用無懈可擊抵消(wuxie()函數);
7.青釭劍效果,無視對方八卦陣;
8.一方出順手牽羊或過河拆橋,獲取對方一張牌或棄掉對方一張牌;
9.出桃加一滴血,出酒增加殺1滴傷害;(以上三條代碼行數較少,未設置函數)
10.為增加游戲完整性,增加馬,但對游戲無影響;
2.9 清牌
清除在屏幕中央的牌(clearpai()函數),其中放置了基本圖像和文字,玩家手牌(placeshoupai()函數),裝備牌(placeequipment()函數);
2.10 調整手牌序號
運用adjustpai()函數,使每次打出牌后為-1的序號移到后面;
2.11 判定音效及裝備牌
judgemusic(int i)函數和judgeequipment(int i)函數用于判定打出牌的音效及裝備牌;
2.12 判定游戲是否結束
judgelife()函數用于判斷玩家和人機生命值是否為0,一方為0,則結束,對方勝利;
2.13 輸出文字
游戲里以out開頭輸出各類文字的函數,在各對應界面輸出對應文字;
3 實現過程中的重點和難點
3.1 修復卡牌實現效果時產生的bug(難點)
在測試相關卡牌打出效果時,由于需要一些限制條件以及可能會有其他卡牌可以打出效果時(如無懈可擊),在測試初期,我們嘗試將無懈可擊的效果加入錦囊牌的發動條件內,但會導致錦囊牌會無視無懈可擊效果依舊能觸發的問題;以及在使用酒之后傷害的計算可能會殘留到下一回合的現象,導致在血量計算以及出牌效果上產生影響。
解決方法為:
1.將無懈可擊的效果單獨用wuxie()函數實現,并在每次打出錦囊牌后加入wuxie()函數。
2.在使用酒后出殺結算完畢以及出牌階段結束之后重置酒的數量以及殺的傷害。
3.2實現各個種類卡牌效果(重點)
“三國殺”這一卡牌游戲的主體玩法依賴于各種類卡牌打出后所實現的不同效果,因此對不同卡牌所要達成的出牌效果實現需要許多邏輯的思考,以及在實現卡牌效果時,實現卡牌效果后均需要全面考慮其他眾多牌的響應效果及人機所采取的對應措施。在實現卡牌效果的時候,我們進行了多次測試,并進行了一些極限場景的模擬及修改,增添細節實現了最終版本。
4 體會與總結
在此次長達一個多月的游戲制作中,我發現對部分知識的運用其實并不難,學過的知識就那些,就算加入了一些新知識,多思考思考也就弄懂了。真正難的是在出現bug時,如何發現并解決它。例如我在寫【青鋼劍】無視【八卦陣】的效果時,僅僅加入了幾行代碼,但測試時卻用了一個多小時,因為【青鋼劍】和【八卦陣】的數量較少,滿足條件比較困難。當然,此次大作業更離不開團隊合作,有些東西你會發現你自己做不出來,你的隊友卻可以做出來,相反也是如此。還有在對一些細節的處理方面,可能某些細節不到位,就會出現不必要的bug。
通過此次合作,我了解到了知識的儲備固然重要,但合作更為重要。其中,通過合作我收獲了自主學習能力、自主糾錯能力。細節修改方面在寫程序時也是十分重要的,通過細節修改,能修復許多bug,使整個程序更加完整,流暢。另外,在此次游戲中,思維也是十分重要,沒有思維許多方面就找不到解決方法,就無法把程序寫下去。此外,邏輯的合理及語言的規范也很重要。
總而言之,此次大作業讓我認識到了自己的不足,也同樣讓我受益匪淺。
?
總結
以上是生活随笔為你收集整理的2020级C语言大作业 - 三国杀的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 数学期望_python机器
- 下一篇: duilib写个三国杀?