APP下载

用C语言实现21点游戏

2020-07-27纪辉进

现代信息科技 2020年6期
关键词:数组庄家点数

摘  要: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-),男,汉族,湖北黄陂人,讲师,本科,主要研究方向:软件技术教学。

猜你喜欢

数组庄家点数
JAVA稀疏矩阵算法
庄家拉高遇袭被狠揍
JAVA玩转数学之二维数组排序
更高效用好 Excel的数组公式
画点数
分析庄家被砸后自救操盘细节
如何识别庄家自救设下的陷阱
破解心灵感应
解析亚盛集团:庄家拉高股价后被砸遇险
寻找勾股数组的历程