《游戏学习》 java经典纸牌类小游戏《斗地主

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开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

&& 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)]

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值