20200804-1、JAVA-String,FileInputStream,FileOutputStream 2、斗地主游戏。

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();
    }

}

结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42005540/article/details/107780591