package solitaire;
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
import java.util.Stack;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.SwingUtilities;
import javax.swing.border.EtchedBorder;
/**
* @author JSM 游戏主界面
*/
public class Play extends JLayeredPane
{
/** 界面大小 */
private int width = 780;
private int height = 600;
/* 存放所有的52张牌 */
private Stack<Card> card;
/* 构造1个deck */
private Deck deck;
/* 构造1个已被翻开的备用牌叠 */
private Discard discard;
/* 构造4个已经排好序的牌叠 */
private SuitPiles[] suitPiles = new SuitPiles[4];
/* 构造7个正在排序的牌叠 */
private Piles[] piles = new Piles[7];
/* 监听器 */
PMouseListener pml = new PMouseListener();
/** 构造方法 */
public Play()
{
// 设置大小
setSize(width, height);
setBackground(new Color(0, 88, 0));
this.setLayout(null);
this.addMouseListener(pml);
JLabel label = new JLabel(new ImageIcon(
Play.class.getResource("/images/背景.jpg")));
label.setBounds(0, 0, 790, 600);
this.setLayer(label, -30001);
add(label);
init();
}
/* 初始化游戏界面 */
private void init()
{
initAllPiles();
addAll();
setCardLocation();
}
/* 重置游戏界面 */
public void reset()
{
removeAll();
init();
}
/** 初始化所有牌叠堆栈 */
private void initAllPiles()
{
/* 初始化deck */
deck = new Deck();
/* 初始化已被翻开的备用牌叠 */
discard = new Discard();
/* 初始化4个已经排好序的牌叠 */
for (int i = 0; i < 4; i++)
{
suitPiles[i] = new SuitPiles(i);
}
/* 初始化7个正在排序的牌叠 */
for (int i = 0; i < 7; i++)
{
piles[i] = new Piles(i);
}
initCard();
allocationCard();
}
/* 初始化所有的52张纸牌 */
private void initCard()
{
card = new Stack<Card>();
for (int i = 0; i < 52; i++)
{
/* 红桃 */
if (i < 13)
{
card.push(new Card(i + 1, Card.HONG_TAO));
}
else
{
/* 方片 */
if (13 <= i && i < 26)
{
card.push(new Card(i + 1 - 13, Card.FANG_PIAN));
}
else
{
/* 黑桃 */
if (26 <= i && i < 39)
{
card.push(new Card(i + 1 - 26, Card.HEI_TAO));
}
/* 梅花 */
else
{
card.push(new Card(i + 1 - 39, Card.MEI_HUA));
}
}
}
}
fixCard();
}
/** 将所有的纸牌打乱 */
private void fixCard()
{
Random r = new Random();
int k;
for (int i = 0; i < 52; i++)
{
k = r.nextInt(52);
card.add(i, card.remove(k));
}
}
/** 分配所有的52张纸牌 */
private void allocationCard()
{
/* deck */
for (int i = 0; i < 24; i++)
{
deck.push(card.pop());
}
/* 正在排序的牌叠 */
for (int i = 0; i < 7; i++)
for (int j = 0; j <= i; j++)
{
piles[i].push(card.pop());
}
}
/** 将所有的正在排序的纸牌的最上一张翻开 */
private void setPilOpen()
{
for (int i = 0; i < 7; i++)
{
if (piles[i].size() > 0)
piles[i].peek().open();
}
}
/* 将所有纸牌加入到游戏界面上并为纸牌添加监听器 */
private void addAll()
{
/* 添加deck */
addListener(deck.lab);
add(deck.lab);
for (Card c : deck)
{
add(c);
addListener(c);
}
/* 添加已被翻开的备用牌叠 */
for (Card c : discard)
{
add(c);
addListener(c);
}
/* 添加4个已经排好序的牌叠 */
for (int i = 0; i < 4; i++)
{
add(suitPiles[i].lab);
for (Card c : suitPiles[i])
{
add(c);
addListener(c);
}
}
/* 添加7个正在排序的牌叠 */
for (int i = 0; i < 7; i++)
{
add(piles[i].lab);
for (Card c : piles[i])
{
add(c);
addListener(c);
}
}
}
private void addListener(JLabel c)
{
c.addMouseListener(pml);
c.addMouseMotionListener(pml);
}
/* 设置所有的纸牌及纸牌下边框位置 */
private void setCardLocation()
{
/* 设置deck中纸牌的位置 */
deck.setLocation();
/* 设置已被翻开的备用牌叠中纸牌的位置 */
discard.setLocation();
/* 设置4个已经排好序的牌叠中纸牌的位置 */
for (int i = 0; i < 4; i++)
{
suitPiles[i].setLocation();
}
/* 设置7个正在排序的牌叠中纸牌的位置 */
for (int i = 0; i < 7; i++)
{
piles[i].setLocation();
}
setPilOpen();
if (isWin())
win();
}
// 如果赢了,计时器线程结束,弹出对话框
private void win()
{
new MyDialog(this);
System.out.println("You Win!");
}
// 判断赢
private boolean isWin()
{
int clear = 0;
for (int i = 0; i < 7; i++)
{
if (piles[i].size() == 0)
{
clear++;
}
}
if (clear == 7)
{
return true;
}
return false;
}
private boolean scan()
{
for (int i = 0; i < 4; i++)
{
if (suitPiles[i].size() != 0)
{
if (discard.size() != 0
&& suitPiles[i].peek().getNum() == discard.peek()
.getNum() - 1
&& suitPiles[i].peek().getColor() == discard.peek()
.getColor())
{
suitPiles[i].push(discard.pop());
return true;
}
else
{
for (int j = 0; j < 7; j++)
{
if (piles[j].size() != 0
&& suitPiles[i].peek().getNum() == piles[j]
.peek().getNum() - 1
&& suitPiles[i].peek().getColor() == piles[j]
.peek().getColor())
{
suitPiles[i].push(piles[j].pop());
return true;
}
}
}
}
else
{
if (discard.size() != 0 && discard.peek().getNum() == 1)
{
suitPiles[i].push(discard.pop());
return true;
}
else
{
for (int j = 0; j < 7; j++)
{
if (piles[j].size() != 0
&& piles[j].peek().getNum() == 1)
{
suitPiles[i].push(piles[j].pop());
return true;
}
}
}
}
}
return false;
}
// 鼠标监听器类
class PMouseListener extends MouseAdapter
{
@Override
public void mouseEntered(MouseEvent e)
{
// TODO 自动生成的方法存根
if (!e.getComponent().getClass().toString()
.equals("class solitaire.Play"))
{
((JLabel) e.getComponent()).setBorder(BorderFactory
.createMatteBorder(3, 1, 3, 3, new Color(255, 255, 0)));
}
}
@Override
public void mouseExited(MouseEvent e)
{
// TODO 自动生成的方法存根
if (!e.getComponent().getClass().toString()
.equals("class solitaire.Play"))
{
((JLabel) e.getComponent()).setBorder(null);
}
}
Point point = new Point(0, 0);
int index;
Component com;
Cards cards;
@Override
/** 鼠标点击,只处理点击deck的事件 */
public void mouseClicked(MouseEvent e)
{
if (e.getComponent().getClass().toString()
.equals("class solitaire.Play"))
{
if (e.getButton() == MouseEvent.BUTTON3)
{
while (scan())
;
// System.out.print(555555555);
}
}
else
{
Component c = e.getComponent();
/* 如果当前点击的牌叠是deck,则将其中最上面的纸牌加入discard中 */
if (deck.in(c))
{
discard.push(deck.pop());
}
else
{
/* 如果deck的大小为0,则将discard中的纸牌由上到下加入deck中 */
if (c.equals(deck.lab))
{
int size = discard.size();
for (int i = 0; i < size; i++)
deck.push(discard.pop());
}
}
// deck.setLocation();
// discard.setLocation();
((JLabel) e.getComponent()).setBorder(null);
}
setCardLocation();
}
@Override
/** 鼠标按下,用来处理所有即将拖动的纸牌 */
public void mousePressed(MouseEvent e)
{
if (e.getComponent().getClass().toString()
.equals("class solitaire.Play"))
{
}
else
{
Component c = e.getComponent();
// TODO 自动生成的方法存根
/* 如果当前点按下的纸牌不在deck中,则记录当前按下的点,及当前�
基于JAVA的windows经典纸牌游戏,适用于山东大学面向对象实验或供JAVA学习者交流讨论
5星 · 超过95%的资源 需积分: 9 119 浏览量
2014-11-07
16:31:13
上传
评论 5
收藏 274KB ZIP 举报
我的妹纸呢
- 粉丝: 0
- 资源: 2
最新资源
- 基于CarNet实现裂缝检测python源码+文档说明+数据+图片(课程设计)
- 课程设计-基于耐火材料裂缝剥落检测python源码+课件
- 基于OpenCV的视频道路车道检测python源码+文档说明+实验演示+图片+使用方法(高分毕业设计)
- 基于OpenCV的案例:图像边缘、角点和轮廓检测,图像分割,图像增强;图片拼接;运动目标检测,颜色直方图比较,三帧帧差法,抠图
- SmartPlug-html大一笔记
- SmartPlug-proteusdemo
- Preliminary Findings on Handmade Rattan Baby Crib andBassinet Designs Regarding.zip
- aveebfq_v1.2.83_downyi.com.apk
- 基于有机发光二极管(OLED)的建模优化算法的matlab仿真源码+数据+文档说明+项目说明(高分课程设计)
- hash01-test.c 本人哈希表(一)的示例代码,仅供参考!
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈