四人斗地主java程序

合集下载

JAVA代码之斗地主发牌

JAVA代码之斗地主发牌

JAVA代码之⽃地主发牌理解很好理解,关键是思路按照⽃地主的规则,完成洗牌发牌的动作: 具体规则:1. 组装54张扑克牌 2. 将54张牌顺序打乱3. 三个玩家参与游戏,三⼈交替摸牌,每⼈17张牌,最后三张留作底牌。

4. 查看三⼈各⾃⼿中的牌(按照牌的⼤⼩排序)、底牌⼿中扑克牌从⼤到⼩的摆放顺序:⼤王,⼩王,2,A,K,Q,J,10,9,8,7,6,5,4,3package com.oracle.demo01;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.Map;public class Doudizhu {public static void main(String[] args) {//1.创建扑克牌MapMap<Integer,String> pooker=new HashMap<Integer,String>();//创建所有key所在的容器ArrayList<Integer> pookerNum=new ArrayList<Integer>();//创建花⾊数组String[] color={"♠","♣","♥","♦"};//创建牌号数组String[] number={"2","A","K","Q","J","10","9","8","7","6","5","4","3"};//造牌并存进map集合int index=2;for(String n:number){for(String c:color){//向map中存数据pooker.put(index,c+n);//向所有key所在的容器存数据pookerNum.add(index);index++;}}//存⼤⼩王pooker.put(0, "⼤王");pookerNum.add(0);pooker.put(1, "⼩王");pookerNum.add(1);//洗牌Collections.shuffle(pookerNum);//System.out.println(pookerNum);//发牌//创建四个容器ArrayList<Integer> bottom=new ArrayList<>();ArrayList<Integer> player1=new ArrayList<>();ArrayList<Integer> player2=new ArrayList<>();ArrayList<Integer> player3=new ArrayList<>();//开始发牌for(int i=0;i<pookerNum.size();i++){//将前三张给底牌if(i<3){bottom.add(pookerNum.get(i));}else if(i%3==0){player1.add(pookerNum.get(i));}else if(i%3==1){player2.add(pookerNum.get(i));}else if(i%3==2){player3.add(pookerNum.get(i));}}//排序(key升序牌从⼤到⼩)Collections.sort(bottom);Collections.sort(player1);Collections.sort(player2);Collections.sort(player3);//看牌(调⽤⽅法)look("刘德华",player1,pooker);look("张家辉",player2,pooker);look("周润发",player3,pooker);look("底牌",bottom,pooker);}//看牌的⽅法(传参为玩家姓名,玩家的牌即键,所有牌的键值对)public static void look( String name,ArrayList<Integer> player,Map<Integer,String> pooker){ //打印玩家姓名System.out.print(name+":");//遍历所有牌号for(int num:player){System.out.print(pooker.get(num)+" ");}System.out.println();}}。

java斗地主游戏项目源码

java斗地主游戏项目源码

java⽃地主游戏项⽬源码部分代码如下Main.javapackage 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) {case0://左边玩家Common.move(card[i], card[i].getLocation(),new Point(50,60+i*5));playerList[0].add(card[i]);break;case1://我Common.move(card[i], card[i].getLocation(),new Point(180+i*7,450));playerList[1].add(card[i]);card[i].turnFront(); //显⽰正⾯break;case2://右边玩家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>();}}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif (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;}@Overridepublic void run() {// TODO Auto-generated method stubmain.t=new Time(main,10);//从10开始倒计时main.t.start();}}效果图<ignore_js_op><ignore_js_op><ignore_js_op><ignore_js_op>详细说明:。

java实现斗地主发牌功能

java实现斗地主发牌功能

java实现⽃地主发牌功能本⽂实例为⼤家分享了java实现⽃地主发牌的具体代码,供⼤家参考,具体内容如下参考⽃地主的游戏规则,完成⼀个发牌的功能(54张牌,考虑点数,花⾊;三名玩家,其中地主⽐其他玩家多3张牌)代码如下:牌类import java.util.Objects;/*** 3-10 J Q K A 2 King Queen 牌类** @author Administrator**/public class Card {/** 牌⾯值 */private String name;/** 花⾊ */private String flower;/** ⼤⼩点数 */private int num;public Card() {super();}public Card(String name, String flower, int num) {super(); = name;this.flower = flower;this.num = num;}public String getName() {return name;}public void setName(String name) { = name;}public String getFlower() {return flower;}public void setFlower(String flower) {this.flower = flower;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}@Overridepublic String toString() {if(Objects.nonNull(flower)) {return name + "-" + flower;}return name;}}玩家类public class Player {/**玩家ID*/private int id;/**玩家姓名*/private String name;/**是否是地主*/private boolean boss;/**牌集合*/private ArrayList<Card> cards = new ArrayList<Card>();public Player(int id, String name, boolean boss, ArrayList<Card> cards) {super();this.id = id; = name;this.boss = boss;this.cards = cards;}public Player() {super();}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public boolean isBoss() {return boss;}public void setBoss(boolean boss) {this.boss = boss;}public ArrayList<Card> getCards() {return cards;}public void setCards(ArrayList<Card> cards) {this.cards = cards;}@Overridepublic String toString() {return name +(boss? "(地主):":"(农名):")+ cards;}}管理类public class GameManage {private static Random randomGen = new Random();/** 声明所有牌的集合 */private static ArrayList<Card> all = new ArrayList<Card>();/** ⽤于⽣成牌的牌⾯值 */private static String[] names = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2", "⼩王","⼤王" }; /** ⽤于⽣成牌的花⾊ */private static String[] flowers = { "红桃", "⽅块", "梅花", "⿊桃" };private ArrayList<Player> players = new ArrayList<Player>();static {int i = 0;for (; i < names.length - 2; i++) {for (int j = 0; j < flowers.length; j++) {Card c = new Card(names[i], flowers[j], i);all.add(c);}}// 将⼤⼩王加⼊all.add(new Card(names[names.length - 2], null, i++)); all.add(new Card(names[names.length - 1], null, i++)); }/*** 加⼊玩家*/private void addPlayer() {Scanner sc = new Scanner(System.in);System.out.println("请输⼊玩家1名称:");String name1 = sc.nextLine();System.out.println("请输⼊玩家2名称:");String name2 = sc.nextLine();System.out.println("请输⼊玩家3名称:");String name3 = sc.nextLine();Player p1 = new Player();p1.setId(1);p1.setName(name1);Player p2 = new Player();p1.setId(2);p2.setName(name2);Player p3 = new Player();p1.setId(3);p3.setName(name3);// 将三名玩家加⼊集合players.add(p1);players.add(p2);players.add(p3);}/*** 随机地主*/private void randomBoss() {// 添加玩家addPlayer();// 随机地主索引int i = randomGen.nextInt(players.size());// 设置指定位置的玩家为地主players.get(i).setBoss(true);}public ArrayList<Player> sendCard() {randomBoss();// 对每⼀名玩家遍历for (Player p : players) {// 先为每⼀位玩家随机发17张牌for (int i = 0; i < 17; i++) {// 随机⼀张牌的索引int cardIndex = randomGen.nextInt(all.size());// 获取随机索引位置的牌Card card = all.get(cardIndex);// 将随机的牌加⼊当前遍历玩家的集合p.getCards().add(card);// 从源集合中移除这张牌all.remove(card);}}// 最后三张牌给地主for (Player p : players) {if (p.isBoss()) {// 将all集合中的所有元素加⼊地主的集合p.getCards().addAll(all);}}return players;}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

Java集合案例之斗地主游戏

Java集合案例之斗地主游戏

Java集合案例之⽃地主游戏本⽂实例为⼤家分享了Java集合案例之⽃地主游戏的具体代码,供⼤家参考,具体内容如下题⽬要求:通过⾃制54张扑克牌,发给3⼈,留下3张底牌,分别显⽰不同⼈的⼿牌与底牌达到⽃地主的游戏需求算法思想:1、4种花⾊,每种13张牌,使⽤for嵌套循环,产⽣52张牌再加⼊⼤⼩王创建牌与花⾊:String[] hs = {"♠", "♥", "♣", "♦"};String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};2、为了⽅便表⽰与操作每⼀张牌,可以⽤1--54的数字代替54种牌,通过此思路:可以使⽤HashMap类,使得牌与数字⼀⼀对应。

Map<Integer, String> pokers = new HashMap<>(); //双列表实现数字与牌相对应List<Integer> list = new ArrayList<>(); //单表存数字int n = 0;//⽤来计算3、考虑当分到牌后使其排列⽅便,可在设置数字对应时,进⾏特殊操作:使得花⾊作为内循环,数字作为内循环这样:在显⽰牌⾯时,更符合⽤户需求for (String s : number) {for (String h : hs) {String poker = h + s; //组合得到52张牌num++; //计数pokers.put(num, poker); //双列表,实现⼤⼩与数组对应list.add(num); //单列表,⽅便操作}}注:通过增强for循环来进⾏遍历num++;pokers.put(num, "⼩王"); //添加⼩王list.add(num);num++;pokers.put(num, "⼤王"); //添加⼤王list.add(num);4、调⽤Collections.shuffle(list)⽅法,使单列表打乱顺序,使⽤ int i 进⾏遍历,留下最后三张作为底牌,再将剩余的51张牌分给三⼈。

斗地主洗牌课课程设计JAVA

斗地主洗牌课课程设计JAVA

斗地主洗牌课课程设计JAVA一、教学目标本课程旨在通过斗地主洗牌程序的设计与实现,让学生掌握JAVA编程的基本语法、流程控制、数组和面向对象编程等知识,培养学生解决实际问题的能力,提高学生的编程兴趣和信息素养。

具体目标如下:1.理解JAVA编程语言的基本语法。

2.掌握JAVA中的流程控制语句,包括条件语句、循环语句等。

3.熟悉JAVA数组的使用方法。

4.理解面向对象编程的基本概念,包括类、对象、封装、继承等。

5.能够运用JAVA编程语言编写简单的程序。

6.能够运用面向对象编程思想设计和实现程序。

7.能够分析问题,编写解决问题的JAVA程序。

情感态度价值观目标:1.培养学生对编程的兴趣,提高信息素养。

2.培养学生团队合作、自主学习的能力。

3.培养学生面对问题,解决问题的决心和毅力。

二、教学内容本课程的教学内容主要包括JAVA编程语言的基本语法、流程控制、数组和面向对象编程等。

1.JAVA基本语法:JAVA的数据类型、变量、运算符、方法等。

2.流程控制:条件语句、循环语句等。

3.数组:一维数组、多维数组的使用和操作。

4.面向对象编程:类、对象、封装、继承等。

三、教学方法本课程采用讲授法、案例分析法、实验法等教学方法,以激发学生的学习兴趣和主动性。

1.讲授法:用于讲解JAVA的基本语法、流程控制、数组和面向对象编程等理论知识。

2.案例分析法:通过分析实际案例,让学生理解和掌握JAVA编程的方法。

3.实验法:通过编写和运行JAVA程序,让学生实践和巩固所学知识。

四、教学资源本课程的教学资源包括教材、多媒体资料和实验设备等。

1.教材:选用《JAVA编程思想》等权威教材,为学生提供系统的学习资料。

2.多媒体资料:制作课件、演示视频等,丰富教学手段,提高学生的学习兴趣。

3.实验设备:为学生提供电脑、网络等实验环境,方便学生进行编程实践。

五、教学评估本课程的教学评估主要包括平时表现、作业和考试三个部分,以全面、客观、公正地评估学生的学习成果。

java课程设计斗地主

java课程设计斗地主

java课程设计斗地主一、教学目标本章节的教学目标旨在让学生掌握Java编程基础,能够运用Java编写简单的斗地主游戏。

具体目标如下:1.理解Java编程语言的基本语法和结构。

2.掌握面向对象编程的思想,了解类、对象、继承、多态等概念。

3.学习Java集合框架,了解List、Set、Map等接口及其实现类。

4.熟悉Java异常处理机制。

5.能够使用Java开发工具,如Eclipse、IntelliJ IDEA等。

6.能够编写简单的Java程序,实现输入输出、数据计算等功能。

7.能够运用Java编写斗地主游戏的界面和逻辑。

情感态度价值观目标:1.培养学生的编程兴趣,提高学生主动学习的积极性。

2.培养学生团队协作的能力,学会与他人共同解决问题。

3.培养学生勇于创新的精神,敢于挑战自己。

二、教学内容本章节的教学内容主要包括以下几个部分:1.Java编程基础:介绍Java语言的基本语法、数据类型、运算符、控制结构等。

2.面向对象编程:讲解类、对象、继承、多态等概念,并通过实例让学生理解并掌握这些概念。

3.Java集合框架:学习List、Set、Map等接口及其实现类,了解常用的数据结构及其应用场景。

4.异常处理:介绍Java异常处理机制,让学生学会处理程序中可能出现的错误和异常。

5.斗地主游戏开发:引导学生运用所学知识,编写斗地主游戏的界面和逻辑。

三、教学方法本章节的教学方法采用讲授法、案例分析法和实验法相结合的方式,具体如下:1.讲授法:教师讲解Java编程基础、面向对象编程、集合框架、异常处理等内容,引导学生理解并掌握相关概念。

2.案例分析法:通过分析具体的斗地主游戏案例,让学生将所学知识运用到实际项目中,提高学生的编程能力。

3.实验法:安排实验室实践环节,让学生动手编写斗地主游戏,培养学生的实际操作能力。

四、教学资源本章节的教学资源包括以下几部分:1.教材:《Java编程基础》等相关教材,为学生提供理论知识的学习依据。

使用Java实现简单的斗地主案例

使用Java实现简单的斗地主案例
public class PokerGame {
public static void main(String[] args) {
//定义扑克牌的花色以及数字的数组 String[] flower = {"♥ ","♠ ","♣ ","♦ "}; String[] numbers = {"A","2",,"6","7","8","9","10","J","Q","K"};
} }
//添加大小王到牌组集合中 poker.add("大王"); poker.add("小王");
//打印输出所有扑克牌测试 System.out.println(poker);
//定义三个玩家和地主牌的集合 List player1 = new ArrayList(); List player2 = new ArrayList(); List player3 = new ArrayList(); List dizhupai = new ArrayList();
//创建牌组集合 List poker = new ArrayList();
//组合扑克牌样式 //拿出每一个花色,然后跟每一个数字进行结合,储存在牌组中 for (int i = 0; i < flower.length; i++) {
for (int j = 0; j < numbers.length; j++) { poker.add(flower[i].concat(numbers[j]));

斗地主 JAVA课程设计

斗地主  JAVA课程设计
基本功能与要求: 使用 Eclipse 和 JDK1.6 工具,操作系统为 WINDOWS,采用面向对象方法完成,
包括总体设计、详细设计、编码实现、测试。设计要求如下: ①游戏由模块组成:游戏区模块,游戏控制模块,级别设置模块和帮助模块。 ②游戏区模块,为玩家提供主体游戏功能,能够处理玩家的各种游戏操作,显示得
指导教师(签名):
20 年 月 日
目录
1 需求与总体设计......................................................................................................................1 1.1 需求分析..............................................................................................................................1 1.2 总体设计..............................................................................................................................1 1.3 功能图..................................................................................................................................1 1.4 类图......................................................................................................................................2 2 详细设计..................................................................................................................................3 2.1 主类 Main.............................................................................................................................3 2.2 类 Card.................................................................................................................................3 2.3 类 CardType.........................................................................................................................4 2.4 类 Common.............................................................................................................................4 2.5 类 Model...............................................................................................................................5 2.6 类 Time.................................................................................................................................5 3 编码实现..................................................................................................................................6 3.1 JAVA 编码实现....................................................................................................................6 4 系统测试................................................................................................................................44 4.1 测试结果............................................................................................................................44 4.2 排错处理............................................................................................................................46 总 结............................................................................................................................................................47

java斗地主小游戏课程设计

java斗地主小游戏课程设计

java斗地主小游戏课程设计一、课程目标知识目标:1. 让学生掌握Java语言的基本语法和编程结构;2. 让学生了解斗地主游戏的规则和逻辑;3. 让学生学会运用面向对象编程思想设计游戏类和对象;4. 让学生掌握数组、集合、异常处理等在游戏编程中的应用。

技能目标:1. 培养学生运用Java语言编写简单游戏的能力;2. 培养学生分析问题、解决问题的能力;3. 培养学生团队协作和沟通表达能力;4. 提高学生的逻辑思维和编程实践能力。

情感态度价值观目标:1. 激发学生对编程和游戏的兴趣,培养其探索精神;2. 培养学生面对挑战和困难时保持积极的态度,勇于尝试和改进;3. 引导学生正确认识游戏,合理安排学习和娱乐时间,形成良好的生活习惯;4. 培养学生的合作精神,使其懂得分享和互助。

课程性质:本课程为实践性较强的Java编程课程,以斗地主小游戏为载体,结合面向对象编程思想,培养学生的编程能力和逻辑思维能力。

学生特点:学生已具备一定的Java语言基础,对游戏有较高的兴趣,但编程实践经验和团队协作能力有待提高。

教学要求:注重理论与实践相结合,引导学生主动探究和解决问题,强调团队协作和沟通表达能力的培养。

将课程目标分解为具体的学习成果,以便于教学设计和评估。

二、教学内容1. Java基础语法复习:变量、数据类型、运算符、控制结构等;2. 面向对象编程:类与对象、构造方法、继承与多态、接口等;3. 游戏规则与逻辑:斗地主游戏规则介绍、牌类设计、出牌逻辑、计分系统等;4. 编程实践:- 牌类设计与实现:Card类、Poker类;- 游戏界面设计:命令行界面设计、用户交互;- 游戏逻辑实现:发牌、出牌、跟牌、提示等功能;- 异常处理:输入异常、游戏逻辑异常处理;- 游戏测试与优化:测试用例设计、性能优化。

5. 团队协作与沟通:项目分组、任务分配、进度跟踪、成果展示。

教学内容安排与进度:第一周:Java基础语法复习、面向对象编程;第二周:斗地主游戏规则介绍、牌类设计与实现;第三周:游戏界面设计、游戏逻辑实现(发牌、出牌);第四周:游戏逻辑实现(跟牌、提示)、异常处理;第五周:游戏测试与优化、团队协作与沟通。

java学习案例-斗地主洗牌发牌

java学习案例-斗地主洗牌发牌

斗地主洗牌发牌【案例介绍】1.任务描述扑克牌游戏“斗地主”,相信许多人都会玩,本案例要求编写一个斗地主的洗牌发牌程序,要求按照斗地主的规则完成洗牌发牌的过程。

一副扑克总共有54张牌,牌面由花色和数字组成(包括J、Q、K、A字母)组成,花色有♠、♥、♦、♣ 四种,分别表示黑桃、红桃、方块、梅花,小☺、大☻分别表示小王和大王。

斗地主游戏共有3位玩家参与,首先将这54张牌的顺序打乱每人轮流摸一次牌,剩余3张留作底牌,然后在控制台打印3位玩家的牌和3张底牌。

2.运行结果任务运行结果如图6-1所示:图6-1 运行结果图【任务介绍】●学会分析“斗地主之洗牌发牌”任务的实现思路。

●根据思路独立完成“斗地主之洗牌发牌”任务的源代码编写、编译及运行。

●掌握List集合和Map集合特点及常用方法的使用。

●掌握集合遍历的方式。

【实现思路】(1)要实现纸牌程序,首先需要完成纸牌的组装。

牌面是由花色(包括♠、♥、♦、♣花色)和数字(包括J、Q、K、A字母)两部分组成,可以创建两个ArrayList集合作为花色集合与数字集合,存储时需要注意。

比10大的牌的数字用J、Q、K表示,1用A表示。

(2)将花色集合与数字集合这两个循环进行嵌套循环,将花色与数字组合,形成52章牌,并赋予其编号。

将组合后的牌存放到一个HashMap集合中,集合的Key值是编号,value值是组装完成的纸牌。

还有两张牌是大小王(小☺表示小王、大☻表示大王)。

由于组装规则不一致,需单独使用add()方法将这两张牌加入到HashMap集合中。

(3)创建一个数字集合,用这个数字集合代替纸牌完成洗牌和发牌操作。

由于纸牌的数量是54张,所以创建集合范围是0~53。

(4)可以使用Collection类的shuffle()方法完成打乱数字集合的操作,实现洗牌效果。

由于只有3个人,所以可以使用for循环,通过将数字与3取余的方法,将代表不同纸牌的数字分配给不同人与底牌,实现发牌效果。

Eclipse+Java+Swing实现斗地主游戏(代码)

Eclipse+Java+Swing实现斗地主游戏(代码)

Eclipse+Java+Swing实现⽃地主游戏(代码)⽬录⼀、系统介绍⼆、系统展⽰1.扑克分发2.抢地主3.出牌4.游戏胜利三、系统实现Card.javaCardType.javaCommon.javaModel.javaNewSwing.java⼀、系统介绍本系统实现扑克的分发,抢地主,电脑⾃动出牌等功能。

⼆、系统展⽰1.扑克分发2.抢地主3.出牌4.游戏胜利三、系统实现Card.javapackage com.sjsq;import java.awt.Point;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.ImageIcon;import javax.swing.JLabel;/**** 扑克管理类** @author shuijianshiqing** @date 2020-09-09 20:41**/public class Card extends JLabel implements MouseListener {Main main;// Main类的引⽤String name;// 图⽚url名字boolean up;// 是否正反⾯boolean canClick = false;// 是否可被点击boolean clicked = false;// 是否点击过public Card(Main m, String name, boolean up) {this.main = m; = name;this.up = up;if (this.up)this.turnFront();else {this.turnRear();}this.setSize(71, 96);this.setVisible(true);this.addMouseListener(this);}// 正⾯public void turnFront() {this.setIcon(new ImageIcon("images/" + name + ".gif"));this.up = true;}// 反⾯public void turnRear() {this.setIcon(new ImageIcon("images/rear.gif"));this.up = false;}@Overridepublic void mouseClicked(MouseEvent e) {if (canClick) {Point from = this.getLocation();int step; // 移动的距离if (clicked)step = -30;else {step = 30;}clicked = !clicked; // 反向// 当被选中的时候,向前移动⼀步/后退⼀步Common.move(this, from, new Point(from.x, from.y - step), 10); }}public void mouseEntered(MouseEvent arg0) {}public void mouseExited(MouseEvent arg0) {}public void mousePressed(MouseEvent arg0) {}public void mouseReleased(MouseEvent arg0) {}}CardType.javapackage com.sjsq;/**** 出牌类型** @author shuijianshiqing** @date 2020-09-09 20:44**/public enum CardType {c1,//单牌。

java斗地主

java斗地主

数据结构大型程序设计题目:斗地主学号:**********对此感兴趣的朋友,请与我交流,邮箱****************,要源代码的请与我联系一.需求分析1.刚开始运行的时候,呈现给用户的是一个登录注册画面(主要是方便以后把它改装成网游)2.登录后有准备的画面,提示一些信息,有开始按钮,开始按钮开始发牌,退出按钮,可以重新退回到登录界面。

这个界面里有有两个菜单,游戏和关于,游戏包括菜单项开始,退出,游戏难度设定,声音关和闭,查看历史战线,关于包括菜单项玩法,版权。

3.点击开始按钮后,开始发牌,发完后,要随机选地主,地主选定后就开始出牌,一个人,两个电脑。

人通过按钮进行选择,出牌,过牌。

任何一方(地主方和非地主方)胜利都将结束游戏,并通过一对话框显示本次登录的得失分情况和询问用户是否继续,继续的话就发牌,否的话就直接退出到登录界面。

二.流程图三.概要分析1.数据库设计:用户信息表:字段名:用户名,密码,用户分数用户历史记录表:字段名:用户名,登录次数,每次登录得分情况2.类的概要设计常量类:定义一些常量,以便修改及维护数据库连接类:加载数据库及数据库的一些操作用户类:记录用户的一些信息登录注册画面类:显示登录画面扑克类:记录每张扑克的信息规则类:定义斗地主规则随机发牌类:生成随机牌,并把牌分成四个数组每个人的牌类:记录用户和电脑牌的一些共性用户牌类:记录用户的牌及一些操作电脑牌类:记录电脑的牌及一些操作剩余牌及出牌类:记录每个人每次出的牌及显示菜单类:每个画面的菜单,及菜单的一些事件响应准备画面类:显示准备画面打牌的画面类:显示打牌的画面地主按钮面板类:控制地主按钮的显示及按钮的事件响应对话框类:为一些对话框的共性关于对话框:关于软件的一些信息规则对话框:显示斗地主的规则信息本次登录后的得分情况对话框类:显示本次登录的得分情况,并提示是否继续历史战绩界面类:显示以往十次的登录画面声音类:加载声音及控制声音的播放电脑选底牌的权值判定:当电脑有权拿地主时,判断是否要电脑出牌类:电脑三种算法出牌的共性,定义一个接口简单出牌类:简单的让电脑出牌中等难度出牌类:让电脑有一定的记忆能力难的出牌类:让电脑具备点人工智能的出牌3.类之间的关系:上面的类都是一些基础类,下面的数据成员基本都是上面来的。

设计模式大作业——斗地主程序

设计模式大作业——斗地主程序
刘品时序图人机对战游戏参与者电脑智能图像管理音效管理控制器刷新画面10输出音效11游戏主循环12游戏结束输出结果游戏参与者网络通信模块图像显示模块音效输出模块控制模块打开游戏大厅初始化环境获取局域网信息初始化图像初始化音效选取游戏对手生成游戏对象是否组建游戏参与游戏创建游戏主机建立稳定的连接创建游戏从机开始游戏开始游戏动作刷新图像输出音效游戏循环游戏逻辑判断传输游戏信息是否结束通知游戏结束输出游戏概要推出游戏环境结束操作时序图多人对战游戏参与者网络通信模块图像显示模块音效输出模块控制模块打开游戏大厅初始化环境获取局域网信息初始化图像初始化音效选取游戏对手生成游戏对象是否组建游戏参与游戏创建游戏主机建立稳定的连接创建游戏从机开始游戏开始游戏动作刷新图像输出音效游戏循环游戏逻辑判断传输游戏信息是否结束通知游戏结束输出游戏概要推出游戏环境结束操作游戏中的设计模式声音模块网络模块工厂模式门面模式模式监听者模式模式纸牌管理声音模块soundplayerisstop
+Card(m: Main, name: String) +turnFront() +turnRear() +mouserPressed() +getName()
CardManager
<<static>>-manager: CardManager <<static>>-map: Map
<<static>>+init(main: Main) <<static>>+getInstance() +getAll() +getCard(key: String) +getRandomSequence(list: List)

Java写的斗地主游戏源码

Java写的斗地主游戏源码

Java写的⽃地主游戏源码源码下载在最后我们的前年的课设要求做⼀个⽃地主程序,当时正在愁如何做界⾯,当时刚好在学习C#,于是就⽤C#完成了这个程序。

⼀⽅⾯,当时我C#功底还很差(其实现在也不怎么样),很多地⽅⽤了“笨办法”,实现的⽐较幼稚,程序效率很低,另⼀⽅⾯感觉很对不起⽼师,因为做这个程序的本意是研究⽃地主程序的AI出牌等等算法相关的东西,⽽我却⼏乎忽略了这些内容。

(我会好好学习算法的……^-^)最可怕的是,由于当时时间⽐较紧,只有⼏天的时间,所以我本着“能跑就⾏”的想法完成了这个程序。

从程序本⾝来说,我觉得我的代码⼏乎没有任何参考价值,满篇的switch...case...,乱七⼋糟的结构,⽽且最可怕的是,所有代码⼏乎都集中在了⼀个mainform.xaml.cs⽂件⾥。

太恐怖了。

我⼀直为我会写出这样的代码感到羞耻……因此也就没敢发布这些源码。

最近⼜在研究Java,做另外的项⽬,看了看以前的代码,觉得虽然代码很烂,但有些地⽅的处理还是有⼀定意义的,毕竟这也算是个中⼩游戏应⽤,于是⼜⽤JAVA重写了⼀遍,发上来和⼤家分享。

如果能对你的学习或者⼯作起到任何作⽤,我都会⾮常⾼兴。

此源码完全⾃由使⽤,你可以利⽤它做任何事情,包括商业应⽤,⽽不需要提前通知我。

这次采⽤的是JAVA8 ,最新发布的JAVA版本,IDE是netbeans,⼀共有80MB左右⼤⼩,体积不⼤,安装也容易程序⽂件夹结构是从C#转过来的,期间使⽤⼀个叫C#转JAVA的⼯具,转换了⼀下语法,效果不是很理想,还是⼿⼯改了许多地⽅可以看到,程序是从Program.java启动(和VS的项⽬⼀样)游戏是⽹页版联机的,因此分服务端和客户端⼆部分,服务端JAVA包括⽃地主逻辑服务和记录服务(⽣成SQL语句发给数据库)游戏客户端 -》⽃地主逻辑服务 - 》记录服务 -》数据库《- 《- 《-客户端发消息到⽃地主逻辑,⽃地主逻辑转发到记录服务,再返回来,这样⼀个通信过程分成逻辑和记录⼆部分的好处是可以并⾏运⾏提⾼效率,⽐如在SQL语句执⾏时,⽃地主逻辑可以继续处理请求现在开始构架游戏,为了不让代码那么难看,我们很有必要加⼊设计模式和⾯向对象思想。

局域网斗地主(java)

局域网斗地主(java)

局域网三人斗地主程序(java版)说明:本程序支持局域网游戏,运行服务器端后,再运行三个客户端分别输入服务器端的IP 即可以游戏。

附件说明:扑克牌重1~54命名,分别为3到大王(四个一组,大小王除外,比如1.jpg,2.jpg都是3),0.jpg 为扑克牌的反面可以从网上下载。

声音文件参考QQ斗地主。

服务器端:三个四个类分别是:IMServer.java客户端主类IMServer.javaimport java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.*;import .ServerSocket;import .Socket;import java.util.*;import javax.swing.*;@SuppressWarnings("serial")public class IMServer extends JFrame implements ActionListener{private int command0=0;//记录接收重新开机的指令数目private int command1=0;//记录接收是否叫地主的指令数目private static ArrayList Dizhu=new ArrayList();private static final int maxThreadLimit = 10;private static int OnlineNumber=0;private JPanel p = new JPanel();DealCard test;String Command;private ArrayList Users=new ArrayList();public int[] Arr=new int[21];private JTextField jtf = new JTextField();private JTextArea jta = new JTextArea();private ArrayList<ThreadServer> threadArray = new ArrayList<ThreadServer>(); //线程数组,用于存放连接线程public IMServer(){p.setLayout(new BorderLayout());p.add(new JLabel("发送(回车)"),BorderLayout.WEST);p.add(jtf,BorderLayout.CENTER);jtf.setHorizontalAlignment(JTextField.RIGHT);getContentPane().setLayout(new BorderLayout());getContentPane().add(new JScrollPane(jta),BorderLayout.CENTER);getContentPane().add(p,BorderLayout.SOUTH);jta.setEditable(false);jtf.setHorizontalAlignment(javax.swing.JTextField.LEFT);jtf.addActionListener(this);setTitle("IM");setSize(500,300);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);new Thread(new Runnable() {@Overridepublic void run() {while(true){if(command0==3){CreatPai();command0=0;}else if(command1==3){int chose1 = 0;for(int i=0;i<10000;i++){}if(Dizhu.isEmpty()){JOptionPane.showMessageDialog(null,"没人抢地主,随机发牌");chose1=(int)(Math.random()*3)+1;}else{int number=(int)(Math.random()*Dizhu.size())+1;Integer chose=(Integer) Dizhu.get(number-1);chose1=chose.intValue();}Dizhu.clear();System.out.println(chose1);guangBo(" 地主是:"+chose1+"系统广播者");guangBo(" 地主是正在出牌");String send=test.CreatDizhu(chose1);System.out.println("地主的牌的是:"+send);guangBo("12|"+chose1+send);guangBo("13|"+chose1+test.dipai);command1=0;}}}}).start();try{ServerSocket serverSocket = new ServerSocket(8189);jta.append("服务器开启时间:" + new Date() + '\n');while(true){if(threadArray.size() >= maxThreadLimit){try{Thread.sleep(1000);}catch(InterruptedException ex){}}else{Socket socket = serverSocket.accept();BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String name=in.readLine();OnlineNumber++;jta.append("用户"+name+ "上线: ("+new Date() +")" +'\n');jta.append("当前在线人数:"+OnlineNumber+"人\n");ThreadServer thread = new ThreadServer(OnlineNumber,name,socket);threadArray.add(thread);Users.add("|"+name);thread.start();try {Thread.sleep(100);if(OnlineNumber>2){for(int i=0;i<3;i++)threadArray.get(i).send("ID"+Users.get(0)+Users.get(1)+Users.get(2));System.out.println(Users);System.out.println(Users);CreatPai();}} catch (InterruptedException ex) {}}}}catch(IOException e){System.err.println(e);}}private void CreatPai(){test=new DealCard();threadArray.get(0).send("11|"+1+er1);threadArray.get(1).send("11|"+2+er2);threadArray.get(2).send("11|"+3+er3);}public static void main(String[] args){new IMServer();}@Overridepublic void actionPerformed(ActionEvent arg0){if (arg0.getSource() instanceof JTextField){String s = jtf.getText();if(s != null){guangBo(" 系统消息:"+s);s = null;}jtf.setText("");}}public void guangBo(String s) //向所有客户端监听线程发送消息{StringTokenizer st = new StringTokenizer(s,"|");st.nextToken();jta.append(s+ '\n');//if(st.hasMoreElements()){if(threadArray.size() > 0) //遍历这个线程数组{for(int i = 0;i < threadArray.size();i++){threadArray.get(i).send(s);System.out.println(i+": "+s);}}}//线程内部类class ThreadServer extends Thread{private Socket incoming;private String name;private int num;private PrintWriter out;public ThreadServer(int num,String name,Socket i){this.num=num;=name;incoming = i;}public int getnum() {return num;}public String getname(){return name;}@Overridepublic void run(){// TODO Auto-generated method stubsynchronized(this){try{try{BufferedReader inStream = new BufferedReader(new InputStreamReader(incoming.getInputStream()));OutputStream outStream = incoming.getOutputStream();out = new PrintWriter(outStream, true);while(true){String s = inStream.readLine();System.out.println(s);StringTokenizer st = new StringTokenizer(s,"|");String command=st.nextToken();if(st.hasMoreElements()){if(command.equals("error")){String name=st.nextToken();int num=Integer.parseInt(name);switch(num){case 1:this.send("11|"+1+er1);break;case 2:this.send("11|"+2+er2);break;case 3:this.send("11|"+2+er2);break;default:System.exit(-1);}}if(command.equals("20")){command0++;}else if(command.equals("21")){String name1=st.nextToken();String dizhu=st.nextToken();if(dizhu.equals("yes")){Dizhu.add(Integer.parseInt(name1));}command1++;}else if(command.equals("22")){String name1=st.nextToken();if(s.endsWith("|")){String realmsg=s.substring(3);guangBo(" 玩家"+name1+"不出牌");guangBo("14|"+realmsg+"|-1");}else{String realmsg=s.substring(3);System.out.println(realmsg);guangBo(" 玩家"+name1+"正在出牌");guangBo("14|"+realmsg);}}else if(command.equals("23")){String name1=st.nextToken();guangBo("15|"+name1);}else if(command.equals("talk")){String msg=st.nextToken();if(msg.length()>0)guangBo(s);}}else if(s.length()>0 && !s.equalsIgnoreCase("EXIT")) {guangBo(s);s = null;}else if(s.equalsIgnoreCase("EXIT")){break;}}}catch(.SocketException e){System.out.println("有用户退出");threadArray.remove(this);}finally{incoming.close();}}catch(IOException e){e.printStackTrace();}}}public void send(String s){if(s != null){out.println(s);}}}public String analysisMsg(String msg){StringTokenizer st = new StringTokenizer(msg,"|");String realMsg=st.nextToken();if(st.hasMoreElements()){String strre = st.nextToken();//读取用户名}//获取信息时间java.text.DateFormat format1 = new java.text.SimpleDateFormat("HH:mm:ss");String strTime = format1.format(new Date());strTime="("+strTime+")";return msg+strTime;}public String ChangeVector(ArrayList v) { //将向量封装成字符串String RealMsg="";for(int i=0;i<v.size();i++){RealMsg+="|"+v.get(i);}return RealMsg;}public String PackMsg(int command,String realMsg){return command+"|Server"+realMsg;}}随机产生排的54不重复的随机数RandomCard.javapublic class RandomCard {public int [] arr=new int[55];public RandomCard(){for(int i=1;i<55;i++){arr[i]=0;}}public int CreatRadom(){int Radom1=(int)(Math.random()*54)+1;if(arr[Radom1]==0) arr[Radom1]=1;else{while(arr[Radom1]==1){Radom1=(int)(Math.random()*54)+1;}arr[Radom1]=1;}return Radom1;}/* public static void main(String[] args) {Radom c= new Radom();for(int i=1;i<55;i++){System.out.println(c.CreatRadom()+" "+i);}}**/}对随机数排序CreateCard,javapublic class CreateCard {public int[] imgPath=new int[55];static RandomCard r;public CreateCard(){r=new RandomCard();for(int i=1;i<55;i++){int j=r.CreatRadom();imgPath[i]=j;}this.maoPao(imgPath,1,17);this.maoPao(imgPath,18,34);this.maoPao(imgPath,35,51);this.maoPao(imgPath,52,54);}public static void maoPao(int[] x,int begin,int end) {for (int i = begin; i <end; i++) {for (int j = i + 1; j <=end; j++) {if (x[i] > x[j]) {int temp = x[i];x[i] = x[j];x[j] = temp;}}}}public void prinArray(){for(int i=1;i<55;i++){if(i%17==1) {System.out.println();}System.out.println(imgPath[i]);}}/*public static void main(String[] args) {CreateCard c= new CreateCard();c.prinArray();}**/}服务器布牌DealCard.javaimport java.util.StringTokenizer;public class DealCard {CreateCard cr;public String user1="";public String user2="";public String user3="";public String dipai="";public String dizhu="";//地主底牌public int dizhu1;//产生的地主public int[] card;public DealCard(){this.ChangeToString();}public void ChangeToString(){cr=new CreateCard();card=cr.imgPath;for(int i=1;i<card.length;i++){if(i<18) user1+="|"+card[i];else if(i<35) user2+="|"+card[i];else if(i<52) user3+="|"+card[i];else dipai+="|"+card[i];}}public String SortString(String str){String newString="";int[] arr=new int[20];StringTokenizer st = new StringTokenizer(str,"|");int i=0;while (st.hasMoreTokens()){arr[i]=Integer.parseInt(st.nextToken());i++;}CreateCard.maoPao(arr,0,19);for(int j=0;j<arr.length;j++){newString+="|"+arr[j];}return newString;}public String CreatDizhu(int dizhu1) //根据提交的叫地主的情况随机产生地主{switch(dizhu1){case 1:return SortString(user1+dipai);case 2:return SortString(user2+dipai);case 3:return SortString(user3+dipai);default:System.exit(-1);}return null;}public static void main(String[] args){DealCard test=new DealCard();System.out.println(er1);System.out.println();System.out.println();}}客户端程序:主类MainClinet.javaimport java.awt.Color;import java.awt.Dimension;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import .Socket;import javax.swing.*;import java.util.*;import java.io.*;/**** @author Administrator*/public class MainClient extends JFrame implements ActionListener,Runnable,MouseListener {Socket socket;JTextField textTalk;JComboBox listOnline; //在线用户列表boolean ischupai=false;//标记是否出牌JLabel right=new JLabel("当前牌数为"+17);//标记剩余牌数JLabel left=new JLabel("当前牌数为"+17);//标记剩余牌数JLabel current=new JLabel("当前牌数为"+17);//标记剩余牌数JLabel right1=new JLabel();//标记剩余牌数JLabel left1=new JLabel();//标记剩余牌数JLabel current1=new JLabel();//标记剩余牌数JLabel[] labplayer={new JLabel(""),new JLabel(""),new JLabel("")};JButton start =new JButton("开始");JButton yes =new JButton("叫地主");JButton no =new JButton("不叫");Compare compare=new Compare();DealCard music=new DealCard();JLabel[] labdipai=new JLabel[3];private JTextArea jta = new JTextArea();private JTextArea jta1 = new JTextArea();private OutputStream toServer;private PrintWriter out;private BufferedReader in;private String Id;private String Username;private String[] Users=new String[3];Thread th=new Thread(this,"listen");ArrayList PlayCard=new ArrayList();//记录要出的牌ArrayList PlayCard1=new ArrayList();//记录上个玩家出牌ArrayList PlayCard2=new ArrayList();//记录上一个玩家出牌public static ArrayList RecordCard=new ArrayList();//记录玩家出牌ArrayList LeftCard=new ArrayList();//记录剩下的牌DealLabel[] labelPic=new DealLabel[20];JLabel[] lab=new JLabel[20];JLabel[] labr1=new JLabel[20];JLabel[] labr2=new JLabel[20];JLabel[] labl1=new JLabel[20];JLabel[] labl2=new JLabel[20];private JButton ibLeftSec;private JButton isbuchuR;private JButton isbuchuL;private Thread time, clocker;public static long startTime, endTime;long nowTime, leftTime, leftSec, leftMin;boolean flag = false;String msg;String Command;private String last;private String dizhu;public int[] Arr;public int loc=760; //当前玩家出牌的相对位置public int locr=580; //当前玩家出牌的相对位置public int locl1=580; //当前玩家出牌的相对位置public int locl2=500; //当前玩家出牌的相对位置private JButton buttonTalk;String IP;//服务器IP地址public MainClient(String name,String IP){this.setTitle("玩家"+name);ername=name;this.IP=IP;this.setLayout(null);setExtendedState(JFrame.MAXIMIZED_BOTH);setResizable(false);Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();init();getContentPane().setBackground(Color.GREEN);new Thread(new Runnable() {public void run() {int i=1;while(true){new Sound().play("b"+String.valueOf(i));i++;if(i>5) i=1;try{Thread.sleep(32000);}catch(Exception e) {}}}}).start();this.Bupai();clocker = new Thread(this, "clock");clocker.start();time = new Thread(this, "ti");time.start();this.setVisible(true);int width = (int)screensize.getWidth();int height = (int)screensize.getHeight();int mainloc=width/2-643;if(mainloc<10) this.setLocation(50, 0);else this.setLocation(mainloc, 0);this.setSize(1286,718); //根据我的电脑设计的大小this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}void init(){for(int i=0;i<3;i++){labplayer[i].setSize(80, 40);this.add(labplayer[i]);}buttonTalk = new JButton("发送");buttonTalk.setSize(60, 30);buttonTalk.setLocation(1080, 570); buttonTalk.setFocusable(false); buttonTalk.addActionListener(this);this.add(buttonTalk);isbuchuR= new JButton("不出") ; isbuchuR.setFocusable(false); isbuchuR.setEnabled(false);isbuchuR.setBackground(Color.red); isbuchuR.setBounds(120,300, 62, 40); isbuchuL= new JButton("不出") ; isbuchuL.setFocusable(false);isbuchuL.setEnabled(false);isbuchuL.setBackground(Color.red); ibLeftSec = new JButton("");isbuchuL.setBounds(900,300, 62, 40); ibLeftSec.setFocusable(false); ibLeftSec.setEnabled(false);ibLeftSec.setBackground(Color.red);this.add(ibLeftSec);isbuchuR.setVisible(false);isbuchuL.setVisible(false);this.add(isbuchuR);this.add(isbuchuL);listOnline=new JComboBox(); listOnline.addItem("All");listOnline.setLocation(1160, 600); listOnline.setSize(58, 30);this.add(listOnline);JLabel labtalk=new JLabel("玩家聊天记录"); labtalk.setBounds(1150, 540,80, 40);this.add(labtalk);JLabel labre=new JLabel("消息接受者"); labre.setBounds(1080, 600,80, 40);this.add(labre);textTalk = new JTextField(20);textTalk.setSize(120, 30);textTalk.setLocation(1150,570); textTalk.addActionListener(this);this.add(textTalk);this.add(listOnline);JLabel lab1=new JLabel("玩家发送消息");JLabel lab2=new JLabel("<html>系<br>统<br>消<br>息<br>区<br>"); lab1.setBounds(1150, 20,80, 40);lab2.setBounds(5, 0,40,100);right.setBounds(890, 270, 120, 40);left.setBounds(130, 270, 120, 40);current.setBounds(560, 500, 120, 40);right1.setBounds(860, 270, 120, 40);left1.setBounds(100, 270, 120, 40);current1.setBounds(530, 500, 120, 40);this.add(lab1);this.add(lab2);this.add(right);this.add(left);this.add(current);this.add(right1);this.add(left1);this.add(current1);jta.setLocation(25, 5);jta.setSize(240, 100);jta.setVisible(true);jta1.setLocation(900, 5);jta1.setSize(140, 600);jta1.setVisible(true);start.setSize(60, 40);start.setLocation(540, 470);start.setFocusable(false);start.setVisible(true);start.setActionCommand("start");start.addActionListener(this);yes.setSize(73, 40);yes.setLocation(450, 470);yes.setFocusable(false);yes.setVisible(false);yes.setActionCommand("yes");yes.addActionListener(this);no.setSize(73, 40);no.setLocation(650, 470);no.setFocusable(false);no.setVisible(false);no.setActionCommand("no");no.addActionListener(this);jta.setEditable(true); //设置可编辑JScrollPane jsp = new JScrollPane(jta); //添加滚动条jsp.setBounds(25,0,240,100); //设置JScrollPane 宽100,高200jta1.setEditable(true); //设置可编辑JScrollPane jsp1 = new JScrollPane(jta1); //添加滚动条jsp1.setBounds(1110,50,150,500); //设置JScrollPane 宽100,高200this.add(jsp); //将组件加入容器this.add(jsp1); //将组件加入容器this.add(start);this.add(yes);this.add(no);}@Overridepublic void actionPerformed(ActionEvent e){String cmd=e.getActionCommand();if (e.getSource() instanceof JTextField){String s =textTalk.getText();if(s.length()>0){java.text.DateFormat format1 = new java.text.SimpleDateFormat("HH:mm:ss");String strTime = format1.format(new Date());strTime="("+strTime+")";jta1.append("玩家"+Id+": "+s+strTime);out.println("talk|"+s+"|"+Id+"|"+listOnline.getSelectedItem().toString());s = "";}textTalk.setText("");}if(e.getSource()==buttonTalk){String s =textTalk.getText();if(s.length()>0){java.text.DateFormat format1 = new java.text.SimpleDateFormat("HH:mm:ss");String strTime = format1.format(new Date());strTime="("+strTime+")";jta1.append(ername+": "+s+strTime+"\n");out.println("talk|"+s+"|"+Id+"|"+listOnline.getSelectedItem().toString());s="";}textTalk.setText("");}if(cmd.equals("start")){th.start();start.setVisible(false);start.setText("重新开局");start.setSize(100, 40);start.setActionCommand("restart");}else if(cmd.equals("yes")){out.println("21|"+Id+"|yes");yes.setText("出牌");no.setText("不出");no.setActionCommand("buchu");yes.setActionCommand("chu");yes.setVisible(false);no.setVisible(false);}else if(cmd.equals("no")){out.println("21|"+Id+"|no");yes.setText("出牌");no.setText("不出");no.setActionCommand("buchu");yes.setActionCommand("chu");yes.setVisible(false);no.setVisible(false);}else if(cmd.equals("chu")) //按键出牌{this.Chupai();}else if(cmd.equals("buchu")){if(PlayCard2.isEmpty()&&PlayCard1.isEmpty()){JOptionPane.showMessageDialog(null,"必须出牌","警告",JOptionPane.WARNING_MESSAGE);}else{PlayCard.clear();for(int i=0;i<LeftCard.size();i++){Integer p=(Integer)(LeftCard.get(i));int k2=p.intValue();labelPic[k2].setBounds(loc-(i+1)*25, 540, 80, 100);labelPic[k2].sign=false;}String send="22|"+Id+"|"+LeftCard.size();out.println(send);yes.setVisible(false);no.setVisible(false);isbuchuL.setVisible(false);isbuchuL.setVisible(false);ischupai=false;new Sound().play("buyao"+(int)(Math.random()*4+1));}}else if(cmd.equals("restart")){out.println("20|"+Id+"|start");start.setVisible(false);for(int i=0;i<20;i++){if(i<3)labdipai[i].setIcon(null);lab[i].setIcon(null);labl1[i].setIcon(null);labl2[i].setIcon(null);labr1[i].setIcon(null);labr2[i].setIcon(null);labelPic[i].setIcon(null);labr1[i].setBounds(1000,locr-i*25, 80, 100);labl1[i].setBounds(20,locl1-i*25, 80, 100);labelPic[i].setBounds(loc-(i+1)*25, 540, 80, 100);if(i<17){labr1[i].setIcon(newImageIcon(getClass().getResource("./tupian/"+0+".jpg")));labl1[i].setIcon(newImageIcon(getClass().getResource("./tupian/"+0+".jpg")));}}LeftCard.clear();PlayCard.clear();PlayCard1.clear();yes.setActionCommand("yes");yes.setText("叫地主");no.setActionCommand("no");no.setText("不叫");current.setText("当前牌数为17");left.setText("当前牌数为17");right.setText("当前牌数为17");isbuchuL.setVisible(false);isbuchuR.setVisible(false);current1.setText("");left1.setText("");right1.setText("");ischupai=false;}}public void connection(String name){try{//socket = new Socket("222.27.243.169",8189);socket = new Socket(IP,8189);toServer = socket.getOutputStream();in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out = new PrintWriter(toServer, true);out.println(name);while(true){String s = in.readLine();if(s!=null){if(s.substring(0,1).endsWith(" "))jta.append(s+"\n");elseDealMsg(s);}s = null;}}catch(IOException e){jta.append("Server doesn't start"+"\n");System.exit(-1);}}@Overridepublic void run(){if(Thread.currentThread()==th){this.connection(Username);}Calendar now;while(((Thread.currentThread()).getName()).equals("clock")){now = Calendar.getInstance();nowTime = now.getTime().getTime();}while(((Thread.currentThread()).getName()).equals("ti"))while(flag){leftTime = endTime - nowTime;leftSec = leftTime/1000;leftMin = leftTime/(60*1000);ibLeftSec.setText(leftSec+"秒");if(leftSec == 0){flag = false;JOptionPane.showMessageDialog(this, "超时!\n时间到", "超时" , JOptionPane.OK_OPTION);break;}}}public void Bupai(){for(int i=0;i<20;i++){labelPic[i]=new DealLabel();lab[i]=new JLabel();labl1[i]=new JLabel();labl2[i]=new JLabel();labr1[i]=new JLabel();labr2[i]=new JLabel();labelPic[i].setBounds(loc-(i+1)*25, 540, 80, 100);lab[i].setBounds(loc-i*25,420, 80, 100);labr1[i].setBounds(1000,locr-i*25, 80, 100);labr2[i].setBounds(930-i*25,300, 80, 100);//左边外面labl1[i].setBounds(20,locl1-i*25, 80, 100);labl2[i].setBounds(locl2-i*25,300, 80, 100);//右边外面if(i<3){labdipai[i]=new JLabel();labdipai[i].setBounds(600-i*40, 5, 80, 100);this.add(labdipai[i]);}if(i<17){labr1[i].setIcon(newImageIcon(getClass().getResource("./tupian/"+0+".jpg")));labl1[i].setIcon(newImageIcon(getClass().getResource("./tupian/"+0+".jpg")));}labelPic[i].setFocusable(false);labelPic[i].sign=false;labelPic[i].addMouseListener(this);this.add(lab[i]);this.add(labr1[i]);this.add(labr2[i]);this.add(labl1[i]);this.add(labl2[i]);this.add(labelPic[i]);}}@Overridepublic void mouseClicked(MouseEvent e){if(!e.isMetaDown()){//鼠标没有右击,已经左击if(!PlayCard.isEmpty())PlayCard.clear();for(int i=0;i<LeftCard.size();i++){Integer p=(Integer)(LeftCard.get(i));int k=p.intValue();if(e.getSource()==labelPic[k]){if(!labelPic[k].sign){labelPic[k].setBounds(loc-(i+1)*25, 520, 80, 100);labelPic[k].sign=true;}else{labelPic[k].setBounds(loc-(i+1)*25, 540, 80, 100);labelPic[k].sign=false;}}}}else //右键出牌{this.Chupai();}}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}public void AnMsg(String msg) //解析消息{StringTokenizer st = new StringTokenizer(msg,"|");int i=0;Arr=new int[20];while (st.hasMoreTokens()){if(i==0)Command=st.nextToken();else if(i==1)last=st.nextToken();elseArr[i-2]=Integer.parseInt(st.nextToken());i++;}}public String ChangeVector(ArrayList v){ //将向量封装成字符串String RealMsg="";for(int i=0;i<v.size();i++){RealMsg+="|"+v.get(i);}return RealMsg;}public void loadImg(){LeftCard.clear();System.out.println("接收到的牌:");for(int i=0;i<20;i++){labelPic[i].setIcon(null);labelPic[i].sign=false;if(Arr[i]!=0){labelPic[i].setIcon(newImageIcon(getClass().getResource("./tupian/"+Arr[i]+".jpg")));System.out.print(" "+Arr[i]);labelPic[i].setVisible(true);labelPic[i].number=Arr[i];LeftCard.add(i);}else{labelPic[i].setIcon(null);}labelPic[i].setBounds(loc-(i+1)*25, 540, 80, 100);}System.out.println();System.out.println();System.out.println();System.out.println("向量Leftcard"+LeftCard);System.out.println();System.out.println();if(LeftCard.size()!=17&&LeftCard.size()!=20){// JOptionPane.showMessageDialog(null, "发牌有误,重新发牌,请等待");//未处理out.println("error|"+this.Id);}}public void DealMsg(String s){StringTokenizer st = new StringTokenizer(s,"|");String command=st.nextToken();if(command.equals("ID")){Users[0]=st.nextToken();Users[1]=st.nextToken();Users[2]=st.nextToken();for(int i=0;i<3;i++){if(ername.equals(Users[i])){this.Id=i+1+"";labplayer[0].setText(ername);labplayer[0].setLocation(560, 470);}else listOnline.addItem(Users[i]);}int Idnum=Integer.parseInt(Id);labplayer[1].setText(Users[Idnum%3]);labplayer[1].setLocation(890, 250);labplayer[2].setText(Users[((Idnum%3)+1)%3]);labplayer[2].setLocation(130, 250);}if(command.equals("11")){this.AnMsg(s);this.loadImg();yes.setVisible(true);no.setVisible(true);}else if(command.equals("12")){last=st.nextToken();int next=Integer.parseInt(last)%3+1;dizhu=last;if(last.equals(Id)){this.AnMsg(s);this.loadImg();yes.setVisible(true);no.setVisible(true);jta.append("您,"+Users[Integer.parseInt(Id)-1]+"是地主\n");jta.append("地主:"+Users[Integer.parseInt(Id)-1]+"正在出牌\n");this.addtime(540, 430);ischupai=true;PlayCard1.clear();PlayCard2.clear();current1.setText("地主");current.setText("当前牌数为"+LeftCard.size());}else if(next==Integer.parseInt(Id)){jta.append(last+"是地主\n");left1.setText("地主");left.setText("当前牌数为"+20);this.addtime(200, 200);。

Java实现斗地主案例

Java实现斗地主案例

Java实现⽃地主案例本⽂实例为⼤家分享了Java实现⽃地主的具体代码,供⼤家参考,具体内容如下import java.util.ArrayList;import java.util.Collections;public class DemoPoker {public static void main(String[] args) {/***⼀、准备牌普通牌:2 A K (3)花⾊:♥♠♣♦王牌:⼤王⼩王创建⼀个集合,把牌组装之后存进去*/String[] numbers = {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"};String[] colors = {"♥", "♠", "♣", "♦"};ArrayList<String> pokerBox = new ArrayList<>();for (String color : colors) {for (String number : numbers) {pokerBox.add(color + number);}}pokerBox.add("⼤王");pokerBox.add("⼩王");/*** ⼆、洗牌static void shuffle(List<?> list) 使⽤默认的随机源随机置换指定的列表。

此处为了输出结果⼯整所以没有直接输出集合*/Collections.shuffle(pokerBox);for (int i = 0; i < pokerBox.size(); i++) {System.out.print(pokerBox.get(i)+"\t");if (i==26) {System.out.println();}}System.out.println();/*** 三、发牌遍历集合,⽤索引%3发牌,余0给玩家1,余1给玩家2,余2给玩家3索引0-50是玩家的牌,51-53是底牌*///玩家⼀ArrayList<String> player01 = new ArrayList<>();//玩家⼆ArrayList<String> player02 = new ArrayList<>();//玩家三ArrayList<String> player03 = new ArrayList<>();//底牌ArrayList<String> diPai = new ArrayList<>();for (int i = 0; i < pokerBox.size(); i++) {String faces = pokerBox.get(i);if (i>=51) {diPai.add(faces);} else if (i%3==0) {player01.add(faces);} else if (i%3==1) {player02.add(faces);} else if (i%3==2) {player03.add(faces);}}/*** 四、看牌直接输出每位玩家的集合*/System.out.println("张⽆忌"+player01);System.out.println("张翠⼭"+player02);System.out.println("殷素素"+player03);System.out.println("底牌"+diPai);}}带排序版的package com.demo_2.poker;import java.util.Collections;import java.util.HashMap;import java.util.LinkedList;import java.util.List;public class Poker {/***⼀共要四步。

四人斗地主java程序

四人斗地主java程序

package poker;/*** <p>Title: 斗地主</p>* <p>Description: </p>* <p>Copyright: Copyright (c) 2004</p>* <p>Company: </p>* @author 李艳生* @version 1.0*/import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.util.*;public class CallPokerDialog extends JDialog{JButton btnOne = new JButton();JButton btnTwo = new JButton();JButton btnThree = new JButton();JButton btnFour = new JButton();int score = PokerKernal.score;public CallPokerDialog() {try {jbInit();}catch(Exception e) {e.printStackTrace();}}private void jbInit() throws Exception {this.setSize(new Dimension(330, 80));//居中显示Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((screenSize.width - 330)/2,(screenSize.height - 80)/2);this.setModal(true);this.setResizable(false);this.setTitle("请叫牌");if(score==1){btnOne.setBackground(Color.pink);}else if(score==2){btnOne.setBackground(Color.pink);btnTwo.setBackground(Color.pink);}btnOne.setBounds(new Rectangle(11, 16, 67, 25));btnOne.setText("1分");btnOne.addActionListener(new CallPokerDialog_btnOne_actionAdapter(this));this.getContentPane().setLayout(null);btnTwo.setBounds(new Rectangle(82, 17, 73, 25));btnTwo.setText("2分");btnTwo.addActionListener(new CallPokerDialog_btnTwo_actionAdapter(this));btnThree.setBounds(new Rectangle(161, 17, 73, 25));btnThree.setText("3分");btnThree.addActionListener(new CallPokerDialog_btnThree_actionAdapter(this));btnFour.setBounds(new Rectangle(240, 16, 73, 25));btnFour.setSelected(false);btnFour.setText("不要");btnFour.addActionListener(new CallPokerDialog_btnFour_actionAdapter(this));this.getContentPane().add(btnOne, null);this.getContentPane().add(btnTwo, null);this.getContentPane().add(btnThree, null);this.getContentPane().add(btnFour, null);}void btnOne_actionPerformed(ActionEvent e) {if(score<1){PokerKernal.score = 1;PokerKernal.two.call = 1;this.dispose();}}void btnTwo_actionPerformed(ActionEvent e) {if(score<2){PokerKernal.two.call = 2;PokerKernal.score = 2;this.dispose();}}void btnThree_actionPerformed(ActionEvent e) {if(score<3){PokerKernal.two.call = 3;PokerKernal.score = 3;this.dispose();}}void btnFour_actionPerformed(ActionEvent e) {this.dispose();}}class CallPokerDialog_btnOne_actionAdapter implements java.awt.event.ActionListener { CallPokerDialog adaptee;CallPokerDialog_btnOne_actionAdapter(CallPokerDialog adaptee) {this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) {adaptee.btnOne_actionPerformed(e);}}class CallPokerDialog_btnTwo_actionAdapter implements java.awt.event.ActionListener { CallPokerDialog adaptee;CallPokerDialog_btnTwo_actionAdapter(CallPokerDialog adaptee) {this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) {adaptee.btnTwo_actionPerformed(e);}}class CallPokerDialog_btnThree_actionAdapter implements java.awt.event.ActionListener { CallPokerDialog adaptee;CallPokerDialog_btnThree_actionAdapter(CallPokerDialog adaptee) {this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) {adaptee.btnThree_actionPerformed(e);}}class CallPokerDialog_btnFour_actionAdapter implements java.awt.event.ActionListener { CallPokerDialog adaptee;CallPokerDialog_btnFour_actionAdapter(CallPokerDialog adaptee) {this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) {adaptee.btnFour_actionPerformed(e);}}package poker;/*** <p>Title: 斗地主</p>* <p>Description: 牌类</p>* <p>Copyright: Copyright (c) 2004</p>* <p>Company: </p>* @author 李艳生* @version 1.0*/import java.awt.*;import java.awt.image.*;public class Card {//牌名称private String name;//牌点数private int dot;//牌图片private Image img;public Card() {name = "";dot = 0;img = null;}public Card(String name, int dot, Image img) { = name;this.dot = dot;this.img = img;}public int getDot() {return dot;}public Image getImg() {return img;}public String getName() {return name;}public void setName(String name) { = name;}public void setImg(Image img) {this.img = img;}public void setDot(int dot) {this.dot = dot;}}package poker;/*** <p>Title: 斗地主</p>* <p>Description: 牌操作</p>* <p>Copyright: Copyright (c) 2004</p>* <p>Company: </p>* @author 李艳生* @version 1.0*/import java.awt.*;import java.awt.Graphics2D;import java.util.*;import java.awt.event.*;import javax.swing.*;import .URL;import .URLClassLoader;public class CardOperation {//所有牌对象集public static Vector cards = new Vector();public CardOperation() {}/**加载扑克图片*/public static void loadCards(Component cmp){//s--黑桃(spade) h--红桃(hearts) c--梅花(club) d--方块(diamond)String name[] = {"s","h","c","d"};String dot[] = {"3","4","5","6","7","8","9","10","j","q","k","a","2"};//权值int power[] = {3,4,5,6,7,8,9,10,11,12,13,14,15};URLClassLoader urlLoader = (URLClassLoader)cmp.getClass().getClassLoader();URL fileLoc = null;Card card = null;//先读52张牌for(int i=0; i<4;i++){for(int j=0;j<13;j++){fileLoc = urlLoader.findResource("cards/"+name[i]+dot[j]+".jpg");card = new Card(name[i]+dot[j], power[j], cmp.getToolkit().createImage(fileLoc));cards.addElement(card);}}//再读大小王fileLoc = urlLoader.findResource("cards/b.jpg");card = new Card("b",200,cmp.getToolkit().createImage(fileLoc));cards.addElement(card);fileLoc = urlLoader.findResource("cards/s.jpg");card = new Card("s",100,cmp.getToolkit().createImage(fileLoc));cards.addElement(card);//牌背景fileLoc = urlLoader.findResource("cards/bg.jpg");card = new Card("bg",0,cmp.getToolkit().createImage(fileLoc));cards.addElement(card);//初始化Card c = new Card();for(int i=0;i<54;i++){PokerKernal.postCards.addElement(c);}for(int i=0;i<20;i++){PokerKernal.oneCards.addElement(c);PokerKernal.twoCards.addElement(c);PokerKernal.threeCards.addElement(c);PokerKernal.selectCards.addElement(c);}PokerKernal.master = "one";}package poker;import javax.swing.*;import java.awt.*;import java.awt.event.*;/*** <p>Title: 斗地主</p>* <p>Description: </p>* <p>Copyright: Copyright (c) 2004</p>* <p>Company: </p>* @author 李艳生* @version 1.0*/public class HelpDialog extends JDialog {JTextArea txtHelp = new JTextArea();JButton btnOK = new JButton();public HelpDialog() throws HeadlessException {try {jbInit();}catch(Exception e) {e.printStackTrace();}}private void jbInit() throws Exception {//居中显示Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((screenSize.width - 450)/2,(screenSize.height - 350)/2);this.setSize(new Dimension(450, 350));this.setModal(true);this.setResizable(false);this.setTitle("游戏规则");txtHelp.setBackground(Color.black);txtHelp.setForeground(Color.green);txtHelp.setText("该游戏由三人玩一副牌,地主为一方,其余两家为一方,\n"+"双方对战,先出完的一方为胜。

java实现斗地主游戏

java实现斗地主游戏

java实现⽃地主游戏感想:第⼀次写博客,感觉编辑器挺复杂厉害的,感觉⾃⼰的内容挺简单的。

有什么问题请多多指教!思路:1、创建⼀个扑克牌的实体类Poker,设置了四个参数:花⾊、数字、牌值(判断⼤⼩)、是否地主牌,实现getset⽅法和构造⽅法;2、创建⼀个玩家的实体类Player,设置了四个参数:初始牌集合,排序后牌集合,牌值集合,是否地主,实现getset⽅法和构造⽅法;3、洗牌:循环嵌套花⾊数组跟数字数组⽣成52个Poker,⼿动加⼊⼤⼩王Poker,放进map(int,Poker)⾥⾯,利⽤Collections.shuffle随机排序map的key,再根据key⽣成排序后的Poker集合4、发牌:⽣成3个玩家对象,拿到洗牌后的集合,前51张牌为玩家牌,后3张为地主牌,在51张牌中随机⼀张为地主牌,遍历玩家牌分配个每⼀个Player,同时根据玩家牌的牌值⽣成集合grades存进Player对象中,将grades转为int数组并进⾏升序排序,根据grade取得新Poker集合分配给玩家。

Poker类:package pany;public class Poker {private String color;private String number;private int grade;boolean isLandowners;public boolean isLandowners() {return isLandowners;}public void setLandowners(boolean landowners) {isLandowners = landowners;}public int getGrade() {return grade;}public void setGrade(int grade) {this.grade = grade;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public Poker() {}public Poker(String color, String number ,int grade,boolean isLandowners) {this.color = color;this.number = number;this.grade=grade;this.isLandowners=isLandowners;}public String toString() {return this.getColor()+this.getNumber();}}Player类:package pany;import java.util.ArrayList;import java.util.LinkedList;public class Player {private ArrayList<Poker> pokers;private boolean isLandower;private ArrayList<Poker> newPokers;private LinkedList<Integer> grades;public LinkedList<Integer> getGrades() {return grades;}public void setGrades(LinkedList<Integer> grades) {this.grades = grades;}public ArrayList<Poker> getNewPokers() {return newPokers;}public void setNewPokers(ArrayList<Poker> newPokers) {this.newPokers = newPokers;}public boolean isLandower() {return isLandower;}public void setLandower(boolean landower) {isLandower = landower;}public Player() {}public ArrayList<Poker> getPokers() {return pokers;}public void setPokers(ArrayList<Poker> pokers) {this.pokers = pokers;}}洗牌:/*洗牌*/public static LinkedList<Poker> getPokerList() {LinkedList<Poker> pokers = new LinkedList<Poker>();LinkedList<Poker> newPokers = new LinkedList<Poker>();ArrayList<Integer> arrayList = new ArrayList<>();int[] arr;/*⽣成54张扑克牌(Poker对象)*//*⽤嵌套循环⽣成从⽅块3到⿊桃2的Poker对象,放进Poker的LinkedList保证顺序*/ String[] colors = {"♦", "♣", "♥", "♠"};String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}; for (int i = 0; i < numbers.length; i++) {for (int j = 0; j < colors.length; j++) {Poker p = new Poker(colors[j], numbers[i], (4 * i) + j + 1, false);pokers.add(p);}}/*添加⼤⼩王*/pokers.add(new Poker("black", "☆", 53, false));pokers.add(new Poker("red", "☆", 54, false));/*将⽣成的54张扑克牌从1到54放进map*/for (int z = 1; z <= pokers.size(); z++) {map.put(z, pokers.get(z - 1));}/*遍历Map,将每个Poker对应的key放进 ArrayList<Integer> arrayList */Set<Map.Entry<Integer, Poker>> set = map.entrySet();Iterator it = set.iterator();while (it.hasNext()) {Map.Entry<Integer, Poker> e = (Map.Entry<Integer, Poker>) it.next();arrayList.add(e.getKey());}/*利⽤Collections.shuffle随机排序key*/Collections.shuffle(arrayList);/*将乱序后的key对于的Poker放进newPokers⾥⾯ */for (Integer i : arrayList) {newPokers.add(map.get(i));}return newPokers;}发牌:/*发牌*//*根据玩家⼈数⽣成Player,默认num=3*/private static void sentPoker(int num) {/*获取洗牌后的LinkedList,保证顺序*/LinkedList<Poker> Allpokers = getPokerList();ArrayList<Poker> pokers = new ArrayList<>();ArrayList<Poker> BottomPokers = new ArrayList<>();/*⽣成玩家对象*/for (int i = 0; i < num; i++) {Player p = new Player();players.add(p);}/*前50张牌为玩家牌,后三张为底牌*/for (int p = 0; p < Allpokers.size(); p++) {if (p <= 50) {pokers.add(Allpokers.get(p));} else {BottomPokers.add(Allpokers.get(p));}}/*玩家牌中随机⼀张为地主牌*/Random rand = new Random();int s = rand.nextInt(51);pokers.get(s).setLandowners(true);System.out.println("地主牌: " + pokers.get(s));/*根据num⽣成Player对象*/for (int j = 0; j < num; j++) {/*玩家的牌值集合*/LinkedList<Integer> grades = new LinkedList<>();/*玩家的⼿牌集合*/ArrayList<Poker> playerPokers = new ArrayList<Poker>();/*根据玩家个数分配玩家牌*/for (int z = j; z < pokers.size(); z = z + num) {playerPokers.add(pokers.get(z));grades.add(pokers.get(z).getGrade());players.get(j).setPokers(playerPokers);players.get(j).setGrades(grades);}/*根据玩家牌中的地主牌设置玩家是否地主*/for (Poker p : players.get(j).getPokers()) {if (p.isLandowners() == true) {players.get(j).setLandower(true);}}/*根据玩家的牌值集合⽣成数组*/Integer[] gs = new Integer[players.get(j).getGrades().size()];grades.toArray(gs);/*排序数组,由低到⾼*/Arrays.sort(gs);/*排序后的玩家牌*/ArrayList<Poker> newPokers = new ArrayList<>();for (int g = 0; g < gs.length; g++) {Poker p = map.get(gs[g]);newPokers.add(p);}players.get(j).setNewPokers(newPokers);System.out.println("玩家" + (j + 1) + ": " + players.get(j).getNewPokers() + " 是否地主:" + players.get(j).isLandower()); }System.out.print("底牌为: ");for (Poker p : BottomPokers) {System.out.print(p + " ");}}效果如下:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

java模拟斗地主发牌功能

java模拟斗地主发牌功能

java模拟⽃地主发牌功能本⽂实例为⼤家分享了java模拟⽃地主发牌的具体代码,供⼤家参考,具体内容如下1.案例介绍规则:组装54张扑克牌54张牌顺序打乱三个玩家参与游戏,三⼈交替摸牌,每⼈17张牌,后三张留作底牌查看三⼈各⾃⼿中的牌(按照牌的⼤⼩排序)、底牌2. 分析1)、准备牌:完成数字与纸牌的映射关系:使⽤双列Map(HashMap)集合,完成⼀个数字与字符串纸牌的对应关系(相当于⼀个字典)。

2)、洗牌:通过数字完成洗牌发牌发牌:将每个⼈以及底牌设计为ArrayList,将后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。

存放的过程中要求数字⼤⼩与⽃地主规则的⼤⼩对应。

将代表不同纸牌的数字分配给不同的玩家与底牌。

3)、看牌:通过Map集合找到对应字符展⽰。

通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进⾏展⽰。

3.代码public class Test7 {public static void main(String[] args) {//定义⼀个Map集合和List集合来存取牌号和索引Map<Integer, String> map = new HashMap();List<Integer> pokerindex = new ArrayList<>();//定义牌String[] num = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};String[] color = {"♥", "♠", "♣", "♦"};//存牌号和与之对应的索引int index = 0;for (String s : num) {for (String c : color) {map.put(index, c + s);pokerindex.add(index);index++;}}//存⼤⼩王map.put(index, "⼤王");pokerindex.add(index);index++;map.put(index, "⼩王");pokerindex.add(index);//打乱牌组;Collections.shuffle(pokerindex);//创建四个集合List<Integer> dipai = new ArrayList<>();List<Integer> player1 = new ArrayList<>();List<Integer> player2 = new ArrayList<>();List<Integer> player3 = new ArrayList<>();//将打乱的索引数组分配给三个⼈for (int i = 0; i < pokerindex.size(); i++) {if (i > 50) {dipai.add(pokerindex.get(i));} else if (i % 3 == 0) {player1.add(pokerindex.get(i));} else if (i % 3 == 2) {player2.add(pokerindex.get(i));} else if (i % 3 == 1) {player3.add(pokerindex.get(i));}}//给每个⼈的牌组排序Collections.sort(player1);Collections.sort(player2);Collections.sort(player3);Collections.sort(dipai);//显⽰每个⼈的牌组show("张三", map, player1);show("李四", map, player2);show("王五", map, player3);show("底牌", map, dipai);}//定义⼀个⽅法⽤来显⽰牌组public static void show(String name, Map<Integer, String> map, List<Integer> player) {System.out.print(name);for (int i = 0; i < player.size(); i++) {Integer ii = player.get(i);System.out.print(map.get(ii) + " ");}System.out.println();}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

Java实现斗地主之洗牌发牌

Java实现斗地主之洗牌发牌

Java实现⽃地主之洗牌发牌本⽂通过实例为⼤家分享了Java实现⽃地主之洗牌发牌的具体代码,供⼤家参考,具体内容如下案例分析需求:实现⽃地主过程中的洗牌,发牌和看牌。

并且确保每⼀位玩家⼿上拿到的牌是随机并且按照⼤⼩排序好的思路1.创建⼀个牌盒,也就是定义⼀个集合对象,⽤ArrayList集合实现2.往牌盒⾥⾯装牌3.洗牌,也就是把牌打散,⽤Collections的shuffle()⽅法实现4.发牌,也就是遍历结合,给三个玩家发牌5.看牌,也就是三个玩家分别遍历⾃⼰的牌代码实现1.创建牌盒,存放所有牌//创建⼀个牌盒,也就是定义⼀个集合对象,⽤ArrayList集合实现ArrayList<String> poker=new ArrayList<String>();2.往牌盒⾥⾯放⼊所有牌组//往牌盒⾥⾯装牌/*◆2,◆3,◆4.....◆k,◆A♣2,...♥2,...♠2,...⼩王 , ⼤王*///定义花⾊数组String[] colors={"◆","♣","♥","♠"};//定义点数数组String[] numbers={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};//将所有牌组合放⼊牌盒for(String col:colors){for(String num:numbers){poker.add(col+num);}}//将最后两张⼤⼩王放⼊牌盒poker.add("⼩王");poker.add("⼤王");3. 洗牌,也就是把牌打散,⽤Collections的shuffle()⽅法实现//洗牌---把牌打乱Collections.shuffle(poker);4. 发牌,也就是遍历结合,给三个玩家发牌//发牌--》遍历牌盒,给三个玩家发牌ArrayList<String> p1=new ArrayList<>();ArrayList<String> p2=new ArrayList<>();ArrayList<String> p3=new ArrayList<>();//留下三张底牌ArrayList<String> dp=new ArrayList<>();//将牌分发for(int i=0;i<poker.size();i++){if(i>=poker.size()-3){dp.add(poker.get(i));}else if(i%3==0){p1.add(poker.get(i));}else if(i%3==1){p2.add(poker.get(i));}else if(i%3==2){p3.add(poker.get(i));}}5. 看牌,也就是三个玩家分别遍历⾃⼰的牌//看牌---分别展⽰三位玩家⾃⼰的牌show("⼤忽悠",p1);show("⼩忽悠",p2);show("超级⽆敌⼤忽悠",p3);//展⽰底牌System.out.print("底牌如下: ");for(var Dp:dp)System.out.print(Dp+" ");看牌的⽅法定义:public static void show(String name,ArrayList<String> arr){System.out.print(name+"的牌: ");for(int i=0;i<arr.size();i++){System.out.print(arr.get(i)+" ");}System.out.println();}完整代码和演⽰结果完整代码:import java.util.ArrayList;import java.util.Collections;import java.util.Scanner;public class Main{public static void main(String[] args){//创建⼀个牌盒,也就是定义⼀个集合对象,⽤ArrayList集合实现ArrayList<String> poker=new ArrayList<String>();//往牌盒⾥⾯装牌/*◆2,◆3,◆4.....◆k,◆A♣2,...♥2,...♠2,...⼩王 , ⼤王*///定义花⾊数组String[] colors={"◆","♣","♥","♠"};//定义点数数组String[] numbers={"2","3","4","5","6","7","8","9","10","J","Q","K","A"}; //将所有牌组合放⼊牌盒for(String col:colors){for(String num:numbers){poker.add(col+num);}}//将最后两张⼤⼩王放⼊牌盒poker.add("⼩王");poker.add("⼤王");//洗牌---把牌打乱Collections.shuffle(poker);//发牌--》遍历牌盒,给三个玩家发牌ArrayList<String> p1=new ArrayList<>();ArrayList<String> p2=new ArrayList<>();ArrayList<String> p3=new ArrayList<>();//留下三张底牌ArrayList<String> dp=new ArrayList<>();//将牌分发for(int i=0;i<poker.size();i++){if(i>=poker.size()-3){dp.add(poker.get(i));}else if(i%3==0){p1.add(poker.get(i));}else if(i%3==1){p2.add(poker.get(i));}else if(i%3==2){p3.add(poker.get(i));}}//看牌---分别展⽰三位玩家⾃⼰的牌show("⼤忽悠",p1);show("⼩忽悠",p2);show("超级⽆敌⼤忽悠",p3);//展⽰底牌System.out.print("底牌如下: ");for(var Dp:dp)System.out.print(Dp+" ");}public static void show(String name,ArrayList<String> arr){System.out.print(name+"的牌: ");for(int i=0;i<arr.size();i++){System.out.print(arr.get(i)+" ");}System.out.println();}}哈希表优化区别: 上⾯是⽤⼀个字符串数组来存储所有牌的组合,并且也是对字符串数组进⾏洗牌操作,较为⿇烦,⽽⽤哈希表之后,我们可以对每⼀张牌对应的索引进⾏洗牌操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

package poker;/*** <p>Title: 斗地主</p>* <p>Description: </p>* <p>Copyright: Copyright (c) 2004</p>* <p>Company: </p>* author 艳生* version 1.0*/import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.util.*;public class CallPokerDialog extends JDialog{JButton btnOne = new JButton();JButton btnTwo = new JButton();JButton btnThree = new JButton();JButton btnFour = new JButton();int score = PokerKernal.score;public CallPokerDialog() {try {jbInit();}catch(Exception e) {e.printStackTrace();}}private void jbInit() throws Exception {this.setSize(new Dimension(330, 80));//居中显示Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((screenSize.width - 330)/2,(screenSize.height - 80)/2);this.setModal(true);this.setResizable(false);this.setTitle("请叫牌");if(score==1){btnOne.setBackground(Color.pink);}else if(score==2){btnOne.setBackground(Color.pink);btnTwo.setBackground(Color.pink);}btnOne.setBounds(new Rectangle(11, 16, 67, 25));btnOne.setText("1分");btnOne.addActionListener(newCallPokerDialog_btnOne_actionAdapter(this));this.getContentPane().setLayout(null);btnTwo.setBounds(new Rectangle(82, 17, 73, 25));btnTwo.setText("2分");btnTwo.addActionListener(newCallPokerDialog_btnTwo_actionAdapter(this));btnThree.setBounds(new Rectangle(161, 17, 73, 25));btnThree.setText("3分");btnThree.addActionListener(newCallPokerDialog_btnThree_actionAdapter(this));btnFour.setBounds(new Rectangle(240, 16, 73, 25));btnFour.setSelected(false);btnFour.setText("不要");btnFour.addActionListener(newCallPokerDialog_btnFour_actionAdapter(this));this.getContentPane().add(btnOne, null);this.getContentPane().add(btnTwo, null);this.getContentPane().add(btnThree, null);this.getContentPane().add(btnFour, null);}void btnOne_actionPerformed(ActionEvent e) {if(score<1){PokerKernal.score = 1;PokerKernal.two.call = 1;this.dispose();}}void btnTwo_actionPerformed(ActionEvent e) {if(score<2){PokerKernal.two.call = 2;PokerKernal.score = 2;this.dispose();}}void btnThree_actionPerformed(ActionEvent e) {if(score<3){PokerKernal.two.call = 3;PokerKernal.score = 3;this.dispose();}}void btnFour_actionPerformed(ActionEvent e) {this.dispose();}}class CallPokerDialog_btnOne_actionAdapter implements java.awt.event.ActionListener {CallPokerDialog adaptee;CallPokerDialog_btnOne_actionAdapter(CallPokerDialog adaptee) { this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) {adaptee.btnOne_actionPerformed(e);}}class CallPokerDialog_btnTwo_actionAdapter implements java.awt.event.ActionListener {CallPokerDialog adaptee;CallPokerDialog_btnTwo_actionAdapter(CallPokerDialog adaptee) { this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) {adaptee.btnTwo_actionPerformed(e);}}class CallPokerDialog_btnThree_actionAdapter implements java.awt.event.ActionListener {CallPokerDialog adaptee;CallPokerDialog_btnThree_actionAdapter(CallPokerDialog adaptee) {this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) {adaptee.btnThree_actionPerformed(e);}}class CallPokerDialog_btnFour_actionAdapter implements java.awt.event.ActionListener {CallPokerDialog adaptee;CallPokerDialog_btnFour_actionAdapter(CallPokerDialog adaptee) { this.adaptee = adaptee;}public void actionPerformed(ActionEvent e) {adaptee.btnFour_actionPerformed(e);}}package poker;/*** <p>Title: 斗地主</p>* <p>Description: 牌类</p>* <p>Copyright: Copyright (c) 2004</p>* <p>Company: </p>* author 艳生* version 1.0*/import java.awt.*;import java.awt.image.*;public class Card {//牌名称private String name;//牌点数private int dot;//牌图片private Image img;public Card() {name = "";dot = 0;img = null;}public Card(String name, int dot, Image img) { = name;this.dot = dot;this.img = img;}public int getDot() {return dot;}public Image getImg() {return img;}public String getName() {return name;}public void setName(String name) { = name;}public void setImg(Image img) { this.img = img;}public void setDot(int dot) { this.dot = dot;}}package poker;/*** <p>Title: 斗地主</p>* <p>Description: 牌操作</p>* <p>Copyright: Copyright (c) 2004</p> * <p>Company: </p>* author 艳生* version 1.0*/import java.awt.*;import java.awt.Graphics2D;import java.util.*;import java.awt.event.*;import javax.swing.*;import .URL;import .URLClassLoader;public class CardOperation {//所有牌对象集public static Vector cards = new Vector();public CardOperation() {}/**加载扑克图片*/public static void loadCards(Component cmp){//s--黑桃(spade) h--红桃(hearts) c--梅花(club) d--方块(diamond)String name[] = {"s","h","c","d"};String dot[] = {"3","4","5","6","7","8","9","10","j","q","k","a","2"};//权值int power[] = {3,4,5,6,7,8,9,10,11,12,13,14,15};URLClassLoader urlLoader = (URLClassLoader)cmp.getClass().getClassLoader();URL fileLoc = null;Card card = null;//先读52牌for(int i=0; i<4;i++){for(int j=0;j<13;j++){fileLoc = urlLoader.findResource("cards/"+name[i]+dot[j]+".jpg");card = new Card(name[i]+dot[j], power[j], cmp.getToolkit().createImage(fileLoc));cards.addElement(card);}}//再读大小王fileLoc = urlLoader.findResource("cards/b.jpg");card = new Card("b",200,cmp.getToolkit().createImage(fileLoc));cards.addElement(card);fileLoc = urlLoader.findResource("cards/s.jpg");card = new Card("s",100,cmp.getToolkit().createImage(fileLoc));cards.addElement(card);//牌背景fileLoc = urlLoader.findResource("cards/bg.jpg");card = new Card("bg",0,cmp.getToolkit().createImage(fileLoc));cards.addElement(card);//初始化Card c = new Card();for(int i=0;i<54;i++){PokerKernal.postCards.addElement(c);}for(int i=0;i<20;i++){PokerKernal.oneCards.addElement(c);PokerKernal.twoCards.addElement(c);PokerKernal.threeCards.addElement(c);PokerKernal.selectCards.addElement(c);}PokerKernal.master = "one";}package poker;import javax.swing.*;import java.awt.*;import java.awt.event.*;/*** <p>Title: 斗地主</p>* <p>Description: </p>* <p>Copyright: Copyright (c) 2004</p>* <p>Company: </p>* author 艳生* version 1.0*/public class HelpDialog extends JDialog {JTextArea txtHelp = new JTextArea();JButton btnOK = new JButton();public HelpDialog() throws HeadlessException {try {jbInit();}catch(Exception e) {e.printStackTrace();}}private void jbInit() throws Exception {//居中显示Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((screenSize.width - 450)/2,(screenSize.height - 350)/2);this.setSize(new Dimension(450, 350));this.setModal(true);this.setResizable(false);this.setTitle("游戏规则");txtHelp.setBackground(Color.black);txtHelp.setForeground(Color.green);txtHelp.setText("该游戏由三人玩一副牌,地主为一方,其余两家为一方,\n"+"双方对战,先出完的一方为胜。

相关文档
最新文档