📄 gameframe.java
字号:
package jcase.lianliankan;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;
/**
* The main game frame
*/
public class GameFrame extends Frame implements ActionListener {
int gridsize_i=8;
int gridsize_j=12;
int pic_num=2;
int size=gridsize_i*gridsize_j;
int realsize=(gridsize_i-2)*(gridsize_j-2);
int realnumber=realsize/pic_num+1;
JButton [] btn=new JButton[size];
int [] button_flag=new int[size];//判断位置上是否有button,flag=1是有button,flag=0没有
int [][] button_record_i=new int[realnumber][pic_num];
int [][] button_record_j=new int[realnumber][pic_num];//记录button位置,第一个角标表示数值,第二个角标表示第几个
Icon [] icon=new ImageIcon[size];
int first_button_i=0;
int first_button_j=0;//第一次点击的按钮号
int second_button_i=0;
int second_button_j=0;//第二次点击的按钮号
int first_i=0;
int first_j=0;//第一次点击的按钮号
int second_i=0;
int second_j=0;//第二次点击的按钮号
boolean flag=false;//flag为true时表示有通路
boolean record_flag=false;//记录两点之间有没有直线通路
boolean flagdraw=false;//画线
int helpfirst_button_i;
int helpfirst_button_j;//第一次点击的按钮号
int helpsecond_button_i;
int helpsecond_button_j;//第二次点击的按钮号
int record1_i=0;
int record1_j=0;
int record2_i=0;
int record2_j=0;//记录直线的两个或一个拐点的位置
int num;
int last=0;//剩余按钮数
String [] record_name=new String[10];
String [] record_time=new String[10];//十个记录
Panel p1=new Panel();
Panel p2=new Panel();
Timer t=createTimer();
Dialog MegDlg,MegDlg_r;
//int s=0;
Button btnY,btnN;
//菜单栏
MenuBar m_MenuBar;
Menu menuFile,menuEdit,menuRecord;
MenuItem mi_File_help,mi_File_wash;
MenuItem menu_Edit_c,menu_Edit_z,menu_Edit_g,menu_Edit_Exit;
MenuItem mi_record;
//查看记录,重新开始,洗牌,初级,中级,高级,退出
File [] MyFile=new File[3];
int level;
Label lian1;
Font MyFont =new Font("Dialog",Font.ITALIC|Font.BOLD,72);
GameFrame()
{
super("连连看");
lian1=new Label(" -==连连看==- ");
lian1.setFont(MyFont);
btnY=new Button("确定");
btnN=new Button("关闭");
MyFile[0]=new File("easy.data");
MyFile[1]=new File("normal.data");
MyFile[2]=new File("hard.data");
setLayout(new BorderLayout());
setBounds(200,120,gridsize_j*48,gridsize_i*52+30+4);
init();
int iset=0;
level=0;
for (level=0;level<3;level++)
{
try
{
DataInputStream record_in=new DataInputStream(new FileInputStream(MyFile[level]));
for (iset=0;iset<10;iset++)
{
record_name[iset]=record_in.readUTF();
record_time[iset]=record_in.readUTF();
}
}
catch(IOException ioe){
Log.debug("read records error.",ioe);
}
if (iset==0)
{
for (int i=0;i<10;i++)
{
record_name[i]="无名";
record_time[i]="59:59";
}
try
{
DataOutputStream record_out=new DataOutputStream(new FileOutputStream(MyFile[level]));
for (int i=0;i<10;i++)
{
record_out.writeUTF(record_name[i]);
record_out.writeUTF(record_time[i]);
}
record_out.close();
}
catch(IOException ioe){
Log.debug("write records error.",ioe);
}
}
}
level=0;
add("Center",lian1);
setVisible(true);
setResizable(false);
btnY.addActionListener(this);
btnN.addActionListener(this);
addWindowListener(new WindowCloser());
}
public void init()//菜单条
{
m_MenuBar=new MenuBar();
menuEdit=new Menu("文件");
menu_Edit_c=new MenuItem("easy");
menu_Edit_z=new MenuItem("normal");
menu_Edit_g=new MenuItem("hard");
menu_Edit_Exit=new MenuItem("退出");
menuEdit.add(menu_Edit_c);
menuEdit.add(menu_Edit_z);
menuEdit.add(menu_Edit_g);
menuEdit.add(menu_Edit_Exit);
m_MenuBar.add(menuEdit);
menuFile=new Menu("操作");
mi_File_help=new MenuItem("提示");
mi_File_wash=new MenuItem("洗牌");
menuFile.add(mi_File_help);
menuFile.add(mi_File_wash);
m_MenuBar.add(menuFile);
menuRecord=new Menu("记录");
mi_record=new MenuItem("查看记录");
menuRecord.add(mi_record);
m_MenuBar.add(menuRecord);
menu_Edit_c.addActionListener(this);
menu_Edit_z.addActionListener(this);
menu_Edit_g.addActionListener(this);
menu_Edit_Exit.addActionListener(this);
mi_File_wash.addActionListener(this);
mi_record.addActionListener(this);
mi_File_help.addActionListener(this);
this.setMenuBar(m_MenuBar);
}
public void restart()
{
first_i=0;
first_j=0;//第一次点击的按钮号
second_i=0;
second_j=0;//第二次点击的按钮号
helpfirst_button_i=0;
helpfirst_button_j=0;//第一次点击的按钮号
helpsecond_button_i=0;
helpsecond_button_j=0;//第二次点击的按钮号
p1=new Panel();
p2=new Panel();
t=createTimer();
size=gridsize_i*gridsize_j;
realsize=(gridsize_i-2)*(gridsize_j-2);
last=realsize;
realnumber=realsize/pic_num+1;
btn=new JButton[size];
button_flag=new int[size];//判断位置上是否有button,flag=1是有button,flag=0没有
button_record_i=new int[realnumber][pic_num];
button_record_j=new int[realnumber][pic_num];//记录button位置,第一个角标表示数值,第二个角标表示第几个
icon=new ImageIcon[size];
t.start();
setSize(gridsize_j*48,gridsize_i*52+30+4);
p1.setLayout(new GridLayout(gridsize_i,gridsize_j));
p2.add(t);
add("Center",p1);
add("South",p2);
setpic();
while(!check())
{
wash();
}
setVisible(true);
}
public void setpic()
{
int ran_i,ran_j,count_num;//(ran_i,ran_j)随机地址,num不同图案的个数,count_num相同图案的个数
count_num=0;
for (int i=0;i<realsize/pic_num;i++)
{
count_num=i+1;
icon[i]=new ImageIcon("Images/Img00"+count_num+".gif");
}
btn=new JButton[size];
for (int i=0;i<size;i++)
{
btn[i]=new JButton(Integer.toString(-1));
btn[i].setFocusable(false);
btn[i].setBackground(Color.lightGray);
}
num=0;
count_num=0;
for (int i=0;i<realsize;i++)
{
ran_i=(int)((Math.random())*(gridsize_i-2)+1);
ran_j=(int)((Math.random())*(gridsize_j-2)+1);
while(!(btn[ran_i*gridsize_j+ran_j].getText().equals("-1")))
{
ran_i+=1;
if (ran_i==gridsize_i-1)
{
ran_i=1;
ran_j+=1;
if (ran_j==gridsize_j-1)
ran_j=1;
}
}
btn[ran_i*gridsize_j+ran_j].setText(Integer.toString(num));
btn[ran_i*gridsize_j+ran_j].setIcon(icon[num]);
button_record_i[num][count_num]=ran_i;
button_record_j[num][count_num]=ran_j;
count_num+=1;
if (count_num%pic_num==0)
{
count_num=0;
num+=1;
}
}
for (int i=0;i<gridsize_i;i++)
for (int j=0;j<gridsize_j;j++)
{
p1.add(btn[i*gridsize_j+j]);
}
for (int i=0;i<gridsize_i;i++)
{
for (int j=0;j<gridsize_j;j++)
{
if ((i>0)&&(i<gridsize_i-1)&&(j>0)&&(j<gridsize_j-1))
{
button_flag[i*gridsize_j+j]=1;
btn[i*gridsize_j+j].addActionListener(this);
}
else
{
button_flag[i*gridsize_j+j]=0;
btn[i*gridsize_j+j].setVisible(false);
}
}
}
}
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand()=="确定")
{
MegDlg.dispose();
}
else if (e.getActionCommand()=="关闭")
{
MegDlg_r.dispose();
}
else if (e.getActionCommand()=="easy")
{
level=0;
gridsize_i=6;
gridsize_j=10;
pic_num=2;
removeAll();
restart();
}
else if (e.getActionCommand()=="normal")
{
level=1;
gridsize_i=8;
gridsize_j=12;
pic_num=2;
removeAll();
restart();
}
else if (e.getActionCommand()=="hard")
{
level=2;
gridsize_i=10;
gridsize_j=14;
pic_num=4;
removeAll();
restart();
}
else if (e.getActionCommand()=="退出")
{
dispose();
System.exit(0);
}
else if (e.getActionCommand()=="洗牌")
{
wash();
}
else if (e.getActionCommand()=="提示")
{
btn[first_i*gridsize_j+first_j].setBackground(Color.lightGray);
first_i=0;
first_j=0;
if (check())
{
btn[helpfirst_button_i*gridsize_j+helpfirst_button_j].setBackground(Color.red);
btn[helpsecond_button_i*gridsize_j+helpsecond_button_j].setBackground(Color.red);
}
}
else if (e.getActionCommand()=="查看记录")
{
MegDlg_r=new Dialog(this,"记录",true);
Panel p5=new Panel();
Panel p6=new Panel();
TextArea getrecord=new TextArea(15,30);
getrecord.append("排名");
getrecord.append(" ");
getrecord.append("姓名");
getrecord.append(" ");
getrecord.append("记录");
getrecord.append("\n");
try
{
DataInputStream record_in=new DataInputStream(new FileInputStream(MyFile[level]));
for (int i=0;i<10;i++)
{
record_name[i]=record_in.readUTF();
record_time[i]=record_in.readUTF();
}
}
catch(IOException ioe){}
for (int i=0;i<10;i++)
{
if (i<9)
getrecord.append("0"+Integer.toString(i+1)+" ");
if (i==9)
getrecord.append(Integer.toString(i+1)+" ");
getrecord.append(record_name[i]);
for (int j=0;j<10-record_name[i].length();j++)
{
getrecord.append(" ");
}
getrecord.append(" ");
if (record_time[i].equals("59:59"))
getrecord.append(" ");
else getrecord.append(record_time[i]);
getrecord.append("\n");
}
getrecord.setEditable(false);
String levelstring;
if (level==0)
levelstring="easy";
else if (level==1)
levelstring="normal";
else levelstring="hard";
p5.add(new Label(levelstring+"级 最新记录"));
p6.setLayout(new FlowLayout());
p6.add(getrecord);
//p6.add(btnN);
MegDlg_r.add("North",p5);
MegDlg_r.add("Center",p6);
MegDlg_r.add("South",btnN);
//MegDlg_r.setBounds(350,200,250,350);
//MegDlg_r.setResizable(false);
MegDlg_r.pack();
MegDlg_r.show();
}
else
{
if ((first_i==0)&&(first_j==0))
{
for (int i=1;i<gridsize_i-1;i++)
{
for (int j=1;j<gridsize_j-1;j++)
{
btn[helpfirst_button_i*gridsize_j+helpfirst_button_j].setBackground(Color.lightGray);
btn[helpsecond_button_i*gridsize_j+helpsecond_button_j].setBackground(Color.lightGray);
if (e.getSource()==btn[i*gridsize_j+j])
{
first_i=i;
first_j=j;
btn[i*gridsize_j+j].setBackground(Color.red);
break;
}
}
if (e.getSource()==btn[first_i*gridsize_j+first_j]) break;
}
}
else
{
if (!e.getSource().equals(btn[first_i*gridsize_j+first_j]))
{
for (int i=1;i<gridsize_i-1;i++)
for (int j=1;j<gridsize_j-1;j++)
{
if (e.getSource()==btn[i*gridsize_j+j])
{
second_i=i;
second_j=j;
break;
}
}
if (btn[first_i*gridsize_j+first_j].getText().equals(btn[second_i*gridsize_j+second_j].getText()))
{
first_button_i=first_i;
first_button_j=first_j;
second_button_i=second_i;
second_button_j=second_j;
button_flag[first_i*gridsize_j+first_j]=0;
button_flag[second_i*gridsize_j+second_j]=0;
if (search())
{
flagdraw=true;
btn[first_i*gridsize_j+first_j].setVisible(false);
btn[second_i*gridsize_j+second_j].setVisible(false);
p1.remove(btn[first_i*gridsize_j+first_j]);
p1.remove(btn[second_i*gridsize_j+second_j]);
first_i=0;
first_j=0;
last=last-2;
if (last==0)
{
//finished,show congratulation dialog
String ctime;
t.stop();
ctime=t.getTime();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -