摘? 要:C語言是實踐性很強的一門課程,要學(xué)好C語言,就得多編寫代碼多練習(xí);C語言課程不僅在計算機類專業(yè)的開設(shè),很多高校連非計算機專業(yè)也在學(xué)習(xí)設(shè);“填鴨式”“驗證式”教學(xué)已經(jīng)讓學(xué)生苦不堪言,對學(xué)習(xí)提不起興趣,將21點撲克牌游戲案例引入C語言的教學(xué),借此激發(fā)學(xué)生的學(xué)習(xí)熱情,積累項目經(jīng)驗,達到提升學(xué)生實踐動手能力的目的。
關(guān)鍵詞:C語言;情境教學(xué);任務(wù)驅(qū)動;項目案例;21點撲克牌游戲
中圖分類號:TP311.1 ? ? ?文獻標識碼:A 文章編號:2096-4706(2020)06-0099-03
Abstract:C language is a very practical course. To learn C language well,you have to write more code and practice more;C language courses are not only offered in computer majors,but also in non computer majors in many colleges and universities;“cramming method” and “verification” teaching have made students miserable and have no interest in learning. This paper introduces the case of BlackJack card game into the teaching of C language,hoping to stimulate studentsenthusiasm for learning,accumulate project experience and improve studentspractical ability.
Keywords:C language;situational teaching;task driven;project cases;blackjack game
0? 引? 言
C語言是一門面向過程的程序設(shè)計語言,學(xué)完本門課程后要能熟練地編寫順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的程序;按教材案例進行“驗證式”的學(xué)習(xí),不會舉一反三、發(fā)散思維,對知識不會綜合運用,就如同“死讀書”。
越來越多的行業(yè)、崗位運用計算機和軟件來處理問題,是因為軟件的靈活,能按照特定的語法,在規(guī)則范圍內(nèi)靈動地組合,能解決日常生活中無窮無盡的需求;書本上的知識,我們要活學(xué)活用;將生活化的案例引入“C語言程序設(shè)計”課程,對提升學(xué)生的邏輯思維素質(zhì)、實踐動手能力都大有好處,特別是游戲情境案例,能提高學(xué)生學(xué)習(xí)興趣,激發(fā)主動學(xué)習(xí)的動力,幫助學(xué)生探索新知,構(gòu)建知識體系;本文將探討21點撲克牌游戲的實現(xiàn)算法。
1? 項目背景
1.1? 開發(fā)環(huán)境
開發(fā)語言:C語言。
開發(fā)工具:Visual Studio 2012/Visual C++ 6.0。
1.2? 項目需求
21點撲克牌游戲規(guī)則如下:一副撲克牌有“黑桃A”到“黑桃K”“紅桃A”到“紅桃K”“梅花A”到“梅花K”“方塊A”到“方塊K”,共52張,“A”算1點,“2”算2點,以此類推,“10”算10點,“J”“Q”“K”都按10點計算點數(shù);另外“A”既可計算為1點,也可計算為11點,當成11點的前提條件是總點數(shù)不超出21點的范圍,否則只能當成1點,這意味著對莊家和玩家怎么有利怎么算;游戲開始先給莊家發(fā)兩張牌,其中一張作為底牌不展示牌面,另一張顯示牌面;后給玩家發(fā)兩張牌,牌面都展示出來;然后重復(fù)詢問玩家是否要牌,如果玩家要牌,再次展示莊家和玩家的所有牌面(莊家底牌不顯示),直到玩家不要牌或玩家牌面超過21點為止;每給玩家發(fā)一張牌就重新展示莊家和玩家牌面,并詢問玩家是否要牌;玩家不要牌后莊家根據(jù)牌面點數(shù)決定是否要牌,直到莊家牌面贏或超出21點的范圍為止;誰的牌面越趨近21點且不超過21點誰贏,同為21時莊家贏,決出勝負后游戲進入下一輪。游戲程序執(zhí)行效果如圖1所示。
2? 項目設(shè)計
2.1? 數(shù)據(jù)模型
C語言中常用的數(shù)據(jù)類型有int、float、double、char;屏幕上要輸出如“黑桃A”的字符串,需要用到一維字符數(shù)組;一副撲克牌有52張,需要用到二維字符數(shù)組;char pk[52][7]={"黑桃A",…,"黑桃K",…,"方塊K"};用一維整型數(shù)組表示點數(shù)intpoint[52]={1,2,…,10,10,10,10,…,1,2,…,10,10,10,10};每張牌每局只能發(fā)一次,用一維整型數(shù)組記錄牌是否發(fā)出過,未發(fā)為0,發(fā)出為1,int already[52]={0}。
記錄莊家和玩家拿到的牌是撲克牌數(shù)組的第幾張,我們只用保存數(shù)組下標,莊家極限概率可得到4個A、4個2、3個3,共11張牌,玩家極限可得到4個A、4個2、3個3,共11張牌,玩家可能計算失誤多要一張共12張牌;int boss[11],player[12];A可當11點計算的前提是莊家或玩家有A牌,要記錄莊家玩家A牌個數(shù):int bossA、int playerA;要記錄牌的張數(shù)和點數(shù):int bossi、playeri、bossPoint、playerPoint;模塊化可降低程序復(fù)雜度,為方便在各函數(shù)中訪問以上數(shù)據(jù),必須將數(shù)據(jù)設(shè)置為全局變量,還要做好隨機種子的初始化,為取隨機數(shù)做好準備。
2.2? 程序流程圖
21點游戲程序設(shè)計流程圖如圖2所示。
3? 核心代碼
3.1? 發(fā)牌實現(xiàn)代碼
int getpk()//發(fā)一張有效牌,牌數(shù)組下標0-51隨機,buf為0牌未發(fā)過為1發(fā)過,發(fā)過得重發(fā)
{int r, buf;do{ r=rand()%52; buf=0;if (already[r]= =1)buf=1;else already[r]=1;}while(buf);
return r;}
3.2? 計算玩家牌面點數(shù)和代碼
void playerSum()//莊家牌面點數(shù)和代碼與此類似,本文略
{ int i; playerPoint=0; playerA=0; for(i =0;i 3.3? 玩家要牌代碼 while(playerPoint<=21){//玩家沒超出21點的范圍就會問你要不要牌//清空緩沖區(qū) printf("要牌嗎(y/n)?");fflush(stdin); yorn=getchar();if(yorn =='n')break; player[playeri]=getpk();playeri++;playerSum(); if(playerPoint<=21){printf("莊家牌面:底牌\t"); for(i=1;i printf("玩家牌面:");for(i=0;i 3.4? 判斷輸贏代碼 if(playerPoint>21)printf("莊家贏\n"); else{if(bossPoint>21)printf("玩家贏\n"); else{if(playerPoint>bossPoint)printf("玩家贏\n"); else printf("莊家贏\n");}} 4? 結(jié)? 論 本案例用到了分支和循環(huán)流程控制語句、整型和字符型等基本數(shù)據(jù)類型、數(shù)組和函數(shù)等C程序設(shè)計中的核心知識點,囊括了教學(xué)大綱中百分之九十的知識點,本案例的實現(xiàn)過程,也是學(xué)生對所學(xué)知識的一次回顧、精練與提升的過程,寓教于樂,激發(fā)學(xué)習(xí)學(xué)習(xí)興趣,提升學(xué)習(xí)動力,建立學(xué)習(xí)的成就感和信心。 本案例邏輯思維嚴謹又不太復(fù)雜,實現(xiàn)的代碼規(guī)模適中;其情境與多數(shù)人喜愛的網(wǎng)絡(luò)游戲情境類似,讓學(xué)生產(chǎn)生一種想親自編碼實現(xiàn)的想法;結(jié)合本文思路,運用所學(xué)的零碎知識點按圖索驥,大部分學(xué)生都有能力將之實現(xiàn);本案例引導(dǎo)學(xué)生溫習(xí)了C程序設(shè)計的基礎(chǔ)知識,對學(xué)生理解C語言的基本語法、提高動手能力、提升邏輯思維能力大有幫助。 參考文獻: [1] 王亮.《C語言程序設(shè)計》循環(huán)結(jié)構(gòu)教學(xué)案例研究 [J].科技視界,2018(1):60-61. [2] 譚浩強.C程序設(shè)計(第五版) [M].北京:清華大學(xué)出版社,2017. [3] 李敏.以培養(yǎng)計算思維為主的C程序設(shè)計課程教學(xué)改革 [J].電腦知識與技術(shù),2019,15(12):111-112. [4] 本·克萊蒙.C程序設(shè)計新思維(第2版) [M].趙巖,譯.北京:人民郵電出版社,2018. [5] 高歡.自主學(xué)習(xí)模式下微課在高校教學(xué)中的實踐研究 [D].河北:河北師范大學(xué),2019. [6] 竇祥國.面向計算思維培養(yǎng)的高職C程序設(shè)計案例教學(xué)研究 [J].中國職業(yè)技術(shù)教育,2019(32):93-96. 作者簡介:紀輝進(1977-),男,漢族,湖北黃陂人,講師,本科,主要研究方向:軟件技術(shù)教學(xué)。