首页 > 代码库 > java斗地主

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();        }        }

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教程网

java斗地主