C#课程设计报告 扑克牌游戏 21点.doc_第1页
C#课程设计报告 扑克牌游戏 21点.doc_第2页
C#课程设计报告 扑克牌游戏 21点.doc_第3页
C#课程设计报告 扑克牌游戏 21点.doc_第4页
C#课程设计报告 扑克牌游戏 21点.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#课程设计报告题目:6. 扑克牌游戏 学 院 自动化学院_专 业_网络工程 _年级班别_08 _学 号 学生姓名_ _ _ _指导教师_ _ 成 绩 2009 年 11月 1 系统设计要求1.1 需求分析该系统要求在Windows平台下实现扑克牌游戏中的21点,模拟现实生活中的牌类游戏模式。该系统需要的主要功能有以下几个:A.扑克牌游戏中的常规功能:1) 洗牌,发牌。牌向玩家显示的是正面或反面。统计赢了、输了、平了多少局的信息。2) 在每一个回合,玩家可根据自己已获得的牌以及对方摊开的牌选择某一个操作(如取牌)。3) 对方(电脑)每个回合根据情况自动选择某个操作。4) 每个回合结束后系统自动判断该局游戏是否结束以及输赢情况。B.21点游戏的功能:1)玩家在每回合可选择“Hit 拿牌”、“Stand 停牌”的操作。当游戏结束后禁用这些操作2)以数字的形式显示玩家获得的牌的大小总和,以及对方(电脑)获得的牌中已摊开给玩家看的牌的大小总和。3)在信息栏中显示与游戏相关的信息。包括“游戏正在进行”、“游戏进行中。对方已停牌”、“恭喜你,你赢了”、“很遗憾,你输了”、“还不错,平局”。1.2界面要求要求界面简洁美观,简单易用。1.3设计环境及调试环境Visual Studio 2008 SP1、Windows 7.2 设计思路2.1用面向对象的方法设计系统中主要的类有:Card、Player、Game、G21、Form1.类名作用Card实现牌模块Player实现玩家模块Game实现游戏模块G21实现21点游戏模块Form1实现整个系统的模块对象的包含关系.Form1 formG21 agamePlayer aPlayer bCard cardCard owncardsCard owncards系统运行后,首先实例化Form1的一个对象,实现窗体模块,如窗体布局、label控件、按钮控件、“关于”菜单等。通过窗体界面“开始”按钮的点击,生成由Game类派生的G21类的对象agame,开始游戏流程。随即agame实例化两个Player类的对象a与b(分别对应于电脑与玩家)以及Card类的对象数组card。然后a与b分别实例化他们的Card类对象数组owncards。a) Card类主要属性:public int number; / 牌的序号(152) public int num_x = 1; / 牌的数字(1、2、313) public int num_y = 1; / 牌花(方块1、梅花2、红桃3、黑桃4) public bool visibility; / 牌是否可见(牌面朝上或朝下) public int top = 20; / 牌左上角的纵坐标 public int left = 20; / 牌左上角的横坐标 private Bitmap bmp; /内存位图引用 private Form1 form; /窗体引用主要方法:private void define_num_x_y()/从序号明确牌的数字与牌花public void ShowOn( ) / 牌面朝上public void ShowOff( ) / 牌面朝下private void Paint( ) / 在游戏框内显示牌面public void Put(int x, int y) /摆放、 移动牌面b) Player类主要属性:private Form1 form; /引用窗体对象 private Card owncards; /玩家手上的牌 private int quantity; /拥有牌的数量 public bool IsThisPlayerOne; /值为true代表此Player对象是玩家1。玩家1的牌在上方,玩家2的在下方。主要方法:public void getcard(Card thecard) /Player取牌private void setCardPosition()/设置玩家手上每张牌的摆放位置.arraylastNum为最后取的一张牌在owncards数组的位置public void showallcards()/摊开所有的牌public void showOnthecard(int n) /摊开第n张牌public void showOnthecard()/摊开最后拿的一张牌public int sum()/手中牌数字的总和c) G21类主要属性:public int state; /游戏状态(0为正在游戏,1为a赢,2为b赢,3为平局) private bool a_IfNotTakeCard; /玩家状态(true为玩家停牌) private bool b_IfNotTakeCard;主要方法:public void start()/开始游戏public void playerchoose(int x) /玩家在窗口点击操作按钮将调用此方法,参数代表不同的按钮。返回值为True代表取了牌public void pcplayerchoose()/电脑玩家的操作(该方法只用于pcround()里)public void judge()/判断输赢private bool ifDraw()/判定是否平局(在已知其中一人赢了或玩家都不取牌的情况下才能使用此方法)private Player whowin(Player boy,Player girl) /判定谁赢(在已知其中一人赢了的情况下才能使用此方法)public void end()/结束游戏d) Game类主要属性:protected Bitmap bmp; /内存位图引用 protected int takencardnum; /已抽出的牌数 public Card card = new Card52; /牌数组(设为52张) protected Player a; /声明两个Player对象 protected Player b;主要方法:public void shuffle()/洗牌,打乱card数组内的元素顺序(可重复执行几次.发牌后决不能执行)public void givecardto(Player aplayer) /发一张牌给Player对象e) Form1类主要属性:public Bitmap DrawingSurface;/内存位图。所有绘制在此进行,随后复制到窗体上。目的是使窗体重绘时保持已绘制的图案。 public G21 agame; public int win;/玩家赢的次数 public int lose;/玩家输的次数 public int draw;/平局次数主要方法:public void InitializeSurface() /初始化内存位图private void start()/开始新一局类的层次图:2.2流程图游戏结束判断、统计输赢情况并显示结果下个回合结束是否需要结束拿牌或停牌发牌开始游戏运行窗体新一局3 调试过程程序界面:开始游戏:游戏结束:对方(电脑)停牌:4 关键程序代码a) Card类这个类主要是实现每一张牌的应有功能,包括牌本身的数字与牌花的属性、把一张牌“放”在屏幕上并显示其正面或背面的方法。首先从参数获取三个必要的数据:内存位图、窗体Form1对象、此牌在所有扑克牌中的序号。内存位图为Bitmap类的对象,提供给Card的对象在上面画画,把该对象所代表的牌画在上面。所有的Card对象均画在同一幅内存位图上。可把这幅内存位图看做是一个原件。在窗体Form1类的Paint()方法中加入“把这幅图印在窗体上”,每次系统调用Paint()方法时(即窗体某些区域被掩盖而无效化时)便要印一次。可把窗体中看到的图看做是刚才原件的复印件。此方法比直接采用GDI+把牌画在窗体上要优胜,能够保持窗体所显示的图形。Form1对象则是提供给Card类对象改变原件位图时使窗体无效化,自动更新复印件。扑克牌的序号用来初始化该牌的数字与牌花。public Card(ref Bitmap DrawingSurface, Form1 form1, int serial_number) /构造函数 bmp = DrawingSurface; form = form1; number = serial_number + 1; /从Game的对象获得该牌的序号. define_num_x_y(); private void define_num_x_y() /从序号明确牌的数字与牌花 num_y = number % 4+1; num_x = (number - num_y-1) / 4 + 1; private void Paint( ) / 在游戏框内显示牌面 if (visibility = true) /牌可见时显示正面 string x = num_x.ToString();/ 牌的数字与牌花转换为字符串型用于下面的路径中 string y = a; / 初始化为a(方块) switch (num_y) case 1: y = a; break; case 2: y = b; break; case 3: y = c; break; case 4: y = d; break; Image myImage = Image.FromFile(.Resourcesz + x + y + .jpg); / 创建以所给路径的jpg为图形的对象.例如:z3b.jpg为梅花3,其中3代表数字“3”,“b代表梅花 Graphics gg = Graphics.FromImage(bmp); gg.DrawImage(myImage, left, top,78,116); / 把牌画在bmp上。最后两个参数是宽,高。 gg.Dispose(); / 释放Graphics对象gg form.Invalidate(); else /牌不可见时显示背面 Image myImage = Image.FromFile(.Resourcesback.jpg); / 以牌背的图像为Image对象 Graphics gg = Graphics.FromImage(bmp); gg.DrawImage(myImage, left, top,78,116); / 把牌的背面画在bmp上 gg.Dispose();/ 释放Graphics对象gg form.Invalidate(); b) Player类该类可实现玩家对手中的牌进行操作,如从Game类对象获取一只牌,手上的各张牌如何摆放在屏幕上,计算手上的牌大小总和。public void getcard(Card thecard) /Player取牌 owncardsquantity = thecard; setCardPosition(); owncardsquantity.ShowOff(); quantity+; private void setCardPosition()/设置玩家手上每张牌的摆放位置.arraylastNum为最后取的一张牌在owncards数组的位置 int basepoint_x=20; /以第一张牌的左上角点为基准点basepoint,用于计算各牌在窗体的位置 int basepoint_y; if (IsThisPlayerOne = true) basepoint_y = 30; else basepoint_y = 200; for (int i = 0; i =quantity; i+) owncardsi.left = basepoint_x + 40 * i; /每两张牌的左上角点相距40像素 owncardsi.top = basepoint_y + 2 * i; public int sum()/手中牌数字的总和 int f = 0; for (int i = 0; i quantity; i+) f += owncardsi.num_x; return f;c) Game类该类作为扑克牌每个具体游戏的父类,不仅可以被G21类继承,理论上也可以派生出其他的扑克游戏,例如锄大地、纸牌、潜乌龟、拖拉机等。该类拥有洗牌方法shuffle(),能够随机排列一套牌。此方法用到Visual Studio提供的Random类中的NextBytes()方法,可将Byte类数组中的所有元素赋值为随机数。洗牌步骤如下,已有Card类数组,新建一个与Card类数组的元素数量相同的Byte类数组,把该数组每个元素赋值为随机数(0256之间),然后每个元素均除以5,则随机数处于051之间。“051”这52个数分别对应于Card类数组(代表一套牌)的52个不同的元素(代表各张牌)。接着,从n=0开始一直到n=51,执行该操作:把Card数组第n个元素与第m个元素对调(m=“Byte数组的第n个元素的值”)。 这样,Card类数组的每一张牌都随机分配到数组中的某一个位置,实现了洗牌的功能。public Game(ref Bitmap DrawingSurface,Form1 Form) /构造函数 bmp = DrawingSurface; form = Form; for (int i = 0; i 52; i+) cardi = new Card(ref bmp, form,i); /按数组的顺序创建序号从152的牌 shuffle(); takencardnum = 0; public void shuffle()/洗牌,打乱card数组内的元素顺序(可重复执行几次.发牌后决不能执行) Byte array = new Byte52; /52个随机数为整数(0256)的数组(下面调整为051)。第n个代表card数组第n个元素与第个元素互换。 Random ran = new Random(); ran.NextBytes(array); /赋值给每个元素为0256的随机整数 for (int i = 0; i 52; i+) arrayi = (Byte)(int)arrayi / 5); /把0256调整为051. Card exchange; /用于交换card数组内的两个牌对象 for (int i = 0; i 21 & bsum 21&(a_IfNotTakeCard=false|b_IfNotTakeCard=false) | (asum = bsum&asum=21&bsum=21&asum=bsum&a_IfNotTakeCard=true&b_IfNotTakeCard=true) return true; else return false; private Player whowin(Player boy,Player girl) /判定谁赢(在已知其中一人赢了的情况下才能使用此方法) int boysum = boy.sum(); int girlsum = girl.sum(); if (boysum 21 & (a_IfNotTakeCard = false | b_IfNotTakeCard = false) | (boysum = 21 & girlsum girlsum & a_IfNotTakeCard = true & b_IfNotTakeCard = true) return boy; else if (girlsum 21 & (a_IfNotTakeCard = false | b_IfNotTakeCard = false) | (girlsum = 21 & boysum boysum & a_IfNotTakeCard = true & b_IfNotTakeCard = true) return girl; else return null; e) Form1类该类实现系统的主要操作,如显示界面、提供接口供用户进行操作等。其中,初始化内存位图时显示出一幅绿色台面图片。public void InitializeSurface()/初始化内存位图 Graphics gg; gg = Graphics.FromImage(DrawingSurface); gg.Clear(SystemColors.Control); Image table = Image.FromFile(.Resourcestable.jpg); gg.DrawImage(table, 0, 0,760,533); gg.Dispose(); this.Invalidate(); private void Form1_Paint(object sender, PaintEventArgs e) e.Graphics.DrawImage(DrawingSurface, 0, 0, DrawingSurface.Width, DrawingSurface.Height); e.Graphics.Dispose(); private void start()/开始新一局 buttonStart.Enabled = false; /禁用Start按钮 agame = new G21(ref DrawingSurface, this); /建立游戏对象 agame.start(); label1.Text = 游戏正在进行; buttonHit.Enabled = true; /启用Hit按钮 buttonStand.Enabled = true; /启用Stand按钮 label7.Enabled = true; /显示统计二字 5 总结对该软件的补充说明:根据系统的设计,用C#语言编写出来的源码最终能够顺利编译并稳定运行,达到了预期效果。基于灵活性的考虑,牌的显示不用PictureBox控件来实现,而采用GDI+以及内存位图来实现。从Game类还可以派生出其他扑克游戏类,并且牌的显示应该能够通过Card类的put()方法结合定时控件Timer来产生出更丰富的形式,如动态式移动。由于时间关系,很多游戏效果未能设计并实现出来。心得与体会:在课堂上,我学到了C#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论