Java小游戏拼图

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

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

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

代码如下:

 
  1. package heima;

  2.  
  3. import java.awt.event.ActionEvent;

  4. import java.awt.event.ActionListener;

  5. import java.awt.event.KeyEvent;

  6. import java.awt.event.KeyListener;

  7. import java.util.Random;

  8.  
  9. import javax.swing.ImageIcon;

  10. import javax.swing.JDialog;

  11. import javax.swing.JFrame;

  12. import javax.swing.JLabel;

  13. import javax.swing.JMenu;

  14. import javax.swing.JMenuBar;

  15. import javax.swing.JMenuItem;

  16. import javax.swing.border.BevelBorder;

  17.  
  18. public class GameJFrame extends JFrame implements KeyListener,ActionListener{

  19. //GameJFrame这个界面表示的就是 游戏的主界面

  20. //以后跟游戏相关的所有逻辑都写在这个类中

  21.  
  22. //创建一个二维数组

  23. //目的:用来管理数据

  24. //加载图片的时候,会根据二维数组中的数据来进行加载

  25. int[][] data =new int[4][4];

  26. //记录空白方块在二维数组中的位置

  27. int x=0;

  28. int y=0;

  29. //定义一个变量,记录当前展示图片的路径

  30. String path = "D:\\学习资料\\Java\\拼图小游戏\\image\\animal\\animal1\\";

  31. //定义一个二维数组 存储一个正确的数据

  32. int[][] win= {

  33. {1,2,3,4},

  34. {5,6,7,8},

  35. {9,10,11,12},

  36. {13,14,15,16},

  37. };

  38. //定义变量来统计部署

  39. int step = 0 ;

  40.  
  41. //创建项目下面的条目对象

  42. JMenuItem replayItem =new JMenuItem("重新游戏");

  43. JMenuItem reLoginItem =new JMenuItem("重新登录");

  44. JMenuItem closeItem =new JMenuItem("关闭游戏");

  45.  
  46. JMenuItem accountItem =new JMenuItem("丁国俊的微信");

  47.  
  48. public GameJFrame () {

  49. //初始化界面

  50. intiJFrame();

  51.  
  52. //初始化菜单

  53. initJMenuBar();

  54.  
  55. //初始化数据

  56. initData();

  57.  
  58. //初始化图片(根据打乱之后的结果去加载图片)

  59. initImage();

  60.  
  61.  
  62.  
  63. //设置窗体可见 放到最后

  64. this.setVisible(true);

  65. }

  66.  
  67. //初始化数据

  68. private void initData() {

  69. //1.定义一个一维数组

  70. int[] tempArr= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

  71. //2.打乱数组中的数据顺序

  72. //遍历数组中得到的每一个元素,拿到每一个元素跟随索引上的数据进行交换

  73. Random r = new Random();

  74. for(int i =0 ;i

  75. //获取随机索引

  76. int index = r.nextInt(tempArr.length);

  77. //拿到遍历到每一个数据,跟随机索引上的数据进行交换

  78. int temp =tempArr[index];

  79. tempArr[i] = tempArr[index];

  80. tempArr[index] =temp;

  81. }

  82.  
  83. //4.给二维数组添加数据

  84. //遍历一维数组tempArr得到每一个元素, 把每一个元素依次添加到二维数组当中

  85. for(int i=0;i

  86. if(tempArr[i]==0) {

  87. x=i/4;

  88. y=i%4;

  89. }else {

  90. data[i/4][i%4]=tempArr[i];

  91. }

  92. }

  93. }

  94. //初始化图片

  95. //添加图片的时候,就需要按照二维数组中管理的数据添加图片

  96. private void initImage() {

  97. //清空原本已经出现的所有图片

  98. this.getContentPane().removeAll();

  99.  
  100. if(victory()) {

  101. //显示胜利图标

  102. JLabel winJLabel = new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\win.png"));

  103. winJLabel.setBounds(203,283,197,73);

  104. this.getContentPane().add(winJLabel);

  105. }

  106.  
  107.  
  108.  
  109. JLabel stepCount = new JLabel ("步数"+step);

  110. stepCount.setBounds(50,30,100,20);

  111. this.getContentPane().add(stepCount);

  112.  
  113.  
  114.  
  115. //先加载的图片在上方 后加载的图片在下方

  116. //外循环---把内循环重复执行了4次

  117. for (int i = 0; i<4;i++) {

  118. //内循环---表示一行添加了4张图片

  119. for (int j = 0; j<4;j++) {

  120. //获取当前要加载图片的序号

  121. int num = data[i][j];

  122. //创建一个JLabel的对象(管理容器)

  123. JLabel jLabel =new JLabel(new ImageIcon(path+ num + ".jpg"));

  124. //指定图片位置

  125. jLabel.setBounds(105*j+83,105*i+134,105,105);

  126. //给图片添加边框

  127. jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));//设置边框凹下来

  128.  
  129. //把管理容器添加到界面中

  130. this.getContentPane().add(jLabel);//取消默认的居中放置

  131. }

  132. }

  133. JLabel background =new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\background.png"));

  134. background.setBounds(40,40,508,560);

  135. //将背景图片添加到界面中

  136. this.getContentPane().add(background);

  137.  
  138. //刷新一下界面

  139. this.getContentPane().repaint();

  140.  
  141. }

  142. public void intiJFrame() {

  143.  
  144. //GameJFrame这个界面表示的就是 游戏的主界面

  145. //以后跟游戏相关的所有逻辑都写在这个类

  146. //设置界面的宽高

  147. this.setSize(603,680);

  148. //设置界面的标题

  149. this.setTitle("拼图单机版v1.8");

  150. //设置界面置顶

  151. this.setAlwaysOnTop(true);

  152. //设置页面居中

  153. this.setLocationRelativeTo(null);

  154. //设置关闭模式

  155. this.setDefaultCloseOperation(3);

  156.  
  157. //取消默认的居中放置 只有取消了才会按照xy的形式来添加组件

  158. this.setLayout(null);

  159. //给整个界面添加键盘监听事件

  160. this.addKeyListener(this );

  161.  
  162. }

  163. public void initJMenuBar(){

  164. //初始化菜单

  165. JMenuBar jMenuBar =new JMenuBar();

  166.  
  167. //常见菜单上的两个选项的对象(功能 关于我们 )

  168. JMenu functionJMenu = new JMenu("功能");

  169. JMenu aboutJMenu = new JMenu("关于我们");

  170.  
  171. //将每一个选项下面的条目放在选项当中

  172. functionJMenu.add(replayItem);

  173. functionJMenu.add(reLoginItem);

  174. functionJMenu.add(closeItem);

  175.  
  176. aboutJMenu.add(accountItem);

  177.  
  178. //给条目绑定时间

  179. replayItem.addActionListener(this);

  180. reLoginItem.addActionListener(this);

  181. closeItem.addActionListener(this);

  182. accountItem.addActionListener(this);

  183.  
  184. //将菜单里的两个选项添加到菜单当中去

  185. jMenuBar.add(functionJMenu);

  186. jMenuBar.add(aboutJMenu);

  187.  
  188. //给整个界面设置菜单

  189. this.setJMenuBar(jMenuBar);

  190.  
  191.  
  192.  
  193. }

  194.  
  195. @Override

  196. public void keyTyped(KeyEvent e) {

  197. // TODO Auto-generated method stub

  198.  
  199. }

  200.  
  201. @Override

  202. //按下不松时会调用这个方法

  203. public void keyPressed(KeyEvent e) {

  204. // TODO Auto-generated method stub

  205. int code = e.getKeyCode();

  206. if(code==65) {

  207. //把界面所有的图片删除

  208. this.getContentPane().removeAll();

  209. //加载第一张完整的图片

  210. JLabel all =new JLabel(new ImageIcon(path +"all.jpg"));

  211. all.setBounds(83,134,420,420);

  212. this.getContentPane().add(all);

  213. //加载背景图片

  214. //添加背景图片

  215. JLabel background =new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\background.png"));

  216. background.setBounds(40,40,508,560);

  217. //将背景图片添加到界面中

  218. //把背景图片添加到界面中

  219. this.getContentPane().add(background);

  220. //刷新界面

  221. this.getContentPane().repaint();

  222. }

  223. }

  224.  
  225. @Override

  226. public void keyReleased(KeyEvent e) {

  227.  
  228. // TODO Auto-generated method stub

  229. //对 上,下,左,右进行判断

  230. //左37 上38 右39 下40

  231. int code =e.getKeyCode();

  232. if(code ==37) {

  233. System.out.println("向左移动");

  234. if(y==3){

  235. return;

  236. }

  237. data[x][y] =data[x][y+1];

  238. data[x][y+1]=0;

  239. y++;

  240. //有一次移动,计步器自增一次

  241. step++;

  242. //调用方法按照最新的数字加载图片

  243. initImage();

  244. }else if(code ==38) {

  245. System.out.println("向上移动");

  246. //逻辑

  247. //空白方框下方的数字往上移动

  248. //x,y表示空白方块

  249. //x+1,y表示空白方块下方的数字

  250.  
  251. //把空白方块下方的数字赋值给空白方块

  252. if(x==3){

  253. return;

  254. }

  255. data[x][y] =data[x+1][y];

  256. data[x+1][y]=0;

  257. x++;

  258. //有一次移动,计步器自增一次

  259. step++;

  260. //调用方法按照最新的数字加载图片

  261. initImage();

  262. }else if(code ==39) {

  263. System.out.println("向右移动");

  264. if(y==0){

  265. return;

  266. }

  267. data[x][y] =data[x][y-1];

  268. data[x][y-1]=0;

  269. y--;

  270. //有一次移动,计步器自增一次

  271. step++;

  272. }else if(code ==40) {

  273. System.out.println("向下移动");

  274. if(x==0){

  275. return;

  276. }

  277. data[x][y] =data[x-1][y];

  278. data[x-1][y]=0;

  279. x--;

  280. //有一次移动,计步器自增一次

  281. step++;

  282. //调用方法按照最新的数字加载图片

  283. initImage();

  284. }else if(code ==65){

  285. initImage();

  286. }else if(code ==87) {

  287. data =new int[][] {

  288. {1,2,3,4},

  289. {5,6,7,8},

  290. {9,10,11,12},

  291. {13,14,15,16}

  292. };

  293. initImage();

  294. }

  295. }

  296. //判断data数组中的数据是否跟win数组中的i昂同

  297. //如果全部相同返回true,否则返false

  298. public boolean victory() {

  299. for( int i=0;i

  300. //i:依次表示二维数组中的data里面的索引

  301. //data[i]:依次表示每一个一维数组

  302. for(int j=0;j

  303. if(data[i][j] !=win[i][j]) {

  304. //只要有一个数据不一样则返回false

  305. return false;

  306. }

  307. }

  308. }

  309. //循环结束表示数组遍历比较完毕 ,全部一样的话返回true

  310. return false;

  311.  
  312. }

  313. public void actionPerformed(ActionEvent e) {

  314. //获取当前被点击的条目对象

  315. Object obj =e.getSource();

  316. //判断

  317. if(obj ==replayItem) {

  318. System.out.println("重新游戏");

  319.  
  320. //计步器清零

  321. step = 0;

  322.  
  323. //再次打乱二维数组

  324. initData();

  325.  
  326. //重新加载图片

  327. initImage();

  328. }else if(obj == reLoginItem) {

  329. System.out.println("重新登录");

  330. this.setVisible(false);

  331. //打开登入界面

  332. new LoginJFrame();

  333. }else if(obj == closeItem) {

  334. System.out.println("关闭游戏");

  335. //直接关闭游戏

  336. System.exit(0);

  337. }else if(obj == accountItem) {

  338. System.out.println("丁国俊的微信");

  339. JDialog jDialog=new JDialog();

  340. //创建一个管理图片的容器对象jDialog

  341. JLabel jLabel = new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\微信图片_20231119183326.jpg")) ;

  342. //设置位置和宽高

  343. jLabel.setBounds(0,0,258,258);

  344. //把图片添加到弹框中

  345. jDialog.getContentPane().add(jLabel);

  346. //设置弹框大小

  347. jDialog.setSize(344,344);

  348. //让弹框置顶

  349. jDialog.setAlwaysOnTop(true);

  350. //让弹框剧中

  351. jDialog.setLocationRelativeTo(null);

  352. //弹框不关闭则无法操作下面的界面

  353. jDialog.setModal(true);

  354. //让弹框显示出来

  355. jDialog.setVisible(true);

  356. }

  357. }

  358. }

测试类如下:

 
  1. package heima;

  2.  
  3. public class App {

  4. public static void main(String[]args) {

  5. //表示程序的启动入口

  6. //如果我们想要开启一个界面,就创建谁的对象就可以了

  7. new GameJFrame();//调用游戏主界面窗体

  8. //new RegisterJFrame();//注册界面

  9. //new LoginJFrame();//登入界面

  10. }

  11. }

运行结果如下:

4df19bed71114f808c62d2925c7c6481.png7065d411013645c6892149dcc358d83e.png6a70a4085b6c458e905192b57b77e64b.png

 

你可能感兴趣的:(java)