IT兄弟连 Java语法教程 综合案例
1.案例需求
编写程序,模拟斗地主游戏洗牌和发牌的流程。
2.应用知识
● 数组的声明
● 数组的遍历
● for循环
● if-else分支结构
3.需求解析
模拟斗地主游戏洗牌和发牌,需要在程序中定义一个String类型的数组用来存储扑克牌,数组的大小为54,初始化这个数组,将不同花色不同点数以及大小王以字符串的形式存储到这个数组中共54张牌。开始洗牌,定义一个新的数组,数组长度也是54,用来存储洗后的扑克牌,使用随机数在未洗牌的扑克数组中进行抽取,被随机到的扑克牌进入新数组中,然后在原数组中将该牌标记未已经被洗出去了,如果再次随机到该牌,则重新随机获取下一张牌,最后新数组中存储了洗好的扑克牌。牌洗好后,需要为三位玩家每人发17张牌,然后留下3张做为底牌,三位玩家的手牌使用三个数组表示,每个数组长度为17,底牌使用一个长度为3的数组表示。通过for循环依次为三位玩家发牌,当发到第51张牌时停止发牌,剩下的三张扑克牌存入底牌数组中。
4.需求实现
import java.util.Random;
public class PokerGame {
public static void main(String[] args){
//创建数组,用于存储扑克牌,扑克牌共54张,所以设定数组大小为54
String[] pokers = new String[54];
//定义花色数组,共4中花色。
String[] colors = {"红桃","黑桃","梅花","方片"};
//定义牌面数组
String[] numbers = {"A","2","3","4","5","6","7","8","9","10","J","Q", "K"};
//定义大小王
String[] kings = {"大王","小王"};
//使用循环将牌存储到pokers数组中
int index = 0; //index用来表示扑克牌数组的下标
for(int i = 0;i<numbers.length;i++){
for(int j = 0;j<colors.length;j++){
pokers[index++] = colors[j] + numbers[i];
}
}
//将大小王添加进扑克牌数组
pokers[index++] = kings[0];
pokers[index] = kings[1];
System.out.println("现在有一副新扑克");
//输出扑克牌
for (String poker : pokers){
System.out.print(poker+",");
}
//开始洗牌
//定义数组,用来存储被洗出的牌
String[] newPokers = new String[pokers.length];
//定义数组,用以表示被随机取出的牌
boolean[] make = new boolean[pokers.length];
//洗牌
for (int i = 0;i<pokers.length;i++){
//创建随机数对象
Random rd = new Random();
//获取随机数,当作即将被洗出的牌的下标
int pokerIndex = rd.nextInt(pokers.length);
//判断被洗出的牌是否已经被洗出了
if (!make[pokerIndex]) {
//如果该牌没被洗出则将该牌添加进洗出数组
newPokers[i] = pokers[pokerIndex];
//将该牌设置为已经被洗出了
make[pokerIndex] = true;
} else i--;//如果该牌已经被洗出了,控制扑克数组下标减1重新选牌
}
//控制换行输出
System.out.println();
//输出洗牌后的牌
for (String poker : newPokers){
System.out.print(poker+",");
}
//定义3名玩家手牌数组以及底牌数组
String[] one = new String[17];
String[] two = new String[17];
String[] three = new String[17];
String[] underPoker = new String[3];
//定义下标在发牌时表示不同玩家需要发的第几张牌
int oneIndex = 0;
int twoIndex = 0;
int threeIndex = 0;
int underPokerIndex = 0;
//循环进行按顺序发牌
for(int i = 0; i<newPokers.length ;i++){
//因为每位玩家只需要发17张手牌,最后3张留给底牌,
//所以发到51张时就不应该给继续给玩家发牌了
if(i<=50 && i % 3 == 0){
one[oneIndex++] = newPokers[i];
}else if(i<=50 && i % 3 ==1){
two[twoIndex++] = newPokers[i];
}else if (i<=50 && i % 3 == 2){
three[threeIndex++] = newPokers[i];
}else{
underPoker[underPokerIndex++] = newPokers[i];
}
}
//循环输出每名玩家的手牌以及底牌
System.out.println();
System.out.print("玩家1得到的牌:");
for (String poker: one){
System.out.print(poker + ",");
}
System.out.println();
System.out.print("玩家2得到的牌:");
for (String poker: two){
System.out.print(poker + ",");
}
System.out.println();
System.out.print("玩家3得到的牌:");
for (String poker: three){
System.out.print(poker + ",");
}
System.out.println();
System.out.print("底牌:");
for (String poker: underPoker){
System.out.print(poker + ",");
}
}
}
IT兄弟连 Java语法教程 综合案例的更多相关文章
- IT兄弟连 Java语法教程 标识符和关键字
Java语言也和其它编程语言一样,使用标识符作为变量.对象的名字.也提供了一系列的关键字用以实现特别的功能.本小节将详细介绍Java语言的标识符和关键字等内容. 1.分隔符 Java语言里的分号“;” ...
- IT兄弟连 Java语法教程 数组 经典案例
案例需求: 编程实现双色球中奖号码的生成 1)应用知识: ● 数组的声明 ● 数组的使用 ● for循环 2)需求解析: 在该程序中,需要定义一个长度为7的数组,用来存储中奖号码,使用Rando ...
- IT兄弟连 Java语法教程 流程控制语句 经典案例
使用continue忽略本次循环剩下的语句 continue的功能和break有点类似,区别是continue只是忽略本次循环剩下的语句,接着开始下一次循环,并不会终止循环:而break则是完全终止循 ...
- IT兄弟连 Java语法教程 数组 多维数组 二维数组的声明
Java语言里提供了支持多维数组的语法.但是这里还想说,从数组底层的运行机制上来看是没有多维数组的. Java语言里的数组类型是引用类型,因此数组变量其实是一个引用,这个引用指向真实的数组内存,数组元 ...
- IT兄弟连 Java语法教程 变量2
变量的作用域和生命周期 到目前为止,使用的所有变量都是在main()方法开始时声明的,然而,Java允许在任何代码块(代码块以开花括号开始,以闭花括号结束)中声明变量,代码块定义了作用域.因此,每当开 ...
- IT兄弟连 Java语法教程 变量1
什么是变量 在Java程序中,变量是基本的存储单元.是在程序运行中值可以改变的一块内存区域.变量是通过标识符(变量名).变量类型及可选的初始化器来定义的,此外,所有的变量都有作用域,作用域定义了变量的 ...
- IT兄弟连 Java语法教程 Java语言的其他特性
Java语言中除了非常重要的跨平台特性外,还有如下几个关键特性: ● 语法简单易学 Java语言的语法简单明了,容易掌握,而且是纯面向对象(OOP)的语言,Java语言的简单性主要体现在以下几个方面 ...
- IT兄弟连 Java语法教程 Java的发展历程
只有少数几种编程语言对程序设计带来过根本性的影响.其中,Java的影响由于迅速和广泛而格外突出.可以毫不夸张的说,1995年Sun公司发布的Java1.0给计算机程序设计领域带来了一场变革.这场变革迅 ...
- IT兄弟连 Java Web教程 经典案例2
案例需求:写一个用户登录的html页面有账号和密码,并在登录的Servlet中获取登录的账号和密码,如果账号是abc密码是123则向浏览器输出登录成功,否则向浏览器输出登录失败. 案例实现: ● h ...
随机推荐
- MySQL数据库:数据完整性及约束的应用
数据完整性 1.域完整性:---------匹配完整性:非空.缺省 字段/列 2.实体完整性:-------匹配完整性:主键.唯一键 记录/行 3.引用完整性:-------匹配完整性:外键 表与表之 ...
- Python—定时任务(APScheduler实现)
简介 APScheduler的全称是Advanced Python Scheduler.它是一个轻量级的基于Quartz的 Python 定时任务调度框架.APSche ...
- python(一) jupyter 安裝
copy from https://jupyter.org/install Getting started with JupyterLab Installation JupyterLab can be ...
- 如何在linux终端创建文件
我们都知道可以用mkdir命令创建一个新的目录,但更多时候如果能直接创建一个文件(普通文件)会让人感觉更愉悦:这样就可以不用在去打开一个专门的创建文本文件的软件,然后还要设置文件名,保存路径那样的繁琐 ...
- Appium(三):安装appium client、adb命令
1. 安装appium client appium client是对webdriver原生api的一些扩展和封装.它可以帮助我们更容易的写出用例,写出更好的用例. appium client是配合原生 ...
- Java之Lambda表达式
函数式编程思想概述 面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做. 面向对象的思想: 做一件事情,找一个能解决这个事情的对 ...
- JS表单内容垂直循环滚动
参考博客:https://blog.csdn.net/yubo_725/article/details/52839493 大佬是真的厉害,保存一下,以方便后续使用 效果: 源码: <!DOCT ...
- Flutter中高级培训
Flutter中高级培训 一.简介 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面.Flutter可以与现有的代码一起工作.本课程全面介绍Flutter ...
- opencv加载图片imread失败的原因
用简单的imshow函数加载图片,报加载失败的异常,显示没有将图片加载到内存中.原因是在配置环境是同时将*lib与*d.lib都入了附加依赖项,而项目的生成方式选择的是debug,*lib在*d.li ...
- ASP.NET图片上传和截取
一.介绍:图片的上传直接使用ajax就可以了,截取图片的话使用到Jcrop插件. 图片上传资料:https://www.jb51.net/article/87654.htm 截取图片插件:http:/ ...