日期:2014-05-17  浏览次数:20824 次

java仿windows纸牌游戏 (二)


这一篇文章不同于上一篇文章。做了较大的改造,其中把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("新游戏&