ZBLOG

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Arrays; import jav...

下面是修改后的代码,实现了对前两次点击的图片进行相同与不同的判断,并计算点击次数和游戏时长(秒):

  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.awt.event.MouseAdapter;
  6. import java.awt.event.MouseEvent;
  7. import java.util.ArrayList;
  8. import java.util.Arrays;
  9. import java.util.Collections;
  10. public class GuessImageGame extends JFrame implements ActionListener {
  11. private ArrayList<String> images;
  12. private ArrayList<JLabel> labels;
  13. private int firstClickIndex = -1;
  14. private int secondClickIndex = -1;
  15. private int clickCount = 0;
  16. // 游戏开始时间
  17. private long startTime;
  18. public GuessImageGame() {
  19. setTitle("猜图游戏");
  20. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  21. setLayout(new GridLayout(4, 4));
  22. // 加载图片列表
  23. loadImages();
  24. // 随机排列图片位置
  25. Collections.shuffle(images);
  26. // 创建图片框
  27. labels = new ArrayList<>();
  28. for (int i = 0; i < 16; i++) {
  29. JLabel label = new JLabel();
  30. label.setPreferredSize(new Dimension(100, 100));
  31. label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
  32. label.setOpaque(true);
  33. label.setBackground(Color.WHITE);
  34. label.addMouseListener(new ClickListener(i));
  35. add(label);
  36. labels.add(label);
  37. }
  38. pack();
  39. setLocationRelativeTo(null);
  40. }
  41. private void loadImages() {
  42. images = new ArrayList<>(Arrays.asList(
  43. "png-0201.png", "png-0202.png",
  44. "png-0203.png", "png-0204.png",
  45. "png-0205.png", "png-0206.png",
  46. "png-0207.png", "png-0208.png"
  47. ));
  48. images.addAll(images);
  49. }
  50. private void startNewGame() {
  51. firstClickIndex = -1;
  52. secondClickIndex = -1;
  53. clickCount = 0;
  54. loadImages();
  55. Collections.shuffle(images);
  56. for (JLabel label : labels) {
  57. label.setIcon(null);
  58. label.setBackground(Color.WHITE);
  59. label.putClientProperty("imagePath", null);
  60. }
  61. startTime = System.currentTimeMillis(); // 记录游戏开始时间
  62. }
  63. @Override
  64. public void actionPerformed(ActionEvent e) {
  65. if ("新游戏".equals(e.getActionCommand())) {
  66. startNewGame();
  67. }
  68. }
  69. private class ClickListener extends MouseAdapter {
  70. private int index;
  71. public ClickListener(int index) {
  72. this.index = index;
  73. }
  74. @Override
  75. public void mouseClicked(MouseEvent e) {
  76. JLabel currentLabel = labels.get(index);
  77. // 已经翻开的图片框,无响应
  78. if (currentLabel.getIcon() != null)
  79. return;
  80. clickCount++;
  81. // 第一次点击
  82. if (clickCount % 2 == 1) {
  83. firstClickIndex = index;
  84. ImageIcon imageIcon = new ImageIcon("imgs/" + images.get(index));
  85. currentLabel.setIcon(imageIcon);
  86. currentLabel.setBackground(Color.GRAY);
  87. currentLabel.putClientProperty("imagePath", images.get(index));
  88. if (clickCount == 1)
  89. startTime = System.currentTimeMillis(); // 第一次点击时记录游戏开始时间
  90. }
  91. // 第二次点击
  92. else if (clickCount % 2 == 0) {
  93. secondClickIndex = index;
  94. ImageIcon imageIcon = new ImageIcon("imgs/" + images.get(index));
  95. currentLabel.setIcon(imageIcon);
  96. // 图片相同,则保持显示状态,背景色设置为绿色
  97. if (images.get(firstClickIndex).equals(images.get(secondClickIndex))) {
  98. labels.get(firstClickIndex).setBackground(Color.GREEN);
  99. currentLabel.setBackground(Color.GREEN);
  100. // 判断是否所有图片都已经被翻开
  101. boolean allImagesOpened = true;
  102. for (JLabel label : labels) {
  103. if (label.getIcon() == null) {
  104. allImagesOpened = false;
  105. break;
  106. }
  107. }
  108. if (allImagesOpened) {
  109. long endTime = System.currentTimeMillis();
  110. long gameTimeSeconds = (endTime - startTime) / 1000; // 计算游戏时长(秒)
  111. JOptionPane.showMessageDialog(GuessImageGame.this, "游戏结束!\n点击次数:" + clickCount + "\n游戏时长:" + gameTimeSeconds + "秒");
  112. }
  113. }
  114. // 图片不同,则显示为空白,背景色设置为白色
  115. else {
  116. SwingUtilities.invokeLater(() -> {
  117. try {
  118. Thread.sleep(1000);
  119. } catch (InterruptedException ex) {
  120. ex.printStackTrace();
  121. }
  122. labels.get(firstClickIndex).setIcon(null);
  123. labels.get(secondClickIndex).setIcon(null);
  124. labels.get(firstClickIndex).setBackground(Color.WHITE);
  125. labels.get(secondClickIndex).setBackground(Color.WHITE);
  126. });
  127. }
  128. }
  129. }
  130. }
  131. public static void main(String[] args) {
  132. SwingUtilities.invokeLater(() -> {
  133. GuessImageGame game = new GuessImageGame();
  134. JMenuBar menuBar = new JMenuBar();
  135. JMenu menu = new JMenu("游戏");
  136. JMenuItem newGameMenuItem = new JMenuItem("新游戏");
  137. newGameMenuItem.addActionListener(game);
  138. menu.add(newGameMenuItem);
  139. menuBar.add(menu);
  140. game.setJMenuBar(menuBar);
  141. game.setVisible(true);
  142. });
  143. }
  144. }

修改后的代码中,在所有图片都被翻开时,会弹出一个提示框显示点击次数和游戏时长(以秒为单位)。同时在第一次点击时记录游戏开始时间,并在所有图片都被翻开时计算游戏时长。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=10571

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?