• JAVA小游戏 “拼图”


    第一步是创建项目 项目名自拟

    第二部创建个包名 来规范class  

    然后是创建类  创建一个代码类 和一个运行类 

    代码如下:

    1. package heima;
    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.JDialog;
    9. import javax.swing.JFrame;
    10. import javax.swing.JLabel;
    11. import javax.swing.JMenu;
    12. import javax.swing.JMenuBar;
    13. import javax.swing.JMenuItem;
    14. import javax.swing.border.BevelBorder;
    15. public class GameJFrame extends JFrame implements KeyListener,ActionListener{
    16. //GameJFrame这个界面表示的就是 游戏的主界面
    17. //以后跟游戏相关的所有逻辑都写在这个类中
    18. //创建一个二维数组
    19. //目的:用来管理数据
    20. //加载图片的时候,会根据二维数组中的数据来进行加载
    21. int[][] data =new int[4][4];
    22. //记录空白方块在二维数组中的位置
    23. int x=0;
    24. int y=0;
    25. //定义一个变量,记录当前展示图片的路径
    26. String path = "D:\\学习资料\\Java\\拼图小游戏\\image\\animal\\animal1\\";
    27. //定义一个二维数组 存储一个正确的数据
    28. int[][] win= {
    29. {1,2,3,4},
    30. {5,6,7,8},
    31. {9,10,11,12},
    32. {13,14,15,16},
    33. };
    34. //定义变量来统计部署
    35. int step = 0 ;
    36. //创建项目下面的条目对象
    37. JMenuItem replayItem =new JMenuItem("重新游戏");
    38. JMenuItem reLoginItem =new JMenuItem("重新登录");
    39. JMenuItem closeItem =new JMenuItem("关闭游戏");
    40. JMenuItem accountItem =new JMenuItem("丁国俊的微信");
    41. public GameJFrame () {
    42. //初始化界面
    43. intiJFrame();
    44. //初始化菜单
    45. initJMenuBar();
    46. //初始化数据
    47. initData();
    48. //初始化图片(根据打乱之后的结果去加载图片)
    49. initImage();
    50. //设置窗体可见 放到最后
    51. this.setVisible(true);
    52. }
    53. //初始化数据
    54. private void initData() {
    55. //1.定义一个一维数组
    56. int[] tempArr= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    57. //2.打乱数组中的数据顺序
    58. //遍历数组中得到的每一个元素,拿到每一个元素跟随索引上的数据进行交换
    59. Random r = new Random();
    60. for(int i =0 ;i<tempArr.length;i++) {
    61. //获取随机索引
    62. int index = r.nextInt(tempArr.length);
    63. //拿到遍历到每一个数据,跟随机索引上的数据进行交换
    64. int temp =tempArr[index];
    65. tempArr[i] = tempArr[index];
    66. tempArr[index] =temp;
    67. }
    68. //4.给二维数组添加数据
    69. //遍历一维数组tempArr得到每一个元素, 把每一个元素依次添加到二维数组当中
    70. for(int i=0;i<tempArr.length;i++) {
    71. if(tempArr[i]==0) {
    72. x=i/4;
    73. y=i%4;
    74. }else {
    75. data[i/4][i%4]=tempArr[i];
    76. }
    77. }
    78. }
    79. //初始化图片
    80. //添加图片的时候,就需要按照二维数组中管理的数据添加图片
    81. private void initImage() {
    82. //清空原本已经出现的所有图片
    83. this.getContentPane().removeAll();
    84. if(victory()) {
    85. //显示胜利图标
    86. JLabel winJLabel = new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\win.png"));
    87. winJLabel.setBounds(203,283,197,73);
    88. this.getContentPane().add(winJLabel);
    89. }
    90. JLabel stepCount = new JLabel ("步数"+step);
    91. stepCount.setBounds(50,30,100,20);
    92. this.getContentPane().add(stepCount);
    93. //先加载的图片在上方 后加载的图片在下方
    94. //外循环---把内循环重复执行了4
    95. for (int i = 0; i<4;i++) {
    96. //内循环---表示一行添加了4张图片
    97. for (int j = 0; j<4;j++) {
    98. //获取当前要加载图片的序号
    99. int num = data[i][j];
    100. //创建一个JLabel的对象(管理容器)
    101. JLabel jLabel =new JLabel(new ImageIcon(path+ num + ".jpg"));
    102. //指定图片位置
    103. jLabel.setBounds(105*j+83,105*i+134,105,105);
    104. //给图片添加边框
    105. jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));//设置边框凹下来
    106. //把管理容器添加到界面中
    107. this.getContentPane().add(jLabel);//取消默认的居中放置
    108. }
    109. }
    110. JLabel background =new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\background.png"));
    111. background.setBounds(40,40,508,560);
    112. //将背景图片添加到界面中
    113. this.getContentPane().add(background);
    114. //刷新一下界面
    115. this.getContentPane().repaint();
    116. }
    117. public void intiJFrame() {
    118. //GameJFrame这个界面表示的就是 游戏的主界面
    119. //以后跟游戏相关的所有逻辑都写在这个类
    120. //设置界面的宽高
    121. this.setSize(603,680);
    122. //设置界面的标题
    123. this.setTitle("拼图单机版v1.8");
    124. //设置界面置顶
    125. this.setAlwaysOnTop(true);
    126. //设置页面居中
    127. this.setLocationRelativeTo(null);
    128. //设置关闭模式
    129. this.setDefaultCloseOperation(3);
    130. //取消默认的居中放置 只有取消了才会按照xy的形式来添加组件
    131. this.setLayout(null);
    132. //给整个界面添加键盘监听事件
    133. this.addKeyListener(this );
    134. }
    135. public void initJMenuBar(){
    136. //初始化菜单
    137. JMenuBar jMenuBar =new JMenuBar();
    138. //常见菜单上的两个选项的对象(功能 关于我们 )
    139. JMenu functionJMenu = new JMenu("功能");
    140. JMenu aboutJMenu = new JMenu("关于我们");
    141. //将每一个选项下面的条目放在选项当中
    142. functionJMenu.add(replayItem);
    143. functionJMenu.add(reLoginItem);
    144. functionJMenu.add(closeItem);
    145. aboutJMenu.add(accountItem);
    146. //给条目绑定时间
    147. replayItem.addActionListener(this);
    148. reLoginItem.addActionListener(this);
    149. closeItem.addActionListener(this);
    150. accountItem.addActionListener(this);
    151. //将菜单里的两个选项添加到菜单当中去
    152. jMenuBar.add(functionJMenu);
    153. jMenuBar.add(aboutJMenu);
    154. //给整个界面设置菜单
    155. this.setJMenuBar(jMenuBar);
    156. }
    157. @Override
    158. public void keyTyped(KeyEvent e) {
    159. // TODO Auto-generated method stub
    160. }
    161. @Override
    162. //按下不松时会调用这个方法
    163. public void keyPressed(KeyEvent e) {
    164. // TODO Auto-generated method stub
    165. int code = e.getKeyCode();
    166. if(code==65) {
    167. //把界面所有的图片删除
    168. this.getContentPane().removeAll();
    169. //加载第一张完整的图片
    170. JLabel all =new JLabel(new ImageIcon(path +"all.jpg"));
    171. all.setBounds(83,134,420,420);
    172. this.getContentPane().add(all);
    173. //加载背景图片
    174. //添加背景图片
    175. JLabel background =new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\background.png"));
    176. background.setBounds(40,40,508,560);
    177. //将背景图片添加到界面中
    178. //把背景图片添加到界面中
    179. this.getContentPane().add(background);
    180. //刷新界面
    181. this.getContentPane().repaint();
    182. }
    183. }
    184. @Override
    185. public void keyReleased(KeyEvent e) {
    186. // TODO Auto-generated method stub
    187. //对 上,下,左,右进行判断
    188. //37383940
    189. int code =e.getKeyCode();
    190. if(code ==37) {
    191. System.out.println("向左移动");
    192. if(y==3){
    193. return;
    194. }
    195. data[x][y] =data[x][y+1];
    196. data[x][y+1]=0;
    197. y++;
    198. //有一次移动,计步器自增一次
    199. step++;
    200. //调用方法按照最新的数字加载图片
    201. initImage();
    202. }else if(code ==38) {
    203. System.out.println("向上移动");
    204. //逻辑
    205. //空白方框下方的数字往上移动
    206. //x,y表示空白方块
    207. //x+1,y表示空白方块下方的数字
    208. //把空白方块下方的数字赋值给空白方块
    209. if(x==3){
    210. return;
    211. }
    212. data[x][y] =data[x+1][y];
    213. data[x+1][y]=0;
    214. x++;
    215. //有一次移动,计步器自增一次
    216. step++;
    217. //调用方法按照最新的数字加载图片
    218. initImage();
    219. }else if(code ==39) {
    220. System.out.println("向右移动");
    221. if(y==0){
    222. return;
    223. }
    224. data[x][y] =data[x][y-1];
    225. data[x][y-1]=0;
    226. y--;
    227. //有一次移动,计步器自增一次
    228. step++;
    229. }else if(code ==40) {
    230. System.out.println("向下移动");
    231. if(x==0){
    232. return;
    233. }
    234. data[x][y] =data[x-1][y];
    235. data[x-1][y]=0;
    236. x--;
    237. //有一次移动,计步器自增一次
    238. step++;
    239. //调用方法按照最新的数字加载图片
    240. initImage();
    241. }else if(code ==65){
    242. initImage();
    243. }else if(code ==87) {
    244. data =new int[][] {
    245. {1,2,3,4},
    246. {5,6,7,8},
    247. {9,10,11,12},
    248. {13,14,15,16}
    249. };
    250. initImage();
    251. }
    252. }
    253. //判断data数组中的数据是否跟win数组中的i昂同
    254. //如果全部相同返回true,否则返false
    255. public boolean victory() {
    256. for( int i=0;i<data.length;i++) {
    257. //i:依次表示二维数组中的data里面的索引
    258. //data[i]:依次表示每一个一维数组
    259. for(int j=0;j<data[i].length;j++) {
    260. if(data[i][j] !=win[i][j]) {
    261. //只要有一个数据不一样则返回false
    262. return false;
    263. }
    264. }
    265. }
    266. //循环结束表示数组遍历比较完毕 ,全部一样的话返回true
    267. return false;
    268. }
    269. public void actionPerformed(ActionEvent e) {
    270. //获取当前被点击的条目对象
    271. Object obj =e.getSource();
    272. //判断
    273. if(obj ==replayItem) {
    274. System.out.println("重新游戏");
    275. //计步器清零
    276. step = 0;
    277. //再次打乱二维数组
    278. initData();
    279. //重新加载图片
    280. initImage();
    281. }else if(obj == reLoginItem) {
    282. System.out.println("重新登录");
    283. this.setVisible(false);
    284. //打开登入界面
    285. new LoginJFrame();
    286. }else if(obj == closeItem) {
    287. System.out.println("关闭游戏");
    288. //直接关闭游戏
    289. System.exit(0);
    290. }else if(obj == accountItem) {
    291. System.out.println("丁国俊的微信");
    292. JDialog jDialog=new JDialog();
    293. //创建一个管理图片的容器对象jDialog
    294. JLabel jLabel = new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\微信图片_20231119183326.jpg")) ;
    295. //设置位置和宽高
    296. jLabel.setBounds(0,0,258,258);
    297. //把图片添加到弹框中
    298. jDialog.getContentPane().add(jLabel);
    299. //设置弹框大小
    300. jDialog.setSize(344,344);
    301. //让弹框置顶
    302. jDialog.setAlwaysOnTop(true);
    303. //让弹框剧中
    304. jDialog.setLocationRelativeTo(null);
    305. //弹框不关闭则无法操作下面的界面
    306. jDialog.setModal(true);
    307. //让弹框显示出来
    308. jDialog.setVisible(true);
    309. }
    310. }
    311. }

    测试类如下:

    1. package heima;
    2. public class App {
    3. public static void main(String[]args) {
    4. //表示程序的启动入口
    5. //如果我们想要开启一个界面,就创建谁的对象就可以了
    6. new GameJFrame();//调用游戏主界面窗体
    7. //new RegisterJFrame();//注册界面
    8. //new LoginJFrame();//登入界面
    9. }
    10. }

    运行结果如下:

  • 相关阅读:
    如何在vscode编辑器中实时查看代码git记录(被谁修改、自己什么时候修改)
    TCP协议调试工具TcpEngine V1.3.0使用教程
    FPGA SPI采集ADC7606数据
    链表(补充)
    Python中使用MySQL模糊查询的方法
    Java并发机制的底层实现原理
    如何使用 ELEMENTOR
    多尺度正余弦优化算法-附代码
    冥想第六百三十四天
    给el-form-item,添加key的场景
  • 原文地址:https://blog.csdn.net/2301_76545469/article/details/134514828