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

这篇具有很好参考价值的文章主要介绍了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 判断是否有选手获胜文章来源地址https://www.toymoban.com/news/detail-543330.html

运行效果

斗地主源码,桌面程序,游戏,java,数据结构,数据库开发,eclipse,Powered by 金山文档
斗地主源码,桌面程序,游戏,java,数据结构,数据库开发,eclipse,Powered by 金山文档
斗地主源码,桌面程序,游戏,java,数据结构,数据库开发,eclipse,Powered by 金山文档
斗地主源码,桌面程序,游戏,java,数据结构,数据库开发,eclipse,Powered by 金山文档

关键代码

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
        
    }

}

到了这里,关于Java 编写斗地主游戏 窗体程序 完整源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 斗地主残局破解算法,斗地主残局暴力求解器算法,秒解各种斗地主残局

    斗地主残局破解,斗地主残局暴力求解器,秒解各种斗地主残局 秒解抖音、微信等各大平台的斗地主残局挑战 支持自定义出牌规则 输入双方的牌后单击“开始求解”按钮即可 求解完成后,电脑会自动选择必胜的一方与用户对局互动,以演示如何必胜 软件和源码地址 http:/

    2024年02月10日
    浏览(78)
  • 【华为OD机试 2023 B卷 | 100分】斗地主之顺子(C++ Java JavaScript Python)

    华为OD统一考试A卷+B卷 新题库说明 2023年5月份,华为官方已经将的 2022/0223Q(1/2/3/4)统一修改为OD统一考试(A卷)和OD统一考试(B卷)。 你收到的链接上面会标注A卷还是B卷。请注意:根据反馈,目前大部分收到的都是B卷。但是仍有概率抽到A卷。 A卷对应2023的新题库(2022Q4 2

    2024年02月08日
    浏览(34)
  • 逆向破解学习-单机斗地主

    9000 是成功的代码 ` import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; public class HookComJuneGameDouDiZhu extends HookImpl{ @Override public String packageName() { return “com.june.game.doudizhu”; } } `

    2024年02月13日
    浏览(44)
  • 【华为OD机试真题】1220 - 斗地主之顺子(JAVA C++ Python JS) | 机试题+算法思路+考点+代码分析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Python语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习

    2024年02月06日
    浏览(47)
  • AI 全自动玩斗地主,靠谱吗?Douzero算法教程

    你觉得,AI 全自动玩斗地主,胜率能有多高? 真就有100%胜率,实现欢乐豆自由? 我让这个 AI 自己玩了一小时,结果出乎意料。 先不着急说最终结果,我们先来看看这个 AI 有多强。 Ai斗地主,就是通过 AI 算法分析游戏画面,获取玩家角色、手牌等信息。 完全自主决策这把

    2024年02月08日
    浏览(39)
  • 使用yolov5和强化学习训练一个AI智能欢乐斗地主(一)

    你好! 欢迎阅读我的文章,本章将介绍,如何使用yolov5和强化学习训练一个AI斗地主,本项目将分为三个部分,其中包含(yolov5目标检测,pyqt5页面搭建,强化学习训练出牌)。为什么会做这个项目呢,主要是出于作者本人感兴趣,我也喜欢打牌,即使这个项目可能在多数项

    2024年02月11日
    浏览(42)
  • 第12章_集合框架拓展练习(ArrayList,HashSet,TreeSet,HashMap,斗地主,省市联动)

    1、随机验证码 随机验证码。 随机生成十组六位字符组成的验证码。 验证码由大小写字母、数字字符组成。 代码实现,效果如图所示: 开发提示: 使用字符数组保存原始字符,利用Random类生成随机索引。 将十组验证码放到集合中 用Iterator迭代器遍历集合 2、学生信息录入

    2024年01月17日
    浏览(39)
  • Python编写简易猜数字小游戏(附完整代码)

    Python编写简易猜数字小游戏(附完整代码) 猜数字游戏是一款非常经典的小游戏,本文将介绍如何使用Python编写一个简易的猜数字游戏,并提供完整的源代码。 首先,让我们了解一下游戏规则。游戏开始时,程序会随机生成一个1到100之间的数字,玩家需要通过输入数字来猜

    2024年02月08日
    浏览(62)
  • python编写小程序小游戏,python编写小程序的运行

    本篇文章给大家谈谈python编写小程序需要注意的地方,以及python编写小程序怎么看代码的,希望对各位有所帮助,不要忘了收藏本站喔。 Source code download: 本文相关源码 python可以开发小程序吗 谷歌人工智能写作项目:小发猫 用python可以做微信小程序吗? 其实微信小程序作为

    2024年03月12日
    浏览(37)
  • 在Ubuntu里编写并运行一个程序的完整流程

    新建一个文件(以 hello.cpp 文件为例)的方法。 ①用vim编辑器的方法。 (前提是需要先装vim编辑器, 安装方法是在终端输入 sudo apt-get install vim ,再输入Y)      首先输入 vim  hello.cpp,进入下图命令模式状态  然后在键盘上输入字母 i ,得到如下图。注意左下角有( --INSE

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包