当前位置:首页 >> 能源/化工 >>

二十一点游戏的设计与开发


毕业设计(论文)报告
题 目 基于 C#的 21 点游戏的设计
与开发 系 别 专 业 班 级 学生姓名 学 号 指导教师 软件与服务外包学院 软件技术(游戏设计) **** ******* ********* ******

2012 年 4 月

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与

开发

基于 C#的 21 点游戏的设计与开发
摘要:进入 21 世纪,随着人们的生活节奏的变快,游戏已经成为人们生活中不
可缺少的一部分,它不仅能使人娱乐,放松人们的心情,也能够开发人的智力。 所以说休闲游戏的开发将会是大势所趋,本文主要是通过对 21 点游戏的开发来 提高自己的编程能力。 21 点游戏是一种简单大众的游戏,自从计算机实现以来,深受广大电脑玩 家的喜爱, 现在流行的 21 点游戏软件大多缺乏美观的界面,和容易的操作方法, 电脑的 AI 值也不是很高。本文通过 C#语言在计算机图形方面的编程,设计了 21 点游戏软件,使该软件具有美观友好的截面,在人机对弈时,使电脑具有较 高的智商。本游戏是以 C#语言作为开发工具。本文详细地介绍了 21 点游戏的发 展史和软件设计的全过程,描述了该软件的功能。 关 键词 :21 点游戏、软件、C#、开发工具

i

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

Blackjack Design and Development Based on C #
Abstract:In the 21 st century,With the faster pace of life, the game has become an
indispensable part of life, which not only makes fun, relax the mood, but also to the development of human intelligence. So the development of casual games will be the trend, this paper is on the development of Blackjack to improve their programming skills. Blackjack game is a simple and popular game, since the computer to achieve, by the love of computer players, but now most popular game soft Blackjack lack aesthetic interface, and easy method of operation, the value of the computer AI is not high. The adoption of the C# programming language in computer graphics, designed Blackjack game software to enable the software with a beautiful and friendly interface in both game, the computer has a higher IQ. The game is based on C# language.This paper introduced in detail the history of the development of the game a 21 point and the whole process of software design, describes the functionality of the software.

Key Words:Blackjack、 Software、C # 、Development tools

ii

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

目录
前言................................................................................................................................ 1 第一章 课程设计的目的与要求.................................................................................. 2 1.1 目的................................................................................................................... 2 1.2 要求................................................................................................................... 2 1.3 开发工具介绍................................................................................................... 2 第二章 21 点游戏起源及介绍..................................................................................... 3 2.1 21 点游戏发展史.............................................................................................. 3 2.2 21 点游戏特点及规则...................................................................................... 3 2.3 21 点游戏常用术语.......................................................................................... 3 2.4 21 点游戏特别规例.......................................................................................... 4 第三章 需求分析.......................................................................................................... 7 3.1 程序开发背景................................................................................................... 7 3.2 程序需求分析................................................................................................... 7 3.3 系统运行环境................................................................................................... 8 3.3.1 软件环境................................................................................................ 8 3.3.2 硬件环境................................................................................................ 8 第四章 概要设计.......................................................................................................... 9 4.1 扑克牌游戏中的常规功能............................................................................... 9 4.2 21 点游戏的功能.............................................................................................. 9 4.3 界面设计........................................................................................................... 9 第五章 详细设计........................................................................................................ 10 5.1 面向对象的设计方法..................................................................................... 10 5.1.1Card 类 ................................................................................................... 11 5.1.2Player 类 ................................................................................................ 11 5.1.3G21 类 .................................................................................................... 11 5.1.4Game 类 ................................................................................................. 12 5.1.5Form1 类 ................................................................................................ 12 5.2 类的层次图..................................................................................................... 12
iii

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

5.3 关键程序代码................................................................................................. 13 5.3.1 实现牌的代码....................................................................................... 13 5.3.2 实现玩家的代码................................................................................... 15 5.3.3 实现游戏的代码................................................................................... 16 5.3.4 实现游戏流程的代码........................................................................... 17 5.3.5 实现系统的代码................................................................................... 18 5.4 调试过程......................................................................................................... 19 第六章 结束语............................................................................................................ 21 参考文献...................................................................................... 错误!未定义书签。

iv

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

前言
二十一点是世界上最受欢迎的扑克牌游戏之一,关于它的起源,比较多的说 法是源于法国,参加者尽量使手中牌的总点数达到 21 点,或是接近 21 点,但不 能超过,再和庄家比较总点数的大小以定输赢。21 点是在所有娱乐场中最常见的 游戏。 近来随着计算机的快速发展,各种各样的电脑游戏层出不穷,使得我们能有 更多的娱乐项目,而棋类游戏能起到锻炼人的思维和修身养性的作用,而且棋类 游戏水平颇高,大有与人脑分庭抗礼之势。 越来越多的具有智能的机器进入了人类的生活,人工智能的重要性如今显而 易见。自己对人工智能比较感兴趣,而五子棋游戏程序的开发实现了这个课题, 正好提供给我这样一个研究的机会,通过对人工智能中博弈方面的研究(人机对 弈) ,让我在简单的人机对弈全局设计,以及具体到相关算法上有了深入的了解。 人工智能大致可以分成几个任务,这时,这些学科之间的差别就变的很模糊。人 工智能在机器人学、模式识别、物景分析、数据库的智能检索、机器下棋(实际 上是博弈论问题)和家用电气智能化等领域都有广泛的应用。而这个课题就是和 人工智能中博弈论领域紧密相关的。

1

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

第一章 课程设计的目的与要求
1.1 目的
(1)能够利用所学的基本知识和技能,解释和应用程序开发所涉及的相关知 识。 (2)基本掌握面向对象程序开发的基本思路和方法; (3)要求学生达到熟练掌握.NET 基本结构以及 C#语言的基本知识和技能; (4)通过学习积累掌握简单的记事本,通讯录以及多媒体播放的开发技术。

1.2 要求
(1)掌握常用控件以及控件的常用属性的使用方法。 (2) 掌握 C#语言的异常处理技术, 能够使用.NET 各种调试方法调试代码,掌 握帮助的使用方法。 (3)熟悉.NET 开发环境,能够使用 C#语言在.NET 平台上独立设计、开发 WINDOWS 应用程序。 (4) 程序中应有不少于 100~300 行的自行编写的代码, 代码需书写详细注释。

1.3 开发工具介绍
本程序是在 Microsoft Visual Studio C# 2005 Express 的开发环境下完成的。

2

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

第二章 21 点游戏起源及介绍
2.1 21 点游戏发展史
21 点游戏为一款极具趣味性的牌类游戏,最早出现在十六世纪,起源于法国, 法语称:vingt-et-un (单单字面来看是 20 和 1,因为法文数字本身的复杂性,就是 简单的 21)。 因此在广为流行后该游戏就叫“21”。后传入英国并广泛流传,如果玩家拿 到黑心 “A” 黑心 和 “J” 就会给与额外的奖励, , 英文的名字叫黑杰克 (Blackjack) 。

2.2 21 点游戏特点及规则
21 点一般用到 1-8 副牌。庄家给每个玩家发两张明牌,牌面朝上面;给自己 发两张牌,一张牌面朝上(叫明牌),一张牌面朝下(叫暗牌)。大家手中扑克 点数的计算是: Q、 和 10 牌都算作 10 点。 牌既可算作 1 点也可算作 11 点, K、 J A 由玩家自己决定。其余所有 2 至 9 牌均按其原面值计算。首先玩家开始要牌,如 果玩家拿到的前两张牌是一张 A 和一张 10 点牌,就拥有黑杰克(Blackjack);此 时,如果庄家没有黑杰克,玩家就能赢得 2 倍的赌金(1 赔 2)。如果庄家的明牌 有一张 A, 则玩家可以考虑买不买保险, 金额是赌筹的一半。 如果庄家是 Blackjack, 那么玩家拿回保险金并且直接获胜;如果庄家没有 Blackjack 则玩家输掉保险继续 游戏。没有黑杰克的玩家可以继续拿牌,可以随意要多少张。目的是尽量往 21 点 靠,靠得越近越好,最好就是 21 点了。在要牌的过程中,如果所有的牌加起来超 过 21 点,玩家就输了——叫爆掉(Bust),游戏也就结束了。假如玩家没爆掉, 又决定不再要牌了,这时庄家就把他的那张暗牌打开来。一般到 17 点或 17 点以 上不再拿牌,但也有可能 15 到 16 点甚至 12 到 13 点就不再拿牌或者 18 到 19 点 继续拿牌。假如庄家爆掉了,那他就输了。假如他没爆掉,那么你就与他比点数 大小,大为赢。一样的点数为平手,你可以把你的赌注拿回来。如果拿牌拿到手 中有 5 张牌,并且总数不到 21 点,那这种情况能压住一切牌型(当然 5 张加起来 一共 21 点更好),但某些玩法中不支持此规则。

2.3 21 点游戏常用术语
黑杰克:一手牌内两张牌的点数相加合共达 21 点(如 A 牌和一张花牌或 10 点牌) 。
3

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

拿牌(HIT):再拿一张牌。玩家(包括闲家和庄家)只要手上牌相加点数不超 过 21 点都可要牌。 停牌(STAND):不再拿牌。在任何情况下,玩家可选择停止要牌。 分牌(SPLIT):玩家再下一注与原赌注相等的赌金,并将前两张牌分为两副单 独的牌。这两张牌的点数必须相同(即一对 8、一对 K 或一对 Q,某些玩法中两 张 10 点的牌如一张 10 一张 Q 时也可分牌) 。但分牌后的黑杰克,只能作普通 21 点计算,其赔率只是 1 赔 1 。 双倍下注(DOUBLE):玩家在拿到前两张牌之后,可以再下一注与原赌注相 等的赌金(如果觉得少可以加倍) ,然后只能再拿一张牌。如果拿到黑杰克,则不 许双倍下注。 (部分玩法中拿到 3 张或 3 张以上也可选择双倍下注,但同样只能再 拿一张牌)保险(INSURANCE):如果庄家牌面朝上的牌是 A,玩家可以买保险, 也就是相当于原赌注一半的额外赌金。如果玩家确信庄家下一张是 10 点牌,则可 以买保险。如果庄家确实有黑杰克,玩家将赢得 2 倍的保险赌金;如果庄家没有 黑杰克,玩家将输掉保险赌金,游戏照常继续。黑杰克要大于其它总点数为 21 点 的牌。 投降:如玩家手上只拥有两张牌,便有权选择投降,退回一半的投注金(庄 家反开的牌不是 A 时才适用) 。赢局:玩家将评定为赢如其牌面是黑杰克(庄家不 是同时获得黑杰克) 、玩家点数较庄家点数接近 21 点(但不超过 21 点) 、或庄家 点数超过 21 点(玩家点数不超过 21 点) 。平手:即玩家手上牌的点数与庄家的点 数相同,或同是黑杰克的时候,双方便没有输赢,投注金将退回给玩家。 庄家赢局:庄家是黑杰克(但玩家不是同时获得黑杰克) 、庄家点数较玩家点 数接近 21 点(但不超过 21 点) 、玩家点数已超过 21 点(无论庄家点数是否超过 21 点) 。赔率:黑杰克 1 赔 2,保险 1 赔 2,其它为 1 赔 1。

2.4 21 点游戏特别规例
当庄家面牌是 A,闲家可以注码的一半选择是否购买保险,以赌庄家的首二 张牌总和会不会是 21 点,如庄家不是 21 点便立即没收保险金,如是 21 点便可获 得保险金额的 2 倍赔偿。 双倍下注: 如闲家首两张牌点数之和为 11 点,可以选择加倍投注,但加注后仅获发 1 张
4

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

牌。有些赌局容许闲家在首两张牌总和为 10 点(甚至任何点数)时加注。 分牌: 如闲家首两张牌点数相同,可以选择分牌,并须加注。分出每门的下注金额 须与原注相同。若闲家打两张 A 分开,则每张 A 只获发 1 张牌,不可再要牌。有 些分牌后不可再分牌。 “二十一点”Blackjack: 如果闲家手中的一张暗牌和一张明牌分别是一张 A 牌(可作 11 点)和一张十 点牌(K、Q、J、10) ,这副牌叫做二十一点(Blackjack) (属例牌) ,该闲家可向 庄家报到,庄家须向该闲家赔上 1 倍注码。 同花顺: 有些赌场会加设这一赔彩规例,即玩家的牌面是同花的“6、7、8”便可即收 3 倍的彩金。 五龙(过五关) : 如果闲家要牌直至手上有 5 张牌而又没有爆煲,这副牌叫做五龙(属例牌) , 该闲家可向庄家报到,庄家须向该闲家赔上 2 倍注码。此情形可同时并存(刚好 21 点) 。 庄家食夹棍: 若庄家和众闲家要以点数决胜(各方都没有出现爆煲的情况) ,若该闲家和庄 家手上所拥有的牌的总点数一样的话,算庄家取胜,即俗称庄家食夹棍,该闲家 的注码会归庄家。赌场规则,二十一点是没有食夹棍这规例,如闲家和庄家手上 牌总点数一样的话,是“打和”,闲家可以拿回原先的注码。注意:庄家是五龙 而闲家的点数比庄家大的话,仍算庄家取胜,不过庄家食夹棍的权利不适用于闲 家例牌(Blackjack 和五龙)的情况,因为闲家 Blackjack 和五龙属于例牌先赔。 本段数牌及概率: 由已派发的牌可以推算未使用的牌值的比例,从而调整赌金,使到胜的时候 可得到更多,或在是否要牌方面降低爆煲的风险,或停牌等候庄家自爆。 数牌: 数牌的流水数字,流行的 H-L 法通常由 2-6 记为+1,7-9 记为 0,10、J、Q、 K、A 记为-1,以此加减后便可推算未用的牌会偏向那一方。数出来的和再除以牌 靴剩余牌的副数,称之为真数(True Count) 。借由参考真数来调整下的赌注和决
5

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

策,可以削弱庄家的优势。数牌并不是出千的一种。使用电子仪器加入赌局则是 一种严重罪行, 而电子仪器除了指计算机之外, 其他如以 CD 音乐通知其他人下注 也包括在内。 概率: 预知下一张牌将会是大牌或小牌的方向,便可用来减少自身爆煲的风险。 (例 如: 闲家是 12 点,庄家面牌是 4 点,而数牌的流水数字是+20、那么等候庄家自爆 便好了) 。如果规则本身造成庄家优势较低且每靴切牌足够少,玩家便有机会出现 正收益,再加上有人会数牌依赖真数指导下大注,便会增加庄家的输率,所以当 庄家怀疑有人数牌时往往会使用 6 副扑克牌甚至 8 副牌,及让玩家每靴牌只能玩 一半来降低穿透率,用于抵消平衡数牌的优势。

6

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

第三章 需求分析
3.1 程序开发背景
黑杰克又名 Blackjack(简称21点) ,起源于法国,现已流传到世界各地。该 游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的 点数之和不超过21点且尽量大。有着悠久的历史。黑杰克简称为21点,1700年左 右法国赌场就有这种21点的纸牌游戏。1931年,当美国内华达州宣布赌博为合法 活动时,21点游戏第一次公开出现在内华达州的赌场俱乐部,15年内,它取代掷 骰子游戏,而一举成为非常流行的赌场庄家参与的赌博游戏。 21点本为赌博游戏,并不值得推荐,但其游戏性和娱乐性却很强,而且作为 一款数字牌类游戏能 一定程度上锻炼逻辑思维和运算能力,本着这种想法,开发 者想把这款传统的赌博游戏制作成适合各类人群休闲娱乐的小游戏,同时通过实 践更加掌握 C#平台的开发过程。

3.2 程序需求分析
如果在程序开发过程中,分析了需求满足用户应用场景的功能后开始开发程 序就会缺乏抽象,用户提出一种需求搞一个特殊处理,再提一个需求又弄另一个 特殊处理,写代码像说口水话,想到哪到哪。搞出一大堆重复的垃圾代码。我们 周围有很多人业务能力很强,沟通能力很强,代码写的很烂,写的比较随意;这 部分人认为业务比技术主要,只要需求理解清楚了,代码怎么写都能实现。这种 思想在做小型系统的开发时危害性不明显,代码构思差一些,代码写烂一些程序 系统比较简单,花点时间还是能理清;开发大型系统,复杂系统时将面临灭顶之 灾,程序将陷入开发几个版本就做不下去的情况,一般经过3~4个版本程序就要推 到重来一次。俗话说傻瓜也能写出机器能读懂的代码,只有聪明的人才能写出人 能读懂的代码。程序设计是个入门容易,精通难得话。 如果纯粹从技术的角度来开发程序,没有弄清楚用户需要什么就开始编码, 又将陷入另一个坑中。经验不足的程序很容易陷入到实现细节,只顾埋头做事却 没有看清方向,导致做出的不是用户想要的,或者开发的功能非常难用,不会取 得商业上的成功,也挫伤程序开发者积极性。 从用户的角度来看,他们不管程序 如何实现,要求的是功能清晰好用,要求的是功能的完整性。
7

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

3.3 系统运行环境 3.3.1 软件环境
客户端:Windows XP/Windows 7 服务器:Windows XP/Windows 7

3.3.2 硬件环境
处理器类型: Pentium III 兼容处理器或更高速度的处理器 处理器速度:最低:600 MHz 建议:1 GHz 或更高

8

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

第四章 概要设计
该系统要求在 Windows 平台下实现扑克牌游戏中的 21 点,模拟现实生活中的 牌类游戏模式。该系统需要的主要功能有以下几个:

4.1 扑克牌游戏中的常规功能
(1)洗牌,发牌。牌向玩家显示的是正面或反面。统计赢了、输了、平了多 少局的信息。 (2)在每一个回合,玩家可根据自己已获得的牌以及对方摊开的牌选择某一 个操作(如取牌) 。 (3)对方(电脑)每个回合根据情况自动选择某个操作。 (4)每个回合结束后系统自动判断该局游戏是否结束以及输赢情况。

4.2 21 点游戏的功能
(1)玩家在每回合可选择“Hit 拿牌”“Stand 停牌”的操作。当游戏结束 、 后禁用这些操作 (2)以数字的形式显示玩家获得的牌的大小总和,以及对方(电脑)获得的 牌中已摊开给玩家看的牌的大小总和。 (3)在信息栏中显示与游戏相关的信息。 “游戏正在进行” 包括 、 “游戏进行中。 对方已停牌”“恭喜你,你赢了”“很遗憾,你输了”“还不错,平局” 、 、 、 。

4.3 界面设计
要求界面简洁美观,简单易用。

9

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

第五章 详细设计
5.1 面向对象的设计方法
系统中主要的类有:Card、Player、Game、G21、Form1.
表 5-1 名称作用表

类名 Card Player Game G21 Form1

作用 实现牌模块 实现玩家模块 实现游戏模块 实现 21 点游戏模块 实现整个系统的模块
Form1 form

G21 agame

Player a

Player b

Card[] card

Card[] owncards

Card[] owncards

图 5-1 对象的包含关系

系统运行后, 首先实例化 Form1 的一个对象, 实现窗体模块, 如窗体布局、 label 控件、按钮控件、 “关于”菜单等。通过窗体界面“开始”按钮的点击,生成由 Game 类派生的 G21 类的对象 agame, 开始游戏流程。 随即 agame 实例化两个 Player 类的对象 a 与 b(分别对应于电脑与玩家)以及 Card 类的对象数组 card[]。然后 a 与 b 分别实例化他们的 Card 类对象数组 owncards[]。

10

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

5.1.1Card 类
表 5-2card 类

牌的序号 牌的数字 牌花 牌是否可见 属性 牌左上角的纵坐标 牌左上角的横坐标 内存位图引用 窗体引用 从序号明确牌的数 字有牌花 牌面朝上 牌面朝下 在游戏框内显示牌 摆放、移动牌面

number(1~52) num_x=1(1~13) num_y=1 visibility(牌面朝上 或朝下) top=20 Left=20 bmp form define_num_x_y showon showoff paint Put(int x,int y)

方法

5.1.2Player 类
表 5-3player 类

引用窗体对象 玩家手上的牌 拥有牌的数量 属性 值为 true 代表 play1 对象为玩家时,玩家 1 的牌在上方, 玩家 2 的牌在下方 player 取牌 设置玩家手上每张牌 的摆放位置 摊开所有的牌 摊开低 n 张牌 摊开最后哪的一张牌 手中牌数字的总和

form owncards quantity Is this playerone

getcard setcardposition showallcards Showonthecard(int n) showonthecard sum

方法

11

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

5.1.3G21 类
表 5-4G21 类

属性

方法

游戏状态 玩家状态 玩家状态 开始游戏 电脑玩家的操作 判断输赢 判断是否平局 判断谁赢 结束游戏

state a_ifnottakecard b_ifnottakecard start pcplayerchoose judge ifdraw whowin end

5.1.4Game 类
表 5-5Game 类

属性

方法

内存位图引用 已抽出的牌数 牌数组 声明两个 player 对象 声明两个 player 对象 洗牌, 打乱 card 数组 内的元素顺序 发一张牌给 player

bmp takencardnum Card=new player a player b shuffle givecardto

5.1.5Form1 类
表 5-6form1 类

玩家赢得次数 属性 玩家输的次数 玩家平局次数 方法 新一局开始

Win Lose Draw Start

5.2 类的层次图

12

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

图 5-2 层次图

5.3 关键程序代码
5.3.1 实现牌的代码
这个类主要是实现每一张牌的应有功能,包括牌本身的数字与牌花的属性、 把一张牌“放”在屏幕上并显示其正面或背面的方法。 首先从参数获取三个必要的数据:内存位图、窗体 Form1 对象、此牌在所有扑克 牌中的序号。 内存位图为 Bitmap 类的对象,提供给 Card 的对象在上面‘画画’,把该对象 所代表的牌画在上面。所有的 Card 对象均画在同一幅内存位图上。可把这幅内存 位图看做是一个‘原件’。在窗体 Form1 类的 Paint()方法中加入“把这幅图印在
13

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

窗体上”,每次系统调用 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("..\\..\\Resources\\z" + x + y + ".jpg"); // 创 建以所给路径的jpg为图形的对象.例如:"z3b.jpg"为"梅花3",其中"3"代表数字“3”,“b"代表"梅花" 14 //从序号明确牌的数字与牌花 //构造函数

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发 Graphics gg = Graphics.FromImage(bmp); gg.DrawImage(myImage, left, top,78,116); // 高。 gg.Dispose(); // 释放Graphics对象gg form.Invalidate(); } else { 为Image对象 Graphics gg = Graphics.FromImage(bmp); gg.DrawImage(myImage, left, top,78,116); // 把牌的背面画在bmp上 gg.Dispose();// 释放Graphics对象gg form.Invalidate(); } //牌不可见时显示背面 Image myImage = Image.FromFile("..\\..\\Resources\\back.jpg"); // 以牌背的图像 把牌画在bmp上。最后两个参数是宽,

5.3.2 实现玩家的代码
该类可实现玩家对手中的牌进行操作, 如从 Game 类对象获取一只牌, 手上的 各张牌如何摆放在屏幕上,计算手上的牌大小总和。
public void getcard(Card thecard) { owncards[quantity] = thecard; setCardPosition(); owncards[quantity].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++) { owncards[i].left = basepoint_x + 40 * i; //每两张牌的左上角点相距40像素 owncards[i].top = basepoint_y + 2 * i; 15 //Player取牌

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发 } } public int sum()//手中牌数字的总和 { int f = 0; for (int i = 0; i < quantity; i++) { f += owncards[i].num_x; } return f; }

5.3.3 实现游戏的代码
该类作为扑克牌每个具体游戏的父类,不仅可以被 G21 类继承,理论上也可 以派生出其他的扑克游戏,例如锄大地、纸牌、潜乌龟、拖拉机等。 该类拥有洗牌方法 shuffle(),能够随机排列一套牌。此方法用到 Visual Studio 提供的 Random 类中的 NextBytes()方法,可将 Byte 类数组中的所有元素赋值为随 机数。洗牌步骤如下,已有 Card 类数组,新建一个与 Card 类数组的元素数量相同 的 Byte 类数组,把该数组每个元素赋值为随机数(0~256 之间) ,然后每个元素 均除以 5,则随机数处于 0~51 之间。 “0~51”这 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++) { card[i] = new Card(ref bmp, form,i); //按数组的顺序创建序号从1~52的牌 } shuffle(); takencardnum = 0; } public void shuffle()//洗牌,打乱card[]数组内的元素顺序(可重复执行几次.发牌后决不能执 行) { 16

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发 Byte[] array = new Byte[52]; //52个随机数为整数ξ(0≤ξ≤256)的数组(下面调整为0≤ξ≤51)。 第n个ξ代表card[]数组第n个元素与第ξ个元素互换。 Random ran = new Random(); ran.NextBytes(array); //赋值给每个元素为0~256的随机整数 for (int i = 0; i < 52; i++) { array[i] = (Byte)((int)array[i] / 5); //把0≤ξ≤256调整为0≤ξ≤51. } Card exchange; //用于交换card[]数组内的两个牌对象 for (int i = 0; i < 52; i++)//交换两张牌 { exchange = card[i]; card[i] = card[array[i]]; card[array[i]] = exchange; } }

5.3.4 实现游戏流程的代码
该类主要实现 21 点游戏的流程。以下是关键部分:判断游戏的结果:a 赢、b 赢或者平局。实现该方法需要把条件分类讨论。代码中,asum 为 a 手中牌的大小 总和,bsum 为 b 手中牌的大小总和,a_IfNotTakeCard 为‘a 是否停牌’ , b_IfNotTakeCard 为‘b 是否停牌’ 。
private bool ifDraw()//判定是否平局(在已知其中一人赢了或玩家都不取牌的情况下才能使用此方法) { int asum = a.sum(); int bsum = b.sum(); if ((asum > 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 && girlsum > 21 && (a_IfNotTakeCard == false || b_IfNotTakeCard == false)) || (boysum <= 21 && girlsum <= 21 && boysum > girlsum && a_IfNotTakeCard == true && b_IfNotTakeCard == true)) return boy; else if ((girlsum <= 21 && boysum > 21 && (a_IfNotTakeCard == false || b_IfNotTakeCard == false)) || (girlsum <= 21 && boysum <= 21 && girlsum > boysum && a_IfNotTakeCard == true && 17

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发 b_IfNotTakeCard == true)) return girl; else return null; }

5.3.5 实现系统的代码
该类实现系统的主要操作,如显示界面、提供接口供用户进行操作等。其中, 初始化内存位图时显示出一幅绿色台面图片。
public void InitializeSurface()//初始化内存位图 { Graphics gg; gg = Graphics.FromImage(DrawingSurface); gg.Clear(SystemColors.Control); Image table = Image.FromFile("..\\..\\Resources\\table.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; //显示"统计"二字

18

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

5.4 调试过程
程序界面:

图 6-3 程序界面

图 6-4 开始界面

19

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

图 6-5 结束界面

图 6-6 结束界面

20

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

第六章 结束语
经过了长达 4 个月的论文准备,我完成了自己选择的 21 点小游戏课题,我觉 得感触颇深。在这四个月里虽然把论文给写完了但是其中遇到的种种问题实在是 让我欲罢不能。我是我知道了平时的积累是多么的重要。在平时感觉挺简单的那 些枯燥单调的代码,真正等到自己要运用的时候你就会觉得那好像是天文数字; 等你好不容易写出来的一大段代码,正高兴的时候,你去一调试,晕死弹出来好 多错误,当时你就会有一种哭的冲动;还有就是这最后的课程设计报告书,平时 都不怎么碰的 word 文档,文档处理、排版又成了令人头疼的一大问题。但是,解 决问题的过程还是蛮让人兴奋地:当你发现一个问题时你试着去解决它,当你通 过查阅相关资料解决之后那种兴奋就不可言语了。平时所学的一小段一小段的代 码到现在必须把它们联系起来使用,把平时学的知识运用到实际,增强了我的实 践动手能力。 课程设计中遇到的问题正是能反应你平时学习时候的不足,这时同学老师的 建议和网络给了我很大的帮助。遇到自己解决不了的问题时,多多向老师同学请 教,或许问题就能迎刃而解。同时让我懂得了古人的一句话少壮不努力,老大徒 伤悲。所以呈现在年轻的时候要多学点。另外,生在这个信息化社会,互联网的 作用不言而喻,许多问题只要在网上搜索一下就能得到非常令人满意的解答。这 次的论文不仅提高了我的知识,更让我懂得了同学之间的友谊。

21

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

致谢
在这个充满春光的四月里,我完成了 21 点游戏设计与开发的论文。首先我在 这里要感谢我的指导老师***老师,感谢他的细心指导,正是在他那孜孜不倦的指 导下我才能更容易的完成这个论文。当然非常感谢我的宿友们在我的毕业设计中, 给予我极大的帮助,使我对整个毕业设计的思路有了总体的把握,并耐心的帮我 解决了许多实际问题,使我有了很大的收获。 总之正是有了你们才有了我今天的论文在这里只能深深地对你们说声谢谢。

22

无锡科技职业学院毕业设计(论文) 基于 C#的 21 点游戏的设计与开发

参考文献
[1]王小科,吕双.C#从入门到精通[M].北京:清华大学出版社,2009.368—388 [2]管西京.C#核心开发技术从入门到精通[M].北京:电子工业出版社,2009.767—787 [3]明日科技,苏素黄,赵会东.C#学习手册[M].北京:电子工业出版社,2011.348—358 [4]钱哨,李挥剑,李继哲.C# WinForm 实践开发教程[M].北京:中国水利水电出版 社,2012.94—137 [5]龙马工作室.Visual C# 2005 程序设计[M].北京:人民邮电出版社,2008.323—332 [6]明日科技,王小科,梁冰.C#开发典型模块大全[M].北京:人民邮电出版社,2009.23 —25

23


相关文章:
二十一点游戏规则及玩法
二十一点游戏规则及玩法来源:大赢家-全球华人网博资讯 等级:欢迎阅读 发布于 2006-02-13 07:34 被读 1809 次 【字体:大中小】 二十一点是一个广受欢迎的...
计算二十一点游戏
二十一点游戏的设计与开发 28页 5财富值 21点游戏代码 3页 免费 C++程序设计...6页 1财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议...
二十一点游戏技巧
二十一点游戏技巧_电脑基础知识_IT/计算机_专业资料。二十一点游戏技巧如果庄家的总牌点大于或等于十七,他们必须停牌。如果庄家的 总牌点小于或等于十六,或有软十...
二十一点玩法大全
澳门 d 场 Pontoon ( 英式二十一点 ) 是用八副纸牌,每副纸牌各 52 张。游 戏目标是让手中牌的点数尽量接近 21 点,但是不超过。 游戏规则: ?庄家和玩家...
二十一点算法技巧
二十一点游戏中,拥有最高点数的玩家获胜,其点数必须等于或低于 21 点; 超过 21 点的玩家称为爆牌。2 点至 10 点的牌以牌面的点数来相加,J、Q、K 每...
21点小游戏JAVA课程设计
课程设计说明书 21 点小游戏 1.课程设计的目的 NO.1 面向对象程序设计是一门...2 二十一点术语 花牌(K、Q、J 分别为 11、12、13)和 10 计算为 10 点...
c++_21点游戏
当时被面试要求设计 21 点游戏,尽量多赢玩家. 游戏规则: 游戏开始先由系统指定...1; Poker poker; cout<<"*** 欢迎玩二十一点游戏 ***"<<endl<<endl; ...
21点游戏
C++程序设计21点游戏 21页 8财富值 21点游戏源代码 3页 5财富值 C#课程设计...21 点游戏 21 点游戏 package 二十一点游戏; import java.awt.Dimension; impo...
二十一点的基本策略
二十一点的基本策略_金融/投资_经管营销_专业资料。二十一点的基本策略据友人...只 须考虑的是你(玩家)牌、庄家的亮牌以及游戏规则,而与其他玩家的牌无关。...
二十一点的游戏规则
二十一点的游戏规则_物理_自然科学_专业资料。主要介绍二十一点游戏的相关知识 二十一点的游戏规则二十一点规则 二十一点通常在七人桌上进行,所有人与庄家比...
更多相关标签:
二十一点游戏 | 二十一点单机游戏 | 二十一点游戏下载 | 二十一点游戏规则 | 二十一点 安卓游戏 | 二十一点网页游戏 | 二十一点小游戏 | 二十一点游戏平台 |