点灯小游戏

原创 2005年05月31日 00:27:00
  1. import java.awt.*;
  2. import javax.swing.*;
  3. import java.awt.event.*;
  4. public class LightGameAllFeel extends JFrame {
  5.   private JButton[] light;
  6.   private JLabel on, off, onInfo, offInfo;
  7.   private JButton Restart;
  8.   private JPanel user, lightContainer;
  9.   private boolean[] flag;
  10.   private JMenuBar bar;
  11.   private JMenu mFile;
  12.   private JMenuItem mnuLightGame;
  13.   private UIManager.LookAndFeelInfo[] looks = UIManager
  14.       .getInstalledLookAndFeels();;
  15.   private Container c = getContentPane();
  16.   private int rownum = 5, randomNum;
  17.   private final Color[] colors = { Color.black, Color.blue, Color.pink,
  18.       Color.red, Color.green, Color.lightGray, Color.magenta, Color.orange,
  19.       Color.cyan, Color.gray, Color.white, Color.yellow };
  20.   private final int colorNum = 11;
  21.   private Handler ActionHandler = new Handler();
  22.   private RestartHandler restartHandler = new RestartHandler();
  23.   //构造函数
  24.   public LightGameAllFeel() {
  25.     super("点灯游戏");
  26.     SwingUtilities.updateComponentTreeUI(this);
  27.     randomNum = getRandom();
  28.     lightContainer = new JPanel(new GridLayout(rownum, rownum));//制作一个面板,把25盏灯放在里面
  29.     user = new JPanel(new GridLayout(3, 2)); //制作另外一个面板,把用户信息和控制按钮放在上面
  30.     light = new JButton[rownum * rownum];
  31.     for (int i = 0; i < rownum * rownum; i++) { //实例化25盏灯
  32.       light[i] = new JButton();
  33.       light[i].setBackground(colors[randomNum]);
  34.       lightContainer.add(light[i]);
  35.       light[i].addActionListener(ActionHandler);
  36.     }
  37.     flag = new boolean[rownum * rownum]; //flag数组存放灯的亮灭
  38.     for (int i = 0; i < rownum * rownum; i++) {
  39.       flag[i] = false;
  40.     }
  41.     on = new JLabel("Lights on");
  42.     off = new JLabel("Lights off");
  43.     onInfo = new JLabel("0");
  44.     offInfo = new JLabel(String.valueOf(rownum * rownum));
  45.     Restart = new JButton("Restart");
  46.     user.add(on);
  47.     user.add(onInfo);
  48.     user.add(off);
  49.     user.add(offInfo);
  50.     user.add(Restart);
  51.     //给程序加上菜单
  52.     JMenuBar bar = new JMenuBar();
  53.     setJMenuBar(bar);
  54.     //"File"菜单
  55.     JMenu mFile = new JMenu("File");
  56.     mFile.setMnemonic('F');
  57.     JMenuItem mnuLightGame = new JMenuItem("Restart"); //设置"重新开始"菜单
  58.     mnuLightGame.addActionListener(restartHandler);
  59.     mFile.add(mnuLightGame);
  60.     mFile.addSeparator();
  61.     JMenuItem mnuExit = new JMenuItem("Exit");//设置"exit"菜单
  62.     mnuExit.addActionListener(new ActionListener() {
  63.       public void actionPerformed(ActionEvent e) {
  64.         System.exit(0);
  65.       }
  66.     });
  67.     mFile.add(mnuExit);
  68.     //"Format"菜单
  69.     ButtonGroup grp = new ButtonGroup();
  70.     JMenu mnuFormat = new JMenu("Format");
  71.     mnuFormat.setMnemonic('m');
  72.     String names[] = { "4个""5个""6个" };
  73.     JRadioButtonMenuItem numformat[];
  74.     numformat = new JRadioButtonMenuItem[names.length + 1];
  75.     for (int i = 0; i < names.length; i++) {
  76.       numformat[i] = new JRadioButtonMenuItem(names[i]);
  77.       mnuFormat.add(numformat[i]);
  78.       numformat[i].addActionListener(new menuHandler());
  79.       grp.add(numformat[i]);
  80.     }
  81.     numformat[3] = new JRadioButtonMenuItem("Custom...");
  82.     grp.add(numformat[3]);
  83.     mnuFormat.add(numformat[3]);
  84.     numformat[3].addActionListener(new menuHandler());
  85.     JMenu mnuOption = new JMenu("Option");
  86.     JMenu lookfeelMenu = new JMenu("Look&Feel");
  87.     mnuOption.add(lookfeelMenu);
  88.     ButtonGroup lookfeelGroup = new ButtonGroup();
  89.     JMenuItem menuItem;
  90.     for (int i = 0; i < looks.length; i++) {
  91.       menuItem = new JRadioButtonMenuItem(looks[i].getName());
  92.       lookfeelMenu.add(menuItem);
  93.       menuItem.addActionListener(new LookFeelAction(looks[i].getClassName()));
  94.       lookfeelGroup.add(menuItem);
  95.     }
  96.     bar.add(mFile);
  97.     bar.add(mnuFormat);
  98.     bar.add(mnuOption);
  99.     //把两个面板加到界面上
  100.     c.add(lightContainer, BorderLayout.CENTER);
  101.     c.add(user, BorderLayout.SOUTH);
  102.     setSize(200, 320);
  103.     show();
  104.     //处理用户按下"Restart"键,重新开始程序
  105.     Restart.addActionListener(restartHandler);
  106.   }
  107.   private void changeTheLookAndFeel(int value) {
  108.     try {
  109.       UIManager.setLookAndFeel(looks[value].getClassName());
  110.       SwingUtilities.updateComponentTreeUI(this);
  111.     }
  112.     catch (Exception e) {
  113.       e.printStackTrace();
  114.     }
  115.   }
  116.   private final int getRandom() {
  117.     return (int) (Math.random() * colors.length);
  118.   }
  119.   public static void main(String args[]) {
  120.     LightGameAllFeel app = new LightGameAllFeel();
  121.     app.addWindowListener(new WindowAdapter() {
  122.       public void windowClosing(WindowEvent e) {
  123.         System.exit(0);
  124.       }
  125.     });
  126.   }
  127.   private class RestartHandler implements ActionListener {
  128.     public void actionPerformed(ActionEvent e) {
  129.       randomNum = getRandom();
  130.       for (int i = 0; i < rownum * rownum; i++) {
  131.         light[i].setBackground(colors[randomNum]);
  132.         light[i].setEnabled(true);
  133.       }
  134.       for (int i = 0; i < rownum * rownum; i++)
  135.         flag[i] = false;
  136.       onInfo.setText("0");
  137.       offInfo.setText(String.valueOf(rownum * rownum));
  138.       changeTheLookAndFeel((int) (Math.random() * 3));
  139.     }
  140.   }
  141.   private class Handler implements ActionListener {
  142.     public void actionPerformed(ActionEvent e) {
  143.       int i, numon = 0;
  144.       for (i = 0; i < rownum * rownum; i++)
  145.         //找出用户点击的位置
  146.         if (e.getSource() == light[i]) break;
  147.       //如果点击第一列
  148.       if (i % rownum == 0) {
  149.         for (int j = 0; j < rownum * rownum; j++)
  150.           if (j - i == 1 || Math.abs(i - j) == rownum || i == j) flag[j] = !flag[j];
  151.       } else if (i % rownum == (rownum - 1)) { //如果点击最后一列
  152.         for (int j = 0; j < rownum * rownum; j++)
  153.           if (i - j == 1 || Math.abs(i - j) == rownum || i == j) flag[j] = !flag[j];
  154.       } else { //如果点击其他的列
  155.         for (int j = 0; j < rownum * rownum; j++)
  156.           if (Math.abs(i - j) == 1 || Math.abs(i - j) == rownum || i == j) flag[j] = !flag[j];
  157.       }
  158.       //先清空所有的格子
  159.       for (int j = 0; j < rownum * rownum; j++)
  160.         light[j].setBackground(colors[randomNum]);
  161.       //把标记为true的格子变相反色
  162.       for (int j = 0; j < rownum * rownum; j++)
  163.         if (flag[j]) {
  164.           light[j].setBackground(colors[colorNum - randomNum]);
  165.           numon++;
  166.         }
  167.       //改变提示信息
  168.       onInfo.setText(String.valueOf(numon));
  169.       offInfo.setText(String.valueOf(rownum * rownum - numon));
  170.       //判断有没有赢得比赛
  171.       for (i = 0; i < rownum * rownum; i++)
  172.         if (!flag[i]) break;
  173.       if (i == rownum * rownum) {
  174.         JOptionPane.showMessageDialog(null"你赢了!");
  175.         for (i = 0; i < rownum * rownum; i++) {
  176.           light[i].setEnabled(false);
  177.           flag[i] = false;
  178.         }
  179.       }
  180.     }
  181.   }
  182.   //处理用户选择游戏规模
  183.   private class menuHandler implements ActionListener {
  184.     public void actionPerformed(ActionEvent e) {
  185.       hide();
  186.       try {
  187.         if (e.getActionCommand().equals("4个")) rownum = 4;
  188.         else if (e.getActionCommand().equals("5个")) rownum = 5;
  189.         else if (e.getActionCommand().equals("6个")) rownum = 6;
  190.         else {
  191.           rownum = Integer.parseInt(JOptionPane.showInputDialog("输入想要的行数!"));
  192.           if (rownum > 20) {
  193.             JOptionPane.showMessageDialog(null"数字不对,请重新输入");
  194.             show();
  195.             return;
  196.           }
  197.         }
  198.       }
  199.       catch (NumberFormatException ne) {
  200.         JOptionPane.showMessageDialog(null"数字不对,请重新输入");
  201.         show();
  202.         return;
  203.       }
  204.       c.remove(lightContainer);
  205.       lightContainer.removeAll();
  206.       light = new JButton[rownum * rownum];
  207.       flag = new boolean[rownum * rownum];
  208.       lightContainer.setLayout(new GridLayout(rownum, rownum));
  209.       for (int i = 0; i < rownum * rownum; i++) {
  210.         light[i] = new JButton();
  211.         light[i].setBackground(colors[randomNum]);
  212.         light[i].addActionListener(ActionHandler);
  213.         lightContainer.add(light[i]);
  214.       }
  215.       c.add(lightContainer, 0);
  216.       setSize(40 * rownum, 64 * rownum);
  217.       show();
  218.       for (int i = 0; i < rownum * rownum; i++) {
  219.         flag[i] = false;
  220.       }
  221.       onInfo.setText(String.valueOf(0));
  222.       offInfo.setText(String.valueOf(rownum * rownum));
  223.     }
  224.   }
  225.   class LookFeelAction implements ActionListener {
  226.     final String lookfeelClassName;
  227.     public LookFeelAction(String name) {
  228.       lookfeelClassName = name;
  229.     }
  230.     public void actionPerformed(ActionEvent e) {
  231.       try {
  232.         // 设置新的外观
  233.         UIManager.setLookAndFeel(lookfeelClassName);
  234.         // 告诉每个组件更新其外观
  235.         SwingUtilities.updateComponentTreeUI(LightGameAllFeel.this);
  236.         LightGameAllFeel.this.repaint();
  237.       }
  238.       catch (Exception ex) {
  239.         ex.printStackTrace();
  240.       }
  241.     }
  242.   }
  243. }

5x5点灯游戏的答案

点灯游戏:点一下鼠标,十字范围内的灯会明暗变换,最后都变亮或者熄灭。曾经公司有朋友在玩,我提议用编程解答该问题,第一个解答是穷举法,现在这个更快速一些,最后的答案竟然是有些初始值没有答案! #incl...
  • Erorr
  • Erorr
  • 2008年05月18日 00:52
  • 5361

IOS点灯小游戏

学习iOSUI阶段第三天掌握了一些视图相关的技巧,于是想到做个小app来巩固一下。 晚上没事就做了这个点灯的小游戏。 关于点灯游戏的相关信息参考百度百科。 一下是我的实现步骤: 第一步:素材准备 ...
  • lifewahaha
  • lifewahaha
  • 2015年04月28日 19:52
  • 649

STM32-学习经验总结 ———stm32-从点灯开始

STM32———-从点灯开始在假期也是很无聊,反正闲着就来写写上学期学的STM32,就当是复习复习吧,其实我也是新手,刚开始自学,可能写的内容里面会出现一些错误,还请看到的朋友及时指出来。 首先来看...
  • Embed_coder
  • Embed_coder
  • 2016年01月19日 16:42
  • 2036

点灯的总结

点灯的总结   属于D.Willam的第一篇博客...自己写的,如有雷同,那就雷同 2016年3月23日15:43:09   零.写在开始的屁话 我记得,我在念书的时候拿到的第一块开发板L...
  • weiyingwin
  • weiyingwin
  • 2016年03月26日 14:26
  • 963

Greenfoot游戏——推箱子

Greenfoot写游戏—— 推箱子作为一个新人,第一次写博客,文章的调理以及结构可能不够清晰,如果有哪里说的不清楚欢迎各位提醒我。本应用内的素材剽窃于此html5 游戏中,写此文前未得到原作者授权允...
  • zpf124
  • zpf124
  • 2016年01月09日 12:03
  • 2047

STM32学习笔记2——GPIO点灯

STM32学习
  • itititint
  • itititint
  • 2015年02月07日 16:56
  • 2002

stm32串口点灯

作者:number007cool 转自:http://blog.chinaunix.net/uid-21658993-id-1820023.html 串口程序: hal.h #ifnd...
  • whw8007
  • whw8007
  • 2013年05月30日 23:24
  • 790

FPGA点灯程序

点灯实验: (1)数字设计:由verilog设计电路,输出引脚连到FPGA对应的LED的引脚 (2)嵌入式设计:软件实现-------XPS:PLB总线上添加GPIO,GPIO输出连接到FPGA对...
  • li_qcxy
  • li_qcxy
  • 2012年12月17日 15:24
  • 2286

点灯游戏算法实现

点灯游戏是一个十分有趣的智力游戏,他的规则是这样的:有一行N行N列的灯,开始时全部是灭的,当你点击其中一盏灯是他的上下左右(若存在的话)状态全部改变,现在要求你在限定的时间内以最少地步数,将全部的灯点...
  • iu_81
  • iu_81
  • 2007年07月16日 23:31
  • 1410

点灯游戏

5*5的格子,初始状态灯全灭(可以通过init_light来定义任何初始状态),点任何一个格子,上下左右状态反转,目标状态灯全亮 rows = 7 cols = 7 light = [[0...
  • com_stu_zhang
  • com_stu_zhang
  • 2015年04月28日 17:38
  • 1137
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:点灯小游戏
举报原因:
原因补充:

(最多只允许输入30个字)