java斗地主游戏项目源码
部分代码如下
Main.java
package com; import java.awt.Color; import java.awt.Container; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JTextField; import javax.swing.SwingUtilities; public class Main extends JFrame implements ActionListener { public Container container = null;// 定义容器 JMenuItem start, exit, about;// 定义菜单按钮 JButton landlord[]=new JButton[2];//抢地主按钮 JButton publishCard[]=new JButton[2];//出牌按钮 int dizhuFlag;//地主标志 int turn; JLabel dizhu; //地主图标 List<Card> currentList[] =new ArrayList[3]; // 当前的出牌 List<Card> playerList[] = new ArrayList[3]; // 定义3个玩家表 List<Card> lordList;//地主牌 Card card[] = new Card[56]; // 定义54张牌 JTextField time[]=new JTextField[3]; //计时器 Time t; //定时器(线程) boolean nextPlayer=false; //转换角色 public Main(){ Init();// 初始化 SetMenu();// 创建菜单 按钮(抢地主,发牌,计时器) this.setVisible(true); CardInit();//发牌 getLord(); //发完牌开始抢地主 time[1].setVisible(true); //线程安全性,把非主线程的UI控制放到里面 SwingUtilities.invokeLater(new NewTimer(this,10)); } // 抢地主 public void getLord(){ //System.out.println(CardType.c0.toString()); for(int i=0;i<2;i++) landlord[i].setVisible(true); } //初始化牌 // 发牌洗牌 public void CardInit() { int count = 1; //初始化牌 for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 13; j++) { if ((i == 5) && (j > 2)) break; else { card[count] = new Card(this, i + "-" + j, false); card[count].setLocation(350, 50); container.add(card[count]); count++; } } } //打乱顺序 for(int i=0;i<100;i++){ Random random=new Random(); int a=random.nextInt(54)+1; int b=random.nextInt(54)+1; Card k=card[a]; card[a]=card[b]; card[b]=k; } //开始发牌 for(int i=0;i<3;i++) playerList[i]=new ArrayList<Card>(); //玩家牌 lordList=new ArrayList<Card>();//地主牌三张 int t=0; for(int i=1;i<=54;i++) { if(i>=52)//地主牌 { Common.move(card[i], card[i].getLocation(),new Point(300+(i-52)*80,10)); lordList.add(card[i]); continue; } switch ((t++)%3) { case 0: //左边玩家 Common.move(card[i], card[i].getLocation(),new Point(50,60+i*5)); playerList[0].add(card[i]); break; case 1: //我 Common.move(card[i], card[i].getLocation(),new Point(180+i*7,450)); playerList[1].add(card[i]); card[i].turnFront(); //显示正面 break; case 2: //右边玩家 Common.move(card[i], card[i].getLocation(),new Point(700,60+i*5)); playerList[2].add(card[i]); break; } //card[i].turnFront(); //显示正面 container.setComponentZOrder(card[i], 0); } //发完牌排序,从大到小 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("java单机斗地主"); 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<Card>(); } } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if (e.getSource() == exit) { this.dispose(); } if (e.getSource() == about) { JOptionPane.showMessageDialog(this, "哈哈"); } 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<Card> c=new ArrayList<Card>(); //点选出牌 for(int i=0;i<playerList[1].size();i++) { Card card=playerList[1].get(i); if(card.clicked) { c.add(card); } } int flag=0; //如果我主动出牌 if(time[0].getText().equals("不要")&&time[2].getText().equals("不要")) { if(Common.jugdeType(c)!=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=300; for(int i=0,len=currentList[1].size();i<len;i++) { Card card=currentList[1].get(i); Common.move(card, card.getLocation(), point); point.x+=15; } //抽完牌后重新整理牌 Common.rePosition(this, playerList[1], 1); time[1].setVisible(false); this.nextPlayer=true; } } } 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,10);//从10开始倒计时 main.t.start(); } }
效果图
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>