日期:2014-05-17 浏览次数:21012 次
这一篇文章不同于上一篇文章。做了较大的改造,其中把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 List tablelist[] = 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("新游戏&