翻牌变色游戏

package com.icss;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;


import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.event.ActionEvent;


public class GameFrame extends JFrame {

private int step;


private JPanel contentPane;
private JButton[] btnAry;
private JLabel lblJindu;
private JLabel lblStep;
private JButton btnRestart;
private JButton btnExit;


/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
GameFrame frame = new GameFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}


/**
* Create the frame.
*/
public GameFrame() {
step = 0;

setTitle("\u6B22\u8FCE\u8FDB\u5165\u7FFB\u724C\u6E38\u620F");
//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//废掉了x按钮的功能
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

this.setSize(464, 595);
this.setLocationRelativeTo(this);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);

//摆放游戏按钮的面板
JPanel pnlGame = new JPanel();
pnlGame.setBounds(0, 43, 456, 468);
contentPane.add(pnlGame);

//显示进度的标签
lblJindu = new JLabel("\u5F53\u524D\u8FDB\u5EA60/81");
lblJindu.setBounds(10, 10, 141, 23);
contentPane.add(lblJindu);

//显示步数的标签
lblStep = new JLabel("\u4F7F\u7528\u4E860\u6B65");
lblStep.setHorizontalAlignment(SwingConstants.RIGHT);
lblStep.setBounds(305, 10, 141, 23);
contentPane.add(lblStep);

//重新开始按钮
btnRestart = new JButton("\u91CD\u65B0\u5F00\u59CB");
btnRestart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//重新开始按钮的事件处理方法

//所有的按钮全部恢复为红色
for (int i = 0; i < btnAry.length; i++) {
btnAry[i].setBackground(Color.PINK);
}

//使用步数清零
step = 0;
lblStep.setText("当前使用:" + step + "步");

//当前进度也重新显示
int blueCount = getBlueButtonCount();
lblJindu.setText("当前进度:" + blueCount + "/81");
}
});
btnRestart.setBounds(113, 521, 107, 30);
contentPane.add(btnRestart);

//退出游戏按钮
btnExit = new JButton("\u9000\u51FA\u6E38\u620F");
btnExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//退出游戏按钮的事件处理
//先询问用户是否真的退出
//JOptionPane.showConfirmDialog(null, "您真的打算退出吗?");
if (JOptionPane.showConfirmDialog(null, "您真的打算退出吗?",
"退出", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
System.exit(0);
}
}
});
btnExit.setBounds(230, 521, 107, 30);
contentPane.add(btnExit);

//为了调试游戏胜利的结果,特别增加的作弊按钮,游戏完成,记得删除它
JButton btnZuobi = new JButton("B");
btnZuobi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//令所有的按钮都变成蓝色,离开胜利差一步
for (int i = 0; i < btnAry.length; i++) {
btnAry[i].setBackground(Color.BLUE);
}

//往回退一步
btnAry[0].doClick();
//btnAry[0].setBackground(Color.PINK);
//btnAry[1].setBackground(Color.PINK);
//btnAry[9].setBackground(Color.PINK);
}
});
btnZuobi.setBounds(407, 525, 39, 26);
contentPane.add(btnZuobi);

//为当前窗体注册窗体监听器
this.addWindowListener(new MyWindowListener());

//=============================华丽的分割线===================
btnAry = new JButton[9 * 9];
GridLayout gl = new GridLayout(9, 9);
pnlGame.setLayout(gl);



//实例化一个监听器出来
GameButtonListener gbl = new GameButtonListener();

for (int i = 0; i < btnAry.length; i++) {
btnAry[i] = new JButton();
pnlGame.add(btnAry[i]);
//将按钮的索引以文本的方式显示在按钮上面。
btnAry[i].setText(i + "");

btnAry[i].setBackground(Color.PINK);
//将数组中的每个按钮都注册到同一个监听器
btnAry[i].addActionListener(gbl);

//以当前按钮的索引为字符串设定为名牌
btnAry[i].setActionCommand(i + "");
}
}

//自定义一个方法,该方法能够使得某一个按钮变颜色,达到翻转的效果
//参数:指定按钮的索引
//功能:指定索引的按钮变换颜色
//返回值:无
private void changeColor(int index) {
//原来是红的,变蓝色,原来是蓝的,变红色 
if (btnAry[index].getBackground().equals(Color.PINK)) {
btnAry[index].setBackground(Color.BLUE);
} else {
btnAry[index].setBackground(Color.PINK);
}
}

//自定义一个获得当前按钮数组中有多少个蓝色按钮的方法
private int getBlueButtonCount() {
int bcount = 0;
for (int i = 0; i < btnAry.length; i++) {
if (btnAry[i].getBackground().equals(Color.BLUE)) {
bcount++;
}
}

return bcount;
}

//定义1个监听器将所有的游戏按钮都控制住
private class GameButtonListener implements ActionListener {


@Override
public void actionPerformed(ActionEvent ae) {
//每次点击游戏按钮都应当增加一次步数
step++;

//要分辨出到底是哪个按钮被按下,要获得此按钮在整个数组中的索引
String strCmd = ae.getActionCommand();   //撕下名牌
int index = Integer.parseInt(strCmd);   //将字符串转化为索引

//令被点击的那个按钮变颜色
//自己变,调用自定义的变色方法
changeColor(index);

//上面变  index - 9
if (index >= 9) {
changeColor(index - 9);
}

//下面变
if (index < 9 * (9 - 1)) {
changeColor(index + 9);
}

//只有当被点击的按钮不在最左边的时候,左边的按钮才需要变
if (index % 9 != 0) {
changeColor(index - 1);
}

//右边变
if ((index + 1) % 9 != 0) {
changeColor(index + 1);
}

int blueCount = getBlueButtonCount();
//显示当前进度
lblJindu.setText("当前进度:" + blueCount + "/81");
//显示游戏步数
lblStep.setText("当前使用:" + step + "步");

//判断是否已经胜利,所有的按钮的变成蓝色
if (blueCount == 81) {
//胜利后的效果,稍后再处理
//弹出一个消息框,恭喜玩家,告诉他赢了。
//JOptionPane.showMessageDialog(null, "恭喜您,胜利了。");
JOptionPane.showMessageDialog(null, "You win!", "胜利", JOptionPane.INFORMATION_MESSAGE); 

//暗示用户重新开始
btnRestart.doClick();
}
}

}

//自定义窗体监听器来控制窗体事件
//通过继承适配器类的方式
private class MyWindowListener extends WindowAdapter {
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
btnExit.doClick();
}
}
/*
* 通过实现监听器接口的方式
private class MyWindowListener implements WindowListener {

//在窗体即将关闭时执行,关注此方法
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
btnExit.doClick();
}


//窗体打开时执行,不关注
public void windowOpened(WindowEvent e) {}


//窗体关闭之后执行,不关注
public void windowClosed(WindowEvent e) {}


//窗体最小化时执行,不关注
public void windowIconified(WindowEvent e) {}


//窗体从最小化恢复成正常时执行,不关注
public void windowDeiconified(WindowEvent e) {}


//窗体从非活动状态变为活动状态时执行,不关注
public void windowActivated(WindowEvent e) {}


//窗体从活动状态变为非活动状态时执行,不关注
public void windowDeactivated(WindowEvent e) {}
}
*/
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值