日期:2014-05-17 浏览次数:20812 次
这一篇文章不同于上一篇文章。做了较大的改造,其中把HashMap换成了ArrayList,虽然空间占用多了很多,因为定义了很多个List
但是各种规则的实现则不容易产生bug。 本程序自己测试还没有发现bug。希望运行了的同学指出不足哦。多多交流
这次给源文件+源码
下载不要分、
http://download.csdn.net/detail/cq361106306/4462720
截图
源码:
import java.awt.Color; import java.awt.Container; import java.util.List; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.HashMap; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; public class CardMain extends JFrame implements ActionListener{ public Container container=null; public static Listtablelist[] = new ArrayList[7];//装未发的牌堆 7堆 public static List waitlist = new ArrayList ();//装未发的牌堆 public static List dragList=new ArrayList ();//装当前正在移动的纸牌 这样设计是为了解决某个bug public static List AList[]=new ArrayList[4]; public static Card border1[]=new Card[6]; //第一排白框 public static Card border2[]=new Card[7];//第二排白框 public static JLabel card[]=new Card[52];//所有卡片 JMenuItem start,exit,about; int min=10,max=20; public CardMain(){ Init();//初始化 SetMenu();//创建菜单 InitCards();//发牌 InitBorder();//设置边框 this.setVisible(true); } //随即打乱牌 public void getRondom(){ JLabel temp=null; for(int i=0;i<52;i++) { int a = (int) (Math.random() * 52); int b = (int) (Math.random() * 52); temp = card[a]; card[a] = card[b]; card[b] = temp; } } //发牌 public void InitCards(){ //初始化52张牌 for(int i=0;i<4;i++) { for(int j=0;j<13;j++) { card[i*13+j]=new Card(this,(i+1)+"-"+(j+1),"front"); } } getRondom();//打乱顺序 //先发7堆,并且每一堆最上面一章是翻开的 int count=0; Point point; for(int k=0;k<24;k++) { ((Card)card[count]).turnRear(); point=new Point(); point.x=600; point.y=30; card[count].setLocation(point); //加入待发牌列表 waitlist.add((Card)card[count]); container.add(card[count]); count++; } for(int i=0;i<7;i++) { tablelist[i]=new ArrayList ();//初始化 for(int j=i;j>=0;j--) { if(j<i)//这句话的意思是当不上最后一张的时候背面,默认不可移动 { ((Card)card[count]).turnRear(); }else {//否则可以移动 ((Card)card[count]).canmove=true; } point=new Point(); point.x=50+100*i; point.y=180+min*j; card[count].setLocation(point); //加入桌面7个队列之一 tablelist[i].add(((Card)card[count])); container.add(card[count]); count++; } } } //画边框 public void InitBorder(){ //4个A for(int i=0;i<6;i++) { border1[i]=new Card(this); border1[i].setBorder(BorderFactory.createLineBorder(Color.white)); if(i<4) { border1[i].setBounds(50+100*i, 30,71,96); AList[i]=new ArrayList (); }else { border1[i].setBounds(600+(i-4)*100, 30,71,96); } container.add(border1[i]); } //7列 for(int i=0;i<7;i++) { border2[i]=new Card(this); border2[i].setBorder(BorderFactory.createLineBorder(Color.white)); border2[i].setBounds(50+100*i, 180,71,96); container.add(border2[i]); } } //初始化窗体 public void Init(){ this.setTitle("经典纸牌游戏---by 小柒"); this.setSize(850, 650); 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("新游戏&