• 拼图小游戏


    一.创建新项目

    二.插入图片

    三.游戏的主界面

    1.代码

    1. package com.itheima.ui;
    2. import java.awt.event.ActionEvent;
    3. import java.awt.event.ActionListener;
    4. import java.awt.event.KeyEvent;
    5. import java.awt.event.KeyListener;
    6. import java.util.Random;
    7. import javax.swing.ImageIcon;
    8. import javax.swing.JFrame;
    9. import javax.swing.JLabel;
    10. import javax.swing.JMenu;
    11. import javax.swing.JMenuBar;
    12. import javax.swing.JMenuItem;
    13. import javax.swing.border.BevelBorder;
    14. public class GameJFrame extends JFrame implements KeyListener,ActionListener{
    15. //GameJFrame游戏的主界面
    16. //4.创建二维数组,用来管理数据
    17. int[][] data = new int[4][4];
    18. int x=0;
    19. int y=0;
    20. //定义一个变量,展示图片路径
    21. String path="images\\\\";
    22. //定义一个二维数组
    23. int[][] win = {
    24. {1,2,3,4},
    25. {5,6,7,8},
    26. {9,10,11,12},
    27. {13,14,15,0}
    28. };
    29. int step=0;
    30. //创建选项下面的对象
    31. JMenuItem replayItem = new JMenuItem("重新游戏");
    32. JMenuItem reLoginItem = new JMenuItem("重新登入");
    33. JMenuItem closeItem = new JMenuItem("关闭游戏");
    34. JMenuItem accountItem = new JMenuItem("公众号");
    35. public GameJFrame() {
    36. //设置宽高
    37. this.setSize(640, 700);
    38. //设置界面的标题
    39. this.setTitle("拼图单机版1.0");
    40. //设置界面置顶
    41. this.setAlwaysOnTop(true);
    42. //设置界面居中
    43. this.setLocationRelativeTo(null);
    44. //设置关闭模式
    45. this.setDefaultCloseOperation(3);
    46. //取消默认中间放置
    47. this.setLayout(null);
    48. //监听事件
    49. this.addKeyListener(this);
    50. //初始化菜单
    51. //创建菜单对象
    52. JMenuBar jMenuBar = new JMenuBar();
    53. //创建菜单上面的选项
    54. JMenu functionJMenu = new JMenu("功能");
    55. JMenu aboutJMenu = new JMenu("关于我们");
    56. //将每一个选项下面的条目添加到选项当中
    57. functionJMenu.add(replayItem);
    58. functionJMenu.add(reLoginItem);
    59. functionJMenu.add(closeItem);
    60. aboutJMenu.add(accountItem);
    61. //绑定事件
    62. replayItem.addActionListener(this);
    63. reLoginItem.addActionListener(this);
    64. closeItem.addActionListener(this);
    65. accountItem.addActionListener(this);
    66. //将菜单里面的两个选项添加到菜单中
    67. jMenuBar.add(functionJMenu);
    68. jMenuBar.add(aboutJMenu);
    69. //给整个界面设置菜单
    70. this.setJMenuBar(jMenuBar);
    71. //初始化数据
    72. initData();
    73. //初始化图片
    74. initImage();
    75. //显示
    76. this.setVisible(true);
    77. }
    78. //初始化数据
    79. private void initData() {
    80. //1.定义一维数组
    81. int[] tempArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    82. //2.打乱数组中的数据顺序
    83. //遍历数组
    84. Random r = new Random();
    85. for(int i=0;i
    86. //获取到随机索引
    87. int index = r.nextInt(tempArr.length);
    88. //拿到遍历数组的数据,和随机交换
    89. int temp = tempArr[i];
    90. tempArr[i] = tempArr[index];
    91. tempArr[index] = temp;
    92. }
    93. //遍历一维数组给二维数组
    94. for(int i=0;i
    95. if(tempArr[i]== 0) {
    96. x=i/4;
    97. y=i%4;
    98. }
    99. data[i /4][i%4] = tempArr[i];
    100. }
    101. }
    102. //初始化图片
    103. //添加图片
    104. private void initImage() {
    105. //清空原本已经出现的所有图片
    106. this.getContentPane().removeAll();
    107. if(victory()) {
    108. JLabel winJLabel = new JLabel(new ImageIcon("C:\\Users\\徐梦\\Desktop\\images\\s.png"));
    109. winJLabel.setBounds(60, 59, 500, 500);
    110. this.getContentPane().add(winJLabel);
    111. }
    112. JLabel stepCount =new JLabel("步数: " +step);
    113. stepCount.setBounds(50, 30, 100, 20);
    114. this.getContentPane().add(stepCount);
    115. for(int i=0;i<4;i++) {
    116. for(int j=0;j<4;j++) {
    117. //获取当前图片的序号
    118. int num=data[i][j];
    119. JLabel jLabel = new JLabel(new ImageIcon(path+num+".gif"));
    120. //创建一个图片JLabel对象(管理容器)
    121. //指定图片位=位置
    122. jLabel.setBounds(151 * j+10, 121 *i+110, 151, 121);
    123. //添加边框0/1都可以
    124. jLabel.setBorder(new BevelBorder(1));
    125. //把管理容器添加到界面中
    126. this.getContentPane().add(jLabel);
    127. }
    128. }
    129. this.getContentPane().repaint();
    130. }
    131. @Override
    132. public void keyTyped(KeyEvent e) {
    133. // TODO Auto-generated method stub
    134. }//按下不松时
    135. @Override
    136. public void keyPressed(KeyEvent e) {
    137. // TODO Auto-generated method stub
    138. int code = e.getKeyCode();
    139. if(code == 65) {
    140. //清空原本已经出现的所有图片
    141. this.getContentPane().removeAll();
    142. //加载完整图片
    143. JLabel all = new JLabel(new ImageIcon("C:\\Users\\徐梦\\Desktop\\images\\all.png"));
    144. all.setBounds(10, 110, 603, 485);
    145. this.getContentPane().add(all);
    146. //刷新界面
    147. this.getContentPane().repaint();
    148. }
    149. }
    150. @Override
    151. public void keyReleased(KeyEvent e) {
    152. //判断游戏是否胜利
    153. if(victory()) {
    154. return;
    155. }
    156. //对上下左右进行判断
    157. int code = e.getKeyCode();
    158. if(code == 37) {
    159. System.out.println("向左");
    160. if(y == 3) {
    161. //表示空白方块已经在最下方了,不能在移动了
    162. return;
    163. }
    164. //把空白方块下面的数字赋值给上面
    165. data[x][y] = data[x ][y-1];
    166. data[x][y-1]=0;
    167. y++;
    168. step++;
    169. initImage();
    170. }else if(code == 38) {
    171. System.out.println("向上");
    172. if(x == 3) {
    173. //表示空白方块已经在最下方了,不能在移动了
    174. return;
    175. }
    176. //把空白方块下面的数字赋值给上面
    177. data[x][y] = data[x + 1][y];
    178. data[x+1][y]=0;
    179. x++;
    180. step++;
    181. initImage();
    182. }else if(code == 39) {
    183. System.out.println("向右");
    184. if(y == 0) {
    185. //表示空白方块已经在最下方了,不能在移动了
    186. return;
    187. }
    188. //把空白方块下面的数字赋值给上面
    189. data[x][y] = data[x ][y-1];
    190. data[x][y-1]=0;
    191. y--;
    192. step++;
    193. initImage();
    194. }else if(code == 40) {
    195. System.out.println("向下");
    196. if(x == 0) {
    197. //表示空白方块已经在最下方了,不能在移动了
    198. return;
    199. }
    200. //把空白方块下面的数字赋值给上面
    201. data[x][y] = data[x - 1][y];
    202. data[x-1][y]=0;
    203. x--;
    204. step++;
    205. initImage();
    206. }else if(code == 65) {
    207. initImage();
    208. }else if(code == 87) {
    209. data = new int[][] {
    210. {1,2,3,4},
    211. {5,6,7,8},
    212. {9,10,11,12},
    213. {13,14,15,0}
    214. };
    215. initImage();
    216. }
    217. }
    218. public boolean victory() {
    219. for(int i=0;i
    220. for(int j=0;j
    221. if(data[i][j] != win[i][j]) {
    222. return false;
    223. }
    224. }
    225. }
    226. return true;
    227. }
    228. @Override
    229. public void actionPerformed(ActionEvent e) {
    230. Object obj =e.getSource();
    231. //判断
    232. if(obj == replayItem) {
    233. System.out.println("重新游戏");
    234. step = 0;
    235. initData();
    236. initImage();
    237. }else if(obj == reLoginItem) {
    238. System.out.println("重新登入");
    239. this.setVisible(false);
    240. new LoginJFrame();
    241. }else if(obj == closeItem) {
    242. System.out.println("关闭游戏");
    243. System.exit(0);
    244. }else if(obj == accountItem) {
    245. System.out.println("公众号");
    246. }
    247. }
    248. }

    2.程序的启动入口

    1. package com.itheima.ui;
    2. public class App {
    3. public static void main(String[] args) {
    4. // TODO Auto-generated method stub
    5. //程序的启动入口
    6. //想要开启谁的界面,就创建谁的对象
    7. new GameJFrame();
    8. }
    9. }

    3.结果

  • 相关阅读:
    mongostat性能分析
    感受 OpenDNS
    Git本地实现服务器搭建
    算法与数据结构(第二周)——排序基础:插入排序法
    前端技能树,面试复习第 47 天—— Vue-Router 详解
    ollama 模型国内加速下载,制作自定义Modelfile模型文件
    Apache ShenYu网关初体验
    蓝桥杯实战应用【算法代码篇】-次数差(附Java、Python和C++代码)
    【unity资源加载与优化章】Profiler优化工具详解
    杭州高职画室哪家好?如何选择高职画室?高职美术学习选哪家画室?
  • 原文地址:https://blog.csdn.net/m0_74981829/article/details/134497177