当前位置:文档之家› C#课程设计游戏21点

C#课程设计游戏21点

目录一、课程设计的目的与要求 (2)1.1 目的: (2)1.2 要求: (2)二、题目说明 (2)2.1程序开发背景 (2)2.2开发工具介绍 (2)三、总体设计 (3)四、详细说明 (3)4.1 系统实施 (3)五、遇到的问题和解决方法 (9)六、课程设计总结 (9)七、参考文献 (10)一、课程设计的目的与要求1.1 目的:(1)能够利用所学的基本知识和技能,解释和应用程序开发所涉及的相关知识。

(2)基本掌握面向对象程序开发的基本思路和方法;(3)要求学生达到熟练掌握.NET基本结构以及C#语言的基本知识和技能;(4)通过学习积累掌握简单的记事本,通讯录以及多媒体播放的开发技术。

1.2 要求:(1)掌握常用控件以及控件的常用属性的使用方法。

(2)掌握C#语言的异常处理技术,能够使用.NET各种调试方法调试代码,掌握帮助的使用方法。

(3)熟悉.NET开发环境,能够使用C#语言在.NET平台上独立设计、开发WINDOWS应用程序。

(4)程序中应有不少于100~300行的自行编写的代码,代码需书写详细注释。

(5)程序中应有不少于100~300行的自行编写的代码,代码需书写详细注释。

二、题目说明2.1程序开发背景黑杰克又名BlackJack(简称21点),起源于法国,现已流传到世界各地。

该游戏由2 到 6 个人玩,使用除大小王之外的52 张牌,游戏者的目标是使手中的牌的点数之和不超过21 点且尽量大。

有着悠久的历史。

黑杰克简称为21点,1700年左右法国赌场就有这种21点的纸牌游戏。

1931年,当美国内华达州宣布赌博为合法活动时,21点游戏第一次公开出现在内华达州的赌场俱乐部,15年内,它取代掷骰子游戏,而一举成为非常流行的赌场庄家参与的赌博游戏。

21点本为赌博游戏,并不值得推荐,但其游戏性和娱乐性却很强,而且作为一款数字牌类游能一定程度上锻炼逻辑思维和运算能力,本着这种想法,开发者想把这款传统的赌博游戏制作成适合各类人群休闲娱乐的小游戏,同时通过实践更加掌握c#平台的开发过程2.2开发工具介绍本程序是在Microsoft Visual studio C# 2005 Express的开发环境下完成的。

三、总体设计本程序为21点小游戏,运用c#的windows应用程序开发,首先制作主窗体,并在其上添加menustrip,picturebox,button,等一系列控件,并设置窗体和控件的相关属性,最终制作出美观大方的游戏主窗体。

然后开始游戏的后台程序编写,把54扑克牌的图片分别重命名为0.jpg~53.jpg,并用random类的.Next方法产生0~53的伪随机数,用(随机数%3+1)的算法算出牌面点数,以“tupian//”+随机数.Tostring+”.jpg”作为相应picturebox的图片地址进行显示。

当玩家要牌结束后,开始用相同的方法给庄家发牌,在庄家没有爆点的情况下将玩家跟庄家的点数进行比较,最后用lable 的Text属性显示最终结果。

四、详细说明4.1 系统实施总体概述“21点小游戏1.功能简介:本软件为21点小游戏,主要实现玩家跟电脑且以电脑为庄家的游戏实现,玩家可以通过新游戏和退出菜单开始和关闭游戏,通过“发牌”“要牌”“开牌”“洗牌”“结束”等按钮操作游戏2.游戏界面截图图1. 游戏主界面3.21点小游戏关键代码和描述:(1)menuStrip菜单中的“新游戏”和“退出”选项:图2. 游戏菜单private void 新游戏ToolStripMenuItem_Click(object sender, EventArgs e) //新游戏,将游戏中所有的数据清空或归位;{index = 0; count = 0;a = 0;b = 0;c = 0;d = 0; f = 0; g = 0; h = 0; o = 0; ii = 1; ss = 0; aa =0; diannao = 0; q1 = 0; qq = 0; duoyu = 0; xiazhu = 0; zongshu = 0;pictureBox1.Hide(); pictureBox2.Hide(); pictureBox3.Hide();pictureBox4.Hide();pictureBox5.Hide(); pictureBox6.Hide(); pictureBox7.Hide();pictureBox8.Hide();pictureBox9.Hide(); pictureBox10.Hide(); pictureBox11.Hide();pictureBox12.Hide();pictureBox13.Hide(); pictureBox14.Hide(); button4.Enabled = false;button8.Enabled = false; button7.Enabled = false; button6.Enabled = true;button9.Enabled = true;button9.Enabled = true;label13.Text = "";label11.Text = "";private void 退出ToolStripMenuItem_Click(object sender, EventArgs e){Application.Exit();}(2)“发牌”和“加牌”按钮的实现,也是主要功能之一:v图3. 发牌加牌按钮用0~53分别代表扑克牌的54张牌面,通过使用Random类的.Next方法随机生成0~53的伪随机数,每个数字分别代表相应的一张扑克牌,使用(随机数 % 3 +1)的方法算出牌面对应点数,大于10点的转为10点;另外定义一个变量ii,作为当前生成的牌是第几张的标识,配合switch选择语句识别当前所发的牌,并做出相关的新牌生成,重复牌判断和点数累计,21点黑杰克判断以及是否爆点判断switch (ii) //ii是作为进入玩家加牌的数值定义,因为玩家是一张一张牌来增加的。

{case 1: //ii的默认值为1;{pictureBox1.Image = Image.FromFile("tupian\\53.jpg");//电脑台面上的第一张牌,为背面,无用a = randon.Next(52);//随机选出第一张牌,为电脑台面上的第二张牌,因为是第一张随机选出的牌,所以不用判断是否与其它的牌重复pictureBox2.Image = Image.FromFile("tupian\\" + a.ToString() +".jpg"); //电脑台面上的第二张牌,同时也是作为基础牌面要计算数值的第一张牌;d1 = a % 13 + 1; //将所得的牌转换成1~13的数字if (d1 > 10) //判断是否为11、12、13这三个数字,如果是,就将它转换为10;d1 = 10;b = randon.Next(52);//这里往下就是玩家的第一张牌,与之相应的是在文件夹中名字为0~51的图片;while (b == a) //当玩家的这个随机得到的牌与庄家得到的第一张随机的牌相同时,则重新生成一个随机数,让它与前面的牌的点数不一样;{b = randon.Next(52);}w1 = b % 13 + 1; //计算出随机得到的数所在的牌的点数if (w1 > 10) //当得到的点数>10的时候,即11、12、13,将它们变成10(作为21点游戏的规则而设定的)w1 = 10;zongshu += w1; //zongshu是玩家所得的点数相加之和的定义pictureBox8.Image = Image.FromFile("tupian\\" + b.ToString() +".jpg"); //将玩家随机得到的第一张牌显示出来c = randon.Next(52);//这里往下为玩家的第二张牌,一直往下相似的代码均为此效果;while (c == a || c == b){c = randon.Next(52);}w2 = c % 13 + 1;i f (w2 > 10)w2 = 10;zongshu += w2;pictureBox9.Image = Image.FromFile("tupian\\" + c.ToString() + ".jpg");(3)玩家点开牌按钮,实现庄家补牌,若庄家不爆点,则比较玩家和庄家的点数private void button7_Click(object sender, EventArgs e) //button7, 开牌,当玩家确定了自己的牌的点数且牌的点数相加小于21点时,就可以开牌和电脑比较大小了{button4.Enabled = true; //这里开始为随机求出的电脑的第二张牌l = randon.Next(52);while (l == a || l == b || l == c || l == d || l == f || l == g || l == h ||l == o){l = randon.Next(52);}d2 = l % 13 + 1;if (d2 > 10)d2 = 10;diannao = d1 + d2; //求出电脑两张牌的数值if ((d2 == 1 && d1 != 1)||(d1 == 1 && d2 != 1)) //这些代码效果与上面说的一样{diannao += 10;ss = 1;}else if (d1 == 1 && d2 == 1){diannao = 12;ss = 1;}pictureBox1.Show();pictureBox1.Image = Image.FromFile("tupian\\" + l.ToString() + ".jpg");m = randon.Next(52); //这里为随机求出电脑的第三张牌;while (m == a || m == b || m == v || m == d || m == f || m == g || m == h ||m == o || m == l){m = randon.Next(52);}d3 = m % 13 + 1;if (diannao >= 17) //当电脑刚开始拿到的2张牌的数值就大于或等于17点时,将不再增加牌,强行退出判断goto qqw;pictureBox3.Show();pictureBox3.Image = Image.FromFile("tupian\\" + m.ToString() + ".jpg"); //显示电脑的第三张随机出来的牌if (d3 > 10)d3 = 10;diannao += d3;if (d3 == 1) //如果第三张牌的点数为A时,则将它默认为11点,但是如果电脑总值超过21点,就将这个点数看做1点{diannao += 10;if (diannao > 21)diannao -= 10;}else if (diannao >= 17 )goto qqw; //如果电脑的点数(两张牌,A取11)的大小在17点和21点之间,则电脑不再增加牌,强行退出判断n = randon.Next(52);while (n == a || n == b || n == c || n == d || n == f || n == g || n == h || n == o || n == l || n == m) //这里是电脑的第四张牌{n = randon.Next(52);}d4 = n % 13 + 1;if (d4 > 10)d4 = 10;diannao += d4;pictureBox4.Show();pictureBox4.Image = Image.FromFile("tupian\\" + n.ToString() + ".jpg");if (ss == 0){if (d4 == 1){diannao += 10;if (diannao > 21)diannao -= 10;}if (diannao >= 17)goto qqw;}if (ss == 1){if (diannao >= 17 && diannao <= 21)goto qqw;if (diannao > 21){diannao -= 10;ss = 0;}if (diannao >= 17)goto qqw;if (diannao < 17){if (d4 == 1){diannao += 10;if (diannao > 21)diannao -= 10;}}if (diannao >= 17)goto qqw;}其他发电脑的5,6,7张牌,代码与以上类似,不重复五、遇到的问题和解决方法1.如何实现纸牌循序发牌的堆叠效果解决之法:依次创建多个picturebox并进行堆叠,每创建一个,将上层设置为顶层。

相关主题