📄 playarea.java
字号:
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.awt.*;
import java.io.*;
import java.applet.*;
import java.net.*;
public class PlayArea extends JPanel implements ActionListener,Runnable{
private int row,col;//行列数
private int count=0;//记录点击次数
private ArrayList<ImageButton> allButtonList;//所有的按钮数组链表
private String imageNames[];//图片名称数组
private LinkedList<ImageIcon> openIconList;//已经打开的图片的集合(链表)
private LinkedList<ImageButton> openButtonList;//已经翻开图像的Button集合
private File currentFile;//当前等级打开的相应的文件
private int success=0;//记录翻开的图片数目
private Record record;//记录具体查看Record类定义
private Thread hintThread;
private JButton hintButton;//提示按钮
private int usedTimes=0;//所用时间记录
private JTextField showUsedTimes,hintMessage;//提示消息用的文本域
private javax.swing.Timer timer;//时间控件
private JPanel center,south;
private AudioPlay successMusic=null;//翻开相同图片的声音
private AudioPlay failMusic=null;//翻开不同图片的声音
private AudioPlay finishMusic=null;//完成的声音
private AudioPlay hintMusic=null;//提示的声音
public PlayArea(){
setLayout(new BorderLayout());
//下面是初始化不同状况的声音
successMusic=new AudioPlay("success.wav");
failMusic=new AudioPlay("fail.wav");
finishMusic=new AudioPlay("finish.wav");
hintMusic =new AudioPlay("hint.wav");
//生成要处理button 和 ImageIcon的集合
allButtonList=new ArrayList<ImageButton>();
openIconList=new LinkedList<ImageIcon>();
openButtonList=new LinkedList<ImageButton>();
hintThread=new Thread(this);
hintMessage=new JTextField();
hintMessage.setHorizontalAlignment(JTextField.CENTER);
hintMessage.setEditable(false);
hintMessage.setFont(new Font("宋体",Font.BOLD,18));
hintMessage.setText("点击次数越多成绩越差");
center=new JPanel();
south=new JPanel();
record=new Record();
hintButton=new JButton("提示");
hintButton.addActionListener(this);
showUsedTimes=new JTextField(12);//显示时间用的
showUsedTimes.setEditable(false);//不可以编辑
showUsedTimes.setHorizontalAlignment(JTextField.CENTER);//水平居中
south.add(new JLabel("用时:"));
south.add(showUsedTimes);
south.add(new JLabel(" 提示图标位置(导致用时增加):"));
south.add(hintButton);
add(south,BorderLayout.SOUTH);
add(hintMessage,BorderLayout.NORTH);
timer=new javax.swing.Timer(1000,this);//每一秒触发一次事件
invalidate();
}
//游戏的初始化
public void initImageButton(int r,int c,String[] imagenames,File currentFile){
row=r;
col=c;
count=0;
this.currentFile=currentFile;
imageNames=imagenames;
openButtonList.clear();
openIconList.clear();
center.removeAll();
center.setLayout(new GridLayout(row,col));
if(timer.isRunning()){
timer.stop();
}
ImageIcon icon[]=new ImageIcon[imageNames.length];
for(int i=0;i<icon.length;i++){
icon[i]=new ImageIcon(imageNames[i]);
}
if(allButtonList.isEmpty()){
for(int i=0;i<row*col;i++){
allButtonList.add(new ImageButton());
}
}else{
allButtonList.clear();
for(int i=0;i<row*col;i++){
allButtonList.add(new ImageButton());
}
}
//给每个button绑定一个图片 并添加监听事件
for(int i=0;i<allButtonList.size();i++){
allButtonList.get(i).addActionListener(this);
allButtonList.get(i).setImageIcon(icon[i%row]);
}
Collections.shuffle(allButtonList); //随机置换按钮链表
for(int i=0;i<col*row;i++){
center.add(allButtonList.get(i));
//allButtonList.get(i).showImageIcon();
}
hintMessage.setText("您需要用鼠标单击出"+col+"个同样图标的方块");
usedTimes=0;
add(center,BorderLayout.CENTER);
showUsedTimes.setText(null);
validate();
}//end initImageButton
public void actionPerformed(ActionEvent e){
//如果点击的是显示图片的按钮则有下列事件发生
if(e.getSource() instanceof ImageButton){
count++;//点击一次记录就加一
if(!timer.isRunning()){
timer.start();
}
ImageButton imagebutton=(ImageButton)e.getSource();
imagebutton.showImageIcon();//当前点击的按钮显示图片
if(openIconList.size()==0){//游戏开始或重置的情况
successMusic.play();
openIconList.add(imagebutton.getImageIcon());
openButtonList.add(imagebutton);
success=1;
}else{//非开始或重置情况
if(imagebutton.getImageIcon()==openIconList.getLast()&&!(openButtonList.contains(imagebutton))){
//点击了相同的图片,但不是点击了已经出现的图片
success+=1;
//这里应该是播放翻开相同图片的声音
successMusic.play();
openIconList.add(imagebutton.getImageIcon());
openButtonList.add(imagebutton);
if(success==col){//这里是游戏完成的情况
//这里应该是播放恭喜过关的声音
finishMusic.play();
for(int i=0;i<allButtonList.size();i++){
allButtonList.get(i).setEnabled(false);
}
for(int i=0;i<openButtonList.size();i++){
openButtonList.get(i).setDisabledIcon(openButtonList.get(i).getImageIcon());
}
timer.stop();
record.setTime(usedTimes);
record.setCount(count);
record.openFile(currentFile);
}
}
else if(imagebutton.getImageIcon()!=openIconList.getLast()&&!(openButtonList.contains(imagebutton))){
//选择的图片和前面的不同
//这里应该是播放翻开了不同的图片的声音
failMusic.play();
for(int i=0;i<openButtonList.size();i++){
openButtonList.get(i).setIcon(null);
}
openButtonList.clear();
openIconList.clear();
openIconList.add(imagebutton.getImageIcon());
openButtonList.add(imagebutton);
success=1;
}
}
}
if(e.getSource()==hintButton){
//提示
hintMusic.play();
if(!hintThread.isAlive())
hintThread=new Thread(this);
for(int i=0;i<allButtonList.size();i++)
allButtonList.get(i).removeActionListener(this);
usedTimes=usedTimes+10;
try{
hintThread.start();
}
catch(IllegalThreadStateException ex){}
}
if(e.getSource()==timer){
usedTimes++;
showUsedTimes.setText("你用时:"+usedTimes+" 秒"+success);
}
}
public void run(){
for(int i=0;i<allButtonList.size();i++){
allButtonList.get(i).showImageIcon();
}
try{ Thread.sleep(1500);
}
catch(InterruptedException exp){}
for(int i=0;i<allButtonList.size();i++){
allButtonList.get(i).addActionListener(this);
if(!(openButtonList.contains(allButtonList.get(i)))){
allButtonList.get(i).setIcon(null);
}
}
hintMusic.stop();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -