模拟洗牌小游戏

洗牌的过程小代码

用代码复现棋牌洗牌的过程

今天面试,面试官人挺好,出了一道小算法题,要用类复现一下棋牌室的洗牌,第一次面试,人比较慌张,其实这题还挺简单了,可惜大脑待机,连java和python都忘了怎么写了,然后就挂了,还是怪自己算法没搞好。

python代码
import random as rd
class game():
    def __init__(self):
        self.hua1 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
        self.hua2 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
        self.hua3 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
        self.hua4 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
        self.paper = [self.hua1,self.hua2,self.hua3,self.hua4]
    def suffle(self):
        rd.shuffle(self.hua1)
        rd.shuffle(self.hua2)
        rd.shuffle(self.hua3)
        rd.shuffle(self.hua4)

    def popPaper(self,players):
        for player in players:
            for i in range(int(52/len(players))):
                randomIndex = rd.randint(0, 3)
                while self.paper[randomIndex] == []:
                    randomIndex = rd.randint(0, 3)
                player.appendPaper(self.paper[randomIndex].pop(), color=randomIndex)




class player():
    def __init__(self):
        self.hua1 = []
        self.hua2 = []
        self.hua3 = []
        self.hua4 = []

    def appendPaper(self,paper,color):
        if color==0:
            self.hua1.append(paper)
        if color==1:
            self.hua2.append(paper)
        if color==2:
            self.hua3.append(paper)
        if color == 3:
            self.hua4.append(paper)

    def show_paper(self):
        print("红桃:",self.hua1)
        print("红梅:", self.hua2)
        print("黑桃:", self.hua3)
        print("黑梅:", self.hua4)



if __name__ =='__main__':

    play1 = player()
    play2 = player()
    play3 = player()
    play4 = player()
    game = game();
    game.suffle()
    game.popPaper(players=[play1,play2,play3,play4])
    print("玩家一有牌:")
    play1.show_paper()
    print("玩家二有牌:")
    play2.show_paper()
    print("玩家三有牌:")
    play3.show_paper()
    print("玩家四有牌:")
    play4.show_paper()

结果

玩家一有牌:
红桃: ['6', '7', '1']
红梅: ['6', '8']
黑桃: ['J', '6']
黑梅: ['9', '7', '2', 'J', '5', 'Q']
玩家二有牌:
红桃: ['J', '8']
红梅: ['1', 'J', '10', 'K', '2']
黑桃: []
黑梅: ['K', '6', '8', '10', '1', '4']
玩家三有牌:
红桃: ['3', 'Q', '5', '4']
红梅: ['3', '9']
黑桃: ['3', '9', '1', '2', '5', '7']
黑梅: ['3']
玩家四有牌:
红桃: ['K', '10', '9', '2']
红梅: ['7', 'Q', '4', '5']
黑桃: ['10', '8', 'Q', 'K', '4']
黑梅: []
Java代码

讲一下思路,paper类用于保存某一类的牌,如红桃,黑桃等,而game用于初始化游戏,一开始游戏有52张牌(粗大地),suff()方法用来洗牌,Player类用来初始化玩家的,玩家手里有4个paper对象用于保存他拿到的所有不同类型的牌。

game类

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Random;

public class game {
    ArrayList<Paper> allpaper;
    ArrayList<Player> Players;

    public game(){
        //四种不同色号的牌
        allpaper = new ArrayList<Paper>(4);
        allpaper.add(new Paper("hua1"));
        allpaper.add(new Paper("hua2"));
        allpaper.add(new Paper("hua3"));
        allpaper.add(new Paper("hua4"));
        //玩家array
        Players = new ArrayList<>();
    }

    public void suff(){
        Collections.shuffle(allpaper.get(0).getPapers());
        Collections.shuffle(allpaper.get(1).getPapers());
        Collections.shuffle(allpaper.get(2).getPapers());
        Collections.shuffle(allpaper.get(3).getPapers());
    }

    public void appendPlayer(Player player){
        //添加玩家
        this.Players.add(player);
    }

    public void openGame(){
        //4个玩家才能开盘
        if (Players.size() != 4) throw new RuntimeException("人数不够");
        //开盘洗牌
        this.suff();
        //给每个玩家分配牌
        for(Player players:this.Players){
            for (int i = 0; i < 13; i++) {
                int index = new Random().nextInt(4);
                while (allpaper.get(index).getPapers().size()==0)
                    index = new Random().nextInt(4);
                players.setPaper(allpaper.get(index).getColor(), allpaper.get(index).popPaper());
            }
        }
    }

    public void showPaperofPlayer(){
        //查看所有玩家对应的牌
        for (Player player:this.Players){
            System.out.println(player.getName());
            player.showPaper();
        }
    }

    public static void main(String[] args) {
       game g = new game();
       g.suff();
       g.appendPlayer(new Player("张三"));
       g.appendPlayer(new Player("李四"));
       g.appendPlayer(new Player("王五"));
       g.appendPlayer(new Player("刘六"));
       g.openGame();
       g.showPaperofPlayer();
    }
}

Player类

play类初始化对象,对象中有4种paper(就是用于存储四种不同色号的),一开始是没有牌的,当game对象调用opengame()方法时,会重牌室中的4种paper中发放牌给玩家。

import java.util.ArrayList;

public class Player {
    private ArrayList<Paper> haspaper;
    private String name;
    public Player(String name){
        //玩家名字
        this.name = name;
        
        //四种不同色号的牌
        haspaper = new ArrayList<>();
        haspaper.add(new Paper(true,"hua1"));
        haspaper.add(new Paper(true,"hua2"));
        haspaper.add(new Paper(true,"hua3"));
        haspaper.add(new Paper(true,"hua4"));
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ArrayList<Paper> getHaspaper() {
        return haspaper;
    }

    
    //该方法添加某一张牌对应到对应色号的牌array中
    public void setPaper(String color,String number) {
        if (color.equals("hua1")) {haspaper.get(0).addPaper(number); return;}
        if (color.equals("hua2")) {haspaper.get(1).addPaper(number);return;}
        if (color.equals("hua3")) { haspaper.get(2).addPaper(number); return;}
        if (color.equals("hua4")) { haspaper.get(3).addPaper(number);return; }
        else throw new RuntimeException("花色错误!");
    }

    public void showPaper(){
        //打印玩家持有的对应色号的牌
        System.out.println("红桃:"+this.haspaper.get(0).getPapers().toString());
        System.out.println("黑桃:"+this.haspaper.get(1).getPapers().toString());
        System.out.println("红梅:"+this.haspaper.get(2).getPapers().toString());
        System.out.println("黑梅:"+this.haspaper.get(3).getPapers().toString());
    }
}

Paper类

用于存储某一类牌的类。

import java.util.ArrayList;
import java.util.Arrays;

public class Paper {
    private ArrayList<String> papers;
    private String color;
    public Paper(String color){
        String[] papers = {"1","2","3","4","5","6","7","8","9","10","J","Q","K"};
        this.papers = new ArrayList<>(Arrays.asList(papers));
        if (color.equals("hua1")||color.equals("hua2")||color.equals("hua3")||color.equals("hua4"))
            this.color = color;
        else new RuntimeException("不存在花色");

    }
    public Paper(boolean isNull,String color){
        if (isNull)
            this.papers = new ArrayList<>();
        else{
            String[] papers = {"1","2","3","4","5","6","7","8","9","10","J","Q","K"};
            this.papers = new ArrayList<>(Arrays.asList(papers));
            if (color.equals("hua1")||color.equals("hua2")||color.equals("hua3")||color.equals("hua4"))
                this.color = color;
            else new RuntimeException("不存在花色");
        }

    }

    public void addPaper(String number){
        this.papers.add(number);
    }

    public String popPaper(){
        return papers.remove(0);
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public ArrayList<String> getPapers() {
        return papers;
    }

    public void setPapers(ArrayList<String> papers) {
        this.papers = papers;
    }
}

结果

张三
红桃:[J, K, 5, 3]
黑桃:[2, 10]
红梅:[3, K, 6]
黑梅:[7, 8, 1, Q]
李四
红桃:[Q, 9, 10, 8, 1, 2, 4]
黑桃:[1, 4]
红梅:[1, 7]
黑梅:[4, 2]
王五
红桃:[6, 7]
黑桃:[6, 9, J, 5]
红梅:[10]
黑梅:[9, 6, K, 5, J, 10]
刘六
红桃:[]
黑桃:[Q, 3, K, 7, 8]
红梅:[5, 4, J, 2, 9, Q, 8]
黑梅:[3]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值