

摘? 要:C語言是實踐性很強的一門課程,要學好C語言,就得多編寫代碼多練習;C語言課程不僅在計算機類專業的開設,很多高校連非計算機專業也在學習設;“填鴨式”“驗證式”教學已經讓學生苦不堪言,對學習提不起興趣,將21點撲克牌游戲案例引入C語言的教學,借此激發學生的學習熱情,積累項目經驗,達到提升學生實踐動手能力的目的。
關鍵詞:C語言;情境教學;任務驅動;項目案例;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語言是一門面向過程的程序設計語言,學完本門課程后要能熟練地編寫順序結構、選擇結構和循環結構的程序;按教材案例進行“驗證式”的學習,不會舉一反三、發散思維,對知識不會綜合運用,就如同“死讀書”。
越來越多的行業、崗位運用計算機和軟件來處理問題,是因為軟件的靈活,能按照特定的語法,在規則范圍內靈動地組合,能解決日常生活中無窮無盡的需求;書本上的知識,我們要活學活用;將生活化的案例引入“C語言程序設計”課程,對提升學生的邏輯思維素質、實踐動手能力都大有好處,特別是游戲情境案例,能提高學生學習興趣,激發主動學習的動力,幫助學生探索新知,構建知識體系;本文將探討21點撲克牌游戲的實現算法。
1? 項目背景
1.1? 開發環境
開發語言:C語言。
開發工具:Visual Studio 2012/Visual C++ 6.0。
1.2? 項目需求
21點撲克牌游戲規則如下:一副撲克牌有“黑桃A”到“黑桃K”“紅桃A”到“紅桃K”“梅花A”到“梅花K”“方塊A”到“方塊K”,共52張,“A”算1點,“2”算2點,以此類推,“10”算10點,“J”“Q”“K”都按10點計算點數;另外“A”既可計算為1點,也可計算為11點,當成11點的前提條件是總點數不超出21點的范圍,否則只能當成1點,這意味著對莊家和玩家怎么有利怎么算;游戲開始先給莊家發兩張牌,其中一張作為底牌不展示牌面,另一張顯示牌面;后給玩家發兩張牌,牌面都展示出來;然后重復詢問玩家是否要牌,如果玩家要牌,再次展示莊家和玩家的所有牌面(莊家底牌不顯示),直到玩家不要牌或玩家牌面超過21點為止;每給玩家發一張牌就重新展示莊家和玩家牌面,并詢問玩家是否要牌;玩家不要牌后莊家根據牌面點數決定是否要牌,直到莊家牌面贏或超出21點的范圍為止;誰的牌面越趨近21點且不超過21點誰贏,同為21時莊家贏,決出勝負后游戲進入下一輪。游戲程序執行效果如圖1所示。
2? 項目設計
2.1? 數據模型
C語言中常用的數據類型有int、float、double、char;屏幕上要輸出如“黑桃A”的字符串,需要用到一維字符數組;一副撲克牌有52張,需要用到二維字符數組;char pk[52][7]={"黑桃A",…,"黑桃K",…,"方塊K"};用一維整型數組表示點數intpoint[52]={1,2,…,10,10,10,10,…,1,2,…,10,10,10,10};每張牌每局只能發一次,用一維整型數組記錄牌是否發出過,未發為0,發出為1,int already[52]={0}。
記錄莊家和玩家拿到的牌是撲克牌數組的第幾張,我們只用保存數組下標,莊家極限概率可得到4個A、4個2、3個3,共11張牌,玩家極限可得到4個A、4個2、3個3,共11張牌,玩家可能計算失誤多要一張共12張牌;int boss[11],player[12];A可當11點計算的前提是莊家或玩家有A牌,要記錄莊家玩家A牌個數:int bossA、int playerA;要記錄牌的張數和點數:int bossi、playeri、bossPoint、playerPoint;模塊化可降低程序復雜度,為方便在各函數中訪問以上數據,必須將數據設置為全局變量,還要做好隨機種子的初始化,為取隨機數做好準備。
2.2? 程序流程圖
21點游戲程序設計流程圖如圖2所示。
3? 核心代碼
3.1? 發牌實現代碼
int getpk()//發一張有效牌,牌數組下標0-51隨機,buf為0牌未發過為1發過,發過得重發
{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? 計算玩家牌面點數和代碼
void playerSum()//莊家牌面點數和代碼與此類似,本文略
{ int i; playerPoint=0; playerA=0; for(i =0;i 3.3? 玩家要牌代碼 while(playerPoint<=21){//玩家沒超出21點的范圍就會問你要不要牌//清空緩沖區 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? 結? 論 本案例用到了分支和循環流程控制語句、整型和字符型等基本數據類型、數組和函數等C程序設計中的核心知識點,囊括了教學大綱中百分之九十的知識點,本案例的實現過程,也是學生對所學知識的一次回顧、精練與提升的過程,寓教于樂,激發學習學習興趣,提升學習動力,建立學習的成就感和信心。 本案例邏輯思維嚴謹又不太復雜,實現的代碼規模適中;其情境與多數人喜愛的網絡游戲情境類似,讓學生產生一種想親自編碼實現的想法;結合本文思路,運用所學的零碎知識點按圖索驥,大部分學生都有能力將之實現;本案例引導學生溫習了C程序設計的基礎知識,對學生理解C語言的基本語法、提高動手能力、提升邏輯思維能力大有幫助。 參考文獻: [1] 王亮.《C語言程序設計》循環結構教學案例研究 [J].科技視界,2018(1):60-61. [2] 譚浩強.C程序設計(第五版) [M].北京:清華大學出版社,2017. [3] 李敏.以培養計算思維為主的C程序設計課程教學改革 [J].電腦知識與技術,2019,15(12):111-112. [4] 本·克萊蒙.C程序設計新思維(第2版) [M].趙巖,譯.北京:人民郵電出版社,2018. [5] 高歡.自主學習模式下微課在高校教學中的實踐研究 [D].河北:河北師范大學,2019. [6] 竇祥國.面向計算思維培養的高職C程序設計案例教學研究 [J].中國職業技術教育,2019(32):93-96. 作者簡介:紀輝進(1977-),男,漢族,湖北黃陂人,講師,本科,主要研究方向:軟件技術教學。