1、纸牌游戏设计报告1纸牌游戏设计报告1.问题描述:本次设计通过 C 语言编写程序实现对图像一般的基本处理,本次设计主要是 52 张纸牌除去大小王,玩家 4 位;需要实现以下功能。设计一个菜单界面,上面分别有 1.发新牌、2.洗牌发牌、3.按点数理牌、4 退出。当点击“1.发新牌”,会转换到一个新的发牌界面上,在这个界面上实现四位玩家中每位玩家的牌都是按照同一花色从小到大的排列界面(其中 A 最小, K 最大),而且最后还能返回到菜单界面;同样当点击“2.洗牌发牌”,发牌界面上四位玩家中牌是随机排列没有特定的规律,但是要注意的是每位玩家的牌都是不相同的;当点击“3.按点数发牌”,发牌界面上四位玩家
2、的牌是随机发牌之后按照从小到大的顺序依次排列;当点击“4.退出”,退出菜单界面结束程序的运行。2.模块划分:此次设计主要有四个模块,它们分别是菜单模块、发新牌模块、洗牌发牌模块、按点数理牌模块;它们的之间的关系如下所示纸牌游戏设计报告2它们所对应的界面转换关系如下:3.算法设计:(1)52 张纸牌图片的放置:纸牌游戏设计报告3第一步:开辟一个存放 52 张纸牌地址的一维数组 a52,定义变量 i,x;第二步:将这 52 张纸牌按照特定的顺序特定的顺序加载到这个数组中去;第三步:利用 4 个 for 循环语句控制每张图片输出的位置putimage()函数;第四步:设置一个清屏函数 system(
3、“cls”),当按下键盘上 Enter 键退出该界面。(2)随机数组 b52的生成:第一步:定义三个变量 i,j,tmp;第二步:设置一个随机种子 srand(unsigned)time(NULL);第三步:利用 for 循环生成 52 个随机数;第四步:利用 while 循环生成每个随机数;第五步:在 while 循环下,在利用 for 循环判断生成的随机数与之前生成随机是否相同,相同执行 break 语句结束循环生成新的随机数,再次进行比较;如果不相同则存放到数组中去;最后将这个数组返回到主函数中去。(3)随机数组 b52按一定顺序排列:第一步:定义三个变量 i,j,temp;第二步:利用
4、 4 个嵌套的 for 循环语句来实现每位玩家的 13 张纸牌按照从小到大的顺序排列;第三步:在每个嵌套的 for 循环中利用 bi%13 来确定每张纸牌的大小,如果后一张牌比前一张牌小,则交换它们的位置,最后返回这个数组 b52到主函数中去。(4)鼠标的生成:第一步:定义一个鼠标按键信息 MOUSEMSG msg;第二步:设置一个鼠标函数 msg=GetMouseMsg();纸牌游戏设计报告4第三步:利用一个 if 语句判断鼠标左键是否按下msg.uMsg=WM_LBUTTONDO-WN;第四步:在 if 语句下根据鼠标函数 msg.x,msg.y 的范围生成字符1、2、3、4,最后这四个字
5、符返回发到主函数中去。(5)主函数实现调用函数的功能:第一步:定义调用函数数组范围的值 SIZE=52;图片的大小 initgraph();flag 初始化-flag=0;第二步:利用 while(flag=0)循环判断是否执行相应的函数调用;第三步:利用 switch-case 语句来调用相应的函数,其中 case 的值是上述返回的字符1、2、3、4;第四步:当 case=1执行发新牌功能;当 case=2执行洗牌发牌功能;当 case=3执行按点数理牌功能;当 case=4flag=1,结束 while 循环,退出程序。纸牌游戏设计报告54.详细设计:整个程序函数之间的关系如下所示主函数发
6、新牌 洗牌发牌 按点数理牌纸牌展示函数 纸牌背景函数 纸牌展示函数 纸牌背景函数 纸牌展示函数发新牌函数洗牌发牌函数 洗牌发牌函数 按点理牌函数纸牌游戏设计报告6以下是本次设计函数功能描述:(1)菜单界面的函数 DispMenu1()是基于 c 语言利用 easy.h 库函数将菜单背景图片展示在出来,其中 loadimage 加载图片, putimage 放置图片;(2)菜单选择函数 ChooseMenu()是并且在其中利用 easy.h 库函数鼠标函数的功能来实现,其中 MOUSEMSG msg 是鼠标定义信息,利用 if 语句,当鼠标按下左键键函数 msg=WM_LBUTTONDOWN 和
7、 1.发新牌、2.洗牌发牌、3.按点数理牌、4.退出在菜单背景图片 msg.x 和 msg.y 的范围来控制产生四个字符1、2、3、4;并将字符返回给主函数; (3)类似于(1)将 52 张纸牌的背景函数 DispMenu2();(4)纸牌展示函数 ShowCard()利用 zasy.h 库函数将 52 张纸牌图片的地址加载到一个一维数组 a52中去,在此过程中利用四个 for 循环控制每张纸牌图片在背景图片上的位置以及它们之间的间距,在该函数还设置了一个清屏功能“system(“cls“)”用来返回主菜单操作;(5)发新牌函数 NewCard(),就是定义一个一维数组 b52,通过 for
8、循环给这个一维数组赋值,数组中每个元素的值等于该该下标;(6)洗牌发牌函数 Shuffle(),就是定义一个一维数组 b52,利用随机种子srand(unsigned)time(NULL)和循环生成 52 个 051 的不同的整数,并将它们赋到一维数组 b52中去;(7)按点数理牌函数 SortCard(),将(6)中生成的一维数组 b52分成四组,它们分别是 b0b12,b13b25,b26b38,b39b52,将每组的 13 个元素除以 13 求其余数,该余数的大小代表了该纸牌的点数大小,最后利用循环语将每组元素余数按照从小到大排序;(8)主函数 mian(),该函数的功能就是通过 Swt
9、ichcase 语句调用相应的函数来实现指定的功能;5.运行结果:纸牌游戏设计报告7当点击运行结果是会出现菜单界面当鼠标点击 1.发新牌时会出现下面的界面:纸牌游戏设计报告8当鼠标点击 2.洗牌发牌时会出现下面的界面:当鼠标点击 3.按点数理牌时会出现下面的界面:从上述运行的结果可以看到,实现一副牌不含大小王的同一花色 13 张牌分配给纸牌游戏设计报告9同一玩家;然后随机分配给每位玩家;最后随机分配给玩家的牌按大小顺序排列。符合设计要求。当在键盘上按下“Enter”返回主菜单。6.心得与体会利用C 语言程序设计课程的相关知识完成一个具有一般的软件设计题目,在此次设计中利用 C 语言进行程序设计
10、,并规范地完成设计报告。通过设计巩固和加深对 C 语言的语言、算法、函数等知识的理解掌握现实复杂问题的分析建模和解决方法包括问题描述、系统分析、设计建模、代码实现、结果分析等提高利用计算机分析解决综合性实际问题的基本能力,并且使自己对软件有进一步的了解。通过此次设计使我基本掌握程序设计的基本方法和步骤,而且对我以前学习知识的一个检测,同时也让自己意识到还有很多的地方自己做的不够,还需要继续潜心学习;在设计程序首先要对自己的设计有所了解,如何去设计,大致的步骤有哪些,如何去实现它的功能,同时也必须查阅相关的资料,找到相关的例子,然后进行创新,得到自己想要的结果,要反复进行调试,找出自己存在的问题
11、,不断改进提高。7.程序源代码:#include#include #include “easyx.h“#include “conio.h“#include “time.h“static int b52;void ShowCard(void)/将 52 张纸牌展示在背景图片上 IMAGE a52;int i,x;loadimage(/加载背景图纸牌游戏设计报告10片,按指定大小存储loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage
12、(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(纸牌游戏设计报告11loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage
13、(loadimage(纸牌游戏设计报告12loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(loadimage(BeginBatchDraw();for(i=0,x=80;i0return choose; void DispMenu2(void)/52 张纸牌展示背景图片函数 IMAGE back1;loadimage( putimage(0,0,纸牌游戏设计报告18void main(void)/主函数 int SIZE=52;int flag=0; initgraph(960,600); while(flag=0) switch(ChooseMenu() case 1:DispMenu2();NewCard(b,SIZE);/发新牌ShowCard(); break;case 2:DispMenu2();Shuffle(b,SIZE); /洗牌发牌 ShowCard();break;case 3: DispMenu2();Shuffle(b,SIZE);纸牌游戏设计报告19SortCard(b,SIZE);/按点数发牌 ShowCard(); break;case 4:closegraph();/退出 flag=1;getchar();