摘? 要:游戲產(chǎn)業(yè)發(fā)展很快,不僅是學生,很多成年人都對游戲愛不釋手;C語言是實踐性很強的一門課程,讓學生用C語言編寫英雄聯(lián)盟游戲,相對于局限于教材的“填鴨式”“驗證式”教學而言,項目教學對學生更有吸引力,更能激發(fā)學生對學習動力,興趣愛好是最好的老師,學生玩著自己編寫的游戲,有利于其體會到成就感,對游戲功能的更高要求促使學生進行自主學習,自己一步步去實現(xiàn)。這樣能激發(fā)學生的學習熱情,積累項目經(jīng)驗,達到提升學生實踐動手能力的目的。
關鍵詞:C語言;情境教學;任務驅(qū)動;項目案例;英雄聯(lián)盟;游戲
中圖分類號:TP311.1? ? ? 文獻標識碼:A 文章編號:2096-4706(2020)05-0069-03
Developing League of Legends Game with C Language
JI Huijin
(Department of Information Technology,Hubei Polytechnic Institute,Xiaogan? 432000,China)
Abstract:The development of the game industry is very fast and hot. Not only students,but also many adults cant let go of the game. C language is a very practical course. This paper introduces the game situation to let students write the League of Legends in C language. Compared with the teaching materials “cramming” and “verification” teaching,project-based teaching is more attractive to students and can stimulate students For learning motivation,interest and hobbies are the best teachers. Students play their own games,and their sense of achievement is expressed in words. The higher requirements for the function of the game inspire students to learn independently and realize step by step. This can stimulate studentsenthusiasm for learning,accumulate project experience,and improve studentspractical ability.
Keywords:C language;situational teaching;task driven;project cases;League of Legends(LOL);game
0? 引? 言
來自網(wǎng)絡的數(shù)據(jù)顯示,2018年電競游戲市場規(guī)模達417.9億元;中國教育部也將電競專業(yè)納入高等教育體系;2017年亞洲奧林匹克理事會將電子競技納入亞運會,2022年,電競將作為杭州亞運會的正式比賽項目。近年來電競游戲規(guī)??焖僭鲩L,給游戲開發(fā)產(chǎn)業(yè)注入無窮動力,游戲開發(fā)程序員缺口也越來越大;本文從游戲入手,培養(yǎng)學生的游戲編程思維和動手能力。
1? 項目背景
1.1? 開發(fā)環(huán)境
開發(fā)語言:C
開發(fā)工具:Visual Studio 2012/Visual C++6.0
1.2? 項目需求
《英雄聯(lián)盟》(簡稱LOL)是美國開發(fā),在中國大陸地區(qū)由騰訊公司代理運營的英雄對戰(zhàn)類競技網(wǎng)游。游戲里擁有數(shù)百位各具特色,不同職業(yè)的英雄,游戲玩家首次登錄可以選擇扮演的英雄,通過打怪掙錢獲取裝備,也可以到商店購買武器和其他用品等,英雄之間還可以對戰(zhàn)。
本項目就是要模擬《英雄聯(lián)盟》游戲,編寫簡化版的英雄聯(lián)盟游戲;用戶首先輸入用戶名和密碼登錄,系統(tǒng)展示多名英雄角色供玩家選擇;選擇好扮演的角色后開始游戲,玩家選擇是進入商店購買商品還是到野外打怪升級;購買的商品可以是武器和藥水,不同的武器攻擊力和防御力不同,價格也有所差別,對戰(zhàn)時受到傷害會減少生命值和體力,不同的藥水功效不一樣,程序運行效果如圖1所示。
2? 數(shù)據(jù)模型
C語言中常用的數(shù)據(jù)類型有int、float、double、char,單獨的某一種數(shù)據(jù)類型都不能描述英雄、怪獸和藥品等,為了描述這些,我們必須采用結構體類型;英雄、怪獸和藥品都有多個備選,因此我們采用結構體數(shù)組作為程序數(shù)據(jù)模型;為了字符串初始化和輸出的便利,英雄、怪獸和藥品的名字采用基類型為char的指針更加方便。相關代碼如下:
struct Weapon
{//武器類型
char *name;//武器名
int attack;//攻擊力
int defence;//防御力
int price;//價格
};
struct Hero
{//英雄類型
char *name;//英雄名
struct Weapon weapon;
//英雄所持武器
int blood;//血量
int money;//金幣
};
struct Monst
{//怪獸類型
char *name;//怪名字
int attack;//攻擊力
int defence;//防御力
int blood;//血量
int money;//金幣
};
struct Good
{//商品類型
char *name;//商品名
int price;//價格
int attack;//加攻擊力
int defence;//加防御力
int blood;//加血量
};
為了降低程序復雜程度,我們把程序按照功能分成多個功能模塊,每個模塊的功能代碼封裝到一個函數(shù)中,為了在各函數(shù)都能正常訪問英雄、武器、怪獸和商品,需要將英雄、武器、怪獸和商品數(shù)組聲明為全局變量。相關代碼如下:
struct Hero heros[2],player;//英雄結構體數(shù)組,玩家
struct Weapon weapons[2];//武器結構體數(shù)組
struct Monst monsts[2],monst;//怪的結構體數(shù)組,隨機怪
struct Good goods[2];//藥
3? 核心代碼
3.1? 初始化英雄、武器、怪獸和藥品代碼
void loading()//初始化2種武器,2位英雄,2只怪獸,2種藥品,根據(jù)需要可初始化更多
{weapons[0].name="倚天劍";weapons[0].attack=28; weapons[0].defence=6;weapons[0].price=300;
weapons[1].name="屠龍刀"; weapons[1].attack=27; weapons[1].defence=8;weapons[1].price=400;
heros[0].name="周芷若";heros[0].weapon=weapons[0]; heros[0].blood=200;heros[0].money=300;
heros[1].name="張無忌";heros[1].weapon=weapons[1]; heros[1].blood=300;heros[1].money=100;
monsts[0].name="貓妖";monsts[0].attack=8;monsts[0].defence=4;monsts[0].blood=50; monsts[0].money=50;
monsts[1].name="狼妖";monsts[1].attack=12;monsts[1].defence=7; monsts[1].blood=90;monsts[1].money= 250;
goods[0].name="金創(chuàng)藥";goods[0].price=100;goods[0].attack=0;goods[0].defence=0;goods[0].blood=150;
goods[1].name="云南藥";goods[1].price=200;goods[1].attack=0;goods[1].defence=0;goods[1].blood=250;}
3.2? 登錄模塊代碼
登錄時玩家根據(jù)提示輸入用戶名和密碼,用戶名和密碼輸入正確,程序進入下一環(huán)節(jié);輸入錯誤需要重新輸入,直到用戶名和密碼都正確才進入后續(xù)流程。這里的登錄賬號和密碼由軟件內(nèi)置,采用整型數(shù)據(jù)表示。也可以采用字符串表示,那么在核對用戶名和密碼是否正確時就需要用到strcmp函數(shù),由于篇幅限制不在此贅述。相關代碼如下:
void login(){
int username,password; do{
printf("請輸入賬號:");scanf("%d",&username);printf("請輸入密碼:"); scanf("%d",&password);
if(username!=123||password!=123)printf("賬號或密碼輸入錯誤,請重新輸入?。躰");
}while(username!=123||password!=123);}
3.3? 選擇扮演角色模塊代碼
當游戲開始時,玩家可根據(jù)系統(tǒng)提示選擇扮演的角色。相關代碼如下:
void cosplay(){//程序列出各英雄姓名,武器,攻擊力等信息,備玩家選擇
int i,select; printf("序號\t姓名\t武器\t攻擊力\t防御力\t價格\t血量\t金幣\n");
for(i=0;i<2;i++) {
printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n",i+1, heros[i].name,heros[i].weapon.name,heros[i].weapon.attack, heros[i].weapon.defence,heros[i].weapon.price,heros[i].blood, heros[i].money);}
printf("請選擇扮演角色:"); scanf("%d",&select); player=heros[select-1];}
3.4? 購買商品模塊代碼
由于篇幅這里只羅列出兩種藥品供購買,若有需要,也可以初始化和羅列更多藥品和武器以供選擇;在購買商品的時候,如果玩家金錢足夠,完成交易后可根據(jù)購買物品的屬性對玩家對應屬性進行增幅提升,例如購買了武器,玩家手持的武器會發(fā)生變化,武器的攻擊力也會發(fā)生變化;如果購買了藥品,恢復體力的藥水會增加玩家體力,恢復血量的藥水會增加玩家血量;如果玩家金錢不夠則無法完成交易,系統(tǒng)會提示玩家打怪掙錢后再來購買。相關代碼如下:
void shopping(){int i,select; printf("序號\t商品名\t單價\t攻擊\t防御\t血\n");
for(i=0;i<2;i++) {
printf("%d\t%s\t%d\t%d\t%d\t%d\n",i+1,goods[i].name,goods[i].price,goods[i].attack,goods[i].defence,goods[i].blood); }
printf("請輸入要購買商品的序號:"); scanf("%d",&select); select--;//1,2
if(select>=0&&select<2) {
if(player.money>=goods[select].price)//買得起
{player.money=player.money-goods[select].price;
player.weapon.attack=player.weapon.attack+goods[select].attack;
player.weapon.defence=player.weapon.defence+goods [select].defence;
player.blood=player.blood+goods[select].blood;
printf("你購買了%s,%d金幣,攻擊力提升%d點,防御力提升%d點,血量提升%d點!\n",goods[select].name,goods [select].price,goods[select].attack,goods[select].defence,goods[select].blood); } else //買不起
{ printf("窮鬼,打怪掙錢去吧,這個地方不適合你?。?n"); }}}
3.5? 戰(zhàn)斗模塊代碼
前面初始化了幾只怪獸,玩家在野外遇到的怪獸隨機;跟怪獸戰(zhàn)斗采用的是對戰(zhàn)模式,即玩家攻擊怪獸后怪獸如果沒死會還手,還手時英雄血量會降低。相關代碼如下:
void fitting(){ int r,hurt; srand((unsigned)time (NULL)); r=rand()%2; monst=monsts[r];
printf("你在野外遭遇到了%s\n",monst.name);
while(player.blood>0&&monst.blood>0) {//英雄先動手
hurt=player.weapon.attack-monst.defence;if(hurt<= monst.blood)//扛得住
{printf("%s對%s發(fā)起了攻擊,造成%d點傷害,%s的血量變?yōu)?d點\n",player.name,monst.name,hurt,monst.name, monst.blood-hurt);monst.blood=monst.blood-hurt; }else //扛不住
{printf("%s對%s發(fā)起了攻擊,造成%d點傷害,%s的血量變?yōu)?,%s死亡?。躰",player.name,monst.name,monst.blood, monst.name,monst.name); monst.blood=0; }
//怪還手
if(monst.blood>0)
{hurt=monst.attack-player.weapon.defence;if(hurt< player.blood)
{printf("%s對%s發(fā)起了攻擊,造成%d點傷害,%s的血量變?yōu)?d點\n",monst.name,player.name,hurt,player.name, player.blood-hurt);player.blood=player.blood-hurt;} else {printf ("%s對%s發(fā)起了攻擊,造成%d點傷害,%s的血量變?yōu)?,%s死亡!\n",monst.name,player.name,player.blood,player.name, player.name); player.blood=0; }}}
if(player.blood>0){ player.money=player.money+ monst.money;
printf("%s勝利,得到%d金幣,%s擁有%d金幣!\n", player.name,monst.money,player.name,player.money); }
else printf("%s死亡,游戲結束!\n",player.name);}
3.6? 新手村模塊代碼
玩家登錄系統(tǒng)后即進入新手村,可以選擇購買裝備或出村打怪練級。相關代碼如下:
void newcountryside(){
int choose; printf("*******歡迎%s進入新手村***** ***\n",player.name); do{
printf("1.購物\n2.出村打怪\n"); scanf("%d",&choose); switch(choose) {
case 1:shopping();break; case 2:fitting();break; } }while(player.blood>0);}
4? 結? 論
本游戲案例非常生活化,富有趣味性,把真實的游戲情境引入課程項目教學中,該項目用到了C語言的if-else流程控制結構,以及變量的聲明、賦值和引用;數(shù)組的聲明,賦值和引用;結構體和結構體數(shù)組;輸入輸出函數(shù)的用法;取隨機數(shù)函數(shù)的用法;for循環(huán)的使用及遍歷數(shù)組;函數(shù)的定義和調(diào)用;指針的用法;對于學有余力的學生,可以在上述功能之外采用C語言中文件的知識,用來實現(xiàn)游戲的存檔、讀檔功能;另外還可以增加更多的英雄、武器、藥品等,對游戲功能進行擴展,讓游戲更具可玩性和趣味性。
本案例代碼總共200多行,邏輯嚴密,代碼規(guī)模適中,自己玩自己編寫的游戲,學生會更有成就感,對增強學生的學習動力、提高其動手能力大有幫助;提升了學生的邏輯思維能力,該案例的項目經(jīng)驗,為學習后續(xù)的軟件編程課程奠定了一個良好且穩(wěn)固的基礎。該案例將復雜問題簡化,化腐朽為神奇,讓學生在學中玩,在玩中學,激發(fā)學習編程的興趣,提升了編程的樂趣,提高了學生解決實際問題的能力,積累項目經(jīng)驗,可以算得上C語言程序課程教學的一個經(jīng)典案例。
參考文獻:
[1] 譚浩強.C程序設計:第五版 [M].北京:清華大學出版社,2017.
[2] 本·克萊蒙.C程序設計新思維:第2版 [M].趙巖,譯.北京:人民郵電出版社,2018.
[3] 王亮.《C語言程序設計》循環(huán)結構教學案例研究 [J].科技視界,2018(1):60-61.
[4] 竇祥國.面向計算思維培養(yǎng)的高職C程序設計案例教學研究 [J].中國職業(yè)技術教育,2019(32):93-96.
[5] 李敏.以培養(yǎng)計算思維為主的C程序設計課程教學改革 [J].電腦知識與技術,2019,15(12):111-112.
[6] 高歡.自主學習模式下微課在高校教學中的實踐研究 [D].河北:河北師范大學,2019.
作者簡介:紀輝進(1977-),男,漢族,湖北黃陂人,講師,本科,主要研究方向:軟件技術教學。