斗地主--Java课程设计

合集下载

JAVA课程设计纸牌游戏

JAVA课程设计纸牌游戏

for(i=1;i<=52;i++) { data[i-1]=i;//录入 52 张牌的编号。 flag[i-1]=0;//将相应编号纸牌的翻牌数初始化为 0。 } for(i=2;i<=52;i++)//外循环,基数循环。 { for(j=1;j<=52;j++)//内循环,基数倍数条件判断。 { if(j%i==0) { data[j-1]=data[j-1]*Flag;//将翻转后的结果更新 data 中的数 据。 flag[j-1]++;//翻牌一次,即记入 flag 数组中。 } } } System.out.printf("\t 最后所有正面向上的牌有:\n"); for(i=0;i<52;i++) { if(data[i]>0)//所有大于 0 的数即为正面向上的纸牌。 System.out.printf(" 第%d 张牌 ",i+1); } System.out.printf("\n");以上为程序主要代码的分析。 在程序中,主要还包括功能界面,如下: System.out.printf("\t-----------------------------------------------------\n"); System.out.printf("\t-----------------------------------------------------\n"); System.out.printf("\t------欢迎进入纸牌游戏 --------\n"); System.out.printf("\t------1.查看题目 --------\n"); System.out.printf("\t------2.查看所有纸牌的翻牌次数 --------\n"); System.out.printf("\t------3.查看指定编号纸牌翻牌记录 --------\n"); System.out.printf("\t------4.查看最终正面向上的纸牌编号 --------\n"); System.out.printf("\t------5.制作人信息 --------\n"); System.out.printf("\t------0.按 0 键结束 --------\n"); System.out.printf("\t-----------------------------------------------------\n"); System.out.printf("\t-----------------------------------------------------\n"); 同时,整个功能实现由 do-while 语句和 switch 语句组合而成,do-while 语句可以保证界 面最少运行一次,switch 语句保证每个功能独立实现,通过 choice 的输入来进入不同的功 能,同时在每个小的独立功能内,我都添加了独立判断是否回到主菜单的语句,如下: System.out.printf("是否回到主菜单?(Y/N):"); n = sc.next(); if(n.equals("Y"))break; else if(n.equals("N")) choice=0;

JAVA实现斗地主

JAVA实现斗地主

JAVA实现⽃地主《⽹络编程》结课报告课题⽃地主学院计算机学院专业计算机科学与技术班级17052318姓名任庆(17220624)指导教师吴永胜完成⽇期2020 年5⽉⽬录第1章绪论 (3)第2章系统设计 (3)2.1⽹络通信 (3)1.传输层协议选择:TCP (3)2.通信草图 (3)2.2同步 (4)1.游戏五⼤阶段 (4)2.流程图 (4)2.3语法语义分析 (4)1.范围 (4)2.语法 (4)3.语义 (4)第3章编码调试 (5)3.1TCP通信 (5)1.客户端 (5)2.服务器 (5)3.实现 (6)3.2同步 (7)1.阶段定义 (7)2.信号量 (7)3.主服务器 (7)4.服务器接收端 (8)5.主客户端 (8)6.客户端接收器 (8)7.同步序列码 (9)3.3语法语义 (9)1.卡牌定义 (9)2.出牌类型 (9)3.语法检查 (10)4.⽐较⼤⼩ (10)3.4打印卡牌 (10)1.原理 (10)2.实现效果 (11)第4章测试运⾏ (11)4.1Waiting (11)4.2Preparation (12)4.3Selecting (12)4.4Running (13)4.5Finish (13)第5章体会总结 (14)参考⽂献 (14)第1章绪论因为这门课是⽹络编程嘛,当然要完成的东西得在多台机器上完成,围绕着通信这个核⼼基础功能展开,因为⽃地主⼩时候玩的⽐较多,对⾥⾯的规则⾮常的熟悉,⽽且我感觉这个游戏刚好是我能够做的,感觉做起来会⽐较有意思,所以选了这个游戏来进⾏开发。

正巧这个学期选了⼀门JA V A语⾔,也为了更加深⼊的了解⼀下这门语⾔,所以决定选这门语⾔作为这个游戏的开发语⾔。

第2章系统设计2.1 ⽹络通信1.传输层协议选择:TCP原因:因为这个游戏数据传输⽐较严谨,有⼀点差错系统可能就瘫痪了,所以选择TCP来作为通信基础。

2.通信草图服务器得有⼀个监听线程,若监听到⼀个客户端,就创建⼀个接收线程和⼀个发送线程负责和客户端进⾏通信,因为是⽃地主,三⼈游戏,三个客户端就够了。

局域网斗地主(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集合案例之⽃地主游戏的具体代码,供⼤家参考,具体内容如下题⽬要求:通过⾃制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课程设计

打豆豆游戏 java课程设计一、课程目标知识目标:1. 让学生掌握Java基础语法,包括变量、数据类型、运算符、控制结构等。

2. 帮助学生理解面向对象编程思想,熟练运用类和对象。

3. 使学生掌握Java图形用户界面(GUI)编程,能使用Swing组件开发打豆豆游戏界面。

技能目标:1. 培养学生运用Java编程解决问题的能力,能独立设计、编写和调试打豆豆游戏代码。

2. 提高学生分析问题的能力,使他们能够根据游戏需求进行模块划分和功能实现。

3. 培养学生的团队协作能力,通过小组合作完成游戏开发。

情感态度价值观目标:1. 培养学生对编程的兴趣,激发他们主动探索新技术的热情。

2. 培养学生克服困难的勇气和信心,使他们勇于面对和解决问题。

3. 培养学生的创新精神,鼓励他们发挥想象力和创造力,设计和实现个性化的打豆豆游戏。

课程性质:本课程为实践性较强的Java课程设计,旨在让学生通过动手实践,掌握Java编程的基本知识和技能。

学生特点:学生已具备一定的Java基础,具有较强的学习能力和动手能力,但对实际项目的开发经验不足。

教学要求:注重理论与实践相结合,充分调动学生的积极性,引导他们主动探究和解决问题。

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

二、教学内容1. Java基础语法复习:变量、数据类型、运算符、控制结构(条件语句、循环语句)。

2. 面向对象编程:类与对象、封装、继承、多态。

3. Java图形用户界面(GUI)编程:- Swing组件:JFrame、JButton、JPanel等。

- 事件处理:动作事件、鼠标事件、键盘事件。

4. 游戏设计:- 游戏需求分析:功能模块划分、界面设计。

- 游戏逻辑实现:豆豆移动、得分计算、游戏结束判定。

- 游戏界面绘制:使用Swing组件搭建游戏界面。

5. 项目实践:- 分组讨论:小组成员共同分析游戏需求,进行任务分配。

- 代码编写:根据分工,完成各自模块的代码编写。

java简单实现斗地主发牌功能

java简单实现斗地主发牌功能

java简单实现⽃地主发牌功能本⽂实例为⼤家分享了java简单实现⽃地主发牌的具体代码,供⼤家参考,具体内容如下问题:参考⽃地主的游戏规则,完成⼀个发牌的功能(54张牌,考虑点数,花⾊;三名玩家,其中地主⽐其他玩家多3张牌)要求实现以下功能:1、洗牌2、发牌(发牌按照常规⽅式A-B-C-A-B-C-A…,不允许⼀次性随机17张给某个玩家)3、玩家⼿中牌的展⽰(要求按点数实现排序)分析运⽤⾯向对象的程序设计思维分为扑克、玩家和游戏三部分,扑克类属性有花⾊,点数,次序;玩家类属性有玩家id,昵称,是否地主,牌的集合;游戏过程分为洗牌,随机产⽣地主,发牌,完成牌的排序,玩家⼿⾥的牌展⽰功能程序实现package com.lesson17.homework;/*** @author HUC**//**扑克类*/public class Poker {/** 扑克花⾊ */private String flower;/** 扑克点数 */private String pointer;/** 扑克顺序 */private int sort;public Poker(String flower, String pointer, int sort) {super();this.flower = flower;this.pointer = pointer;this.sort = sort;}public String getFlower() {return flower;}public void setFlower(String flower) {this.flower = flower;}public String getPointer() {return pointer;}public void setPointer(String pointer) {this.pointer = pointer;}public int getSort() {return sort;}public void setSort(int sort) {this.sort = sort;}@Overridepublic String toString() {return flower + pointer;}package com.lesson17.homework;public class Player {/** 玩家id */private int id;/** 玩家昵称 */private String name;/** 玩家拿到的牌 */private ArrayList<Poker> pokers = new ArrayList<>();/** 玩家是否地主 */private boolean boss;public Player(int id, String name) {super();this.id = id; = name;}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 ArrayList<Poker> getPokers() {return pokers;}public void setPokers(ArrayList<Poker> pokers) {this.pokers = pokers;}public boolean isBoss() {return boss;}public void setBoss(boolean boss) {this.boss = boss;}package com.lesson17.homework;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;import java.util.Random;public class PokerGame {static List<Player> players;static ArrayList<Poker> list = new ArrayList<>();static String[] flowers = {"⽅块","梅花","⿊桃","红⼼"};static String[] pointers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; int bossIndex; //地主索引static{//初始化扑克for (int i = 0; i < flowers.length; i++) {for (int j = 0; j < pointers.length; j++) {//⽣成⼀张扑克对象Poker p = new Poker(flowers[i], pointers[j], j);list.add(p);}}//单独将⼤⼩王加⼊集合list.add(new Poker("⼩", "王", 13));list.add(new Poker("⼤", "王", 14));//初始化玩家players = Arrays.asList(new Player(1, "刘备"),new Player(2, "关⽻"),new Player(3, "张飞"));}/**洗牌*/public void washPoker(){Collections.shuffle(list);}/**随机地主*/public void pushBoss(){Random r = new Random();bossIndex = r.nextInt(players.size());//设置被随机到的玩家为地主players.get(bossIndex).setBoss(true);}/**依次发牌*/public void pushPoker(){for (int i = 0; i < 51; i+=3) {players.get(0).getPokers().add(list.get(i));players.get(1).getPokers().add(list.get(i+1));players.get(2).getPokers().add(list.get(i+2));}for(int i = 51;i < 54 ;i++){//将最后剩余的牌(3张)全部给地主players.get(bossIndex).getPokers().add(list.get(i));}}/**排序*/public void sortPoker() {Collections.sort(players.get(0).getPokers(), (a,b)->a.getSort()-b.getSort()); Collections.sort(players.get(1).getPokers(), (a,b)->a.getSort()-b.getSort()); Collections.sort(players.get(2).getPokers(), (a,b)->a.getSort()-b.getSort()); }public void start(){//随机地主pushBoss();//洗牌washPoker();//发牌pushPoker();//排序sortPoker();//展⽰牌for(Player p : players){System.out.println(p.getPokers());}}public static void main(String[] args) {new PokerGame().start();}}结果以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

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基础语法复习、面向对象编程;第二周:斗地主游戏规则介绍、牌类设计与实现;第三周:游戏界面设计、游戏逻辑实现(发牌、出牌);第四周:游戏逻辑实现(跟牌、提示)、异常处理;第五周:游戏测试与优化、团队协作与沟通。

(完整word版)斗地主--Java课程设计

(完整word版)斗地主--Java课程设计

《面向对象程序设计》课程设计报告题目:斗地主软件设计与实现院(系):信息科学与工程学院专业班级:计算机科学与技术1201班学生姓名:程伟学号:20121183011指导教师:吴奕20 14 年 12 月 29 日至20 15 年 1 月 9 日华中科技大学武昌分校制面向对象程序设计课程设计任务书目录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排错处理 (47)总结 (47)1需求与总体设计1.1需求分析游戏设计需要用到牌Card的正反面及牌的移动,还有CardType设计出牌种类,还有各种牌的形式,还要设计几个人玩游戏,抢地主的方法,出牌倒计时,出牌和不出牌等等,另外还要设计54张牌,打牌出现的各种结果。

1.2总体设计本游戏实现了图形界面的设计、游戏区模块,游戏控制模块,级别设置模块和帮助模块。

为玩家提供主体游戏功能,能够处理玩家的各种游戏操作,并最终显示游戏结果。

1.3功能图1.4类图2详细设计2.1主类Main图表说明如下:2.2类Card(1)类图(2)说明:该类主要是设计牌面的正反、牌之间的距离、移动(即出牌时向前移动纸牌),其中有:boolean up;//是否正反面;boolean canClick=false;//是否可被点击boolean clicked=false;//是否点击过;String name;//图片url名字Main main;//Main类的引用2.3类CardTypepublic enum CardType 列出各种出牌的类型2.4类Common1)判断牌型public static CardType jugdeType()2)移动效果的函数,用于发牌public static void move()3)对牌的排序public static void order()4)重新定位 flag代表电脑1 ,2 或者是我public static void rePosition()5)地主牌权值,看是否抢地主public static int getScore()6)返回花色public static int getColor()7)得到最大相同数public static void getMax()8)拆牌public static Model getModel()各种对子、顺子、飞机、炸弹9)拆连子public static void get123()10)拆双顺public static void getTwoTwo()11)拆飞机public static void getPlane()12)拆炸弹public static void getBoomb()13)拆3带public static void getThree()14)拆对子public static void getTwo()15)拆单牌public static void getSingle()16)隐藏之前出过的牌public static void hideCards()17)检查牌的是否能出public static int checkCards()2.5类Model各种牌型public class ModelList<String> a1=new ArrayList<String>(); //单张List<String> a2=new ArrayList<String>(); //对子List<String> a3=new ArrayList<String>(); //3带List<String> a123=new ArrayList<String>(); //连子List<String> a112233=new ArrayList<String>(); //连牌List<String> a111222=new ArrayList<String>(); //飞机List<String> a4=new ArrayList<String>(); //炸弹2.6类Time// 等待i秒public void second(int i)//时间如何走public void run()if (i == -1)// 正常终结,说明超时// 开始游戏根据地主不同顺序不同main.turn=main.dizhuFlag;// 出牌按钮 --我出牌turnOn(true);// 我自己的定时器timeWait(30, 1);//选完关闭turnOn(false);3编码实现3.1JAVA编码实现(1)Main.java主要代码public class Main extends JFrame implements ActionListener{public Container container = null; // 定义容器JMenuItem start, exit, about; // 定义菜单按钮JButton landlord[]=new JButton[2]; //抢地主按钮JButton publishCard[]=new JButton[2]; //出牌按钮int dizhuFlag; //地主标志int turn;JLabel dizhu; //地主图标List<Card> currentList[] =new ArrayList[3]; // 当前的出牌List<Card> playerList[] = new ArrayList[3]; // 定义3个玩家表List<Card> lordList;//地主牌Card card[] = new Card[56]; // 定义54张牌JTextField time[]=new JTextField[3]; //计时器Time t; //定时器(线程)boolean nextPlayer=false; //转换角色public Main(){Init();// 初始化SetMenu();// 创建菜单按钮(抢地主,发牌,计时器)this.setVisible(true);CardInit();//发牌getLord(); //发完牌开始抢地主time[1].setVisible(true);//线程安全性,把非主线程的UI控制放到里面SwingUtilities.invokeLater(new NewTimer(this,10));}public void getLord()// 抢地主{//System.out.println(CardType.c0.toString());for(int i=0;i<2;i++) //当没有人抢地主时或者一个人和当前的人抢地主时landlord[i].setVisible(true);}//初始化牌// 发牌洗牌public void CardInit()//初始化牌{int count = 1;for (int i = 1; i <= 5; i++){for (int j = 1; j <= 13; j++){if ((i == 5) && (j > 2))break;else {card[count] = new Card(this, i + "-" + j, false);card[count].setLocation(350, 50);container.add(card[count]);count++;}}}//打乱顺序for(int i=0;i<100;i++){Random random=new Random();int a=random.nextInt(54)+1;int b=random.nextInt(54)+1;Card k=card[a]; //赋值语句,打乱牌序card[a]=card[b];card[b]=k;}//开始发牌for(int i=0;i<3;i++) //三张底牌playerList[i]=new ArrayList<Card>(); //玩家牌lordList=new ArrayList<Card>();//地主牌三张int t=0;for(int i=1;i<=54;i++) //进行发牌{if(i>=52)//地主牌{Common.move(card[i], card[i].getLocation(),new Point(300+(i-52)*80,10));lordList.add(card[i]);continue;}switch ((t++)%3) {case 0://显示各边的玩家,这是左边玩家Common.move(card[i], card[i].getLocation(),new Point(50,60+i*5));playerList[0].add(card[i]);break;case 1://玩家:我Common.move(card[i], card[i].getLocation(),new Point(180+i*7,450));playerList[1].add(card[i]);card[i].turnFront(); //显示正面break;case 2://右边玩家Common.move(card[i], card[i].getLocation(),new Point(700,60+i*5));playerList[2].add(card[i]);break;}//card[i].turnFront(); //显示正面container.setComponentZOrder(card[i], 0);}//发完牌排序,从大到小for(int i=0;i<3;i++){Common.order(playerList[i]);Common.rePosition(this,playerList[i],i);//重新定位}dizhu=new JLabel(new ImageIcon("images/dizhu.gif"));//地主最后要加入底牌dizhu.setVisible(false);dizhu.setSize(40, 40);container.add(dizhu);}// 初始化窗体public void Init(){this.setTitle("斗地主游戏---by程宵");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, "20121183026,程宵"); }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();}}(2)Card.java主要代码如下: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 turnFront(){反面代码类似正面,这里就不附带了}@Overridepublic void mouseClicked(MouseEvent e){// TODO Auto-generated method stubif(canClick){Point from=this.getLocation();int step; //移动的距离if(clicked)step=-20;else {step=20;}clicked=!clicked; //反向//当被选中的时候,向前移动一步/后退一步Common.move(this,from,new Point(from.x,from.y-step));}}public void mouseEntered(MouseEvent arg0) {}public void mouseExited(MouseEvent arg0) {}public void mousePressed(MouseEvent arg0) {}public void mouseReleased(MouseEvent arg0) {}}(3)Common.java主要代码如下public class Common {//判断牌型public static CardType jugdeType(List<Card> list){//因为之前排序过所以比较好判断int len=list.size();//单牌,对子,3不带,4个一样炸弹if(len<=4){ //如果第一个和最后个相同,说明全部相同if(list.size()>0&&Common.getValue(list.get(0))==Common.getValue(list.get(l en-1))){switch (len) {case 1:return CardType.c1;case 2:return CardType.c2;case 3:return CardType.c3;case 4:return CardType.c4;}}//双王,化为对子返回if(len==2&&Common.getColor(list.get(1))==5)return CardType.c2;//当第一个和最后个不同时,3带1if(len==4&&((Common.getValue(list.get(0))==Common.getValue(list.get(len-2)))||Common.getValue(list.get(1))==Common.getValue(list.get(len-1))))return CardType.c31;else {return CardType.c0;}}//当5张以上时,连字,3带2,飞机,2顺,4带2等等if(len>=5){//现在按相同数字最大出现次数Card_index card_index=new Card_index();for(int i=0;i<4;i++)card_index.a[i]=new ArrayList<Integer>();//求出各种数字出现频率Common.getMax( card_index,list); //a[0,1,2,3]分别表示重复1,2,3,4次的牌//3带2 -----必含重复3次的牌if(card_index.a[2].size()==1 &&card_index.a[1].size()==1 && len==5) return CardType.c32;//4带2(单,双)if(card_index.a[3].size()==1 && len==6)return CardType.c411;if(card_index.a[3].size()==1 && card_index.a[1].size()==2 &&len==8) return CardType.c422;//单连,保证不存在王if((Common.getColor(list.get(0))!=5)&&(card_index.a[0].size()==len) &&(Common.getValue(list.get(0))-Common.getValue(list.get(len-1))==len-1)) return CardType.c123;//连队if(card_index.a[1].size()==len/2 && len%2==0 && len/2>=3&&(Common.getValue(list.get(0))-Common.getValue(list.get(len-1))==(len/2-1 )))return CardType.c1122;//飞机if(card_index.a[2].size()==len/3 && (len%3==0) &&(Common.getValue(list.get(0))-Common.getValue(list.get(len-1))==(len/3-1)) )return CardType.c111222;//飞机带n单,n/2对if(card_index.a[2].size()==len/4 &&((Integer)(card_index.a[2].get(len/4-1))-(Integer)(card_index.a[2].get(0)) ==len/4-1))return CardType.c11122234;//飞机带n双if(card_index.a[2].size()==len/5 && card_index.a[2].size()==len/5 &&((Integer)(card_index.a[2].get(len/5-1))-(Integer)(card_index.a[2].get(0)) ==len/5-1))return CardType.c1112223344;}return CardType.c0;}//移动效果的函数,用于发牌public static void move(Card card,Point from,Point to){if(to.x!=from.x){double k=(1.0)*(to.y-from.y)/(to.x-from.x);double b=to.y-to.x*k;int flag=0;//判断向左还是向右移动步幅if(from.x<to.x)flag=20;else {flag=-20;}for(int i=from.x;Math.abs(i-to.x)>20;i+=flag){double y=k*i+b;//这里主要用的数学中的线性函数card.setLocation(i,(int)y);try {Thread.sleep(5); //延迟,可自己设置} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//位置校准card.setLocation(to);}//对list排序public static void order(List<Card> list){Collections.sort(list,new Comparator<Card>() {@Overridepublic int compare(Card o1, Card o2) {// TODO Auto-generated method stubint a1=Integer.parseInt(.substring(0, 1));//花色int a2=Integer.parseInt(.substring(0,1));intb1=Integer.parseInt(.substring(2,.length()));//数值int b2=Integer.parseInt(.substring(2,.length()));int flag=0;//如果是王的话if(a1==5) b1+=100;if(a1==5&&b1==1) b1+=50;if(a2==5) b2+=100;if(a2==5&&b2==1) b2+=50;//如果是A或者2if(b1==1) b1+=20;if(b2==1) b2+=20;if(b1==2) b1+=30;if(b2==2) b2+=30;flag=b2-b1;if(flag==0)return a2-a1;else {return flag;}}});}//重新定位 flag代表电脑1 ,2 或者是我public static void rePosition(Main m,List<Card> list,int flag){ Point p=new Point();if(flag==0){p.x=50;p.y=(450/2)-(list.size()+1)*15/2;}if(flag==1){//我的排序 _y=450 width=830p.x=(800/2)-(list.size()+1)*21/2;p.y=450;}if(flag==2){p.x=700;p.y=(450/2)-(list.size()+1)*15/2;}int len=list.size();for(int i=0;i<len;i++){Card card=list.get(i);Common.move(card, card.getLocation(), p);m.container.setComponentZOrder(card, 0);if(flag==1)p.x+=21;else p.y+=15;}}//地主牌权值,看是否抢地主public static int getScore(List<Card> list){int count=0;for(int i=0,len=list.size();i<len;i++){Card card=list.get(i);if(.substring(0, 1).equals("5")){//System.out.println(.substring(0, 1));count+=5;}if(.substring(2, .length()).equals("2")){//System.out.println(2);count+=2;}}return count;}//返回花色public static int getColor(Card card){return Integer.parseInt(.substring(0,1));}//返回值public static int getValue(Card card){int i= Integer.parseInt(.substring(2,.length()));if(.substring(2,.length()).equals("2")) i+=13;if(.substring(2,.length()).equals("1")) i+=13;if(Common.getColor(card)==5)i+=2;//是王return i;}//得到最大相同数public static void getMax(Card_index card_index,List<Card> list){ int count[]=new int[14];//1-13各算一种,王算第14种for(int i=0;i<14;i++)count[i]=0;for(int i=0,len=list.size();i<len;i++){if(Common.getColor(list.get(i))==5)count[13]++;elsecount[Common.getValue(list.get(i))-1]++;}for(int i=0;i<14;i++){switch (count[i]) {case 1:card_index.a[0].add(i+1);break;case 2:card_index.a[1].add(i+1);break;case 3:card_index.a[2].add(i+1);break;case 4:card_index.a[3].add(i+1);break;}}}//拆牌public static Model getModel(List<Card> list){//先复制一个listList list2=new ArrayList<Card>(list);Model model=new Model();//------先拆炸弹Common.getBoomb(list2, model); //ok//------拆3带Common.getThree(list2, model);//拆飞机Common.getPlane(list2, model);//------拆对子Common.getTwo(list2, model);//拆连队Common.getTwoTwo(list2, model);//拆顺子Common.get123(list2, model);//拆单Common.getSingle(list2, model);return model;}//拆连子public static void get123(List<Card> list,Model model){List<Card> del=new ArrayList<Card>();//要删除的Cardsif(list.size()>0&&(Common.getValue(list.get(0))<7||Common.getValue(list.get(list.size()-1))>10))return;if(list.size()<5)return;for(int i=0,len=list.size();i<len;i++){int k=i;for(int j=i;j<len;j++){if(Common.getValue(list.get(i))-Common.getValue(list.get(j))==j-i) {k=j;}}if(k-i>=4){String s="";for(int j=i;j<k;j++)s+=list.get(j).name+",";del.add(list.get(j));}s+=list.get(k).name;del.add(list.get(k));model.a123.add(s);i=k;}}list.removeAll(del);}//拆双顺public static void getTwoTwo(List<Card> list,Model model){ List<String> del=new ArrayList<String>();//要删除的Cards//从model里面的对子找List<String> l=model.a2;if(l.size()<3)return ;Integer s[]=new Integer[l.size()];for(int i=0,len=l.size();i<len;i++){String []name=l.get(i).split(",");s[i]=Integer.parseInt(name[0].substring(2,name[0].length()));}//s0,1,2,3,4 13,9,8,7,6for(int i=0,len=l.size();i<len;i++){int k=i;for(int j=i;j<len;j++){if(s[i]-s[j]==j-i)k=j;}if(k-i>=2)//k=4 i=1{//说明从i到k是连队String ss="";for(int j=i;j<k;j++)ss+=l.get(j)+",";del.add(l.get(j));}ss+=l.get(k);model.a112233.add(ss);del.add(l.get(k));i=k;}}l.removeAll(del);}//拆飞机public static void getPlane(List<Card> list,Model model){ List<String> del=new ArrayList<String>();//要删除的Cards//从model里面的3带找List<String> l=model.a3;if(l.size()<2)return ;Integer s[]=new Integer[l.size()];for(int i=0,len=l.size();i<len;i++){String []name=l.get(i).split(",");s[i]=Integer.parseInt(name[0].substring(2,name[0].length()));}for(int i=0,len=l.size();i<len;i++){int k=i;for(int j=i;j<len;j++){if(s[i]-s[j]==j-i)k=j;}if(k!=i){//说明从i到k是飞机String ss="";for(int j=i;j<k;j++){ss+=l.get(j)+",";del.add(l.get(j));}ss+=l.get(k);model.a111222.add(ss);del.add(l.get(k));i=k;}}l.removeAll(del);}//拆炸弹public static void getBoomb(List<Card> list,Model model){List<Card> del=new ArrayList<Card>();//要删除的Cards//王炸if(list.size()>=2 &&Common.getColor(list.get(0))==5 && Common.getColor(list.get(1))==5){model.a4.add(list.get(0).name+","+list.get(1).name); //按名字加入del.add(list.get(0));del.add(list.get(1));}//如果王不构成炸弹咋先拆单if(Common.getColor(list.get(0))==5&&Common.getColor(list.get(1))!=5){del.add(list.get(0));model.a1.add(list.get(0).name);}list.removeAll(del);//一般的炸弹for(int i=0,len=list.size();i<len;i++){if(i+3<len && Common.getValue(list.get(i))==Common.getValue(list.get(i+3))){String s=list.get(i).name+",";s+=list.get(i+1).name+",";s+=list.get(i+2).name+",";s+=list.get(i+3).name;model.a4.add(s);for(int j=i;j<=i+3;j++)del.add(list.get(j));i=i+3;}}list.removeAll(del);}//拆3带public static void getThree(List<Card> list,Model model){List<Card> del=new ArrayList<Card>();//要删除的Cards//连续3张相同for(int i=0,len=list.size();i<len;i++){if(i+2<len&&Common.getValue(list.get(i))==Common.getValue(list.get(i+2))) {String s=list.get(i).name+",";s+=list.get(i+1).name+",";s+=list.get(i+2).name;model.a3.add(s);for(int j=i;j<=i+2;j++)del.add(list.get(j));i=i+2;}}list.removeAll(del);}//拆对子public static void getTwo(List<Card> list,Model model){List<Card> del=new ArrayList<Card>();//要删除的Cards//连续2张相同for(int i=0,len=list.size();i<len;i++){if(i+1<len&&Common.getValue(list.get(i))==Common.getValue(list.get(i+1))){String s=list.get(i).name+",";s+=list.get(i+1).name;model.a2.add(s);for(int j=i;j<=i+1;j++)del.add(list.get(j));i=i+1;}}list.removeAll(del);}//拆单牌public static void getSingle(List<Card> list,Model model){ List<Card> del=new ArrayList<Card>();//要删除的Cards//1for(int i=0,len=list.size();i<len;i++){model.a1.add(list.get(i).name);del.add(list.get(i));}list.removeAll(del);}//隐藏之前出过的牌public static void hideCards(List<Card> list){for(int i=0,len=list.size();i<len;i++){list.get(i).setVisible(false);}}//检查牌的是否能出public static int checkCards(List<Card> c,List<Card>[] current){ //找出当前最大的牌是哪个电脑出的,c是点选的牌List<Card> currentlist=(current[0].size()>0)?current[0]:current[2];CardType cType=Common.jugdeType(c);//如果张数不同直接过滤if(cType!=CardType.c4&&c.size()!=currentlist.size())return 0;//比较我的出牌类型if(Common.jugdeType(c)!=Common.jugdeType(currentlist)){return 0;}//比较出的牌是否要大//王炸弹if(cType==CardType.c4){if(c.size()==2)return 1;if(currentlist.size()==2)return 0;}//单牌,对子,3带,4炸弹if(cType==CardType.c1||cType==CardType.c2||cType==CardType.c3||cType==Card Type.c4){if(Common.getValue(c.get(0))<=Common.getValue(currentlist.get(0))){return 0;}else {return 1;}}//顺子,连队,飞机裸if(cType==CardType.c123||cType==CardType.c1122||cType==CardType.c111222) {if(Common.getValue(c.get(0))<=Common.getValue(currentlist.get(0))) return 0;elsereturn 1;}//按重复多少排序//3带1,3带2 ,飞机带单,双,4带1,2,只需比较第一个就行,独一无二的if(cType==CardType.c31||cType==CardType.c32||cType==CardType.c411||cType== CardType.c422||cType==CardType.c11122234||cType==CardType.c1112223344){ List<Card> a1=Common.getOrder2(c); //我出的牌List<Card> a2=Common.getOrder2(currentlist);//当前最大牌if(Common.getValue(a1.get(0))<Common.getValue(a2.get(0)))return 0;}return 1;}//按照重复次数排序public static List getOrder2(List<Card> list){List<Card> list2=new ArrayList<Card>(list);List<Card> list3=new ArrayList<Card>();List<Integer> list4=new ArrayList<Integer>();int len=list2.size();int a[]=new int[20];for(int i=0;i<20;i++)a[i]=0;for(int i=0;i<len;i++){a[Common.getValue(list2.get(i))]++;}int max=0;for(int i=0;i<20;i++){max=0;for(int j=19;j>=0;j--){if(a[j]>a[max])max=j;}for(int k=0;k<len;k++){if(Common.getValue(list2.get(k))==max){list3.add(list2.get(k));}}list2.remove(list3);a[max]=0;}return list3;}}class Card_index{List a[]=new ArrayList[4];//单张}(4)Time.java主要代码public class Time extends Thread {Main main;boolean isRun = true;int i = 10;public Time(Main m, int i) {this.main = m;this.i = i;}@Overridepublic void run() {while (i > -1 && isRun) {main.time[1].setText("倒计时:" + i--);second(1);// 等一秒}if (i == -1)// 正常终结,说明超时main.time[1].setText("不抢");ndlord[0].setVisible(false);ndlord[1].setVisible(false);for (Card card2 : main.playerList[1])card2.canClick = true;// 可被点击// 如果自己抢到地主if (main.time[1].getText().equals("抢地主")) { // 得到地主牌main.playerList[1].addAll(main.lordList);openlord(true);second(2);// 等待五秒Common.order(main.playerList[1]);Common.rePosition(main, main.playerList[1], 1);setlord(1);} else {// 电脑选地主if (Common.getScore(main.playerList[0]) < Common .getScore(main.playerList[2])) {main.time[2].setText("抢地主");main.time[2].setVisible(true);setlord(2);// 设定地主openlord(true);second(3);main.playerList[2].addAll(main.lordList);Common.order(main.playerList[2]);Common.rePosition(main, main.playerList[2], 2);openlord(false);} else {main.time[0].setText("抢地主");main.time[0].setVisible(true);setlord(0);// 设定地主openlord(true);second(3);main.playerList[0].addAll(main.lordList);Common.order(main.playerList[0]);Common.rePosition(main, main.playerList[0], 0);//openlord(false);}}// 选完地主后关闭地主按钮ndlord[0].setVisible(false);ndlord[1].setVisible(false);turnOn(false);for (int i = 0; i < 3; i++){main.time[i].setText("不要");main.time[i].setVisible(false);}// 开始游戏根据地主不同顺序不同main.turn=main.dizhuFlag;while (true) {if(main.turn==1) //我{turnOn(true);// 出牌按钮 --我出牌timeWait(30, 1);// 我自己的定时器turnOn(false);//选完关闭main.turn=(main.turn+1)%3;if(win())//判断输赢break;}if (main.turn==0){computer0();main.turn=(main.turn+1)%3;if(win())//判断输赢break;}if(main.turn==2){computer2();main.turn=(main.turn+1)%3;if(win())//判断输赢break;}}}// 等待i秒public void second(int i) {try {Thread.sleep(i * 1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 地主牌翻看public void openlord(boolean is) {for (int i = 0; i < 3; i++) {if (is)main.lordList.get(i).turnFront(); // 地主牌翻看else {main.lordList.get(i).turnRear(); // 地主牌闭合}main.lordList.get(i).canClick = true;// 可被点击}}// 设定地主public void setlord(int i) {Point point = new Point();if (i == 1)// 我是地主{point.x = 80;point.y = 430;main.dizhuFlag = 1;// 设定地主}if (i == 0) {point.x = 80;point.y = 20;main.dizhuFlag = 0;}if (i == 2) {point.x = 700;point.y = 20;main.dizhuFlag = 2;}main.dizhu.setLocation(point);main.dizhu.setVisible(true);}// 打开出牌按钮public void turnOn(boolean flag) {main.publishCard[0].setVisible(flag);main.publishCard[1].setVisible(flag);}// 电脑0走牌(我代表1)public void computer0() {timeWait(1, 0); // 定时ShowCard(0); // 出牌}// 电脑2走牌(我代表1)public void computer2() {timeWait(1, 2); // 定时ShowCard(2); // 出牌}// 走牌public void ShowCard(int role) {Model model = Common.getModel(main.playerList[role]);// 待走的牌List<String> list = new ArrayList();// 如果是主动出牌if (main.time[(role + 1) % 3].getText().equals("不要")&& main.time[(role + 2) % 3].getText().equals("不要")) { // 有单出单 (除开3带,飞机能带的单牌)if (model.a1.size() > (model.a111222.size() * 2 + model.a3.size())) { list.add(model.a1.get(model.a1.size() - 1));}// 有对子出对子 (除开3带,飞机)else if (model.a2.size() > (model.a111222.size() * 2 + model.a3 .size())) {list.add(model.a2.get(model.a2.size() - 1));}// 有顺子出顺子else if (model.a123.size() > 0) {list.add(model.a123.get(model.a123.size() - 1));}// 有3带就出3带,没有就出光3else if (model.a3.size() > 0) {// 3带单,且非关键时刻不能带王,2if (model.a1.size() > 0) {list.add(model.a1.get(model.a1.size() - 1));}// 3带对else if (model.a2.size() > 0) {list.add(model.a2.get(model.a2.size() - 1));}list.add(model.a3.get(model.a3.size() - 1));}// 有双顺出双顺else if (model.a112233.size() > 0) {list.add(model.a112233.get(model.a112233.size() - 1));}// 有飞机出飞机else if (model.a111222.size() > 0) {String name[] = model.a111222.get(0).split(",");// 带单if (name.length / 3 <= model.a1.size()) {list.add(model.a111222.get(model.a111222.size() - 1));for (int i = 0; i < name.length / 3; i++)list.add(model.a1.get(i));} else if (name.length / 3 <= model.a2.size())// 带双{list.add(model.a111222.get(model.a111222.size() - 1));for (int i = 0; i < name.length / 3; i++)list.add(model.a2.get(i));}// 有炸弹出炸弹} else if (model.a4.size() > 0) {// 4带2,1int sizea1 = model.a1.size();int sizea2 = model.a2.size();if (sizea1 >= 2) {list.add(model.a1.get(sizea1 - 1));。

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学习案例-斗地主洗牌发牌

斗地主洗牌发牌【案例介绍】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取余的方法,将代表不同纸牌的数字分配给不同人与底牌,实现发牌效果。

斗地主人机对战课程设计

斗地主人机对战课程设计

斗地主人机对战课程设计一、课程目标知识目标:1. 让学生掌握斗地主游戏的基本规则,了解牌型、出牌顺序和胜负条件。

2. 使学生理解人工智能在斗地主游戏中的应用,了解机器学习中的决策树、强化学习等基本概念。

3. 帮助学生掌握计算机编程中与斗地主相关的算法和数据结构。

技能目标:1. 培养学生运用所学知识进行斗地主游戏策略分析的能力。

2. 提高学生运用编程语言实现斗地主游戏的简单AI的能力。

3. 培养学生团队协作、沟通表达的能力。

情感态度价值观目标:1. 培养学生对人工智能的兴趣,激发他们探索未知、挑战自我的热情。

2. 培养学生在游戏中遵守规则、公平竞争的意识,树立正确的竞技观念。

3. 引导学生学会在团队合作中相互尊重、互相学习,培养良好的团队精神。

课程性质分析:本课程以斗地主人机对战为主题,结合计算机编程和人工智能知识,旨在提高学生的编程能力和人工智能素养。

学生特点分析:学生处于高年级阶段,已具备一定的计算机编程基础和逻辑思维能力,对人工智能有一定了解,对斗地主游戏有较高的兴趣。

教学要求:1. 注重理论与实践相结合,让学生在动手实践中掌握知识。

2. 鼓励学生积极参与讨论,培养他们的思维能力和创新能力。

3. 关注学生的个体差异,因材施教,提高教学质量。

二、教学内容1. 斗地主游戏规则及策略分析:包括牌型、出牌顺序、记分规则、胜负条件等,结合实例进行讲解。

2. 人工智能基本概念:介绍决策树、强化学习等基本原理,以及它们在斗地主游戏中的应用。

3. 编程语言及算法:选用Python语言,讲解列表、字典等数据结构,以及递归、迭代等算法在斗地主AI实现中的应用。

4. 斗地主人机对战系统设计:包括游戏界面设计、牌型识别、出牌策略、胜负判定等模块的编写。

5. 人工智能斗地主AI实战:分组进行项目实践,每组设计并实现一个简单的斗地主AI,进行对战演练。

教学内容安排和进度:第一周:斗地主游戏规则及策略分析,人工智能基本概念。

java扑克牌课程设计

java扑克牌课程设计

java扑克牌课程设计一、课程目标知识目标:1. 学生能理解Java面向对象编程的基本概念,如类、对象、继承、封装等;2. 学生能掌握Java集合框架的使用,如ArrayList、HashMap等;3. 学生能运用Java异常处理机制处理程序异常;4. 学生能运用Java多线程技术开发简单的并发程序。

技能目标:1. 学生能运用所学知识设计并实现一个简单的Java扑克牌游戏;2. 学生能通过编写代码,实现扑克牌的洗牌、发牌、排序等基本功能;3. 学生能运用Java多线程技术实现扑克牌游戏的并发操作;4. 学生能通过调试和优化代码,提高程序的稳定性和性能。

情感态度价值观目标:1. 学生通过课程学习,培养对编程的兴趣和热情,增强学习Java的自信心;2. 学生在小组合作中,培养团队协作能力和沟通表达能力;3. 学生在解决实际问题的过程中,培养分析问题和解决问题的能力,形成积极向上的学习态度;4. 学生通过扑克牌游戏的设计与实现,认识到编程在生活中的广泛应用,激发对科技创新的热情。

二、教学内容1. Java面向对象编程基础:复习类与对象的概念、构造方法、成员变量、成员方法等,重点讲解继承、封装和多态性的应用。

相关教材章节:第3章 类与对象,第4章 继承与多态。

2. Java集合框架:介绍ArrayList、LinkedList、HashMap等常用集合类的使用方法,通过案例演示集合框架在实际编程中的应用。

相关教材章节:第6章 集合框架。

3. Java异常处理:讲解异常的概念、分类,掌握try-catch-finally结构,学会编写健壮的代码处理可能出现的异常。

相关教材章节:第7章 异常处理。

4. Java多线程编程:介绍线程的概念、创建、同步与通信,通过扑克牌游戏案例讲解多线程技术在游戏并发操作中的应用。

相关教材章节:第9章 多线程编程。

5. 扑克牌游戏设计与实现:结合所学知识,设计并实现一个简单的扑克牌游戏,涵盖洗牌、发牌、排序等功能,锻炼学生综合运用Java编程知识解决实际问题的能力。

斗地主的制作与实现课程设计报告(附完整源代码)

斗地主的制作与实现课程设计报告(附完整源代码)

《游戏设计概论》课程设计报告题目斗地主的制作与实现专业班级学号姓名同组人员一、课程设计的内容、要求完成一个网络版的斗地主。

对于联网斗地主,要实现以下功能:1,能够联网对战,能及时出牌并能与主机一起更新游戏状态。

2,能正确判断胜负和游戏的开始与结束。

3,能认清地主和农民,能正确记分。

4,整个游戏界面如下图所示。

上面中间是游戏地主最后拿的三张牌,左右分别是玩家的牌,下面中间是自己的牌。

在游戏的右下方有2个按钮,分别是出牌和过牌。

5,这个游戏是用鼠标进行操作的,单击自己的牌可以把它们选中,当轮到自己出牌时,就可以单击出牌按钮,出自己已经选中的牌,或者单击过牌按钮,放弃出牌机会。

游戏开始时会有选地主的过程,可以单击出牌选择自己是地主,也可以单击过牌选择放弃,如果所有的玩家都选择放弃,则重新发牌。

二、所采用的数据结构没有.三、主要模块(或函数)及其功能本游戏的所有模块如下图所示:其中主要模块功能:Managers模块:这是本游戏的核心模块之一。

函数:void GameStart();//游戏初始化,发牌。

void SendCard(); //发牌void CardsInfo(Card ca[],int &num,int &min,int &type);//用来得到牌的信息。

到底是炸弹,连牌,还是什么的。

void PlayS(int min2,int type2,int num2);//设置与发出声音,用来通知玩家所打的牌的大小与种类。

void Updata();//根据游戏状态的改变,从而设置游戏界面的状态。

Card模块:记录了一张牌的所有信息,包括大小、类型、是否被玩家选中。

CProgramView模块:编辑游戏界面函数:void DrawCardOut(int k);void DrawLeft();//绘出剩下的地主的牌,当地主还没决定的时候画的是牌的背面,决定地主//后画出地主的牌void DrawPlayername();//根据传入的字符串,绘出玩家的名称void OnPass();//点击过牌按钮后的响应函数void OnSendCard();//画出当前玩家所出的牌int SelectNum(int num,int mx,int my);//判断玩家点牌后具体点的是哪一张void DrawOtherCard();//画出另外两个玩家还剩下的牌,以及//他们刚刚出牌void DrawMyCard();//画出当前玩家手中牌void OnCancel();//点击退出按钮后的响应函数void OnOK();//点击确定按钮后的响应函数virtual ~CProgramView();CString PlayerName[3];//用来存放三个玩家姓名的字符串void PrintAll();//整体重画CChat模块:基本对话框的聊天模块.CNet模块:网络控制CServer模块:网络主机配置NetControl模块:用于设置网络各方面的问题。

java斗地主

java斗地主

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

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

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

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

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

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

四人斗地主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写的⽃地主游戏源码源码下载在最后我们的前年的课设要求做⼀个⽃地主程序,当时正在愁如何做界⾯,当时刚好在学习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实现⽃地主案例本⽂实例为⼤家分享了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 {/***⼀共要四步。

网络编程课程设计文档-斗地主

网络编程课程设计文档-斗地主

网络编程课程设计院系信息工程学院专业计算机科学与技术班级0901B组长赵春乐成员牛龙、尹祖博、王青、胡园、姜海芳、朱立鹏、崔洪畅项目“龙乐”斗地主设计与实现指导教师魏雪峰摘要本游戏是一种新型的基于c/s模式的网络版斗地主游戏。

我们研究主要方向是用网络软件设计方法,以局部网内联众游戏为模型,用Java开发网络版的扑克牌软件。

本游戏的研究目的是在实践中学习游戏软件编写过程,真正了解网络编程c/s 通信的各种可行性方法之一。

本文隶属网络游戏设计系统中的子课题---斗地主游戏服务器与客户端的通讯模块。

首先介绍网络斗地主游戏设计系统开发环境,通信方面的编程使用,并对扑克牌游戏c/s 模式进行问题分析,然后给出解决问题涉及到的关键技术,接着利用软件工程设计思想,从系统需求分析着手,编写总体设计,详细设计文档,深入分析并设计斗地主游戏c/s模式的应用,并利用面向对象的设计方法完成模块的设计和实现过程,最后是系统测试和下一步的工作。

本设计以一副牌规则为准.本论文讲述了网络斗地主的游戏算法的设计,游戏通讯部分的开发(多线程,socket)的设计过程。

本设计采用myeclipse工具作为开发工具,结合socket编程。

设计过程中,首先建立系统的应用模型,然后在此基础上进行需求迭代,详细设计时不断地修正和完善,经过测试阶段反复调试和验证,最终形成达到设计要求的可行系统。

关键词:网络斗地主;服务器;客户机;socket编程;1目录摘要 (I)1绪论 ............................................................................................................................... - 1 -1.1国内外研究现状综述............................................................................................ - 1 -1.2网络版斗地主的系统实现方法:网络编程 ........................................................ - 1 -2需求分析 ....................................................................................................................... - 2 -2.1任务背景及目标.................................................................................................... - 2 -2.2任务功能分析........................................................................................................ - 2 -2.2.1网络模块 ........................................................................................................ - 3 -2.2.2游戏规则模块 ................................................................................................ - 3 -2.2.3客户端模块 .................................................................................................... - 3 -2.3系统开发技术........................................................................................................ - 4 -2.3.1Windows Socket通信技术 ............................................................................ - 4 -2.3.2W indows Sockets通信程序的基本流程 ........................................................ - 5 -2.3.3异步选择机制 ................................................................................................ - 5 -2.4小结........................................................................................................................ - 5 -3软件设计与实现 ........................................................................................................... - 6 -3.1游戏规则模块的设计与实现.............................................................................. - 10 -3.2.1游戏规则 ...................................................................................................... - 10 -3.2用户控制模块...................................................................................................... - 13 -3.3.1用户控制模块功能及原理 .......................................................................... - 13 -3.3.2小结 .............................................................................................................. - 13 -4软件测试与运行 ......................................................................................................... - 13 -4.1实验环境.............................................................................................................. - 13 -4.2测试与运行结果.................................................................................................. - 14 -5结束语 .............................................................................................................................. - 21 -6参考文献 .......................................................................................................................... - 21 -1绪论随着电脑硬件技术和互联网的飞速发展,电脑游戏也突飞猛进,成功游戏不断涌现。

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

《面向对象程序设计》课程设计报告题目:斗地主软件设计与实现院(系):信息科学与工程学院专业班级:计算机科学与技术1201班学生姓名:**学号:***********指导教师:**20 14 年 12 月 29 日至20 15 年 1 月 9 日华中科技大学武昌分校制面向对象程序设计课程设计任务书目录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)1需求与总体设计1.1需求分析游戏设计需要用到牌Card的正反面及牌的移动,还有CardType设计出牌种类,还有各种牌的形式,还要设计几个人玩游戏,抢地主的方法,出牌倒计时,出牌和不出牌等等,另外还要设计54张牌,打牌出现的各种结果。

1.2总体设计本游戏实现了图形界面的设计、游戏区模块,游戏控制模块,级别设置模块和帮助模块。

为玩家提供主体游戏功能,能够处理玩家的各种游戏操作,并最终显示游戏结果。

1.3功能图1.4类图2详细设计2.1主类Main图表说明如下:2.2类Card(1)类图(2)说明:该类主要是设计牌面的正反、牌之间的距离、移动(即出牌时向前移动纸牌),其中有:boolean up;//是否正反面;boolean canClick=false;//是否可被点击boolean clicked=false;//是否点击过;String name;//图片url名字Main main;//Main类的引用2.3类CardTypepublic enum CardType 列出各种出牌的类型2.4类Common1)判断牌型public static CardType jugdeType()2)移动效果的函数,用于发牌public static void move()3)对牌的排序public static void order()4)重新定位 flag代表电脑1 ,2 或者是我public static void rePosition()5)地主牌权值,看是否抢地主public static int getScore()6)返回花色public static int getColor()7)得到最大相同数public static void getMax()8)拆牌public static Model getModel()各种对子、顺子、飞机、炸弹9)拆连子public static void get123()10)拆双顺public static void getTwoTwo()11)拆飞机public static void getPlane()12)拆炸弹public static void getBoomb()13)拆3带public static void getThree()14)拆对子public static void getTwo()15)拆单牌public static void getSingle()16)隐藏之前出过的牌public static void hideCards()17)检查牌的是否能出public static int checkCards()2.5类Model各种牌型public class ModelList<String> a1=new ArrayList<String>(); //单张List<String> a2=new ArrayList<String>(); //对子List<String> a3=new ArrayList<String>(); //3带List<String> a123=new ArrayList<String>(); //连子List<String> a112233=new ArrayList<String>(); //连牌List<String> a111222=new ArrayList<String>(); //飞机List<String> a4=new ArrayList<String>(); //炸弹2.6类Time// 等待i秒public void second(int i)//时间如何走public void run()if (i == -1)// 正常终结,说明超时// 开始游戏根据地主不同顺序不同main.turn=main.dizhuFlag;// 出牌按钮 --我出牌turnOn(true);// 我自己的定时器timeWait(30, 1);//选完关闭turnOn(false);3编码实现3.1JAVA编码实现(1)Main.java主要代码public class Main extends JFrame implements ActionListener{public Container container = null; // 定义容器JMenuItem start, exit, about; // 定义菜单按钮JButton landlord[]=new JButton[2]; //抢地主按钮JButton publishCard[]=new JButton[2]; //出牌按钮int dizhuFlag; //地主标志int turn;JLabel dizhu; //地主图标List<Card> currentList[] =new ArrayList[3]; // 当前的出牌List<Card> playerList[] = new ArrayList[3]; // 定义3个玩家表List<Card> lordList;//地主牌Card card[] = new Card[56]; // 定义54张牌JTextField time[]=new JTextField[3]; //计时器Time t; //定时器(线程)boolean nextPlayer=false; //转换角色public Main(){Init();// 初始化SetMenu();// 创建菜单按钮(抢地主,发牌,计时器)this.setVisible(true);CardInit();//发牌getLord(); //发完牌开始抢地主time[1].setVisible(true);//线程安全性,把非主线程的UI控制放到里面SwingUtilities.invokeLater(new NewTimer(this,10));}public void getLord()// 抢地主{//System.out.println(CardType.c0.toString());for(int i=0;i<2;i++) //当没有人抢地主时或者一个人和当前的人抢地主时landlord[i].setVisible(true);}//初始化牌// 发牌洗牌public void CardInit()//初始化牌{int count = 1;for (int i = 1; i <= 5; i++){for (int j = 1; j <= 13; j++){if ((i == 5) && (j > 2))break;else {card[count] = new Card(this, i + "-" + j, false);card[count].setLocation(350, 50);container.add(card[count]);count++;}}}//打乱顺序for(int i=0;i<100;i++){Random random=new Random();int a=random.nextInt(54)+1;int b=random.nextInt(54)+1;Card k=card[a]; //赋值语句,打乱牌序card[a]=card[b];card[b]=k;}//开始发牌for(int i=0;i<3;i++) //三张底牌playerList[i]=new ArrayList<Card>(); //玩家牌lordList=new ArrayList<Card>();//地主牌三张int t=0;for(int i=1;i<=54;i++) //进行发牌{if(i>=52)//地主牌{Common.move(card[i], card[i].getLocation(),new Point(300+(i-52)*80,10));lordList.add(card[i]);continue;}switch ((t++)%3) {case 0://显示各边的玩家,这是左边玩家Common.move(card[i], card[i].getLocation(),new Point(50,60+i*5));playerList[0].add(card[i]);break;case 1://玩家:我Common.move(card[i], card[i].getLocation(),new Point(180+i*7,450));playerList[1].add(card[i]);card[i].turnFront(); //显示正面break;case 2://右边玩家Common.move(card[i], card[i].getLocation(),new Point(700,60+i*5));playerList[2].add(card[i]);break;}//card[i].turnFront(); //显示正面container.setComponentZOrder(card[i], 0);}//发完牌排序,从大到小for(int i=0;i<3;i++){Common.order(playerList[i]);Common.rePosition(this,playerList[i],i);//重新定位}dizhu=new JLabel(new ImageIcon("images/dizhu.gif"));//地主最后要加入底牌dizhu.setVisible(false);dizhu.setSize(40, 40);container.add(dizhu);}// 初始化窗体public void Init(){this.setTitle("斗地主游戏---by程宵");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, "20121183026,程宵"); }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();}}(2)Card.java主要代码如下: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 turnFront(){反面代码类似正面,这里就不附带了}@Overridepublic void mouseClicked(MouseEvent e){// TODO Auto-generated method stubif(canClick){Point from=this.getLocation();int step; //移动的距离if(clicked)step=-20;else {step=20;}clicked=!clicked; //反向//当被选中的时候,向前移动一步/后退一步Common.move(this,from,new Point(from.x,from.y-step));}}public void mouseEntered(MouseEvent arg0) {}public void mouseExited(MouseEvent arg0) {}public void mousePressed(MouseEvent arg0) {}public void mouseReleased(MouseEvent arg0) {}}(3)Common.java主要代码如下public class Common {//判断牌型public static CardType jugdeType(List<Card> list){//因为之前排序过所以比较好判断int len=list.size();//单牌,对子,3不带,4个一样炸弹if(len<=4){ //如果第一个和最后个相同,说明全部相同if(list.size()>0&&Common.getValue(list.get(0))==Common.getValue(list.get(l en-1))){switch (len) {case 1:return CardType.c1;case 2:return CardType.c2;case 3:return CardType.c3;case 4:return CardType.c4;}}//双王,化为对子返回if(len==2&&Common.getColor(list.get(1))==5)return CardType.c2;//当第一个和最后个不同时,3带1if(len==4&&((Common.getValue(list.get(0))==Common.getValue(list.get(len-2)))||Common.getValue(list.get(1))==Common.getValue(list.get(len-1))))return CardType.c31;else {return CardType.c0;}}//当5张以上时,连字,3带2,飞机,2顺,4带2等等if(len>=5){//现在按相同数字最大出现次数Card_index card_index=new Card_index();for(int i=0;i<4;i++)card_index.a[i]=new ArrayList<Integer>();//求出各种数字出现频率Common.getMax( card_index,list); //a[0,1,2,3]分别表示重复1,2,3,4次的牌//3带2 -----必含重复3次的牌if(card_index.a[2].size()==1 &&card_index.a[1].size()==1 && len==5) return CardType.c32;//4带2(单,双)if(card_index.a[3].size()==1 && len==6)return CardType.c411;if(card_index.a[3].size()==1 && card_index.a[1].size()==2 &&len==8) return CardType.c422;//单连,保证不存在王if((Common.getColor(list.get(0))!=5)&&(card_index.a[0].size()==len) &&(Common.getValue(list.get(0))-Common.getValue(list.get(len-1))==len-1)) return CardType.c123;//连队if(card_index.a[1].size()==len/2 && len%2==0 && len/2>=3&&(Common.getValue(list.get(0))-Common.getValue(list.get(len-1))==(len/2-1 )))return CardType.c1122;//飞机if(card_index.a[2].size()==len/3 && (len%3==0) &&(Common.getValue(list.get(0))-Common.getValue(list.get(len-1))==(len/3-1)) )return CardType.c111222;//飞机带n单,n/2对if(card_index.a[2].size()==len/4 &&((Integer)(card_index.a[2].get(len/4-1))-(Integer)(card_index.a[2].get(0)) ==len/4-1))return CardType.c11122234;//飞机带n双if(card_index.a[2].size()==len/5 && card_index.a[2].size()==len/5 &&((Integer)(card_index.a[2].get(len/5-1))-(Integer)(card_index.a[2].get(0)) ==len/5-1))return CardType.c1112223344;}return CardType.c0;}//移动效果的函数,用于发牌public static void move(Card card,Point from,Point to){if(to.x!=from.x){double k=(1.0)*(to.y-from.y)/(to.x-from.x);double b=to.y-to.x*k;int flag=0;//判断向左还是向右移动步幅if(from.x<to.x)flag=20;else {flag=-20;}for(int i=from.x;Math.abs(i-to.x)>20;i+=flag){double y=k*i+b;//这里主要用的数学中的线性函数card.setLocation(i,(int)y);try {Thread.sleep(5); //延迟,可自己设置} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//位置校准card.setLocation(to);}//对list排序public static void order(List<Card> list){Collections.sort(list,new Comparator<Card>() {@Overridepublic int compare(Card o1, Card o2) {// TODO Auto-generated method stubint a1=Integer.parseInt(.substring(0, 1));//花色int a2=Integer.parseInt(.substring(0,1));intb1=Integer.parseInt(.substring(2,.length()));//数值int b2=Integer.parseInt(.substring(2,.length()));int flag=0;//如果是王的话if(a1==5) b1+=100;if(a1==5&&b1==1) b1+=50;if(a2==5) b2+=100;if(a2==5&&b2==1) b2+=50;//如果是A或者2if(b1==1) b1+=20;if(b2==1) b2+=20;if(b1==2) b1+=30;if(b2==2) b2+=30;flag=b2-b1;if(flag==0)return a2-a1;else {return flag;}}});}//重新定位 flag代表电脑1 ,2 或者是我public static void rePosition(Main m,List<Card> list,int flag){ Point p=new Point();if(flag==0){p.x=50;p.y=(450/2)-(list.size()+1)*15/2;}if(flag==1){//我的排序 _y=450 width=830p.x=(800/2)-(list.size()+1)*21/2;p.y=450;}if(flag==2){p.x=700;p.y=(450/2)-(list.size()+1)*15/2;}int len=list.size();for(int i=0;i<len;i++){Card card=list.get(i);Common.move(card, card.getLocation(), p);m.container.setComponentZOrder(card, 0);if(flag==1)p.x+=21;else p.y+=15;}}//地主牌权值,看是否抢地主public static int getScore(List<Card> list){int count=0;for(int i=0,len=list.size();i<len;i++){Card card=list.get(i);if(.substring(0, 1).equals("5")){//System.out.println(.substring(0, 1));count+=5;}if(.substring(2, .length()).equals("2")){//System.out.println(2);count+=2;}}return count;}//返回花色public static int getColor(Card card){return Integer.parseInt(.substring(0,1));}//返回值public static int getValue(Card card){int i= Integer.parseInt(.substring(2,.length()));if(.substring(2,.length()).equals("2")) i+=13;if(.substring(2,.length()).equals("1")) i+=13;if(Common.getColor(card)==5)i+=2;//是王return i;}//得到最大相同数public static void getMax(Card_index card_index,List<Card> list){ int count[]=new int[14];//1-13各算一种,王算第14种for(int i=0;i<14;i++)count[i]=0;for(int i=0,len=list.size();i<len;i++){if(Common.getColor(list.get(i))==5)count[13]++;elsecount[Common.getValue(list.get(i))-1]++;}for(int i=0;i<14;i++){switch (count[i]) {case 1:card_index.a[0].add(i+1);break;case 2:card_index.a[1].add(i+1);break;case 3:card_index.a[2].add(i+1);break;case 4:card_index.a[3].add(i+1);break;}}}//拆牌public static Model getModel(List<Card> list){//先复制一个listList list2=new ArrayList<Card>(list);Model model=new Model();//------先拆炸弹Common.getBoomb(list2, model); //ok//------拆3带Common.getThree(list2, model);//拆飞机Common.getPlane(list2, model);//------拆对子Common.getTwo(list2, model);//拆连队Common.getTwoTwo(list2, model);//拆顺子Common.get123(list2, model);//拆单Common.getSingle(list2, model);return model;}//拆连子public static void get123(List<Card> list,Model model){List<Card> del=new ArrayList<Card>();//要删除的Cardsif(list.size()>0&&(Common.getValue(list.get(0))<7||Common.getValue(list.get(list.size()-1))>10))return;if(list.size()<5)return;for(int i=0,len=list.size();i<len;i++){int k=i;for(int j=i;j<len;j++){if(Common.getValue(list.get(i))-Common.getValue(list.get(j))==j-i) {k=j;}}if(k-i>=4){String s="";for(int j=i;j<k;j++)s+=list.get(j).name+",";del.add(list.get(j));}s+=list.get(k).name;del.add(list.get(k));model.a123.add(s);i=k;}}list.removeAll(del);}//拆双顺public static void getTwoTwo(List<Card> list,Model model){ List<String> del=new ArrayList<String>();//要删除的Cards//从model里面的对子找List<String> l=model.a2;if(l.size()<3)return ;Integer s[]=new Integer[l.size()];for(int i=0,len=l.size();i<len;i++){String []name=l.get(i).split(",");s[i]=Integer.parseInt(name[0].substring(2,name[0].length()));}//s0,1,2,3,4 13,9,8,7,6for(int i=0,len=l.size();i<len;i++){int k=i;for(int j=i;j<len;j++){if(s[i]-s[j]==j-i)k=j;}if(k-i>=2)//k=4 i=1{//说明从i到k是连队String ss="";for(int j=i;j<k;j++)ss+=l.get(j)+",";del.add(l.get(j));}ss+=l.get(k);model.a112233.add(ss);del.add(l.get(k));i=k;}}l.removeAll(del);}//拆飞机public static void getPlane(List<Card> list,Model model){ List<String> del=new ArrayList<String>();//要删除的Cards//从model里面的3带找List<String> l=model.a3;if(l.size()<2)return ;Integer s[]=new Integer[l.size()];for(int i=0,len=l.size();i<len;i++){String []name=l.get(i).split(",");s[i]=Integer.parseInt(name[0].substring(2,name[0].length()));}for(int i=0,len=l.size();i<len;i++){int k=i;for(int j=i;j<len;j++){if(s[i]-s[j]==j-i)k=j;}if(k!=i){//说明从i到k是飞机String ss="";for(int j=i;j<k;j++){ss+=l.get(j)+",";del.add(l.get(j));}ss+=l.get(k);model.a111222.add(ss);del.add(l.get(k));i=k;}}l.removeAll(del);}//拆炸弹public static void getBoomb(List<Card> list,Model model){List<Card> del=new ArrayList<Card>();//要删除的Cards//王炸if(list.size()>=2 &&Common.getColor(list.get(0))==5 && Common.getColor(list.get(1))==5){model.a4.add(list.get(0).name+","+list.get(1).name); //按名字加入del.add(list.get(0));del.add(list.get(1));}//如果王不构成炸弹咋先拆单if(Common.getColor(list.get(0))==5&&Common.getColor(list.get(1))!=5){del.add(list.get(0));model.a1.add(list.get(0).name);}list.removeAll(del);//一般的炸弹for(int i=0,len=list.size();i<len;i++){if(i+3<len && Common.getValue(list.get(i))==Common.getValue(list.get(i+3))){String s=list.get(i).name+",";s+=list.get(i+1).name+",";s+=list.get(i+2).name+",";s+=list.get(i+3).name;model.a4.add(s);for(int j=i;j<=i+3;j++)del.add(list.get(j));i=i+3;}}list.removeAll(del);}//拆3带public static void getThree(List<Card> list,Model model){List<Card> del=new ArrayList<Card>();//要删除的Cards//连续3张相同for(int i=0,len=list.size();i<len;i++){if(i+2<len&&Common.getValue(list.get(i))==Common.getValue(list.get(i+2))) {String s=list.get(i).name+",";s+=list.get(i+1).name+",";s+=list.get(i+2).name;model.a3.add(s);for(int j=i;j<=i+2;j++)del.add(list.get(j));i=i+2;}}list.removeAll(del);}//拆对子public static void getTwo(List<Card> list,Model model){List<Card> del=new ArrayList<Card>();//要删除的Cards//连续2张相同for(int i=0,len=list.size();i<len;i++){if(i+1<len&&Common.getValue(list.get(i))==Common.getValue(list.get(i+1))){String s=list.get(i).name+",";s+=list.get(i+1).name;model.a2.add(s);for(int j=i;j<=i+1;j++)del.add(list.get(j));i=i+1;}}list.removeAll(del);}//拆单牌public static void getSingle(List<Card> list,Model model){ List<Card> del=new ArrayList<Card>();//要删除的Cards//1for(int i=0,len=list.size();i<len;i++){model.a1.add(list.get(i).name);del.add(list.get(i));}list.removeAll(del);}//隐藏之前出过的牌public static void hideCards(List<Card> list){for(int i=0,len=list.size();i<len;i++){list.get(i).setVisible(false);}}//检查牌的是否能出public static int checkCards(List<Card> c,List<Card>[] current){ //找出当前最大的牌是哪个电脑出的,c是点选的牌List<Card> currentlist=(current[0].size()>0)?current[0]:current[2];CardType cType=Common.jugdeType(c);//如果张数不同直接过滤if(cType!=CardType.c4&&c.size()!=currentlist.size())return 0;//比较我的出牌类型if(Common.jugdeType(c)!=Common.jugdeType(currentlist)){return 0;}//比较出的牌是否要大//王炸弹if(cType==CardType.c4){if(c.size()==2)return 1;if(currentlist.size()==2)return 0;}//单牌,对子,3带,4炸弹if(cType==CardType.c1||cType==CardType.c2||cType==CardType.c3||cType==Card Type.c4){if(Common.getValue(c.get(0))<=Common.getValue(currentlist.get(0))){return 0;}else {return 1;}}//顺子,连队,飞机裸if(cType==CardType.c123||cType==CardType.c1122||cType==CardType.c111222) {if(Common.getValue(c.get(0))<=Common.getValue(currentlist.get(0))) return 0;elsereturn 1;}//按重复多少排序//3带1,3带2 ,飞机带单,双,4带1,2,只需比较第一个就行,独一无二的if(cType==CardType.c31||cType==CardType.c32||cType==CardType.c411||cType== CardType.c422||cType==CardType.c11122234||cType==CardType.c1112223344){ List<Card> a1=Common.getOrder2(c); //我出的牌List<Card> a2=Common.getOrder2(currentlist);//当前最大牌if(Common.getValue(a1.get(0))<Common.getValue(a2.get(0)))return 0;}return 1;}//按照重复次数排序public static List getOrder2(List<Card> list){List<Card> list2=new ArrayList<Card>(list);List<Card> list3=new ArrayList<Card>();List<Integer> list4=new ArrayList<Integer>();int len=list2.size();int a[]=new int[20];for(int i=0;i<20;i++)a[i]=0;for(int i=0;i<len;i++){a[Common.getValue(list2.get(i))]++;}int max=0;for(int i=0;i<20;i++){max=0;for(int j=19;j>=0;j--){if(a[j]>a[max])max=j;}for(int k=0;k<len;k++){if(Common.getValue(list2.get(k))==max){list3.add(list2.get(k));}}list2.remove(list3);a[max]=0;}return list3;}}class Card_index{List a[]=new ArrayList[4];//单张}(4)Time.java主要代码public class Time extends Thread {Main main;boolean isRun = true;int i = 10;public Time(Main m, int i) {this.main = m;this.i = i;}@Overridepublic void run() {while (i > -1 && isRun) {main.time[1].setText("倒计时:" + i--);second(1);// 等一秒}if (i == -1)// 正常终结,说明超时main.time[1].setText("不抢");ndlord[0].setVisible(false);ndlord[1].setVisible(false);for (Card card2 : main.playerList[1])card2.canClick = true;// 可被点击// 如果自己抢到地主if (main.time[1].getText().equals("抢地主")) { // 得到地主牌main.playerList[1].addAll(main.lordList);openlord(true);second(2);// 等待五秒Common.order(main.playerList[1]);Common.rePosition(main, main.playerList[1], 1);setlord(1);} else {// 电脑选地主if (Common.getScore(main.playerList[0]) < Common .getScore(main.playerList[2])) {main.time[2].setText("抢地主");main.time[2].setVisible(true);setlord(2);// 设定地主openlord(true);second(3);main.playerList[2].addAll(main.lordList);Common.order(main.playerList[2]);Common.rePosition(main, main.playerList[2], 2);openlord(false);} else {main.time[0].setText("抢地主");main.time[0].setVisible(true);setlord(0);// 设定地主openlord(true);second(3);main.playerList[0].addAll(main.lordList);Common.order(main.playerList[0]);Common.rePosition(main, main.playerList[0], 0);//openlord(false);}}// 选完地主后关闭地主按钮ndlord[0].setVisible(false);ndlord[1].setVisible(false);turnOn(false);for (int i = 0; i < 3; i++){main.time[i].setText("不要");main.time[i].setVisible(false);}// 开始游戏根据地主不同顺序不同main.turn=main.dizhuFlag;while (true) {if(main.turn==1) //我{turnOn(true);// 出牌按钮 --我出牌timeWait(30, 1);// 我自己的定时器turnOn(false);//选完关闭main.turn=(main.turn+1)%3;if(win())//判断输赢break;}if (main.turn==0){computer0();main.turn=(main.turn+1)%3;if(win())//判断输赢break;}if(main.turn==2){computer2();main.turn=(main.turn+1)%3;if(win())//判断输赢break;}}}// 等待i秒public void second(int i) {try {Thread.sleep(i * 1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 地主牌翻看public void openlord(boolean is) {for (int i = 0; i < 3; i++) {if (is)main.lordList.get(i).turnFront(); // 地主牌翻看else {main.lordList.get(i).turnRear(); // 地主牌闭合}main.lordList.get(i).canClick = true;// 可被点击}}// 设定地主public void setlord(int i) {Point point = new Point();if (i == 1)// 我是地主{point.x = 80;point.y = 430;main.dizhuFlag = 1;// 设定地主}if (i == 0) {point.x = 80;point.y = 20;main.dizhuFlag = 0;}if (i == 2) {point.x = 700;point.y = 20;main.dizhuFlag = 2;}main.dizhu.setLocation(point);main.dizhu.setVisible(true);}// 打开出牌按钮public void turnOn(boolean flag) {main.publishCard[0].setVisible(flag);main.publishCard[1].setVisible(flag);}// 电脑0走牌(我代表1)public void computer0() {timeWait(1, 0); // 定时ShowCard(0); // 出牌}// 电脑2走牌(我代表1)public void computer2() {timeWait(1, 2); // 定时ShowCard(2); // 出牌}// 走牌public void ShowCard(int role) {Model model = Common.getModel(main.playerList[role]);// 待走的牌List<String> list = new ArrayList();// 如果是主动出牌if (main.time[(role + 1) % 3].getText().equals("不要")&& main.time[(role + 2) % 3].getText().equals("不要")) { // 有单出单 (除开3带,飞机能带的单牌)if (model.a1.size() > (model.a111222.size() * 2 + model.a3.size())) { list.add(model.a1.get(model.a1.size() - 1));}// 有对子出对子 (除开3带,飞机)else if (model.a2.size() > (model.a111222.size() * 2 + model.a3 .size())) {list.add(model.a2.get(model.a2.size() - 1));}// 有顺子出顺子else if (model.a123.size() > 0) {list.add(model.a123.get(model.a123.size() - 1));}// 有3带就出3带,没有就出光3else if (model.a3.size() > 0) {// 3带单,且非关键时刻不能带王,2if (model.a1.size() > 0) {list.add(model.a1.get(model.a1.size() - 1));}// 3带对else if (model.a2.size() > 0) {list.add(model.a2.get(model.a2.size() - 1));}list.add(model.a3.get(model.a3.size() - 1));}// 有双顺出双顺else if (model.a112233.size() > 0) {list.add(model.a112233.get(model.a112233.size() - 1));}// 有飞机出飞机else if (model.a111222.size() > 0) {String name[] = model.a111222.get(0).split(",");// 带单if (name.length / 3 <= model.a1.size()) {list.add(model.a111222.get(model.a111222.size() - 1));for (int i = 0; i < name.length / 3; i++)list.add(model.a1.get(i));} else if (name.length / 3 <= model.a2.size())// 带双{list.add(model.a111222.get(model.a111222.size() - 1));for (int i = 0; i < name.length / 3; i++)list.add(model.a2.get(i));}// 有炸弹出炸弹} else if (model.a4.size() > 0) {// 4带2,1int sizea1 = model.a1.size();int sizea2 = model.a2.size();if (sizea1 >= 2) {list.add(model.a1.get(sizea1 - 1));。

相关文档
最新文档