模拟洗牌小游戏
洗牌的过程小代码
用代码复现棋牌洗牌的过程
今天面试,面试官人挺好,出了一道小算法题,要用类复现一下棋牌室的洗牌,第一次面试,人比较慌张,其实这题还挺简单了,可惜大脑待机,连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]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)