线程——扑克牌发牌

多线程随机发牌

随机发牌!!!
在这里插入图片描述

import java.util.Scanner;
import java.util.Arrays;
import java.util.Random;
public class Main {
 public static void main(String[] args) {
  Poker res = new Poker();
  Thread a = new Thread(res);
  a.start();
 }
}
class Poker implements Runnable {
 People[] r;
 int[] d;
 String[] card;
 int w;
 public Poker() {
  r = new People[] { new People("玩家1"), new People("玩家2"), new People("玩家3"), };
  d = new int[54];
  w = 0;
  card = new String[54];
  Random rec = new Random();
  while (w < 54) {
   int ji = 0;
   int x = rec.nextInt(54);
   for (int i = 0; i < w; i++) {
    if (d[i] == x) {
     ji++;
    }
   }
   if (ji == 0) {
    d[w] = x;
    if (x + 1 <= 52) {
     if (x % 4 == 0) {
      card[w] = "♦";
     } else if (x % 4 == 1) {
      card[w] = "♣";
     } else if (x % 4 == 2) {
      card[w] = "♠";
     } else if (x % 4 == 3) {
      card[w] = "♥";
     }
     card[w] = card[w] + ((x / 4) + 1);
    } else if (x + 1 == 53) {
     card[w] = "小王";
    } else if (x + 1 == 54) {
     card[w] = "大王";
    }
    w++;
   }
  }
 }
 public String zh(int x) {
  if (x + 1 <= 52) {
   if (x % 4 == 0) {
    return "♦" + ((x / 4) + 1);
   } else if (x % 4 == 1) {
    return "♣" + ((x / 4) + 1);
   } else if (x % 4 == 2) {
    return "♠" + ((x / 4) + 1);
   } else if (x % 4 == 3) {
    return "♥" + ((x / 4) + 1);
   }
  } else if (x + 1 == 53) {
   return "小王";
  } else if (x + 1 == 54) {
   return "大王";
  }
  return null;
 }
 @Override
 public void run() {
  int i = 0;
  r[0].f = true;
  while (i < 54) {
   int z = 0;
   for (;;) {
    if (r[z].f) {
     try {
      Thread.sleep(1000);
     } catch (InterruptedException e) {
// TODO Auto-generated catch block
      e.printStackTrace();
     }
     System.out.print(r[z].name + "摸牌 " + card[i] + ",");
     r[z].t[r[z].g] = d[i];
     r[z].c[r[z].g] = card[i];
     r[z].g = r[z].g + 1;
     i++;
     r[z].f = false;
     if (i == 54) {
      System.out.println("发牌结束");
      break;
     } else {
      if (z + 1 == 3) {
       System.out.println("下一个" + r[0].name);
       r[0].f = true;
      } else {
       System.out.println("下一个" + r[z + 1].name);
       r[z + 1].f = true;
      }
     }
     break;
    } else {
     z++;
     if (z == 3) {
      z = 0;
     }
    }
   }
  }
  this.String();
 }
 public void String() {
  for (int i = 0; i < 3; i++) {
   Arrays.sort(r[i].t);
   System.out.print(r[i].name + " ");
   for (int b = 0; b < 18; b++) {
    System.out.print(this.zh(r[i].t[b]) + " ");
   }
   System.out.println();
  }
 }
 private void sort() {
// TODO Auto-generated method stub
 }
}
class People {
 String name;
 boolean f;
 String[] c;
 int g;
 int[] t;
 public People(String name) {
  c = new String[18];
  this.name = name;
  f = false;
  t = new int[18];
 }
}
以下是一个简单的多线程实现斗地主发牌的代码示例: ```python import threading import time import random class Player: def __init__(self, name): self.name = name self.cards = [] class Card: def __init__(self, suit, rank): self.suit = suit self.rank = rank class Game: def __init__(self, players): self.players = players self.cards = [] self.landlord = None def shuffle_cards(self): # 生成一副牌 for suit in ["Spades", "Hearts", "Diamonds", "Clubs"]: for rank in range(1, 14): card = Card(suit, rank) self.cards.append(card) # 洗牌 random.shuffle(self.cards) def deal_cards(self): # 发牌 for i in range(51): player = self.players[i % 3] card = self.cards.pop() player.cards.append(card) # 发地主牌 self.landlord = self.players[random.randint(0, 2)] for i in range(3): card = self.cards.pop() self.landlord.cards.append(card) def start_game(self): # 输出每个玩家的牌 for player in self.players: print(player.name, player.cards) if __name__ == "__main__": player1 = Player("Player 1") player2 = Player("Player 2") player3 = Player("Player 3") players = [player1, player2, player3] game = Game(players) game.shuffle_cards() # 创建一个线程池 pool = [] for player in players: t = threading.Thread(target=game.deal_cards, args=()) pool.append(t) # 启动线程 for t in pool: t.start() # 等待线程结束 for t in pool: t.join() game.start_game() ``` 在这个示例代码中,我们使用了线程池的方式来实现多线程发牌。首先创建一个线程池,然后将每个玩家的发牌操作放入线程池中。在启动线程之前,需要先洗牌,然后等待所有线程结束之后,输出每个玩家的牌。需要注意的是,为了防止多个线程同时操作同一个数据,需要使用线程同步机制来保证数据的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大大大龙虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值