Java 编写斗地主游戏 窗体程序 完整源码

今天为大家分享斗地主游戏的开发与制作,目前是单机版游戏,后续时间空了,会给大家分享下联机版本的开发与制作。整个系统界面漂亮,有完整得源码,希望大家可以喜欢。喜欢的帮忙点赞和关注。一起编程、一起进步

开发环境

开发语言为Java,开发环境Eclipse或者IDEA都可以。运行主程序,或者执行打开JAR文件即可以运行本程序。

系统框架

利用JDK自带的SWING框架开发,不需要安装第三方JAR包。纯窗体模式,直接运行Main文件即可以。同时带有详细得设计文档

主要功能

启动方法

对Main.java点右键,run as Application,启动24点游戏。

游戏规则

1、发牌:一副牌,留三张底牌,其余发给三家,底牌叫牌后加到地主手中。

2、叫牌:叫牌按出牌顺序轮流开始叫牌,每人只能叫一次,叫牌可叫“1分”、“2分”、“3分”或不叫,所叫的分数为“叫牌的底分”,分数叫的高赢的多,输的也多。叫完后叫的最大分的为地主,如果都选择不叫牌,重新发牌,然后重新开始叫牌。

3、出牌:首先将三张底牌交给地主,三张底牌所有人都能看到。由地主开始出牌,然后按逆时针顺序依次出牌,轮到用户跟牌时,用户可按左上方Pass按钮表示不跟或按Search按规则查找然后按出牌按钮出牌。直至某一方牌出完就结束此局。

4、牌型:火箭:即双王(双鬼牌),什么牌型都可打,是最大的牌。炸弹:四张同数值牌(如四个5)。除火箭和比自己大的炸弹外,什么牌型都可打。单牌(一手牌):单个牌。对牌(一手牌):数值相同的两张牌。三张牌:数值相同的三张牌(如三个10)。三带一手:数值相同的三张牌+一张单牌或一对牌

实现的主要功能

1.生成扑克牌

2.分发牌给赌徒

3 为分发好牌的赌徒排好牌的顺序

4 计算最佳出牌规则

5 判断是否有选手获胜

运行效果

关键代码

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,Runnable{

    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控制放到里面
        t=new Time(this,10);//从10开始倒计时
        t.start();
        
    }
    // 抢地主
    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("斗地主游戏---帮写代码网");
        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,this);
            }
            //判断是否符合出牌
            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 Thread(new Main()).start();
        
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        
    }

}

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏 java实现的游戏游戏 游戏开发 游戏源码 java开发 经典游戏

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机程序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值