这篇文章主要介绍了Eclipse+Java+Swing实现斗地主游戏并附上详细的代码实现,正在学习的你可以当小练习练练,希望对你有所帮助
一、系统介绍
本系统实现扑克的分发,抢地主,电脑自动出牌等功能。
二、系统展示
1.扑克分发
2.抢地主
3.出牌
4.游戏胜利
三、系统实现
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; /** * * 扑克管理类 * * @author shuijianshiqing * * @date 2020-09-09 20:41 * */ public class Card extends JLabel implements MouseListener { Main main;// Main类的引用 String name;// 图片url名字 boolean up;// 是否正反面 boolean canClick = false;// 是否可被点击 boolean clicked = false;// 是否点击过 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; // 移动的距离 if (clicked) step = -30; else { step = 30; } clicked = !clicked; // 反向 // 当被选中的时候,向前移动一步/后退一步 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; /** * * 出牌类型 * * @author shuijianshiqing * * @date 2020-09-09 20:44 * */ public enum CardType { c1,//单牌。 c2,//对子。 c3,//3不带。 c4,//炸弹。 c31,//3带1。 c32,//3带2。 c411,//4带2个单,或者一对 c422,//4带2对 c123,//连子。 c1122,//连队。 c111222,//飞机。 c11122234,//飞机带单排. c1112223344,//飞机带对子. 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; /** * * 各类判断函数 * * @author shuijianshiqing * * @date 2020-09-09 20:52 * */ public class Common { // 判断牌型 public static CardType jugdeType(Listlist) { // 因为之前排序过所以比较好判断 int len = list.size(); // 单牌,对子,3不带,4个一样炸弹 if (len <= 4) { // 如果第一个和最后个相同,说明全部相同 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; // 当第一个和最后个不同时,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; } } // 当5张以上时,连字,3带2,飞机,2顺,4带2等等 if (len >= 5) {// 现在按相同数字最大出现次数 Card_index card_index = new Card_index(); for (int i = 0; i <4; i++) card_index.a[i] = new ArrayList (); // 求出各种数字出现频率 Common.getMax(card_index, list); // a[0,1,2,3]分别表示重复1,2,3,4次的牌 // 3带2 -----必含重复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对 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; // 连队 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; // 飞机 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; // 飞机带n单,n/2对 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; // 飞机带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; } // 移动效果的函数,用于发牌 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;// 判断向左还是向右移动步幅 if (from.x 20; i += flag) { double y = k * i + b;// 这里主要用的数学中的线性函数 System.out.println(y + "=" + k + "*" + i + "+" + b); card.setLocation(i, (int) y); try { Thread.sleep(20); // 延迟,可自己设置 } catch (InterruptedException e) { e.printStackTrace(); } } } // 位置校准 card.setLocation(to); } // 对list排序 public static void order(List list) { Collections.sort(list, new Comparator () { 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()));// 数值 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 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 list) { int count = 0; for (int i = 0, len = list.size(); i 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) { // 先复制一个list List list2 = new ArrayList (list); Model model = new Model(); // ------先拆炸弹 Common.getBoomb(list2, model); // ok // ------拆3带 Common.getThree(list2, model); // 拆飞机 Common.getPlane(list2, model); // ------拆对子 Common.getTwo(list2, model); // 拆连队 Common.getTwoTwo(list2, model); // 拆顺子 Common.get123(list2, model); // 拆单 Common.getSingle(list2, model); return model; } // 拆连子 public static void get123(List list, Model model) { List del = new ArrayList ();// 要删除的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 = 4) { String s = ""; for (int j = i; j list, Model model) { List del = new ArrayList ();// 要删除的Cards // 从model里面的对子找 List l = model.a2; if (l.size() <3) return; Integer s[] = new Integer[l.size()]; for (int i = 0, len = l.size(); i = 2)// k=4 i=1 {// 说明从i到k是连队 String ss = ""; for (int j = i; j list, Model model) { List del = new ArrayList ();// 要删除的Cards // 从model里面的3带找 List l = model.a3; if (l.size() <2) return; Integer s[] = new Integer[l.size()]; for (int i = 0, len = l.size(); i list, Model model) { List del = new ArrayList ();// 要删除的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)); } // 如果王不构成炸弹咋先拆单 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 list, Model model) { List del = new ArrayList ();// 要删除的Cards // 连续3张相同 for (int i = 0, len = list.size(); i list, Model model) { List del = new ArrayList ();// 要删除的Cards // 连续2张相同 for (int i = 0, len = list.size(); i list, Model model) { List del = new ArrayList ();// 要删除的Cards // 1 for (int i = 0, len = list.size(); i list) { for (int i = 0, len = list.size(); i c, List [] current) { // 找出当前最大的牌是哪个电脑出的,c是点选的牌 List currentlist = (current[0].size() > 0) ? current[0] : current[2]; CardType cType = Common.jugdeType(c); // 如果张数不同直接过滤 if (cType != CardType.c4 && c.size() != currentlist.size()) return 0; // 比较我的出牌类型 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; } // 单牌,对子,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; } } // 顺子,连队,飞机裸 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; } // 按重复多少排序 // 3带1,3带2 ,飞机带单,双,4带1,2,只需比较第一个就行,独一无二的 if (cType == CardType.c31 || cType == CardType.c32 || cType == CardType.c411 || cType == CardType.c422 || cType == CardType.c11122234 || cType == CardType.c1112223344) { List a1 = Common.getOrder2(c); // 我出的牌 List a2 = Common.getOrder2(currentlist);// 当前最大牌 if (Common.getValue(a1.get(0)) list) { List list2 = new ArrayList (list); List list3 = new ArrayList (); // List list4=new ArrayList (); int len = list2.size(); int a[] = new int[20];// 记录数 for (int i = 0; i <20; i++) a[i] = 0; for (int i = 0; i = 0; j--) { if (a[j] > a[max]) max = j; } for (int k = 0; k
Model.java
package com.sjsq; import java.util.ArrayList; import java.util.List; /** * * 扑克类型List类 * * @author shuijianshiqing * * @date 2020-09-09 20:47 * */ public class Model { //一组牌 int value; //权值 int num;// 手数 (几次能够走完,没有挡的情况下) Lista1=new ArrayList (); //单张 List a2=new ArrayList (); //对子 List a3=new ArrayList (); //3带 List a123=new ArrayList (); //连子 List a112233=new ArrayList (); //连牌 List a111222=new ArrayList (); //飞机 List a4=new ArrayList (); //炸弹 }
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("倒计时:" + i--); second(1);// 等一秒 } if (i == -1)// 正常终结,说明超时 main.time[1].setText("不抢"); main.landlord[0].setVisible(false); main.landlord[1].setVisible(false); for (Card card2 : main.playerList[1]) card2.canClick = true;// 可被点击 // 如果自己抢到地主 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])list = new ArrayList (); // 如果是主动出牌 if (main.time[(role + 1) % 3].getText().equals("不要") && main.time[(role + 2) % 3].getText().equals("不要")) { // 有单出单 (除开3带,飞机能带的单牌) if (model.a1.size() > (model.a111222.size() * 2 + model.a3.size())) { list.add(model.a1.get(model.a1.size() - 1)); } // 有对子出对子 (除开3带,飞机) 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带,没有就出光3 else if (model.a3.size() > 0) { // 3带单,且非关键时刻不能带王,2 if (model.a1.size() > 0) { list.add(model.a1.get(model.a1.size() - 1)); } // 3带对 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)); } // 有飞机出飞机 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 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 player = main.currentList[(role + 2) % 3].size() > 0 ? main.currentList[(role + 2) % 3] : main.currentList[(role + 1) % 3];// 当前出的牌 CardType cType = Common.jugdeType(player);// 桌面别人出的牌 // 如果是单牌 if (cType == CardType.c1) { AI_1(model.a1, player, list, role); } // 如果是对子 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); } // 飞机带单 else if (cType == CardType.c11122234) { AI_4(model.a111222, model.a1, player, list, role); } // 飞机带对 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转换成Card for (int i = 0, len = list.size(); i 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 getCardByName(List list, String n) { String[] name = n.split(","); List cardsList = new ArrayList (); int j = 0; for (int i = 0, len = list.size(); i model, List player, List list, int role) { for (int i = 0, len = model.size(); i Common.getValue(player.get(0))) { list.add(model.get(i)); return; } } } // 飞机带单,双 public void AI_4(List model1, List model2, List player, List list, int role) { // 排序按重复数 player = Common.getOrder2(player); int len1 = model1.size(); int len2 = model2.size(); if (len1 <1 || len2 < 1) return; for (int i len1; i++) { string[] s=model1.get(i).split(","); s2=model2.get(0).split(","); if ((s.length> 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 model1, List model2, List player, List list, int role) { // 排序按重复数 player = Common.getOrder2(player); int len1 = model1.size(); int len2 = model2.size(); if (len1 <1 || len2 < 2) return; for (int 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)); } } } // 单牌,对子,3个,4个,通用 public void AI_1(List model, List player, List list, int role) { // 顶家 if ((role + 1) % 3 == main.dizhuFlag) { for (int i = 0, len = model.size(); 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 model1, List model2, List player, List list, int role) { // model1是主牌,model2是带牌,player是玩家出的牌,,list是准备回的牌 // 排序按重复数 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 - 1;>= 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(); } // 延时,模拟时钟 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("倒计时:" + i); main.time[player].setVisible(true); second(1); i--; } if (i == -1) { main.time[player].setText("超时"); } main.nextPlayer = false; } else { for (int i = n; i >= 0; i--) { second(1); // main.container.setComponentZOrder(main.time[player], 0); main.time[player].setText("倒计时:" + i); main.time[player].setVisible(true); } } main.time[player].setVisible(false); } // 通过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; } }
到此这篇关于Eclipse+Java+Swing实现斗地主游戏(代码)的文章就介绍到这了,更多相关Eclipse+Java+Swing实现斗地主游戏内容请搜索0133技术站以前的文章或继续浏览下面的相关文章希望大家以后多多支持0133技术站!
以上就是Eclipse+Java+Swing实现斗地主游戏(代码)的详细内容,更多请关注0133技术站其它相关文章!