写代码的思路:
    1.创建一个窗体,并且获取窗体的最外层容器getContantPane
    2.创建一个卡牌类,card
    3.创建一个玩家类,每个玩家都有一个链表存放到手的卡牌
    4.创建一个实施卡牌流程的线程,实现卡牌操作:
         准备:创建54个卡牌对象,分成三堆放置在桌面上;
           创建三个玩家类对象,其中玩家2表示己方玩家
           洗牌:按顺序创建的54张卡牌随机存放一维数组的区域里

           发牌:留下三张地主牌,并且是背面朝上。调用到point类,使牌移动到三方,三个玩家得到各自的牌。

界面类:

package a_landOne;

import java.awt.Color;
import java.awt.Container;

import javax.swing.JFrame;

public class AViewJFrame extends JFrame {
	private Container table;

	public static void main(String[] args) {
		new AViewJFrame().initJframe();
	}

	private void initJframe() {
		setSize(600, 600);
		setLocationRelativeTo(null);
		setResizable(false);
		setDefaultCloseOperation(1);
		table = getContentPane();
		// 绝对定位
		table.setLayout(null);
		table.setBackground(new Color(0, 112, 26));
		// 创建一个庄家对象
		BBanker banker = new BBanker(table);
		banker.start();
		setVisible(true);
	}
}
卡牌类:

package a_landOne;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class BCards extends JLabel {
	private String name;

	public BCards(String name) {
		this.name = name;
		setSize(71, 96);
		// 设置牌面默认为背面
		setIcon(new ImageIcon("images/rear.gif"));
	}

	public String getName() {
		return name;
	}

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

	public void overturn() {
		setIcon(new ImageIcon("images/" + name + ".gif"));
	}

}
庄家的线程类:

package a_landOne;

import java.awt.Container;
import java.awt.Point;
import java.util.Random;

public class BBanker extends Thread {
	public Container table;
	private BCards[] card = new BCards[54];
	// 创建一个随机数对象
	private Random random = new Random();
	// 创建三个玩家
	BPlayer Player1 = new BPlayer();
	BPlayer Player2 = new BPlayer();
	BPlayer Player3 = new BPlayer();

	public BBanker(Container table) {
		this.table = table;
	}

	/*
	 * 做庄函数
	 */
	public void run() {
		for (int i = 0; i < 5; i++) {
			for (int j = 0; j < 13; j++) {
				// 准备阶段,创建54个卡牌对象,卡牌分成五堆,放在桌面上
				if (i == 4 && j > 1) {
					break;
				}
				BCards cards = new BCards(i + "-" + j);
				cards.setLocation(200 + i * 30, 30);
				table.add(cards);
				table.repaint();
				// 洗牌阶段,即每张牌随机存入数组
				shuffle(cards);
			}
		}
		// 发牌阶段
		deal();
	}

	/*
	 * 洗牌的函数
	 */
	public void shuffle(BCards cards) {
		int ran = random.nextInt(54);
		while (card[ran] != null) {
			ran = random.nextInt(54);
		}
		card[ran] = cards;
	}

	/*
	 * 发牌的函数
	 */
	public void deal() {
		int c = 0, f = 0, s = 0, t = 0;
		for (int i = 0; i < 51; i++) {
			// 发牌阶段,留下三张地主牌,并且是背面朝上。
			BCards cards = card[i];
			switch ((c++) % 3) {
			case 0:
				CMoving.move(cards, cards.getLocation(), new Point(25, 50 + (f++) * 20));
				Player1.linkedList.add(cards);
				break;
			case 1:
				CMoving.move(cards, cards.getLocation(), new Point(97 + (s++) * 20, 470));
				Player2.linkedList.add(cards);
				break;
			case 2:
				CMoving.move(cards, cards.getLocation(), new Point(500, 50 + (t++) * 20));
				Player3.linkedList.add(cards);
				break;
			}
			cards.overturn();
			table.setComponentZOrder(cards, 0);
		}
	}
}
移动的静态函数:

package a_landOne;

import java.awt.Point;

public class CMoving {
	public static void move(BCards cards, Point start, Point end) {
		if (start.x!=end.x) {
			// 默认向左移动
			int speed = -10;
			if (start.x < end.x) {
				// 向右边移动
				speed = -speed;
			}
			double tangent = ((double)end.y - start.y) / Math.abs(end.x - start.x);
			while (Math.abs(end.x - start.x) > 20) {
				start.x += speed;
				start.y += Math.abs(speed) * tangent;
				cards.setLocation(start.x, start.y);
				try {
					Thread.sleep(20);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			// 最后校准位置
			cards.setLocation(end);
		}
	}
}
玩家类:

package a_landOne;
/*
 * 玩家类对象
 */

import java.util.LinkedList;

public class BPlayer {
	//一个玩家一个链表放卡牌
	public LinkedList<BCards> linkedList=new LinkedList<>();
}
总结:

 所用到的图片素材:链接:https://pan.baidu.com/s/1o9UAckU 密码:avcq

代码写到这,还没写各个玩家手中的牌重新排序以及三张底牌要重新定位

 附上运行图:

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐