2019级C语言大作业 - 三国杀
三國殺19年 C語言演示視頻
?
分享19級同學大一上學期用C語言實現(xiàn)的三國殺游戲。分步驟代碼、圖片音樂素材、可執(zhí)行程序可以從百度網(wǎng)盤下載:
https://pan.baidu.com/s/1K3ANkUtPUABbaAd2CmxFLw一、 設(shè)計思路
《三國殺》是中國傳媒大學動畫學院2004級游戲?qū)I(yè)學生設(shè)計,由北京游卡桌游文化發(fā)展有限公司出版發(fā)行的一款熱門的桌上游戲,并在2009年6月底由杭州邊鋒網(wǎng)絡(luò)技術(shù)有限公司開發(fā)出網(wǎng)絡(luò)游戲。該游戲融合了西方類似游戲的特點,并結(jié)合中國三國時期背景,以身份、勢力或陣營等為線索,以卡牌為形式,合縱連橫,經(jīng)過一輪一輪的謀略和動作獲得最終的勝利。三國殺集合歷史、文學、美術(shù)等元素于一身,在中國廣受歡迎。
由其本身特性可知,《三國殺》游戲,完全可以由C語言完成,并且實現(xiàn)過程具有一定難度,再加上于我組組員都深深熱愛此項卡牌運動,于是,在我組一致商議決定下,確定在此次C語言項目設(shè)計,我組將借由所學知識親手創(chuàng)造一款相似的軟件游戲。
二、 功能描述
我組此次完成的《三國殺》游戲支持實現(xiàn)真實三國殺的大部分設(shè)定,包括殺、閃、桃等的基本牌,萬箭齊發(fā)、南蠻入侵、無中生有等的錦囊牌以及諸葛連弩,青龍偃月刀等的裝備牌。玩家將以教程闖關(guān)形式面對并設(shè)法戰(zhàn)勝越發(fā)智能的簡單AI,并在闖關(guān)途中解鎖新的卡牌,最終獲得游戲的勝利。
《(簡易)三國殺》基本規(guī)則:
1、起始手牌
將游戲牌洗混,隨機分給每個玩家4張,此為起始手牌。
手牌:拿在手里的牌。
將剩余游戲牌放在桌子中央,作為牌堆(玩家在游戲中棄置的牌放在一旁,組成棄牌堆)。
2、回合流程
進行游戲時,由玩家開始,按逆時針方向以回合的方式進行。即:每名玩家有一個自己的回合,一名玩家回合結(jié)束后,右邊玩家的回合開始,依次輪流進行。
每個玩家的回合可以分為六個階段:
2.1 準備階段
通常可以跳過,有些武將可以使用此階段的技能。
2.2 判定階段
若面前橫置著延時類錦囊,必須依次對這些延時類錦囊進行判定。
若面前橫置有兩種或更多的延時類錦囊,從最后一個施加的錦囊開始判定(最早放置的最后判定)。
2.3 摸牌階段
從牌堆頂摸兩張牌。
在游戲里,若沒有特殊說明,“摸X張牌”指的就是從牌堆最上方摸牌。
當需要摸牌或?qū)⒁獙ε贫旬a(chǎn)生影響時,牌堆沒牌,則立即將棄牌堆洗混后形成新的摸牌堆。
2.4出牌階段
可以使用0到任意張牌,加強自己或攻擊他人,但必須遵守以下兩條規(guī)則:
2.4.1、每個出牌階段僅限使用一次【殺】。
2.4.2、任何一個玩家面前的判定區(qū)或裝備區(qū)里不能放有兩張同名的牌。
2.4.3、每使用一張牌,即執(zhí)行該牌之效果。如無特殊說明,游戲牌在使用后均需棄置(放入棄牌堆)。
2.5、 棄牌階段
在出牌階段中,不想出或沒法出牌時,就進入棄牌階段,此時檢查手牌數(shù)是否超出當前的體力值(手牌上限等于當前的體力值),每超出一張,需要棄一張手牌。
2.6、 結(jié)束階段
通??梢蕴^,有些武將可以使用此階段的技能。
3、補充說明
3.1、在游戲里,若無特殊說明,摸牌即是說從游戲牌堆頂摸牌。
3.2、玩家在游戲中使用、打出或棄置的游戲牌放在一旁,組成棄牌堆。
3.3、當牌堆沒牌時,則立即將棄牌堆洗混后形成新的牌堆。
3.4、“體力上限”與“當前體力值”不一樣。
4、武將死亡
當一個武將的體力降到0或更低時,即進入瀕死狀態(tài),除非自己或他人在此時用“桃”來挽救該武將,否則該武將出局。武將出局后,棄置該武將所有牌。
5、游戲結(jié)束
5.1、AI死亡,玩家獲勝,進入下一關(guān)或獲得游戲勝利
5.2、玩家死亡,玩家落敗
6、卡牌效果
6.1、殺
你的出牌階段,對除你外,你攻擊范圍內(nèi)的一名角色使用,效果是對該角色造成1點傷害。
◆游戲開始時你的攻擊范圍是1 。
◆每個出牌階段你只能使用一張【殺】。
6.2、閃
當你受到【殺】的攻擊時,你可以使用一張【閃】來抵消【殺】的效果。
◆閃通常情況下只能在回合外使用或打出。
6.3、桃
桃能在兩種情況下使用:
1、在你的出牌階段,你可以使用它來回復你的1點體力。
2、當有角色處于瀕死狀態(tài)時,你可以對該角色使用【桃】,防止該角色的死亡。
◆出牌階段,若你沒有損失體力,你不可以對自己使用【桃】。
6.4、過河拆橋
出牌階段,對除你以外的任意一名區(qū)域內(nèi)有牌的角色使用。你選擇并棄置該角色區(qū)域里的一張牌。
◆區(qū)域包括手牌、裝備區(qū)和判定區(qū)。
6.5、順手牽羊
出牌階段,對除你以外的與你距離1以內(nèi)且區(qū)域內(nèi)有牌的一名角色使用。你選擇并獲得該角色區(qū)域內(nèi)的一張牌。
◆使用順手牽羊時,注意你裝備區(qū)里的馬和目標角色裝備區(qū)里的馬。
◆區(qū)域包括手牌、裝備區(qū)和判定區(qū)。
6.6、決斗
出牌階段,對除你以外的任意一名角色使用。由目標角色先開始,你和其輪流打出一張【殺】。【決斗】對首先不出【殺】的一方造成1點傷害,而另一方視為此傷害的來源。
◆使用【決斗】有可能讓自己受傷
◆受到因【決斗】導致的傷害時,來源為決斗的獲勝方。
6.7、借刀殺人
出牌階段,對除你以外的裝備區(qū)里有武器牌的一名角色使用。該角色需對其攻擊范圍內(nèi),由你指定的另一名角色使用一張【殺】,否則你獲得該角色裝備區(qū)里的武器牌。
◆角色使用【殺】時,角色技能和武器技能可以照常發(fā)動。
6.8、萬箭齊發(fā)
出牌階段,對除你以外的所有角色使用。按行動順序結(jié)算,除非目標角色打出一張【閃】,否則該角色受到【萬箭齊發(fā)】對其造成的1點傷害。
◆你必須指定除你外的所有角色為目標,然后他們(從你的下家開始)依次選擇是否打出【閃】。
6.9、南蠻入侵
出牌階段,對除你以外的所有角色使用。按行動順序結(jié)算,除非目標角色打出一張【殺】,否則該角色受到〔南蠻入侵〕對其造成的1點傷害.
◆你必須指定除你外的所有角色為目標,然后他們依次(從你的下家開始)選擇是否打出【殺】。
6.10、無中生有
出牌階段,對你自己使用。摸兩張牌。
6.11、五谷豐登
出牌階段,對所有角色使用。你從牌堆亮出等同于現(xiàn)存角色數(shù)量的牌,然后按行動順序結(jié)算,目標角色選擇并獲得其中的一張。
◆這張牌會讓包括你在內(nèi)的角色每人各從一定數(shù)量的牌里挑選一張加入手牌。
6.12、桃園結(jié)義
出牌階段,對所有角色使用。按行動順序結(jié)算,目標角色回復1點體力。
◆這張牌會讓包括你在內(nèi)的角色各回復1點體力。即使所有人都滿血也可使用,只是沒有效果。
6.13、無懈可擊
在目標錦囊生效前,抵消其對一名角色產(chǎn)生的效果。
◆【無懈可擊】是一張可以在其他錦囊開始結(jié)算時使用的錦囊,它只能抵消目標錦囊對一名指定角色產(chǎn)生的效果。
◆【無懈可擊】本身也是錦囊,所以也可以被抵消。
三、 開發(fā)步驟實現(xiàn)方法
在本組組內(nèi),我主要負責各與卡牌效果的實現(xiàn)相關(guān)的算法編譯,而要實現(xiàn)最終版所具有的功能,我在編碼過程中主要經(jīng)歷了四大步:
1、 回合制基本框架
這是《三國殺》游戲的最基本之處,也是第一個讓我組組員頭疼的地方。在先前制作的一系列游戲中,主函數(shù)一般包括:
while (1) {show(); //顯示界面updateWithoutInput(); //無需用戶輸入的更新updateWithInput(); //需用戶輸入的更新}如何實現(xiàn)操作的轉(zhuǎn)換,即在玩家執(zhí)行完摸牌、出牌、棄牌后控制AI進行操作,成了一大難題。最后,在我組組員的共同努力與創(chuàng)新下,借由進一層次的循環(huán)控制完成了此項操作,最終完成的主函數(shù)如下
while (1) {show(); //顯示huihe_player(); //玩家回合huihe_npc(); //電腦回合 }其中,在玩家回合huihe_player函數(shù)中置入了另一重循環(huán),在執(zhí)行完棄牌操作后退出循環(huán),完成回合制設(shè)定。
2、 基本牌實現(xiàn)
比較其他部分來說,這一部分是相對輕松的,需要注意的只有對于任一角色,每一個回合所能出的【殺】次數(shù)是有限并受距離限制,因此需要另外定義相關(guān)變量。
int player_sha_num=0;//玩家出殺次數(shù) int npc_sha_num=0;;//電腦出殺次數(shù) int npc_player=1,player_npc=1;//距離3、 錦囊牌實現(xiàn)
這一部分的難點是對于任一錦囊牌,【無懈可擊】可以被打出以使其失效(包括【無懈可擊】本身),這就要求對于玩家每一次使用錦囊,AI判斷手牌中是否包含【無懈可擊】、是否應該打出,為簡化代碼,遂將這一步驟以函數(shù)形式封裝
int npc_wuxie(int success)//判斷手牌是否包含【無懈可擊】 {for(i=0;i<npc_shoupai_num;i++){if(npc[i]==11){npc[i]=0;success=0;break;}}//打出【無懈可擊】,使相應錦囊的success變量轉(zhuǎn)化為0return success; }4、 裝備牌實現(xiàn)
這一部分的難點是裝備牌一方面占有額外的儲存位置,一方面又與另外幾種牌種都有交互,這就要求我們定義新的變量存儲各角色裝備情況并根據(jù)裝備情況對該角色使用牌的規(guī)則進行調(diào)整。例如,當某一角色裝備【諸葛連弩】時,其每回合使用殺的限制將解除。又如,當某一角色裝備【青龍偃月刀】時,其所使用的【殺】被【閃】抵消時可以繼續(xù)出殺
void player_1() {int input;int success_1=1;if(player_sha_num==1&&player_weapon!=21){printf("您本回合已使用過殺,無法繼續(xù)出殺");Sleep(20);}//一般情況對出【殺】次數(shù)有限制,裝備【諸葛連弩】時解除else{if(player_npc<=1){player[player_out]=0;player_shoupai_num--;if(npc_armor==27)printf("殺無效");//判斷對方是否裝備【明光鎧】else{success_1=npc_2(success_1);if(success_1==1){npc_life--;show ();printf("npc收到一點傷害");npc_bingsi ();gameover ();}else if(player_weapon==22){player_zhengli ();show ();printf("是否發(fā)動青龍偃月刀繼續(xù)出殺");scanf ("%d”, &input);input--;if(player[input]==1)player_1();}//當【殺】被【閃】抵消時,判定是否裝備【青龍偃月刀】,若是,可繼續(xù)出【殺】}player_sha_num++;}elseprintf("距離不足");} }?
總結(jié)
以上是生活随笔為你收集整理的2019级C语言大作业 - 三国杀的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文看懂POE供电原理
- 下一篇: 一张图了解致远A6人事管理