发牌程序(一)

package SendCard;

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class DealCard {
	public DealCard(int cardMax, int personNumber) {
		CardBuffer cardbuffer = new CardBuffer(personNumber);
		new SendCardThread(cardbuffer, cardMax).start();
		String[] titles = { "北", "东", "南", "西" };
		int[] x = { 300, 550, 300, 50 };
		int[] y = { 200, 320, 440, 320 };
		for (int i = 0; i < personNumber; i++) {
			new ReceiveCardThread(cardbuffer, i, titles[i], x[i], y[i]);
		}
	}

	public static void main(String[] args) {
		new DealCard(52, 4);// 52张牌,4个人收
	}
}

class CardBuffer {
	private int personNumber;// 多少人接收
	private int value;
	private int order;// 接牌的循序
	private boolean isEmpty;// 旗杆标志

	public CardBuffer(int personNumber) {
		this.personNumber = personNumber;
		isEmpty = true;
		order = 0;
	}

	public synchronized void put(int value) {
		while (!isEmpty) {// 要放入数据,必须buffer为空
			try {
				this.wait();
			} catch (InterruptedException e) {
				System.out.println("buffer不为空,等待异常!!");
			}
		}
		this.value = value;
		isEmpty = !isEmpty;
		this.notifyAll();
	}

	public synchronized int get(int order) {
		while (isEmpty || this.order != order) {// 只有是有序的人才能接收
			try {
				this.wait();
			} catch (InterruptedException e) {
				System.out.println("buffer为空,等待异常!!");
			}
		}
		isEmpty = !isEmpty;
		this.notifyAll();
		this.order = (this.order + 1) % this.personNumber;// 有序发牌
		return value;
	}

}

class SendCardThread extends Thread {
	private CardBuffer buffer;
	private int cardMax;
	private int[] cardNumber;// 0 1 2 3 4 5 .... 51

	public SendCardThread(CardBuffer buffer, int cardMax) {
		this.buffer = buffer;
		this.cardMax = cardMax;
		this.setPriority(MAX_PRIORITY);
		cardNumber = new int[cardMax];
		for (int i = 0; i < cardNumber.length; i++) {// 初始化牌
			cardNumber[i] = i;
		}
	}

	public int[] shuffle(int[] cleancard) {
		if(cleancard==null||cleancard.length==0){
			return null;
		}
		int[] mycleancard = new int[cleancard.length];
		for (int i = 0; i < mycleancard.length; i++) {
			mycleancard[i] = cleancard[i];
		}
		int temp = 0, rand;
		for (int i = 0; i < mycleancard.length; i++) {// 第i个的元素与第rand个的元素 交换
			rand = (int) (Math.random() * 100) % cardMax;// 交换位置,错序
			temp = mycleancard[rand];
			mycleancard[rand] = mycleancard[i];
			mycleancard[i] = temp;
		}
		return mycleancard;
	}

	@Override
	public void run() {
		int[] mycard = shuffle(cardNumber);
		for (int i = 0; i < mycard.length; i++) {
			buffer.put(mycard[i]);
		}
		for (int i = 0; i < 4; i++) {// 使4个接收线程关闭
			buffer.put(-1);
		}
	}

}

class ReceiveCardThread extends JFrame implements Runnable {
	private CardBuffer buffer;
	private int order;
	private JTextArea text;
	private Color[] colors;

	public ReceiveCardThread(CardBuffer buffer, int order, String title, int x,
			int y) {
		super(title);
		setLocation(x, y);
		setSize(250, 100);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.buffer = buffer;
		this.order = order;
		this.buffer = buffer;
		text = new JTextArea();
		text.setLineWrap(true);
		text.setEditable(false);
		getContentPane().add(text);
		colors  = new Color[] {Color.BLACK,Color.RED,Color.GRAY,Color.pink};

		setVisible(true);
		new Thread(this).start();
	}

	@Override
	public void run() {
		while (true) {
			int value = buffer.get(order);
			int color = value/13;
			if(value==-1){
				return ;
			}
			text.append(String.format("%4d", value));
			try {
				Thread.sleep(30);
			} catch (InterruptedException e) {
				System.out.println("qwer");
			}
		}
	}

}

时间: 2024-08-03 03:43:51

发牌程序(一)的相关文章

妞一个斗地主发牌程序!!!

学习java三个星期,利用所学的知识做了一个三人斗地主发牌程序,闲话少叙,上代码 1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.List; 4 5 /** 6 * 三人斗地主程序 功能:将一副牌随机分发给地主(20张牌),农民A(17张牌),农民B (17张牌) 7 * 步骤:1.洗牌阶段:将54张牌储存到ArraryList 容器中(批量储存,for循环) 8 * 2.发牌阶段:

第十章 数组与集合 发牌程序 实例代码

解决方案目录: Suit.cs四种花色 namespace Cards { enum Suit { Clubs, Diamonds, Hearts, Spades } } Value.cs扑克牌的13中面值 namespace Cards { enum Value { Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace } } Pack.cs发牌程序核心类 namespace Cards { u

C语言的随机发牌程序(红桃、黑桃、梅花、方块)

做一个随机发牌的C语言程序,供大家学习,思考. 未做任何注释,有测试时候留下的一些输出语句,一遍方便测试. /* author:nunu qq:398269786 */ #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { int a[60]; int b[60]; int w = 0; int wi,wj,wii; int i,j,index,x=0,m; for(i=0;i<54;

一个有趣的基于C++的模拟发牌程序

在内存中模拟出一副牌,然后模拟洗牌,发牌等动作. 流程是这样的:构建一副牌保存到一个数组中—洗牌—创建玩家—向玩家发牌–输出每个玩家的牌. #include <stdio.h> #include <stdlib.h> #include <time.h> //定义扑克的花色 enum Suit{ heart, spade, diamond, club, joker1, joker2 }; //一副牌的数量 #define CARD_COUNT 54 //定义扑克 type

发牌程序(二)

package SendCardcopy; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Action; import javax.swing.JButton; import javax.swing.

发牌程序(三)

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import

斗地主发牌程序

//洗牌函数 shuffle() 接收一个数组 let shuffle = function(pokers){ for(let i=0;i<pokers.length;i++) { let random = parseInt(Math.floor(Math.random()*54));//随机生成54张牌的一个随机数 //两张牌进行交换 let temp = pokers[i]; pokers[i] = pokers[random]; pokers[random] = temp; } } //对

集合练习 之 斗地主发牌

      >HashMap 的key底层数据结构是哈希表 >ArrayList 底层数据结构是数组,查询快,增删慢 >TreeSet  底层数据结构式红黑树(平衡二叉树),默认构造器采用自然排序(Integer已经实现了Comparable接口 ).     package cn.itcast.day18; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import

扑克牌的发牌功能,存储,以及显示

/* 功能:实现扑克牌的发牌和存储以及显示牌型 */ #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 54 #define M 17 /* 发牌程序: 花色有红桃,梅花,方块,黑桃 花点有:1,2,3,4,5,6,7,8,9,10,J,Q,K 另点数从1-54; 1  - 13 表示红桃 14 - 26 表示梅花 27 - 39 表示方块 40 - 52 表示黑桃 53 - 54 表示大小王