扑克牌项目的基本实现

目录

前言

一、创建并初始化扑克牌

二、洗牌规则

1.从前往后洗牌

2.从后往前洗牌

三、发牌流程

1.每人发17张,共发3人

2.发牌轮次17次,每轮3次

四、输出到控制台

总结


前言

实现功能的方法很重要,自己表达的逻辑不一定是最好的,这就需要去参考别人的方法,去理解运用。

重要的是洗牌的逻辑,它是标准的扑克牌洗牌规则。


提示:以下是本篇文章正文内容,下面案例可供参考

一、创建并初始化扑克牌

1、创建扑克牌
   - 一共有54张扑克牌;
   - 每张扑克牌属性都相同,所以选用数组
2、定义扑克牌
   - 先用初始化定义(最好用枚举类型去定义)比较和枚举定义相同
   - 用双层for循环定义赋值不严谨,不要用。(不能以结果为导向写代码,逻辑很重要)

代码如下(示例):

String[] playingCards = {"红桃A", "红桃2", "红桃3", "红桃4", "红桃5", "红桃6", "红桃7",
 "红桃8", "红桃9", "红桃10", "红桃J", "红桃Q", "红桃K", "黑桃A", "黑桃2", "黑桃3", "黑桃4",
 "黑桃5", "黑桃6", "黑桃7", "黑桃8", "黑桃9", "黑桃10", "黑桃J", "黑桃Q", "黑桃K", "方片A",
 "方片2", "方片3", "方片4", "方片5", "方片6", "方片7", "方片8", "方片9", "方片10", "方片J", 
"方片Q", "方片K", "梅花A", "梅花2", "梅花3","梅花4", "梅花5", "梅花6", "梅花7", "梅花8",
"梅花9", "梅花10", "梅花J", "梅花Q", "梅花K", "大王", "小王"};

二、洗牌规则

随机数,两个数据交换,for循环

1.从前往后洗牌

- 从前往后依次抽取前面 n 位置的牌
- 随机数抽取 n ~ 54范围的牌(用随机数抽取指定范围的数random.nextInt(max-min+1)-min)
- 重复以上过程 53 次

代码如下(示例):

//从前往后依次洗牌,最小值会逐渐增加1
int max = 53;
int min = 1;
Random random = new Random();
int index = random.nextInt(max-min+1)-min);
 

2.从后往前洗牌

- 从后往前依次抽取后面 n 位置的牌
- 随机数抽取 0 ~ n 位置的整数用于扑克牌下标,相当于随机抽取前面扑克牌
- 两张牌交换一下(两个数据交换位置)
- 重复以上过程 53 次
//数组有下标,创建随机数抽取下标,后两个数交换位置
Random random = new Random();
//从后往前洗牌,从后选中一张牌,在随机抽取一张牌,交换数据,完成洗牌,重复过程53次
for (int i=playingCards.length-1;i>0;i--) {//大于0是为了省略最后一次交换
    //抽取最后一张牌,每次洗牌,位置向前移动一位
    String card = playingCards[i];
    //随机抽取没有交换位置的牌的下标
    int index = random.nextInt(i);
    //把随机抽取的牌 和 最后一张牌交换位置(将要洗的牌)
    playingCards[i] = playingCards[index];
    playingCards[index] = card;
    //重复以上过程,
}

三、发牌流程

- 发牌的业务规则
- 共有3个人,每人17张牌,最后3张做底牌
- 发牌阶段有两种发牌思路
//初始化 3个人 17张牌
String[] p1 = new String[17];
String[] p2 = new String[17];
String[] p3 = new String[17];

1.每人发17张,共发3人

int index = 0;
for (int i=0;i<17;i++) {
p1[i] = playingCards[index];
p2[i] = playingCards[index+1];
p3[i] = playingCards[index+2];
index+=3;
}

2.发牌轮次17次,每轮3次

int index = 0;
for (int i=0;i<=48;i+=3) {
p1[index] = playingCards[i];
p2[index] = playingCards[i+1];
p3[index] = playingCards[i+2];
index++;
}
//存入底牌
String[] base = {playingCards[51],playingCards[52],playingCards[53]};

四、输出到控制台

增强for循环,foreach和for相比只是少写了循环次数,编译时会编译成正常for循环
System.out.print("p1: ");
for (String card : p1) {
    System.out.print(card+ " ");
}
System.out.println();
System.out.print("p2: ");
for (String card : p2) {
    System.out.print(card+ " ");
}
System.out.println();
System.out.print("p3: ");
for (String card : p3) {
    System.out.print(card+ " ");
}
System.out.println();
System.out.print("底牌: ");
for (String card : base) {
    System.out.print(card+ " ");
}

总结

- 用枚举类型去定义固定的内容,虽然for循环也可以但是不严谨,不推荐使用

- 不能以结果为导向写代码,逻辑很重要

- 傻瓜也能写出计算机能理解的代码,而好的程序员是写给人能看懂的代码

- 计算机只认识 0 或 1,随机数借鉴了 ”高德纳“ 设计的算法,实现了随机数的API。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值