上一篇实现了简单的扑克牌创建,本篇将完成最终目的,实现洗牌功能
首先理一下思路
产生一张牌——产生一副牌——洗牌——发牌——实现整个功能
这些功能则需要在类里面实现,所以大致可以分为3个类
一个类用于管理一张牌的属性,点数和花色
一个类用于保存一副牌,实现牌的功能
一个类用于运行整个项目(主类)
创建一个类Poker,管理一张牌的属性
package poker;
//管理一张牌的信息,点数和花色
public class Poker {
private String dot;//用来记录一张牌的点数
private String pic;//用来记录一张牌的花色
static final String [] DOTS = new String[]{"♠","♥","♣","♦"};
static final String [] PICS = new String[]{"3","4","5","6","7"
,"8","9","10","J",
"Q","K","A","2"};
/*
这里涉及到static 和 final
1.static是静态修饰符,在类外部调用的时候可以不用建立相应的对象,直接通过“类名.”来访问
2.final是缺省修饰符,用缺省修饰符修饰的是常量,名字需要大写。由于是常量,不用再通过构造函数来初始化。由于花色和点数是固定存在且不会被修改的,我们可以设置为final和private
*/
public Poker(String dot, String pic) {
this.dot = dot;
this.pic = pic;
}//含有两个参数的构造方法,this代表当前类的对象,创建对象之后系统会自动调用相应类的构造函数来初始化成员变量
@Override
public String toString() {
return pic+dot;
}
/*
toString方法,当使用print输出一个对象时,就会自动调用toString方法。如果没有实现,会自动调用父类的toString。当需要打印出对象的值的时候,需要重写toString方法,否则会出现乱码。
快捷键ctrl+enter,找到toString(自行设置快捷键)
该方法也可以手动写
*/
public String getDot() {
return dot;
}
public void setDot(String dot) {
this.dot = dot;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
}
/*
以上为get/set方法,目的是间接访问私有对象的值
ctrl+enter为快捷键
*/
创建一个类PokerManager,实现洗牌、发牌功能
package poker;
import java.util.ArrayList;
import java.util.Collections;
//管理牌的所有行为
public class PokerManager {
private ArrayList<Poker> pokers;//定义ArrayList数组来保存一副牌
public PokerManager() {
pokers = new ArrayList<>();
}//构造方法
public void produce(){
for(int i=0;i<Poker.DOTS.length;i++){
for(int j=0;j<Poker.PICS.length;j++){
String d = Poker.DOTS[i];
String p = Poker.PICS[j];
Poker poker = new Poker(d,p);//调用Poker的构造方法初始化poker
pokers.add(poker);//这样生成一副牌,保存在数组pokers里面
}
}
}//生成一副牌
public void show(){
for(int i = 0;i<pokers.size();i++){
System.out.print(pokers.get(i)+" ");
if((i+1)%17==0){//17张换一下行,斗地主雏形
System.out.print("\n");
}
}
}//展示一副牌
public void shuffle(){
Collections.shuffle(pokers);
}//java提供了“洗牌功能”,实质上是打乱数组顺序,此时必须使用list格式
创建主类运行该项目
package poker;
public class MyClass {
public static void main(String[] args){
PokerManager manager = new PokerManager();
manager.produce();//生成一副牌;
manager.shuffle();//洗牌(打乱数组顺序)
manager.show(); //发牌
}
}
//可以看出主类很简单了,只需要通过一个个对象来调用相应方法即可,这也是面向对象语言的一个好处
运行结果
image.png
本节之后,对类与对象有了综合的运用,为之后的项目打下基础
注意事项
java规定,for语句等功能需要写在方法里面(函数),不能单独存在,否则会报Unknown token