部分代码如下
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(); } }
Time.java
package com; import java.awt.Point; import java.util.ArrayList; import java.util.List; import javax.swing.JOptionPane; 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]) < Common .getScore(main.playerList[2])) { main.time[2].setText("抢地主"); main.time[2].setVisible(true); setlord(2);// 设定地主 openlord(true); second(3); main.playerList[2].addAll(main.lordList); Common.order(main.playerList[2]); Common.rePosition(main, main.playerList[2], 2); openlord(false); } else { main.time[0].setText("抢地主"); main.time[0].setVisible(true); setlord(0);// 设定地主 openlord(true); second(3); main.playerList[0].addAll(main.lordList); Common.order(main.playerList[0]); Common.rePosition(main, main.playerList[0], 0); //openlord(false); } } // 选完地主后 关闭地主按钮 main.landlord[0].setVisible(false); main.landlord[1].setVisible(false); turnOn(false); for (int i = 0; i < 3; i++) { main.time[i].setText("不要"); main.time[i].setVisible(false); } // 开始游戏 根据地主不同顺序不同 main.turn=main.dizhuFlag; while (true) { if(main.turn==1) //我 { turnOn(true);// 出牌按钮 --我出牌 timeWait(30, 1);// 我自己的定时器 turnOn(false);//选完关闭 main.turn=(main.turn+1)%3; if(win())//判断输赢 break; } if (main.turn==0) { computer0(); main.turn=(main.turn+1)%3; if(win())//判断输赢 break; } if(main.turn==2) { computer2(); main.turn=(main.turn+1)%3; if(win())//判断输赢 break; } } } // 等待i秒 public void second(int i) { try { Thread.sleep(i * 1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 地主牌翻看 public void openlord(boolean is) { for (int i = 0; i < 3; i++) { if (is) main.lordList.get(i).turnFront(); // 地主牌翻看 else { main.lordList.get(i).turnRear(); // 地主牌闭合 } main.lordList.get(i).canClick = true;// 可被点击 } } // 设定地主 public void setlord(int i) { Point point = new Point(); if (i == 1)// 我是地主 { point.x = 80; point.y = 430; main.dizhuFlag = 1;// 设定地主 } if (i == 0) { point.x = 80; point.y = 20; main.dizhuFlag = 0; } if (i == 2) { point.x = 700; point.y = 20; main.dizhuFlag = 2; } main.dizhu.setLocation(point); main.dizhu.setVisible(true); } // 打开出牌按钮 public void turnOn(boolean flag) { main.publishCard[0].setVisible(flag); main.publishCard[1].setVisible(flag); } // 电脑0走牌(我代表1) public void computer0() { timeWait(1, 0); // 定时 ShowCard(0); // 出牌 } // 电脑2走牌(我代表1) public void computer2() { timeWait(1, 2); // 定时 ShowCard(2); // 出牌 } // 走牌 public void ShowCard(int role) { Model model = Common.getModel(main.playerList[role]); // 待走的牌 List<String> 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 < name.length / 3; i++) list.add(model.a1.get(i)); } else if (name.length / 3 <= model.a2.size())// 带双 { list.add(model.a111222.get(model.a111222.size() - 1)); for (int i = 0; i < name.length / 3; i++) list.add(model.a2.get(i)); } // 有炸弹出炸弹 } else if (model.a4.size() > 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<Card> 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 < len; i++) { List<Card> cards = getCardByName(main.playerList[role], list.get(i)); for (Card card : cards) { Common.move(card, card.getLocation(), point); 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<Card> list, String n) { String[] name = n.split(","); List cardsList = new ArrayList<Card>(); int j = 0; for (int i = 0, len = list.size(); i < len; i++) { if (j < name.length && list.get(i).name.equals(name[j])) { cardsList.add(list.get(i)); i = 0; j++; } } return cardsList; } //顺子 public void AI_3(List<String> model,List<Card> player,List<String> list,int role){ for(int i=0,len=model.size();i<len;i++) { String []s=model.get(i).split(","); if(s.length==player.size()&&getValueInt(model.get(i))>Common.getValue(player.get(0))) { list.add(model.get(i)); return; } } } //飞机带单,双 public void AI_4(List<String> model1,List<String> model2,List<Card> player,List<String> list,int role){ //排序按重复数 player=Common.getOrder2(player); int len1=model1.size(); int len2=model2.size(); if(len1<1 || len2<1) return; for(int i=0;i<len1;i++){ String []s=model1.get(i).split(","); String []s2=model2.get(0).split(","); if((s.length/3<=len2)&&(s.length*(3+s2.length)==player.size())&&getValueInt(model1.get(i))>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<String> model1,List<String> model2,List<Card> player,List<String> list,int role){ //排序按重复数 player=Common.getOrder2(player); int len1=model1.size(); int len2=model2.size(); if(len1<1 || len2<2) return; for(int i=0;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<String> model,List<Card> player,List<String> list,int role){ //顶家 if((role+1)%3==main.dizhuFlag) { for(int i=0,len=model.size();i<len;i++) { if(getValueInt(model.get(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<String> model1,List<String> model2,List<Card> player,List<String> 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=len-1;i>=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; } }
本文转载于:java教程网
时间: 2024-10-08 03:29:16