lordList.add(card[i]);
continue;
}
switch ((t++)%3) {
case 0:
//左边玩家
Common.move(card[i], card[i].getLocation(),new Point(50,60+i*5),t);
playerList[0].add(card[i]);
//card[i].turnFront(); //显示正面
break;
case 1:
//我
Common.move(card[i], card[i].getLocation(),new Point(180+i*7,450),t);
playerList[1].add(card[i]);
card[i].turnFront(); //显示正面
break;
case 2:
//右边玩家
Common.move(card[i], card[i].getLocation(),new Point(700,60+i*5),t);
playerList[2].add(card[i]);
//card[i].turnFront(); //显示正面
break;
}
//card[i].turnFront(); //显示正面
container.setComponentZOrder(card[i], 0);
}
System.out.println(“结束发牌…”);
System.out.println(System.currentTimeMillis()-start);
//发完牌排序,从大到小
for(int i=0;i<3;i++)
{
Common.order(playerList[i]);
Common.rePosition(this,playerList[i],i);//重新定位
}
dizhu=new JLabel(new ImageIcon(“images/dizhu.gif”));
dizhu.setVisible(false);
dizhu.setSize(40, 40);
container.add(dizhu);
}
// 初始化窗体
public void Init() {
this.setTitle(“斗地主游戏”);
this.setSize(830, 620);
setResizable(false);
setLocationRelativeTo(getOwner()); // 屏幕居中
container = this.getContentPane();
container.setLayout(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
container.setBackground(new Color(0, 112, 26)); // 背景为绿色
}
// 创建菜单 功能按钮
public void SetMenu() {
JMenuBar jMenuBar = new JMenuBar();
JMenu game = new JMenu(“游戏”);
JMenu help = new JMenu(“帮助”);
start = new JMenuItem(“新游戏”);
exit = new JMenuItem(“退出”);
about = new JMenuItem(“关于”);
start.addActionListener(this);
exit.addActionListener(this);
about.addActionListener(this);
game.add(start);
game.add(exit);
help.add(about);
jMenuBar.add(game);
jMenuBar.add(help);
this.setJMenuBar(jMenuBar);
landlord[0]=new JButton(“抢地主”);
landlord[1]=new JButton(“不 抢”);
publishCard[0]= new JButton(“出牌”);
publishCard[1]= new JButton(“不要”);
for(int i=0;i<2;i++)
{
publishCard[i].setBounds(320+i*100, 400, 60, 20);
landlord[i].setBounds(320+i*100, 400,75,20);
container.add(landlord[i]);
landlord[i].addActionListener(this);
landlord[i].setVisible(false);
container.add(publishCard[i]);
publishCard[i].setVisible(false);
publishCard[i].addActionListener(this);
}
for(int i=0;i<3;i++){
time[i]=new JTextField(“倒计时:”);
time[i].setVisible(false);
container.add(time[i]);
}
time[0].setBounds(140, 230, 60, 20);
time[1].setBounds(374, 360, 60, 20);
time[2].setBounds(620, 230, 60, 20);
for(int i=0;i<3;i++)
{
currentList[i]=new ArrayList();
}
}
//点击鼠标事件
public void actionPerformed(ActionEvent e) {
if (e.getSource() == exit) {
this.dispose();
}
if (e.getSource() == about) {
JOptionPane.showMessageDialog(this, “QQ361106306,小柒”);
}
if (e.getSource() == start) {
this.restart();
}
if(e.getSource()==landlord[0])
{
time[1].setText(“抢地主”);
t.isRun=false; //时钟终结
}
if(e.getSource()==landlord[1])
{
time[1].setText(“不抢”);
t.isRun=false; //时钟终结
}
//如果是不要
if(e.getSource()==publishCard[1])
{
this.nextPlayer=true;
currentList[1].clear();
time[1].setText(“不要”);
}
//如果是出牌按钮
if(e.getSource()==publishCard[0]){
List c = new ArrayList();
//点选出牌
for(int i=0;i<playerList[1].size();i++)
{
Card card=playerList[1].get(i);
if(card.clicked)
{
c.add(card);//把点中的牌放入新集合
}
}
/** 给点选的牌排序 */
/*for(int i=0;i<c.size();i++){
System.out.println(“点选的牌是:”+c.get(i).name);
}*/
int flag=0;
//如果我主动出牌
if(time[0].getText().equals(“不要”)&&time[2].getText().equals(“不要”))
{
if(Common.jugdeType©!=CardType.c0)
flag=1;//表示可以出牌
}//如果我跟牌
else{
flag=Common.checkCards(c,currentList);
}
//判断是否符合出牌
if(flag==1)
{
currentList[1]=c;
playerList[1].removeAll(currentList[1]);//移除走的牌
//定位出牌
Point point=new Point();
point.x=(770/2)-(currentList[1].size()+1)*15/2;;
point.y=310;
for(int i=0,len=currentList[1].size();i<len;i++)
{
Card card=currentList[1].get(i);
Common.move(card, card.getLocation(), point,10);
point.x+=15;
}
//抽完牌后重新整理牌
Common.rePosition(this, playerList[1], 1);
time[1].setVisible(false);
this.nextPlayer=true;
}
}
}
private void restart() {
System.out.println(“重新开始”);
/* for(int i=0;i<3;i++){
currentList[i]=null;
}
for(int i=0;i<3;i++){
playerList[i]=null;
}
lordList=null;
for(int i=0;i<card.length;i++){
card[i]=null;
}
nextPlayer=false;*/
// this.CardInit();//发牌
}
public static void main(String args[]) {
new Main();
}
}
class NewTimer implements Runnable{
Main main;
int i;
public NewTimer(Main m,int i){
this.main=m;
this.i=i;
}
@Override
public void run() {
// TODO Auto-generated method stub
main.t=new Time(main,12);//从10开始倒计时
main.t.start();
}
}
Card类
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
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) {
// TODO Auto-generated method stub
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 枚举类
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类
import java.awt.Point;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Common {
//判断牌型
public static CardType jugdeType(List list){
//因为之前排序过所以比较好判断
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 && len5)
return CardType.c32;
//4带2(单,双)
if(card_index.a[3].size()1 && len6)
return CardType.c411;
//4带2对
if(card_index.a[3].size()==1 && card_index.a[1].size()2 &&len8)
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%20 && 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%30) &&
(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<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(5); //延迟,可自己设置
} 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(a15&&b11) b1+=50;
if(a2==5) b2+=100;
if(a25&&b21) 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<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;
}
}
//地主牌权值,看是否抢地主
public static int getScore(List 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;
}
//得到最大相同数
public static void getMax(Card_index card_index,List 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 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<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 list,Model model){
List del=new ArrayList();//要删除的Cards
//从model里面的对子找
List l=model.a2;
if(l.size()❤️)
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
{//说明从i到k是连队
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);
}
//拆飞机
public static void getPlane(List 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<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)
{//说明从i到k是飞机
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 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<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 list,Model model){
List del=new ArrayList();//要删除的Cards
//连续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);
}
//拆对子
public static void getTwo(List list,Model model){
List del=new ArrayList();//要删除的Cards
//连续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)))
{
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
&& 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 list,Model model){
List del=new ArrayList();//要删除的Cards
//连续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);
}
//拆对子
public static void getTwo(List list,Model model){
List del=new ArrayList();//要删除的Cards
//连续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)))
{
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-P2oYyre4-1710847819564)]
[外链图片转存中…(img-HGg23x7n-1710847819565)]
[外链图片转存中…(img-lXAZjYFn-1710847819565)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-45gwVrW7-1710847819565)]