写代码的思路:
1.创建一个窗体,并且获取窗体的最外层容器getContantPane
2.创建一个卡牌类,card
3.创建一个玩家类,每个玩家都有一个链表存放到手的卡牌
4.创建一个实施卡牌流程的线程,实现卡牌操作:
准备:创建54个卡牌对象,分成三堆放置在桌面上;
创建三个玩家类对象,其中玩家2表示己方玩家
洗牌:按顺序创建的54张卡牌随机存放一维数组的区域里
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
代码写到这,还没写各个玩家手中的牌重新排序以及三张底牌要重新定位
附上运行图: