Eclipse+Java+Swing實(shí)現(xiàn)斗地主游戲(代碼)
一、系統(tǒng)介紹
本系統(tǒng)實(shí)現(xiàn)撲克的分發(fā),搶地主,電腦自動(dòng)出牌等功能。
二、系統(tǒng)展示
1.撲克分發(fā)
2.搶地主
3.出牌
4.游戲勝利
三、系統(tǒng)實(shí)現(xiàn)
Card.java
package com.sjsq; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.ImageIcon; import javax.swing.JLabel; /** ?*? ?* 撲克管理類(lèi) ?*? ?* @author shuijianshiqing ?* ?* @date 2020-09-09 20:41 ?* ?*/ public class Card extends JLabel implements MouseListener { ?? ?Main main;// Main類(lèi)的引用 ?? ?String name;// 圖片url名字 ?? ?boolean up;// 是否正反面 ?? ?boolean canClick = false;// 是否可被點(diǎn)擊 ?? ?boolean clicked = false;// 是否點(diǎn)擊過(guò) ?? ?public Card(Main m, String name, boolean up) { ?? ??? ?this.main = m; ?? ??? ?this.name = name; ?? ??? ?this.up = up; ?? ??? ?if (this.up) ?? ??? ??? ?this.turnFront(); ?? ??? ?else { ?? ??? ??? ?this.turnRear(); ?? ??? ?} ?? ??? ?this.setSize(71, 96); ?? ??? ?this.setVisible(true); ?? ??? ?this.addMouseListener(this); ?? ?} ?? ?// 正面 ?? ?public void turnFront() { ?? ??? ?this.setIcon(new ImageIcon("images/" + name + ".gif")); ?? ??? ?this.up = true; ?? ?} ?? ?// 反面 ?? ?public void turnRear() { ?? ??? ?this.setIcon(new ImageIcon("images/rear.gif")); ?? ??? ?this.up = false; ?? ?} ?? ?@Override ?? ?public void mouseClicked(MouseEvent e) { ?? ??? ?if (canClick) { ?? ??? ??? ?Point from = this.getLocation(); ?? ??? ??? ?int step; // 移動(dòng)的距離 ?? ??? ??? ?if (clicked) ?? ??? ??? ??? ?step = -30; ?? ??? ??? ?else { ?? ??? ??? ??? ?step = 30; ?? ??? ??? ?} ?? ??? ??? ?clicked = !clicked; // 反向 ?? ??? ??? ?// 當(dāng)被選中的時(shí)候,向前移動(dòng)一步/后退一步 ?? ??? ??? ?Common.move(this, from, new Point(from.x, from.y - step), 10); ?? ??? ?} ?? ?} ?? ?public void mouseEntered(MouseEvent arg0) { ?? ?} ?? ?public void mouseExited(MouseEvent arg0) { ?? ?} ?? ?public void mousePressed(MouseEvent arg0) { ?? ?} ?? ?public void mouseReleased(MouseEvent arg0) { ?? ?} }
CardType.java
package com.sjsq; /** ?*? ?* 出牌類(lèi)型 ?*? ?* @author shuijianshiqing ?* ?* @date 2020-09-09 20:44 ?* ?*/ public enum CardType { ?? ?c1,//單牌。 ?? ?c2,//對(duì)子。 ?? ?c3,//3不帶。 ?? ?c4,//炸彈。 ?? ?c31,//3帶1。 ?? ?c32,//3帶2。 ?? ?c411,//4帶2個(gè)單,或者一對(duì) ?? ?c422,//4帶2對(duì) ?? ?c123,//連子。 ?? ?c1122,//連隊(duì)。 ?? ?c111222,//飛機(jī)。 ?? ?c11122234,//飛機(jī)帶單排. ?? ?c1112223344,//飛機(jī)帶對(duì)子. ?? ?c0//不能出牌 }
Common.java
package com.sjsq; import java.awt.Point; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** ?*? ?* 各類(lèi)判斷函數(shù) ?*? ?* @author shuijianshiqing ?* ?* @date 2020-09-09 20:52 ?* ?*/ public class Common { ?? ?// 判斷牌型 ?? ?public static CardType jugdeType(List<Card> list) { ?? ??? ?// 因?yàn)橹芭判蜻^(guò)所以比較好判斷 ?? ??? ?int len = list.size(); ?? ??? ?// 單牌,對(duì)子,3不帶,4個(gè)一樣炸彈 ?? ??? ?if (len <= 4) { // 如果第一個(gè)和最后個(gè)相同,說(shuō)明全部相同 ?? ??? ??? ?if (list.size() > 0 && Common.getValue(list.get(0)) == Common.getValue(list.get(len - 1))) { ?? ??? ??? ??? ?switch (len) { ?? ??? ??? ??? ?case 1: ?? ??? ??? ??? ??? ?return CardType.c1; ?? ??? ??? ??? ?case 2: ?? ??? ??? ??? ??? ?return CardType.c2; ?? ??? ??? ??? ?case 3: ?? ??? ??? ??? ??? ?return CardType.c3; ?? ??? ??? ??? ?case 4: ?? ??? ??? ??? ??? ?return CardType.c4; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?// 雙王,炸彈 ?? ??? ??? ?if (len == 2 && Common.getColor(list.get(1)) == 5 && Common.getColor(list.get(0)) == 5) ?? ??? ??? ??? ?return CardType.c4; ?? ??? ??? ?// 當(dāng)?shù)谝粋€(gè)和最后個(gè)不同時(shí),3帶1 ?? ??? ??? ?if (len == 4 && ((Common.getValue(list.get(0)) == Common.getValue(list.get(len - 2))) ?? ??? ??? ??? ??? ?|| Common.getValue(list.get(1)) == Common.getValue(list.get(len - 1)))) ?? ??? ??? ??? ?return CardType.c31; ?? ??? ??? ?else { ?? ??? ??? ??? ?return CardType.c0; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?// 當(dāng)5張以上時(shí),連字,3帶2,飛機(jī),2順,4帶2等等 ?? ??? ?if (len >= 5) {// 現(xiàn)在按相同數(shù)字最大出現(xiàn)次數(shù) ?? ??? ??? ?Card_index card_index = new Card_index(); ?? ??? ??? ?for (int i = 0; i < 4; i++) ?? ??? ??? ??? ?card_index.a[i] = new ArrayList<Integer>(); ?? ??? ??? ?// 求出各種數(shù)字出現(xiàn)頻率 ?? ??? ??? ?Common.getMax(card_index, list); // a[0,1,2,3]分別表示重復(fù)1,2,3,4次的牌 ?? ??? ??? ?// 3帶2 -----必含重復(fù)3次的牌 ?? ??? ??? ?if (card_index.a[2].size() == 1 && card_index.a[1].size() == 1 && len == 5) ?? ??? ??? ??? ?return CardType.c32; ?? ??? ??? ?// 4帶2(單,雙) ?? ??? ??? ?if (card_index.a[3].size() == 1 && len == 6) ?? ??? ??? ??? ?return CardType.c411; ?? ??? ??? ?// 4帶2對(duì) ?? ??? ??? ?if (card_index.a[3].size() == 1 && card_index.a[1].size() == 2 && len == 8) ?? ??? ??? ??? ?return CardType.c422; ?? ??? ??? ?// 順子,保證不存在王 ?? ??? ??? ?if ((Common.getColor(list.get(0)) != 5) && (card_index.a[0].size() == len) ?? ??? ??? ??? ??? ?&& (Common.getValue(list.get(0)) - Common.getValue(list.get(len - 1)) == len - 1)) ?? ??? ??? ??? ?return CardType.c123; ?? ??? ??? ?// 連隊(duì) ?? ??? ??? ?if (card_index.a[1].size() == len / 2 && len % 2 == 0 && len / 2 >= 3 ?? ??? ??? ??? ??? ?&& (Common.getValue(list.get(0)) - Common.getValue(list.get(len - 1)) == (len / 2 - 1))) ?? ??? ??? ??? ?return CardType.c1122; ?? ??? ??? ?// 飛機(jī) ?? ??? ??? ?if (card_index.a[2].size() == len / 3 && (len % 3 == 0) ?? ??? ??? ??? ??? ?&& (Common.getValue(list.get(0)) - Common.getValue(list.get(len - 1)) == (len / 3 - 1))) ?? ??? ??? ??? ?return CardType.c111222; ?? ??? ??? ?// 飛機(jī)帶n單,n/2對(duì) ?? ??? ??? ?if (card_index.a[2].size() == len / 4 && ((Integer) (card_index.a[2].get(len / 4 - 1)) ?? ??? ??? ??? ??? ?- (Integer) (card_index.a[2].get(0)) == len / 4 - 1)) ?? ??? ??? ??? ?return CardType.c11122234; ?? ??? ??? ?// 飛機(jī)帶n雙 ?? ??? ??? ?if (card_index.a[2].size() == len / 5 && card_index.a[2].size() == len / 5 ?? ??? ??? ??? ??? ?&& ((Integer) (card_index.a[2].get(len / 5 - 1)) - (Integer) (card_index.a[2].get(0)) == len / 5 ?? ??? ??? ??? ??? ??? ??? ?- 1)) ?? ??? ??? ??? ?return CardType.c1112223344; ?? ??? ?} ?? ??? ?return CardType.c0; ?? ?} ?? ?// 移動(dòng)效果的函數(shù),用于發(fā)牌 ?? ?public static void move(Card card, Point from, Point to, int t) { ?? ??? ?if (to.x != from.x) { ?? ??? ??? ?double k = (1.0) * (to.y - from.y) / (to.x - from.x); ?? ??? ??? ?double b = to.y - to.x * k; ?? ??? ??? ?int flag = 0;// 判斷向左還是向右移動(dòng)步幅 ?? ??? ??? ?if (from.x < to.x) { ?? ??? ??? ??? ?if (t % 3 == 2) { ?? ??? ??? ??? ??? ?flag = 3; ?? ??? ??? ??? ?} else { ?? ??? ??? ??? ??? ?flag = 10; ?? ??? ??? ??? ?} ?? ??? ??? ?} else { ?? ??? ??? ??? ?if (t % 3 == 2) { ?? ??? ??? ??? ??? ?flag = -3; ?? ??? ??? ??? ?} else { ?? ??? ??? ??? ??? ?flag = -10; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?for (int i = from.x; Math.abs(i - to.x) > 20; i += flag) { ?? ??? ??? ??? ?double y = k * i + b;// 這里主要用的數(shù)學(xué)中的線性函數(shù) ?? ??? ??? ??? ?System.out.println(y + "=" + k + "*" + i + "+" + b); ?? ??? ??? ??? ?card.setLocation(i, (int) y); ?? ??? ??? ??? ?try { ?? ??? ??? ??? ??? ?Thread.sleep(20); // 延遲,可自己設(shè)置 ?? ??? ??? ??? ?} catch (InterruptedException e) { ?? ??? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ??? ?// 位置校準(zhǔn) ?? ??? ?card.setLocation(to); ?? ?} ?? ?// 對(duì)list排序 ?? ?public static void order(List<Card> list) { ?? ??? ?Collections.sort(list, new Comparator<Card>() { ?? ??? ??? ?public int compare(Card o1, Card o2) { ?? ??? ??? ??? ?// TODO Auto-generated method stub ?? ??? ??? ??? ?int a1 = Integer.parseInt(o1.name.substring(0, 1));// 花色 ?? ??? ??? ??? ?int a2 = Integer.parseInt(o2.name.substring(0, 1)); ?? ??? ??? ??? ?int b1 = Integer.parseInt(o1.name.substring(2, o1.name.length()));// 數(shù)值 ?? ??? ??? ??? ?int b2 = Integer.parseInt(o2.name.substring(2, o2.name.length())); ?? ??? ??? ??? ?int flag = 0; ?? ??? ??? ??? ?// 如果是王的話 ?? ??? ??? ??? ?if (a1 == 5) ?? ??? ??? ??? ??? ?b1 += 100; ?? ??? ??? ??? ?if (a1 == 5 && b1 == 1) ?? ??? ??? ??? ??? ?b1 += 50; ?? ??? ??? ??? ?if (a2 == 5) ?? ??? ??? ??? ??? ?b2 += 100; ?? ??? ??? ??? ?if (a2 == 5 && b2 == 1) ?? ??? ??? ??? ??? ?b2 += 50; ?? ??? ??? ??? ?// 如果是A或者2 ?? ??? ??? ??? ?if (b1 == 1) ?? ??? ??? ??? ??? ?b1 += 20; ?? ??? ??? ??? ?if (b2 == 1) ?? ??? ??? ??? ??? ?b2 += 20; ?? ??? ??? ??? ?if (b1 == 2) ?? ??? ??? ??? ??? ?b1 += 30; ?? ??? ??? ??? ?if (b2 == 2) ?? ??? ??? ??? ??? ?b2 += 30; ?? ??? ??? ??? ?flag = b2 - b1; ?? ??? ??? ??? ?if (flag == 0) { ?? ??? ??? ??? ??? ?return a2 - a1; ?? ??? ??? ??? ?} else { ?? ??? ??? ??? ??? ?return flag; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?}); ?? ?} ?? ?// 重新定位 flag代表電腦1 ,2 或者是我 ?? ?public static void rePosition(Main m, List<Card> list, int flag) { ?? ??? ?Point p = new Point(); ?? ??? ?if (flag == 0) { ?? ??? ??? ?p.x = 50; ?? ??? ??? ?p.y = (450 / 2) - (list.size() + 1) * 15 / 2; ?? ??? ?} ?? ??? ?if (flag == 1) {// 我的排序 _y=450 width=830 ?? ??? ??? ?p.x = (800 / 2) - (list.size() + 1) * 21 / 2; ?? ??? ??? ?p.y = 450; ?? ??? ?} ?? ??? ?if (flag == 2) { ?? ??? ??? ?p.x = 700; ?? ??? ??? ?p.y = (450 / 2) - (list.size() + 1) * 15 / 2; ?? ??? ?} ?? ??? ?int len = list.size(); ?? ??? ?for (int i = 0; i < len; i++) { ?? ??? ??? ?Card card = list.get(i); ?? ??? ??? ?Common.move(card, card.getLocation(), p, 10); ?? ??? ??? ?m.container.setComponentZOrder(card, 0); ?? ??? ??? ?if (flag == 1) ?? ??? ??? ??? ?p.x += 21; ?? ??? ??? ?else ?? ??? ??? ??? ?p.y += 15; ?? ??? ?} ?? ?} ?? ?// 地主牌權(quán)值,看是否搶地主 ?? ?public static int getScore(List<Card> list) { ?? ??? ?int count = 0; ?? ??? ?for (int i = 0, len = list.size(); i < len; i++) { ?? ??? ??? ?Card card = list.get(i); ?? ??? ??? ?if (card.name.substring(0, 1).equals("5")) { ?? ??? ??? ??? ?// System.out.println(card.name.substring(0, 1)); ?? ??? ??? ??? ?count += 5; ?? ??? ??? ?} ?? ??? ??? ?if (card.name.substring(2, card.name.length()).equals("2")) { ?? ??? ??? ??? ?// System.out.println(2); ?? ??? ??? ??? ?count += 2; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?return count; ?? ?} ?? ?// 返回花色 ?? ?public static int getColor(Card card) { ?? ??? ?return Integer.parseInt(card.name.substring(0, 1)); ?? ?} ?? ?// 返回值 ?? ?public static int getValue(Card card) { ?? ??? ?int i = Integer.parseInt(card.name.substring(2, card.name.length())); ?? ??? ?if (card.name.substring(2, card.name.length()).equals("2")) ?? ??? ??? ?i += 13; ?? ??? ?if (card.name.substring(2, card.name.length()).equals("1")) ?? ??? ??? ?i += 13; ?? ??? ?if (Common.getColor(card) == 5) ?? ??? ??? ?i += 2;// 是王 ?? ??? ?return i; ?? ?} ?? ?// 得到最大相同數(shù) ?? ?public static void getMax(Card_index card_index, List<Card> list) { ?? ??? ?int count[] = new int[14];// 1-13各算一種,王算第14種 ?? ??? ?for (int i = 0; i < 14; i++) ?? ??? ??? ?count[i] = 0; ?? ??? ?for (int i = 0; i < list.size(); i++) { ?? ??? ??? ?if (Common.getColor(list.get(i)) == 5) ?? ??? ??? ??? ?count[13]++; ?? ??? ??? ?else ?? ??? ??? ??? ?count[Common.getValue(list.get(i)) - 1]++; ?? ??? ?} ?? ??? ?for (int i = 0; i < 14; i++) { ?? ??? ??? ?switch (count[i]) { ?? ??? ??? ?case 1: ?? ??? ??? ??? ?card_index.a[0].add(i + 1); ?? ??? ??? ??? ?break; ?? ??? ??? ?case 2: ?? ??? ??? ??? ?card_index.a[1].add(i + 1); ?? ??? ??? ??? ?break; ?? ??? ??? ?case 3: ?? ??? ??? ??? ?card_index.a[2].add(i + 1); ?? ??? ??? ??? ?break; ?? ??? ??? ?case 4: ?? ??? ??? ??? ?card_index.a[3].add(i + 1); ?? ??? ??? ??? ?break; ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?// 拆牌 ?? ?public static Model getModel(List<Card> list) { ?? ??? ?// 先復(fù)制一個(gè)list ?? ??? ?List<Card> list2 = new ArrayList<Card>(list); ?? ??? ?Model model = new Model(); ?? ??? ?// ------先拆炸彈 ?? ??? ?Common.getBoomb(list2, model); // ok ?? ??? ?// ------拆3帶 ?? ??? ?Common.getThree(list2, model); ?? ??? ?// 拆飛機(jī) ?? ??? ?Common.getPlane(list2, model); ?? ??? ?// ------拆對(duì)子 ?? ??? ?Common.getTwo(list2, model); ?? ??? ?// 拆連隊(duì) ?? ??? ?Common.getTwoTwo(list2, model); ?? ??? ?// 拆順子 ?? ??? ?Common.get123(list2, model); ?? ??? ?// 拆單 ?? ??? ?Common.getSingle(list2, model); ?? ??? ?return model; ?? ?} ?? ?// 拆連子 ?? ?public static void get123(List<Card> list, Model model) { ?? ??? ?List<Card> del = new ArrayList<Card>();// 要?jiǎng)h除的Cards ?? ??? ?if (list.size() > 0 && (Common.getValue(list.get(0)) < 7 || Common.getValue(list.get(list.size() - 1)) > 10)) ?? ??? ??? ?return; ?? ??? ?if (list.size() < 5) ?? ??? ??? ?return; ?? ??? ?for (int i = 0, len = list.size(); i < len; i++) { ?? ??? ??? ?int k = i; ?? ??? ??? ?for (int j = i; j < len; j++) { ?? ??? ??? ??? ?if (Common.getValue(list.get(i)) - Common.getValue(list.get(j)) == j - i) { ?? ??? ??? ??? ??? ?k = j; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?if (k - i >= 4) { ?? ??? ??? ??? ?String s = ""; ?? ??? ??? ??? ?for (int j = i; j < k; j++) { ?? ??? ??? ??? ??? ?s += list.get(j).name + ","; ?? ??? ??? ??? ??? ?del.add(list.get(j)); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?s += list.get(k).name; ?? ??? ??? ??? ?del.add(list.get(k)); ?? ??? ??? ??? ?model.a123.add(s); ?? ??? ??? ??? ?i = k; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?list.removeAll(del); ?? ?} ?? ?// 拆雙順 ?? ?public static void getTwoTwo(List<Card> list, Model model) { ?? ??? ?List<String> del = new ArrayList<String>();// 要?jiǎng)h除的Cards ?? ??? ?// 從model里面的對(duì)子找 ?? ??? ?List<String> l = model.a2; ?? ??? ?if (l.size() < 3) ?? ??? ??? ?return; ?? ??? ?Integer s[] = new Integer[l.size()]; ?? ??? ?for (int i = 0, len = l.size(); i < len; i++) { ?? ??? ??? ?String[] name = l.get(i).split(","); ?? ??? ??? ?s[i] = Integer.parseInt(name[0].substring(2, name[0].length())); ?? ??? ?} ?? ??? ?// s0,1,2,3,4 13,9,8,7,6 ?? ??? ?for (int i = 0, len = l.size(); i < len; i++) { ?? ??? ??? ?int k = i; ?? ??? ??? ?for (int j = i; j < len; j++) { ?? ??? ??? ??? ?if (s[i] - s[j] == j - i) ?? ??? ??? ??? ??? ?k = j; ?? ??? ??? ?} ?? ??? ??? ?if (k - i >= 2)// k=4 i=1 ?? ??? ??? ?{// 說(shuō)明從i到k是連隊(duì) ?? ??? ??? ??? ?String ss = ""; ?? ??? ??? ??? ?for (int j = i; j < k; j++) { ?? ??? ??? ??? ??? ?ss += l.get(j) + ","; ?? ??? ??? ??? ??? ?del.add(l.get(j)); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?ss += l.get(k); ?? ??? ??? ??? ?model.a112233.add(ss); ?? ??? ??? ??? ?del.add(l.get(k)); ?? ??? ??? ??? ?i = k; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?l.removeAll(del); ?? ?} ?? ?// 拆飛機(jī) ?? ?public static void getPlane(List<Card> list, Model model) { ?? ??? ?List<String> del = new ArrayList<String>();// 要?jiǎng)h除的Cards ?? ??? ?// 從model里面的3帶找 ?? ??? ?List<String> l = model.a3; ?? ??? ?if (l.size() < 2) ?? ??? ??? ?return; ?? ??? ?Integer s[] = new Integer[l.size()]; ?? ??? ?for (int i = 0, len = l.size(); i < len; i++) { ?? ??? ??? ?String[] name = l.get(i).split(","); ?? ??? ??? ?s[i] = Integer.parseInt(name[0].substring(2, name[0].length())); ?? ??? ?} ?? ??? ?for (int i = 0, len = l.size(); i < len; i++) { ?? ??? ??? ?int k = i; ?? ??? ??? ?for (int j = i; j < len; j++) { ?? ??? ??? ??? ?if (s[i] - s[j] == j - i) ?? ??? ??? ??? ??? ?k = j; ?? ??? ??? ?} ?? ??? ??? ?if (k != i) {// 說(shuō)明從i到k是飛機(jī) ?? ??? ??? ??? ?String ss = ""; ?? ??? ??? ??? ?for (int j = i; j < k; j++) { ?? ??? ??? ??? ??? ?ss += l.get(j) + ","; ?? ??? ??? ??? ??? ?del.add(l.get(j)); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?ss += l.get(k); ?? ??? ??? ??? ?model.a111222.add(ss); ?? ??? ??? ??? ?del.add(l.get(k)); ?? ??? ??? ??? ?i = k; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?l.removeAll(del); ?? ?} ?? ?// 拆炸彈 ?? ?public static void getBoomb(List<Card> list, Model model) { ?? ??? ?List<Card> del = new ArrayList<Card>();// 要?jiǎng)h除的Cards ?? ??? ?// 王炸 ?? ??? ?if (list.size() >= 2 && Common.getColor(list.get(0)) == 5 && Common.getColor(list.get(1)) == 5) { ?? ??? ??? ?model.a4.add(list.get(0).name + "," + list.get(1).name); // 按名字加入 ?? ??? ??? ?del.add(list.get(0)); ?? ??? ??? ?del.add(list.get(1)); ?? ??? ?} ?? ??? ?// 如果王不構(gòu)成炸彈咋先拆單 ?? ??? ?if (Common.getColor(list.get(0)) == 5 && Common.getColor(list.get(1)) != 5) { ?? ??? ??? ?del.add(list.get(0)); ?? ??? ??? ?model.a1.add(list.get(0).name); ?? ??? ?} ?? ??? ?list.removeAll(del); ?? ??? ?// 一般的炸彈 ?? ??? ?for (int i = 0, len = list.size(); i < len; i++) { ?? ??? ??? ?if (i + 3 < len && Common.getValue(list.get(i)) == Common.getValue(list.get(i + 3))) { ?? ??? ??? ??? ?String s = list.get(i).name + ","; ?? ??? ??? ??? ?s += list.get(i + 1).name + ","; ?? ??? ??? ??? ?s += list.get(i + 2).name + ","; ?? ??? ??? ??? ?s += list.get(i + 3).name; ?? ??? ??? ??? ?model.a4.add(s); ?? ??? ??? ??? ?for (int j = i; j <= i + 3; j++) ?? ??? ??? ??? ??? ?del.add(list.get(j)); ?? ??? ??? ??? ?i = i + 3; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?list.removeAll(del); ?? ?} ?? ?// 拆3帶 ?? ?public static void getThree(List<Card> list, Model model) { ?? ??? ?List<Card> del = new ArrayList<Card>();// 要?jiǎng)h除的Cards ?? ??? ?// 連續(xù)3張相同 ?? ??? ?for (int i = 0, len = list.size(); i < len; i++) { ?? ??? ??? ?if (i + 2 < len && Common.getValue(list.get(i)) == Common.getValue(list.get(i + 2))) { ?? ??? ??? ??? ?String s = list.get(i).name + ","; ?? ??? ??? ??? ?s += list.get(i + 1).name + ","; ?? ??? ??? ??? ?s += list.get(i + 2).name; ?? ??? ??? ??? ?model.a3.add(s); ?? ??? ??? ??? ?for (int j = i; j <= i + 2; j++) ?? ??? ??? ??? ??? ?del.add(list.get(j)); ?? ??? ??? ??? ?i = i + 2; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?list.removeAll(del); ?? ?} ?? ?// 拆對(duì)子 ?? ?public static void getTwo(List<Card> list, Model model) { ?? ??? ?List<Card> del = new ArrayList<Card>();// 要?jiǎng)h除的Cards ?? ??? ?// 連續(xù)2張相同 ?? ??? ?for (int i = 0, len = list.size(); i < len; i++) { ?? ??? ??? ?if (i + 1 < len && Common.getValue(list.get(i)) == Common.getValue(list.get(i + 1))) { ?? ??? ??? ??? ?String s = list.get(i).name + ","; ?? ??? ??? ??? ?s += list.get(i + 1).name; ?? ??? ??? ??? ?model.a2.add(s); ?? ??? ??? ??? ?for (int j = i; j <= i + 1; j++) ?? ??? ??? ??? ??? ?del.add(list.get(j)); ?? ??? ??? ??? ?i = i + 1; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?list.removeAll(del); ?? ?} ?? ?// 拆單牌 ?? ?public static void getSingle(List<Card> list, Model model) { ?? ??? ?List<Card> del = new ArrayList<Card>();// 要?jiǎng)h除的Cards ?? ??? ?// 1 ?? ??? ?for (int i = 0, len = list.size(); i < len; i++) { ?? ??? ??? ?model.a1.add(list.get(i).name); ?? ??? ??? ?del.add(list.get(i)); ?? ??? ?} ?? ??? ?list.removeAll(del); ?? ?} ?? ?// 隱藏之前出過(guò)的牌 ?? ?public static void hideCards(List<Card> list) { ?? ??? ?for (int i = 0, len = list.size(); i < len; i++) { ?? ??? ??? ?list.get(i).setVisible(false); ?? ??? ?} ?? ?} ?? ?// 檢查牌的是否能出 ?? ?public static int checkCards(List<Card> c, List<Card>[] current) { ?? ??? ?// 找出當(dāng)前最大的牌是哪個(gè)電腦出的,c是點(diǎn)選的牌 ?? ??? ?List<Card> currentlist = (current[0].size() > 0) ? current[0] : current[2]; ?? ??? ?CardType cType = Common.jugdeType(c); ?? ??? ?// 如果張數(shù)不同直接過(guò)濾 ?? ??? ?if (cType != CardType.c4 && c.size() != currentlist.size()) ?? ??? ??? ?return 0; ?? ??? ?// 比較我的出牌類(lèi)型 ?? ??? ?if (Common.jugdeType(c) != Common.jugdeType(currentlist)) { ?? ??? ??? ?return 0; ?? ??? ?} ?? ??? ?// 比較出的牌是否要大 ?? ??? ?// 王炸彈 ?? ??? ?if (cType == CardType.c4) { ?? ??? ??? ?if (c.size() == 2) ?? ??? ??? ??? ?return 1; ?? ??? ??? ?if (currentlist.size() == 2) ?? ??? ??? ??? ?return 0; ?? ??? ?} ?? ??? ?// 單牌,對(duì)子,3帶,4炸彈 ?? ??? ?if (cType == CardType.c1 || cType == CardType.c2 || cType == CardType.c3 || cType == CardType.c4) { ?? ??? ??? ?if (Common.getValue(c.get(0)) <= Common.getValue(currentlist.get(0))) { ?? ??? ??? ??? ?return 0; ?? ??? ??? ?} else { ?? ??? ??? ??? ?return 1; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?// 順子,連隊(duì),飛機(jī)裸 ?? ??? ?if (cType == CardType.c123 || cType == CardType.c1122 || cType == CardType.c111222) { ?? ??? ??? ?if (Common.getValue(c.get(0)) <= Common.getValue(currentlist.get(0))) ?? ??? ??? ??? ?return 0; ?? ??? ??? ?else ?? ??? ??? ??? ?return 1; ?? ??? ?} ?? ??? ?// 按重復(fù)多少排序 ?? ??? ?// 3帶1,3帶2 ,飛機(jī)帶單,雙,4帶1,2,只需比較第一個(gè)就行,獨(dú)一無(wú)二的 ?? ??? ?if (cType == CardType.c31 || cType == CardType.c32 || cType == CardType.c411 || cType == CardType.c422 ?? ??? ??? ??? ?|| cType == CardType.c11122234 || cType == CardType.c1112223344) { ?? ??? ??? ?List<Card> a1 = Common.getOrder2(c); // 我出的牌 ?? ??? ??? ?List<Card> a2 = Common.getOrder2(currentlist);// 當(dāng)前最大牌 ?? ??? ??? ?if (Common.getValue(a1.get(0)) < Common.getValue(a2.get(0))) ?? ??? ??? ??? ?return 0; ?? ??? ?} ?? ??? ?return 1; ?? ?} ?? ?// 按照重復(fù)次數(shù)排序 ?? ?public static List getOrder2(List<Card> list) { ?? ??? ?List<Card> list2 = new ArrayList<Card>(list); ?? ??? ?List<Card> list3 = new ArrayList<Card>(); ?? ??? ?// List<Integer> list4=new ArrayList<Integer>(); ?? ??? ?int len = list2.size(); ?? ??? ?int a[] = new int[20];// 記錄數(shù) ?? ??? ?for (int i = 0; i < 20; i++) ?? ??? ??? ?a[i] = 0; ?? ??? ?for (int i = 0; i < len; i++) { ?? ??? ??? ?a[Common.getValue(list2.get(i))]++; ?? ??? ?} ?? ??? ?int max = 0; ?? ??? ?for (int i = 0; i < 20; i++) { ?? ??? ??? ?max = 0; ?? ??? ??? ?for (int j = 19; j >= 0; j--) { ?? ??? ??? ??? ?if (a[j] > a[max]) ?? ??? ??? ??? ??? ?max = j; ?? ??? ??? ?} ?? ??? ??? ?for (int k = 0; k < len; k++) { ?? ??? ??? ??? ?if (Common.getValue(list2.get(k)) == max) { ?? ??? ??? ??? ??? ?list3.add(list2.get(k)); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?list2.remove(list3); ?? ??? ??? ?a[max] = 0; ?? ??? ?} ?? ??? ?return list3; ?? ?} } class Card_index { ?? ?List a[] = new ArrayList[4];// 單張 }
Model.java
package com.sjsq; import java.util.ArrayList; import java.util.List; /** ?*? ?* 撲克類(lèi)型List類(lèi) ?*? ?* @author shuijianshiqing ?* ?* @date 2020-09-09 20:47 ?* ?*/ public class Model { ?? ?//一組牌 ?? ?int value; //權(quán)值 ?? ?int num;// 手?jǐn)?shù) (幾次能夠走完,沒(méi)有擋的情況下) ?? ?List<String> a1=new ArrayList<String>(); //單張 ?? ?List<String> a2=new ArrayList<String>(); //對(duì)子 ?? ?List<String> a3=new ArrayList<String>(); //3帶 ?? ?List<String> a123=new ArrayList<String>(); //連子 ?? ?List<String> a112233=new ArrayList<String>(); //連牌 ?? ?List<String> a111222=new ArrayList<String>(); //飛機(jī) ?? ?List<String> a4=new ArrayList<String>(); //炸彈 }
NewSwing.java
package com.sjsq; import javax.swing.SwingUtilities; public class NewSwing { ?? ? } Time.java package com.sjsq; import java.awt.Point; import java.util.ArrayList; import java.util.List; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; public class Time extends Thread { ?? ?Main main; ?? ?boolean isRun = true; ?? ?int i = 10; ?? ?public Time(Main m, int i) { ?? ??? ?this.main = m; ?? ??? ?this.i = i; ?? ?} ?? ?@Override ?? ?public void run() { ?? ??? ?while (i > -1 && isRun) { ?? ??? ??? ?main.time[1].setText("倒計(jì)時(shí):" + i--); ?? ??? ??? ?second(1);// 等一秒 ?? ??? ?} ?? ??? ?if (i == -1)// 正常終結(jié),說(shuō)明超時(shí) ?? ??? ??? ?main.time[1].setText("不搶"); ?? ??? ?main.landlord[0].setVisible(false); ?? ??? ?main.landlord[1].setVisible(false); ?? ??? ?for (Card card2 : main.playerList[1]) ?? ??? ??? ?card2.canClick = true;// 可被點(diǎn)擊 ?? ??? ?// 如果自己搶到地主 ?? ??? ?if (main.time[1].getText().equals("搶地主")) { ?? ??? ??? ?// 得到地主牌 ?? ??? ??? ?main.playerList[1].addAll(main.lordList); ?? ??? ??? ?openlord(true); ?? ??? ??? ?second(2);// 等待五秒 ?? ??? ??? ?Common.order(main.playerList[1]); ?? ??? ??? ?Common.rePosition(main, main.playerList[1], 1); ?? ??? ??? ?setlord(1); ?? ??? ?} else { ?? ??? ??? ?// 電腦選地主 ?? ??? ??? ?if (Common.getScore(main.playerList[0]) < Common.getScore(main.playerList[2])) { ?? ??? ??? ??? ?main.time[2].setText("搶地主"); ?? ??? ??? ??? ?main.time[2].setVisible(true); ?? ??? ??? ??? ?setlord(2);// 設(shè)定地主 ?? ??? ??? ??? ?openlord(true);// 把地主牌翻開(kāi) ?? ??? ??? ??? ?second(3); ?? ??? ??? ??? ?main.playerList[2].addAll(main.lordList); ?? ??? ??? ??? ?Common.order(main.playerList[2]); ?? ??? ??? ??? ?Common.rePosition(main, main.playerList[2], 2); ?? ??? ??? ??? ?openlord(false); ?? ??? ??? ?} else { ?? ??? ??? ??? ?main.time[0].setText("搶地主"); ?? ??? ??? ??? ?main.time[0].setVisible(true); ?? ??? ??? ??? ?setlord(0);// 設(shè)定地主 ?? ??? ??? ??? ?openlord(true); ?? ??? ??? ??? ?second(3); ?? ??? ??? ??? ?main.playerList[0].addAll(main.lordList); ?? ??? ??? ??? ?Common.order(main.playerList[0]); ?? ??? ??? ??? ?Common.rePosition(main, main.playerList[0], 0); ?? ??? ??? ??? ?// openlord(false); ?? ??? ??? ?} ?? ??? ?} ?? ??? ?// 選完地主后 關(guān)閉地主按鈕 ?? ??? ?main.landlord[0].setVisible(false); ?? ??? ?main.landlord[1].setVisible(false); ?? ??? ?turnOn(false); ?? ??? ?for (int i = 0; i < 3; i++) { ?? ??? ??? ?main.time[i].setText("不要"); ?? ??? ??? ?main.time[i].setVisible(false); ?? ??? ?} ?? ??? ?// 開(kāi)始游戲 根據(jù)地主不同順序不同 ?? ??? ?main.turn = main.dizhuFlag; ?? ??? ?while (true) { ?? ??? ??? ?if (main.turn == 1) // 我 ?? ??? ??? ?{ ?? ??? ??? ??? ?turnOn(true);// 出牌按鈕 --我出牌 ?? ??? ??? ??? ?timeWait(30, 1);// 我自己的定時(shí)器 ?? ??? ??? ??? ?System.out.println("我出牌"); ?? ??? ??? ??? ?turnOn(false);// 選完關(guān)閉 ?? ??? ??? ??? ?main.turn = (main.turn + 1) % 3; ?? ??? ??? ??? ?if (win())// 判斷輸贏 ?? ??? ??? ??? ??? ?break; ?? ??? ??? ?} ?? ??? ??? ?if (main.turn == 0) { ?? ??? ??? ??? ?computer0(); ?? ??? ??? ??? ?main.turn = (main.turn + 1) % 3; ?? ??? ??? ??? ?if (win())// 判斷輸贏 ?? ??? ??? ??? ??? ?break; ?? ??? ??? ?} ?? ??? ??? ?if (main.turn == 2) { ?? ??? ??? ??? ?computer2(); ?? ??? ??? ??? ?main.turn = (main.turn + 1) % 3; ?? ??? ??? ??? ?if (win())// 判斷輸贏 ?? ??? ??? ??? ??? ?break; ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?// 等待i秒 ?? ?public void second(int i) { ?? ??? ?try { ?? ??? ??? ?Thread.sleep(i * 1000); ?? ??? ?} catch (InterruptedException e) { ?? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ?? ?} ?? ?// 地主牌翻看 ?? ?public void openlord(boolean is) { ?? ??? ?for (int i = 0; i < 3; i++) { ?? ??? ??? ?if (is) ?? ??? ??? ??? ?main.lordList.get(i).turnFront(); // 地主牌翻看 ?? ??? ??? ?else { ?? ??? ??? ??? ?main.lordList.get(i).turnRear(); // 地主牌閉合 ?? ??? ??? ?} ?? ??? ??? ?main.lordList.get(i).canClick = true;// 可被點(diǎn)擊 ?? ??? ?} ?? ?} ?? ?// 設(shè)定地主 ?? ?public void setlord(int i) { ?? ??? ?Point point = new Point(); ?? ??? ?if (i == 1)// 我是地主 ?? ??? ?{ ?? ??? ??? ?point.x = 80; ?? ??? ??? ?point.y = 430; ?? ??? ??? ?main.dizhuFlag = 1;// 設(shè)定地主 ?? ??? ?} ?? ??? ?if (i == 0) { ?? ??? ??? ?point.x = 80; ?? ??? ??? ?point.y = 20; ?? ??? ??? ?main.dizhuFlag = 0; ?? ??? ?} ?? ??? ?if (i == 2) { ?? ??? ??? ?point.x = 700; ?? ??? ??? ?point.y = 20; ?? ??? ??? ?main.dizhuFlag = 2; ?? ??? ?} ?? ??? ?main.dizhu.setLocation(point); ?? ??? ?main.dizhu.setVisible(true); ?? ?} ?? ?// 打開(kāi)出牌按鈕 ?? ?public void turnOn(boolean flag) { ?? ??? ?main.publishCard[0].setVisible(flag); ?? ??? ?main.publishCard[1].setVisible(flag); ?? ?} ?? ?// 電腦0走牌(我代表1) ?? ?public void computer0() { ?? ??? ?timeWait(3, 0); // 定時(shí) ?? ??? ?ShowCard(0); // 出牌 ?? ?} ?? ?// 電腦2走牌(我代表1) ?? ?public void computer2() { ?? ??? ?timeWait(3, 2); // 定時(shí) ?? ??? ?ShowCard(2); // 出牌 ?? ?} ?? ?// 走牌 ?? ?public void ShowCard(int role) { ?? ??? ?Model model = Common.getModel(main.playerList[role]); ?? ??? ?// 待走的牌 ?? ??? ?List<String> list = new ArrayList<String>(); ?? ??? ?// 如果是主動(dòng)出牌 ?? ??? ?if (main.time[(role + 1) % 3].getText().equals("不要") && main.time[(role + 2) % 3].getText().equals("不要")) { ?? ??? ??? ?// 有單出單 (除開(kāi)3帶,飛機(jī)能帶的單牌) ?? ??? ??? ?if (model.a1.size() > (model.a111222.size() * 2 + model.a3.size())) { ?? ??? ??? ??? ?list.add(model.a1.get(model.a1.size() - 1)); ?? ??? ??? ?} // 有對(duì)子出對(duì)子 (除開(kāi)3帶,飛機(jī)) ?? ??? ??? ?else if (model.a2.size() > (model.a111222.size() * 2 + model.a3.size())) { ?? ??? ??? ??? ?list.add(model.a2.get(model.a2.size() - 1)); ?? ??? ??? ?} // 有順子出順子 ?? ??? ??? ?else if (model.a123.size() > 0) { ?? ??? ??? ??? ?list.add(model.a123.get(model.a123.size() - 1)); ?? ??? ??? ?} // 有3帶就出3帶,沒(méi)有就出光3 ?? ??? ??? ?else if (model.a3.size() > 0) { ?? ??? ??? ??? ?// 3帶單,且非關(guān)鍵時(shí)刻不能帶王,2 ?? ??? ??? ??? ?if (model.a1.size() > 0) { ?? ??? ??? ??? ??? ?list.add(model.a1.get(model.a1.size() - 1)); ?? ??? ??? ??? ?} // 3帶對(duì) ?? ??? ??? ??? ?else if (model.a2.size() > 0) { ?? ??? ??? ??? ??? ?list.add(model.a2.get(model.a2.size() - 1)); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?list.add(model.a3.get(model.a3.size() - 1)); ?? ??? ??? ?} // 有雙順出雙順 ?? ??? ??? ?else if (model.a112233.size() > 0) { ?? ??? ??? ??? ?list.add(model.a112233.get(model.a112233.size() - 1)); ?? ??? ??? ?} // 有飛機(jī)出飛機(jī) ?? ??? ??? ?else if (model.a111222.size() > 0) { ?? ??? ??? ??? ?String name[] = model.a111222.get(0).split(","); ?? ??? ??? ??? ?// 帶單 ?? ??? ??? ??? ?if (name.length / 3 <= model.a1.size()) { ?? ??? ??? ??? ??? ?list.add(model.a111222.get(model.a111222.size() - 1)); ?? ??? ??? ??? ??? ?for (int i = 0; i < name.length / 3; i++) ?? ??? ??? ??? ??? ??? ?list.add(model.a1.get(i)); ?? ??? ??? ??? ?} else if (name.length / 3 <= model.a2.size())// 帶雙 ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?list.add(model.a111222.get(model.a111222.size() - 1)); ?? ??? ??? ??? ??? ?for (int i = 0; i < name.length / 3; i++) ?? ??? ??? ??? ??? ??? ?list.add(model.a2.get(i)); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?// 有炸彈出炸彈 ?? ??? ??? ?} else if (model.a4.size() > 0) { ?? ??? ??? ??? ?// 4帶2,1 ?? ??? ??? ??? ?int sizea1 = model.a1.size(); ?? ??? ??? ??? ?int sizea2 = model.a2.size(); ?? ??? ??? ??? ?if (sizea1 >= 2) { ?? ??? ??? ??? ??? ?list.add(model.a1.get(sizea1 - 1)); ?? ??? ??? ??? ??? ?list.add(model.a1.get(sizea1 - 2)); ?? ??? ??? ??? ??? ?list.add(model.a4.get(0)); ?? ??? ??? ??? ?} else if (sizea2 >= 2) { ?? ??? ??? ??? ??? ?list.add(model.a2.get(sizea1 - 1)); ?? ??? ??? ??? ??? ?list.add(model.a2.get(sizea1 - 2)); ?? ??? ??? ??? ??? ?list.add(model.a4.get(0)); ?? ??? ??? ??? ?} else {// 直接炸 ?? ??? ??? ??? ??? ?list.add(model.a4.get(0)); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} // 如果是跟牌 ?? ??? ?else { ?? ??? ??? ?List<Card> player = main.currentList[(role + 2) % 3].size() > 0 ? main.currentList[(role + 2) % 3] ?? ??? ??? ??? ??? ?: main.currentList[(role + 1) % 3];// 當(dāng)前出的牌 ?? ??? ??? ?CardType cType = Common.jugdeType(player);// 桌面別人出的牌 ?? ??? ??? ?// 如果是單牌 ?? ??? ??? ?if (cType == CardType.c1) { ?? ??? ??? ??? ?AI_1(model.a1, player, list, role); ?? ??? ??? ?} // 如果是對(duì)子 ?? ??? ??? ?else if (cType == CardType.c2) { ?? ??? ??? ??? ?AI_1(model.a2, player, list, role); ?? ??? ??? ?} // 3帶 ?? ??? ??? ?else if (cType == CardType.c3) { ?? ??? ??? ??? ?AI_1(model.a3, player, list, role); ?? ??? ??? ?} // 炸彈 ?? ??? ??? ?else if (cType == CardType.c4) { ?? ??? ??? ??? ?AI_1(model.a4, player, list, role); ?? ??? ??? ?} // 如果是3帶1 ?? ??? ??? ?else if (cType == CardType.c31) { ?? ??? ??? ??? ?// 偏家 涉及到拆牌 ?? ??? ??? ??? ?// if((role+1)%3==main.dizhuFlag) ?? ??? ??? ??? ?AI_2(model.a3, model.a1, player, list, role); ?? ??? ??? ?} // 如果是3帶2 ?? ??? ??? ?else if (cType == CardType.c32) { ?? ??? ??? ??? ?// 偏家 ?? ??? ??? ??? ?// if((role+1)%3==main.dizhuFlag) ?? ??? ??? ??? ?AI_2(model.a3, model.a2, player, list, role); ?? ??? ??? ?} // 如果是4帶11 ?? ??? ??? ?else if (cType == CardType.c411) { ?? ??? ??? ??? ?AI_5(model.a4, model.a1, player, list, role); ?? ??? ??? ?} ?? ??? ??? ?// 如果是4帶22 ?? ??? ??? ?else if (cType == CardType.c422) { ?? ??? ??? ??? ?AI_5(model.a4, model.a2, player, list, role); ?? ??? ??? ?} ?? ??? ??? ?// 順子 ?? ??? ??? ?else if (cType == CardType.c123) { ?? ??? ??? ??? ?AI_3(model.a123, player, list, role); ?? ??? ??? ?} ?? ??? ??? ?// 雙順 ?? ??? ??? ?else if (cType == CardType.c1122) { ?? ??? ??? ??? ?AI_3(model.a112233, player, list, role); ?? ??? ??? ?} ?? ??? ??? ?// 飛機(jī)帶單 ?? ??? ??? ?else if (cType == CardType.c11122234) { ?? ??? ??? ??? ?AI_4(model.a111222, model.a1, player, list, role); ?? ??? ??? ?} ?? ??? ??? ?// 飛機(jī)帶對(duì) ?? ??? ??? ?else if (cType == CardType.c1112223344) { ?? ??? ??? ??? ?AI_4(model.a111222, model.a2, player, list, role); ?? ??? ??? ?} ?? ??? ??? ?// 炸彈 ?? ??? ??? ?if (list.size() == 0) { ?? ??? ??? ??? ?int len4 = model.a4.size(); ?? ??? ??? ??? ?if (len4 > 0) ?? ??? ??? ??? ??? ?list.add(model.a4.get(len4 - 1)); ?? ??? ??? ?} ?? ??? ?} ?? ??? ?// 定位出牌 ?? ??? ?main.currentList[role].clear(); ?? ??? ?if (list.size() > 0) { ?? ??? ??? ?Point point = new Point(); ?? ??? ??? ?if (role == 0) ?? ??? ??? ??? ?point.x = 200; ?? ??? ??? ?if (role == 2) ?? ??? ??? ??? ?point.x = 550; ?? ??? ??? ?point.y = (400 / 2) - (list.size() + 1) * 15 / 2;// 屏幕中部 ?? ??? ??? ?// 將name轉(zhuǎn)換成Card ?? ??? ??? ?for (int i = 0, len = list.size(); i < len; i++) { ?? ??? ??? ??? ?List<Card> cards = getCardByName(main.playerList[role], list.get(i)); ?? ??? ??? ??? ?for (Card card : cards) { ?? ??? ??? ??? ??? ?Common.move(card, card.getLocation(), point, 10); ?? ??? ??? ??? ??? ?point.y += 15; ?? ??? ??? ??? ??? ?main.currentList[role].add(card); ?? ??? ??? ??? ??? ?main.playerList[role].remove(card); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?Common.rePosition(main, main.playerList[role], role); ?? ??? ?} else { ?? ??? ??? ?main.time[role].setVisible(true); ?? ??? ??? ?main.time[role].setText("不要"); ?? ??? ?} ?? ??? ?for (Card card : main.currentList[role]) ?? ??? ??? ?card.turnFront(); ?? ?} ?? ?// 按name獲得Card,方便從Model取出 ?? ?public List<Card> getCardByName(List<Card> list, String n) { ?? ??? ?String[] name = n.split(","); ?? ??? ?List<Card> cardsList = new ArrayList<Card>(); ?? ??? ?int j = 0; ?? ??? ?for (int i = 0, len = list.size(); i < len; i++) { ?? ??? ??? ?if (j < name.length && list.get(i).name.equals(name[j])) { ?? ??? ??? ??? ?cardsList.add(list.get(i)); ?? ??? ??? ??? ?i = 0; ?? ??? ??? ??? ?j++; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?return cardsList; ?? ?} ?? ?// 順子 ?? ?public void AI_3(List<String> model, List<Card> player, List<String> list, int role) { ?? ??? ?for (int i = 0, len = model.size(); i < len; i++) { ?? ??? ??? ?String[] s = model.get(i).split(","); ?? ??? ??? ?if (s.length == player.size() && getValueInt(model.get(i)) > Common.getValue(player.get(0))) { ?? ??? ??? ??? ?list.add(model.get(i)); ?? ??? ??? ??? ?return; ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?// 飛機(jī)帶單,雙 ?? ?public void AI_4(List<String> model1, List<String> model2, List<Card> player, List<String> list, int role) { ?? ??? ?// 排序按重復(fù)數(shù) ?? ??? ?player = Common.getOrder2(player); ?? ??? ?int len1 = model1.size(); ?? ??? ?int len2 = model2.size(); ?? ??? ?if (len1 < 1 || len2 < 1) ?? ??? ??? ?return; ?? ??? ?for (int i = 0; i < len1; i++) { ?? ??? ??? ?String[] s = model1.get(i).split(","); ?? ??? ??? ?String[] s2 = model2.get(0).split(","); ?? ??? ??? ?if ((s.length / 3 <= len2) && (s.length * (3 + s2.length) == player.size()) ?? ??? ??? ??? ??? ?&& getValueInt(model1.get(i)) > Common.getValue(player.get(0))) { ?? ??? ??? ??? ?list.add(model1.get(i)); ?? ??? ??? ??? ?for (int j = 1; j <= s.length / 3; j++) ?? ??? ??? ??? ??? ?list.add(model2.get(len2 - j)); ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?// 4帶1,2 ?? ?public void AI_5(List<String> model1, List<String> model2, List<Card> player, List<String> list, int role) { ?? ??? ?// 排序按重復(fù)數(shù) ?? ??? ?player = Common.getOrder2(player); ?? ??? ?int len1 = model1.size(); ?? ??? ?int len2 = model2.size(); ?? ??? ?if (len1 < 1 || len2 < 2) ?? ??? ??? ?return; ?? ??? ?for (int i = 0; i < len1; i++) { ?? ??? ??? ?if (getValueInt(model1.get(i)) > Common.getValue(player.get(0))) { ?? ??? ??? ??? ?list.add(model1.get(i)); ?? ??? ??? ??? ?for (int j = 1; j <= 2; j++) ?? ??? ??? ??? ??? ?list.add(model2.get(len2 - j)); ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?// 單牌,對(duì)子,3個(gè),4個(gè),通用 ?? ?public void AI_1(List<String> model, List<Card> player, List<String> list, int role) { ?? ??? ?// 頂家 ?? ??? ?if ((role + 1) % 3 == main.dizhuFlag) { ?? ??? ??? ?for (int i = 0, len = model.size(); i < len; i++) { ?? ??? ??? ??? ?if (getValueInt(model.get(i)) > Common.getValue(player.get(0))) { ?? ??? ??? ??? ??? ?list.add(model.get(i)); ?? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} else {// 偏家 ?? ??? ??? ?for (int len = model.size(), i = len - 1; i >= 0; i--) { ?? ??? ??? ??? ?if (getValueInt(model.get(i)) > Common.getValue(player.get(0))) { ?? ??? ??? ??? ??? ?list.add(model.get(i)); ?? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?// 3帶1,2,4帶1,2 ?? ?public void AI_2(List<String> model1, List<String> model2, List<Card> player, List<String> list, int role) { ?? ??? ?// model1是主牌,model2是帶牌,player是玩家出的牌,,list是準(zhǔn)備回的牌 ?? ??? ?// 排序按重復(fù)數(shù) ?? ??? ?player = Common.getOrder2(player); ?? ??? ?int len1 = model1.size(); ?? ??? ?int len2 = model2.size(); ?? ??? ?// 如果有王直接炸了 ?? ??? ?if (len1 > 0 && model1.get(0).length() < 10) { ?? ??? ??? ?list.add(model1.get(0)); ?? ??? ??? ?System.out.println("王炸"); ?? ??? ??? ?return; ?? ??? ?} ?? ??? ?if (len1 < 1 || len2 < 1) ?? ??? ??? ?return; ?? ??? ?for (int len = len1, i = len - 1; i >= 0; i--) { ?? ??? ??? ?if (getValueInt(model1.get(i)) > Common.getValue(player.get(0))) { ?? ??? ??? ??? ?list.add(model1.get(i)); ?? ??? ??? ??? ?break; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?list.add(model2.get(len2 - 1)); ?? ??? ?if (list.size() < 2) ?? ??? ??? ?list.clear(); ?? ?} ?? ?// 延時(shí),模擬時(shí)鐘 ?? ?public void timeWait(int n, int player) { ?? ??? ?if (main.currentList[player].size() > 0) ?? ??? ??? ?Common.hideCards(main.currentList[player]); ?? ??? ?if (player == 1)// 如果是我,10秒到后直接下一家出牌 ?? ??? ?{ ?? ??? ??? ?int i = n; ?? ??? ??? ?while (main.nextPlayer == false && i >= 0) { ?? ??? ??? ??? ?// main.container.setComponentZOrder(main.time[player], 0); ?? ??? ??? ??? ?main.time[player].setText("倒計(jì)時(shí):" + i); ?? ??? ??? ??? ?main.time[player].setVisible(true); ?? ??? ??? ??? ?second(1); ?? ??? ??? ??? ?i--; ?? ??? ??? ?} ?? ??? ??? ?if (i == -1) { ?? ??? ??? ??? ?main.time[player].setText("超時(shí)"); ?? ??? ??? ?} ?? ??? ??? ?main.nextPlayer = false; ?? ??? ?} else { ?? ??? ??? ?for (int i = n; i >= 0; i--) { ?? ??? ??? ??? ?second(1); ?? ??? ??? ??? ?// main.container.setComponentZOrder(main.time[player], 0); ?? ??? ??? ??? ?main.time[player].setText("倒計(jì)時(shí):" + i); ?? ??? ??? ??? ?main.time[player].setVisible(true); ?? ??? ??? ?} ?? ??? ?} ?? ??? ?main.time[player].setVisible(false); ?? ?} ?? ?// 通過(guò)name估值 ?? ?public int getValueInt(String n) { ?? ??? ?String name[] = n.split(","); ?? ??? ?String s = name[0]; ?? ??? ?int i = Integer.parseInt(s.substring(2, s.length())); ?? ??? ?if (s.substring(0, 1).equals("5")) ?? ??? ??? ?i += 3; ?? ??? ?if (s.substring(2, s.length()).equals("1") || s.substring(2, s.length()).equals("2")) ?? ??? ??? ?i += 13; ?? ??? ?return i; ?? ?} ?? ?// 判斷輸贏 ?? ?public boolean win() { ?? ??? ?for (int i = 0; i < 3; i++) { ?? ??? ??? ?if (main.playerList[i].size() == 0) { ?? ??? ??? ??? ?String s; ?? ??? ??? ??? ?if (i == 1) { ?? ??? ??? ??? ??? ?s = "恭喜你,勝利了!"; ?? ??? ??? ??? ?} else { ?? ??? ??? ??? ??? ?s = "恭喜電腦" + i + ",贏了! 你的智商有待提高哦"; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?JOptionPane.showMessageDialog(main, s); ?? ??? ??? ??? ?return true; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?return false; ?? ?} }
到此這篇關(guān)于Eclipse+Java+Swing實(shí)現(xiàn)斗地主游戲(代碼)的文章就介紹到這了,更多相關(guān)Eclipse+Java+Swing實(shí)現(xiàn)斗地主游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Elasticsearch如何把一個(gè)索引變?yōu)橹蛔x
這篇文章主要為大家介紹了詳解Elasticsearch如何把一個(gè)索引變?yōu)橹蛔x示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Springboot整合Redis實(shí)現(xiàn)超賣(mài)問(wèn)題還原和流程分析(分布式鎖)
最近在研究超賣(mài)的項(xiàng)目,寫(xiě)一段簡(jiǎn)單正常的超賣(mài)邏輯代碼,多個(gè)用戶同時(shí)操作同一段數(shù)據(jù)出現(xiàn)問(wèn)題,糾結(jié)該如何處理呢?下面小編給大家?guī)?lái)了Springboot整合Redis實(shí)現(xiàn)超賣(mài)問(wèn)題還原和流程分析,感興趣的朋友一起看看吧2021-10-10SpringCloud?Stream?整合RabbitMQ的基本步驟
這篇文章主要介紹了SpringCloud?Stream?整合RabbitMQ的基本步驟,從項(xiàng)目介紹到生產(chǎn)者結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03Java 入門(mén)圖形用戶界面設(shè)計(jì)之事件處理上
圖形界面(簡(jiǎn)稱(chēng)GUI)是指采用圖形方式顯示的計(jì)算機(jī)操作用戶界面。與早期計(jì)算機(jī)使用的命令行界面相比,圖形界面對(duì)于用戶來(lái)說(shuō)在視覺(jué)上更易于接受,本篇精講Java語(yǔ)言中關(guān)于圖形用戶界面的事件處理2022-02-02springboot調(diào)用HTML文件注意事項(xiàng)及說(shuō)明
這篇文章主要介紹了springboot調(diào)用HTML文件注意事項(xiàng)及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11實(shí)例講解Java的MyBatis框架對(duì)MySQL中數(shù)據(jù)的關(guān)聯(lián)查詢
這里我們來(lái)以實(shí)例講解Java的MyBatis框架對(duì)MySQL中數(shù)據(jù)的關(guān)聯(lián)查詢,包括一對(duì)多、多對(duì)一的關(guān)聯(lián)查詢以及自身關(guān)聯(lián)映射的方法等,需要的朋友可以參考下2016-06-06Collections工具類(lèi)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Collections工具類(lèi)提供了大量針對(duì)Collection/Map的操作。這篇文章主要介紹了Collections工具類(lèi)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-04-04詳解Java的JDBC API的存儲(chǔ)過(guò)程與SQL轉(zhuǎn)義語(yǔ)法的使用
這篇文章主要介紹了詳解Java的JDBC API的存儲(chǔ)過(guò)程與SQL轉(zhuǎn)義語(yǔ)法的使用,JDBC是Java用于連接使用各種數(shù)據(jù)庫(kù)的API,需要的朋友可以參考下2015-12-12