20200804-1、JAVA-String,FileInputStream,FileOutputStream 2、斗地主游戏。
规则如下:
1.有三名玩家,可从控制台赋值玩家姓名,玩家中会有牌类集合的属性,还有是否是地主的状态
2.牌类有两个属性:花色和点数。花色有4种:黑红梅方(可用枚举)点数对应有13加上两张王牌(可用枚举)。
3.扑克牌管理类:用于产生54张随即顺序的牌堆(牌类集合,54张牌不变,变得是顺序),给玩家发牌,并随机产生地主,把剩余3张底牌给地主,并展示三位玩家的手牌。同时把手牌信息存入文件中
要求:
1.能产生54张牌的集合
2.能产生随机的54张牌的集合或能实现随机发牌的功能
3.玩家类和三名玩家对象名称赋值
4.能实现随机产生地主,并给三位玩家分配牌的集合(
5.实现把集合结果保存到文件中
提示:枚举类中可以有普通属性和构造器,枚举对象可以是构造器对象。
1、课堂笔记:
String
是final类型,不可被继承,底层是char类型数组常量,不可更改
而对String对象重新赋值的过程,其实是新建对象的过程
如果需要对String对象频繁赋值,则不推荐使用String
线程安全:synchronized 保证线程间隔离
String: 不可被改变,真正意义上的安全 在频繁字符串拼接的情况下,速度非常慢
StringBuffer: 线程安全的
StringBuilder: 线程不安全的
绝对路径和相对路径:绝对路径一般是从根目录开始的,写全路径
相对路径一般是从工程目录开始的
FileInputStream读文件的流程:
1、FileInputStream对象和String对象声明
2、创建fileInputStream对象(文件路径和File对象)
3、读单字节或整个读到byte数组中
4、转成字符串
5、关闭FileInputStream流
6、返回结果
FileOutputStream写文件的流程:
1、File对象装载文件路径
2、判断文件父级目录是否存在,不存在则创建
3、声明FileOutputSteam对象
4、创建fileOutputStream对象(File对象,是否追加)
5、把要写的字符串转成bytel数组,并写入输出流
6、关闭FileOutputSream流
2、斗地主游戏
player类:
package homework2;
import java.util.ArrayList;
/*
* @ClassName: Player
* project name: 20200802-homework
* @Description:
*/
public class Player {
public String name;
public ArrayList<String> list = new ArrayList();
public ArrayList<String> getList() {
return list;
}
public void setList(ArrayList<String> list) {
this.list = list;
}
public Player() {
}
public Player(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String nameOfDiZhu(int i){
String j = String.valueOf(i);
return "player"+j+".txt";
}
}
cards类:
package homework2;
import java.io.*;
import java.util.*;
/**
* @ClassName: Cards
* Date: 2020/8/2 21:44
* project name: 20200802-homework
* @Description:
*/
public class Cards {
// ArrayList<String> players = new ArrayList();
Player[] player = new Player[3]; //创建一个包含三个玩家的player对象
public void xiCard(){
Scanner input = new Scanner(System.in);
for (int i = 0; i < player.length; i++) {
System.out.println("请输入第"+(i+1)+"位玩家的姓名:");
player[i] = new Player(input.next());//以此循环输入每一轮三位玩家的姓名
writeFile("玩家姓名:"+player[i].name+"\n", "D:/myDoc/"+player[i].nameOfDiZhu(i+1), true);
//再将玩家的姓名存入文件夹中
}
List<String> Card = new ArrayList(); //将54张牌存入Card集合中
String[] card = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
String[] color = {"♠","♥","♣","♦"};
for (String cards : card){ //双重循环实现数字与花色的字符串叠加
for (String colors : color){
Card.add(colors + cards);
}
}
Card.add("小王"); //最后单独加入两张大小王
Card.add("大王");
Collections.shuffle(Card); //洗牌
for (int i = 0; i<Card.size()-3;i=i+3){ //依此给3位玩家发牌
player[0].getList().add(Card.get(i));
player[1].getList().add(Card.get(i+1));
player[2].getList().add(Card.get(i+2));
}
System.out.println("随机产生地主!");
int diZhu;
diZhu = (int)(Math.random()*3); //随机数,随机产生地主的编号
System.out.println("恭喜"+player[diZhu].name+"成为地主!获得三张底牌!");
writeFile("此轮是地主\n", "D:/myDoc/"+player[diZhu].nameOfDiZhu(diZhu+1), true);
//将地主信息存入文件夹中
for (int i = 51; i <54 ; i++) {//再给产生的地主发放最后的三张底牌
player[diZhu ].getList().add(Card.get(i));
}
for (int i = 0; i <3 ; i++) {//将三位玩家的牌存入文件夹中
for (Object j:player[i].getList()) {
writeFile(j+" ", "D:/myDoc/"+player[i].nameOfDiZhu(i+1), true);
} /*以-----------作为分割线,切分每一轮比赛,将每一轮比赛发放的牌存入数组中的一个元素,这样,指定都一轮比赛,即选定数组的下标,
以此来输入某一轮比赛玩家的手牌。其中文件夹的路径使用了字符串拼接,因为不同的玩家信息存入不同的文件夹,文件夹的名称不相同。
(在player中定义了文件夹名称的方法)
*/
writeFile("\n--------------------\n", "D:/myDoc/"+player[i].nameOfDiZhu(i+1), true);
}
int i =0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入您想展示第几次手牌?");
i = sc.nextInt();
System.out.println(readByOne("D:/myDoc/player1.txt",i));
System.out.println(readByOne("D:/myDoc/player2.txt",i));
System.out.println(readByOne("D:/myDoc/player3.txt",i));
}
public static void writeFile(String str,String path,boolean isAppend){
File f = new File(path);
if (!f.getParentFile().exists()) {
f.getParentFile().mkdir();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(f,isAppend);
byte[] b=str.getBytes();
fos.write(b);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public String readByOne(String path, int i) {
FileInputStream fis = null;
String str = null;
String print = null;
String[] printword =new String[100];
try {
fis = new FileInputStream(path);
StringBuffer sb = new StringBuffer();
byte[] b = new byte[fis.available()]; //创建byte类型数据流数组
fis.read( b); //是读取文件里的字符串,然后给byte类型的数组b赋值,读取文件里的字符串放入b数组缓冲区内。
str = new String(b);
printword = str.split("\n--------------------\n");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return printword[i-1];
}
}
测试类:
package homework2;
/**
* @ClassName: TestCards
* Date: 2020/8/2 21:44
* project name: 20200802-homework
* @Description:
*/
public class TestCards {
public static void main(String[] args) {
Cards cards = new Cards();
cards.xiCard();
}
}
结果: