一、团队课程设计博客链接

二、个人负责模块或任务说明

实体类的设计

斗地主规则的实现

人机自动出牌的算法

实现数据库的DAO模式

三、自己的代码提交记录

注:这里只有部分提交记录,详细的提交记录在团队课程设计博客里有

四、自己负责模块或任务详细说明

1、实体类的设计的代码分析

游戏设计需要用到卡片类(Card)正反面,还有牌型(CardType)的设计,以及各种牌的组合,还要设计在游戏中的抢地主、出牌倒计时、出牌和不出牌等等以及需要判断是否能够出牌和人机自动出牌等。

整体的设计需要用户类(User)用于存储用户的账号密码,以及用户信息类(UserInformation)用于存储用户的账号、昵称、积分等等个人信息。

2、斗地主规则的实现的代码分析

既然是一个游戏,那就要有规则,其中最主要的就是,判断所选的牌型是否正确,即是否符合规则。在牌型符合规则时,需要判断是否能够出牌。

在判断所选的牌型是否符合规则的设计中,因为规则中的牌型是固定的,所以设计了一个常量CardType类,这个常量类中包括了符合斗地主规则的所有可选牌型以及不允许出牌的常量。

判断牌型的时候,需要根据所选的牌的数量,以及各个牌型的特征,如:连对的基本特征为,需要连续3对,并且这三对的数值是连续的等等,来判断用户所选的牌是否为规则内的牌型,是的话返回相应的牌型,供后面的算法判断,如果不是则返回c0,服务器就会给客户端相应的反馈,禁止用户出所选的牌。

判断完牌型后,如果返回的不是c0,则需要判断用户是否能够出所选的牌。在这个判断中,首先就需要判断用户是主动出牌还是跟牌,如果为主动出牌,则服务器就会给客户端相应的反馈,同意用户出牌;如果为被动出牌,则需要判断当前用户所选的牌,与前面的用户出的最大的牌进行比较。

当前面出的牌不是炸弹,而用户选的牌型为炸弹时,既可以出牌。当用户选的牌型不为炸弹时,需要判断该用户所选的牌是否与前面用户所出的牌型相符合,若符合,则判断该用户所选的牌是否比前面用户所出的牌大,若符合则允许出牌,否则禁止用户出牌。

3、人机自动出牌的算法的代码分析

本次课程设计实现的是单人单机游戏,则需要电脑自动判断除用户外的另外两幅牌该如何出。

判断人机如何出牌时,首先先判断人机为主动出牌还是被动出牌,若为主动出牌,则把人机的牌进行拆分,拆分成符合规则的相关牌型,然后按先出单牌,再出对子,在出连对等等的顺序,按序选择该轮人机所要出的牌。

如果为被动出牌,则将人机的牌进行拆分,拆分成符合规则的相关牌型,然后通过判断目前所出的最大的牌的牌型,根据该牌型判断目前该人机手中是否拥有符合条件的牌,若有,再判断该人机的下一个出牌人是否为地主,如果是,则选择最大的出,如果不是则选择最小的出。如果没有符合条件的牌,则该人机就不出牌。

由于两个操作都涉及到对人机牌的拆分,在拆分的过程中,按照炸弹优先,拆分三带,拆分飞机等等的顺序,将人机的手牌拆分成符合规则的各个种类的手牌,防止拆了规则中的大牌,如炸弹等等。

最后就是,一开始的抢地主环节,当用户抢地主时,则地主就为用户,当用户不抢地主时,需要根据人机当前手牌的权重大小,来判断是那个人机要抢地主。该权重的计算方法为,统计两幅人机手牌中大小王、A以及2的多少来计算,权重大的获得地主牌。

4、数据存储DAO模式代码分析

DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。

本次课程设计的底层数据存储为数据库,为了以防以后使用文件等其他形式存储数据,为了方便日后修改小量代码,使用了DAO模式设计数据存储。

在本次课程设计的DAO模式的设计中,使用了两个DAO接口类,UserDAO以及UserInformationDAO类,里面分别包括对User以及UserInformation的操作的相关方法。

因为使用了数据库实现数据的存储,所以在数据库的操作类分别实现了上面的两个接口。由于在对数据库的每次操作中,均需要链接数据库以及断开与数据库的链接,所以将链接数据库以及断开与数据的链接的操作拿出来,另外写了一个JDBCUtil工具类。

5、多人同时访问并进行游戏(多线程)的代码分析

本次课程设计要实现的最终目标即为该斗地主游戏可以实现多人同时进行游戏。

则涉及到了多线程,当多人同时向服务器发出请求时,服务器需要判断该请求来自哪位玩家,该玩家所属的牌局当前的状态,并进行相关的计算,给浏览器返回相应的计算结果。

所以,我们写了一个InitServlet,用于当Tomcat服务器启动时,就将一个牌局组对象(CardGames)写入application中,则这牌局组对象就会一直存在,直到Tomcat服务器关闭。

这个牌局组(CardGames)对象,包括了一个Map类型的牌局组,一个Integer类型的标志(sign),并且包括一个新建牌局的对象,在新建牌局的时候,将标志,以及新建的牌局放入Map中,并且将改标志赋值给相应的用户中的牌局标识,在后期的数据传输中,后台只要从客户端获取该请求的用户,即可通过该用户对应的牌局标识来从application中获取的牌局组的对象中,获得相应的牌局,从而得到正确的结果。为了防止多个用户同时向服务器发送新家牌局的请求,导致出现了错误,所以为创建牌局的方法添加了互斥锁。

牌局的对象中定义了初始牌对象,地主标识符,对应角色是否出牌标识,当前的出牌,3个玩家的所分到的牌,以及地主牌。

五、课程设计感想

在本次课程设计中,我主要负责的模块为后端的代码。最为难忘的便是在实体类的设计中,使用了public属性,并且最初的设计中,基本没有涉及到对象,导致后期在实现多人同时访问时出现了各种各样的错误,最后只好对已有的代码进行重构,花费了更多的时间,特别是在对牌型判断的公共方法中,进行了大修改。

本次课程设计,实现了网络web版的单人斗地主,无法支持多人同时进行游戏,可以在次基础上进行迭代,进而实现多人游戏。在对人机自动出的牌较为简单,对人机出牌的判断方法较为笨拙,可以进行优化,如添加人工智能算法等使得人机更加的“聪明”。

通过本次课程设计,让我对JAVA的面向对象设计有了更加深刻的理解,平时上课讲的比较基础,再加上有时候可能没有认真听课,PTA上的题目较为简单,未能对面向对象编程有更加深入的了解,虽然花费了大量的时间(将近两周吧),但是收获多多。

斗地主Java课程设计_JAVA面向对象编程课程设计——web版斗地主相关推荐

  1. java封装例题_java面向对象编程类的封装接口和基本类库练习题

    面向对象编程基本知识练习 一.判断题 1.不需要定义类,就能创建对象.() 2.构造方法用于给类的 private 实例变量赋值.() 3.对象一经声明就可以立即使用.() 4.在定义变量和方法时,必 ...

  2. 消灭泡泡糖游戏java编程_JAVA面向对象编程课程设计——泡泡堂

    ###一.成员介绍 姓名|任务分配|个人博客链接 --|:--:|--: 张一弛(组长)|GUI设计.游戏界面相关类实现.阿里巴巴扫描纠错.团队博客编写|在做了,在做了,下次一定 王江鸿|Box类.B ...

  3. java泡泡堂教程_JAVA面向对象编程课程设计——泡泡堂(个人博客)

    二.个人负责模块或任务说明 GUI设计 游戏界面类.地图类的实现(实现与Player类的交互) 阿里巴巴扫描纠错 团队博客编写 三.自己的代码提交记录 四.自己负责模块或任务详细说明 1.地图Fiel ...

  4. java class对象创建时机_Java面向对象编程-类的声明周期

    第十章 类的生命周期 10.1 Java虚拟机及程序的生命周期 当通过java命令运行一个Java程序时,就启动了一个Java虚拟机进程.Java虚拟机进程从启动到终止的过程,称为Java虚拟机的生命 ...

  5. 面向对象编程,设计原则,设计模式

    2019独角兽企业重金招聘Python工程师标准>>> 面向对象编程,设计原则,设计模式 面向对象编程 面向对象编程与面向过程编程的区别 面向对象软件开发的优点 面向对象编程语言 C ...

  6. 第2课第3节_Java面向对象编程_继承性_P【学习笔记】

    摘要:韦东山android视频学习笔记  面向对象程序的三大特性之继承性:继承性的主要作用就是复用代码.继承性也有一定的限制,如图一 图一 1.我们在第2课第2节_Java面向对象编程_封装性_P 中 ...

  7. Java基础教程:面向对象编程[2]

    Java基础教程:面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default ...

  8. Java面向对象编程(第2版)_学习记录

    <Java面向对象编程(第2版)> 孙卫琴 编著 文章目录 一.介绍 (一)平台与开发环境 (二)一些知识 (三)数组 二.类的生命周期 (一)类的加载 1. 加载 2. 连接 3. 初始 ...

  9. c语言编程课程心得,c语言编程课程设计心得.docx

    C语言编程课程设计心得 C语言编程课程设计心得 河南城建学院 <C语言程序设计>课程设计报告 适用专业工程管理专业课程名称C语言程序设计指导教师赵军民.魏新红.张芳芳 设计人:051409 ...

最新文章

  1. DNS之一:编译安装
  2. RHEL/CentOS/Fedora各种源(EPEL、Remi、RPMForge、RPMFusion)配置
  3. 学会用好 Visual Studio Code
  4. poj3648 Wedding 2-sat
  5. 如果BigDecimal是答案,那肯定是一个奇怪的问题
  6. android 3.0单元测试,Android Studio 3.0 gradle 3.0.0-beta2打破了Kotlin单元测试覆盖率?
  7. free命令里的buffers/cache
  8. leetcode —— 面试题 17.08. 马戏团人塔
  9. 3-Scala控制结构
  10. c语言中ox1小于小于a,丹江口市2018适应性数学试卷和答案
  11. 项目验收流程小TIPS
  12. Excel表格批量生成Word文档
  13. c语言实验报告总结通用版,C语言实训心得体会
  14. 知识追踪常见建模方法之IRT项目反应理论
  15. win10系统下,屏幕录制专家如何录制耳机里面的声音
  16. 苹果开发者账号官方翻译篇-创建证书
  17. 解决windows指纹解锁过一段时间就使用不了、需要重新录入指纹才可以使用的问题
  18. 热议!211高校近200名硕博新生开学无宿舍住,需校外租房...
  19. Jsd2205面试题
  20. finalcut剪切快捷键_Final Cut Pro X 常用快捷键大全 FCPX快捷键

热门文章

  1. 实验十二 AODV和DSR协议仿真实验
  2. 三维,XR视频低延时实时传输
  3. python对象可分为什么_Python是面向对象的编程语言,而对象拥有各种特性、功能,专业术语称之为____...
  4. Separable Convolution(深度可分离卷积)
  5. S7-1200PLC 通过高速计数器测量AB相编码器转速
  6. 点石互动--石头之:张家界国际旅游网点评
  7. 企业上云服务商之华山论剑
  8. 在macbook air中通过usb安装windows7操作系统
  9. 客户故事:4家银行如何打造新一代移动金融中心
  10. LCAMV06-TCD1304线阵CCD模组