Eclipse+Java+Swing实现⽃地主游戏(代码)⽬录
⼀、系统介绍
⼆、系统展⽰
1.扑克分发
2.抢地主
3.出牌
4.游戏胜利
三、系统实现
Card.java
CardType.java
Common.java
Model.java
NewSwing.java
⼀、系统介绍
本系统实现扑克的分发,抢地主,电脑⾃动出牌等功能。
⼆、系统展⽰
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;regression简谱
/**
*
* 扑克管理类
*
* @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;
}
@Overridejava手机游戏下载
public void mouseClicked(MouseEvent e) {
if (canClick) {
Point from = Location();
int step; // 移动的距离
if (clicked)
step = -30;
else {
step = 30;
}
clicked = !clicked; // 反向
html表单提交的方式
/
/ 当被选中的时候,向前移动⼀步/后退⼀步
}
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,//单牌。java正则表达式以a开头b结尾
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(List<Card> list) {
// 因为之前排序过所以⽐较好判断
int len = list.size();
// 单牌,对⼦,3不带,4个⼀样
if (len <= 4) { // 如果第⼀个和最后个相同,说明全部相同
if (list.size() > 0 && (0)) == (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 && (1)) == 5 && (0)) == 5)                return CardType.c4;
// 当第⼀个和最后个不同时,3带1
if (len == 4 && (((0)) == (len - 2)))
|| (1)) == (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<Integer>();
/
/ 求出各种数字出现频率
// 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 (((0)) != 5) && (card_index.a[0].size() == len)
&& ((0)) - (len - 1)) == len - 1))
return CardType.c123;
// 连队
if (card_index.a[1].size() == len / 2 && len % 2 == 0 && len / 2 >= 3
&& ((0)) - (len - 1)) == (len / 2 - 1)))                return CardType.c1122;
// 飞机
if (card_index.a[2].size() == len / 3 && (len % 3 == 0)
&& ((0)) - (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 < 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;// 这⾥主要⽤的数学中的线性函数
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<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()));// 数值
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
this is it架子鼓谱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 = (i);
if (flag == 1)
p.x += 21;
else
p.y += 15;
}
}
// 地主牌权值,看是否抢地主
public static int getScore(List<Card> list) {
int count = 0;
for (int i = 0, len = list.size(); i < len; i++) {
Card card = (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;
}