• Java拼图游戏


    1 图片制作

           选择你喜欢的一张图片,(友情提示:图片尽量在400*600 范围内),然后通过网上的在线分割图片,或者你ps等其他软件,把图片分割为大小相等的12份.如下图所示

    我们首先创建一个勇于描述游戏中显示的图片的实体类:Picture类,代码如下

    1. public class Picture {
    2. private String alisa;//别名
    3. private String picPath;//预览图片的路径
    4. private String[] subPicPaths;//拼图区的切片图片路径
    5. //省略了setter/getter 构造方法的代码
    6. }

    这里我们就应用了java的OOP思想,把游戏中的一个拼图抽象成一个Picture类, 上图左边的小图片对应Picture类的subPicPaths属性, 右边的预览图对应Picture类的picPath属性,以及我们给这个拼图取了一个名称,对应Picture的alisa属性.

            我们已经封装好了Picture类,接下来我们需要编写我们的游戏主界面类 MainFrame,我们现在的程序不是运行在控制台,而是运行一个界面窗口,所有我们的主界面类必须实现Swing包下的JFrame类,JFrame简单的理解就是一个游戏窗口.


    2.编码实现

    1. public class MainFrame extends JFrame{
    2. private String[] items = {"小熊","美女"};
    3. private Map<String,Picture> picMap = new HashMap<>(); //游戏中的图片
    4. private static final long serialVersionUID = -3974891708686273202L;
    5. private JComboBox<String> imgComboBox; //选择图片的下拉框
    6. private PictureCanvasPanle canvasPanle; //拼图区的面板
    7. private PicturePreviewPanel previewPanle; //预览区的面板
    8. private JTextField nameTxt; //显示图片名词的文本域
    9. public static Picture selectedPicture; //被选中的图片
    10. private JButton startBtn; //开始按钮
    11. public static JTextField stepTxt; //显示步数的文本域
    12. //添加图片
    13. public void setMap(){
    14. for(int i = 0; i < items.length;i++){
    15. String[] subPaths = new String[12];
    16. for(int j = 0; j < subPaths.length; j++){
    17. subPaths[j] = "image/" +(i+1)+"-"+(j+1)+".jpg";
    18. }
    19. Picture pic = new Picture(items[i], "image/" +(i+1)+".jpg", subPaths);
    20. picMap.put(pic.getAlisa(), pic);
    21. }
    22. }
    23. //无参构造方法,进行界面的初始化
    24. public MainFrame(){
    25. setMap();
    26. //初始化
    27. init();
    28. //添加组件
    29. addComponent();
    30. //添加拼图和预览
    31. addPreview();
    32. //给组件添加事件
    33. addActionLisener();
    34. }
    35. //给界面上的组件绑定事件
    36. private void addActionLisener() {
    37. //给下拉框添加事件
    38. imgComboBox.addActionListener(new ActionListener() {
    39. @SuppressWarnings("unchecked")
    40. @Override
    41. public void actionPerformed(ActionEvent e) {
    42. JComboBox<String> cbx = (JComboBox<String>) e.getSource();
    43. selectedPicture = picMap.get(cbx.getSelectedItem());
    44. previewPanle.setPath(selectedPicture.getPicPath());
    45. nameTxt.setText("图片名称:"+cbx.getSelectedItem());
    46. canvasPanle.changePictureCell();
    47. previewPanle.repaint();
    48. }
    49. });
    50. //给开始按钮添加事件监听
    51. startBtn.addActionListener(new ActionListener() {
    52. @Override
    53. public void actionPerformed(ActionEvent e) {
    54. //把移动的步数清零
    55. canvasPanle.stepNum = 0;
    56. stepTxt.setText("步数:"+canvasPanle.stepNum);
    57. //打乱拼图区的小方块
    58. canvasPanle.start();
    59. }
    60. });
    61. }
    62. //添加预览图片
    63. private void addPreview() {
    64. JPanel mainPanle = new JPanel();
    65. mainPanle.setLayout(new GridLayout(1,2));
    66. canvasPanle = new PictureCanvasPanle();
    67. previewPanle = new PicturePreviewPanel();
    68. mainPanle.add(canvasPanle,BorderLayout.WEST);
    69. mainPanle.add(previewPanle,BorderLayout.EAST);
    70. this.add(mainPanle,BorderLayout.CENTER);
    71. }
    72. private void addComponent() {
    73. //上部分的内容
    74. JPanel topPanel = new JPanel();
    75. //设置布局器
    76. topPanel.setLayout(new GridLayout(1,2));
    77. //给上面板添加左右面板
    78. //左面板
    79. JPanel leftPanel = new JPanel();
    80. //设置背景颜色
    81. leftPanel.setBackground(Color.PINK);
    82. leftPanel.setBorder(new TitledBorder("游戏设置区"));
    83. //添加其他组件
    84. //设置左边的布局
    85. leftPanel.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
    86. //标签
    87. JLabel infoLabel = new JLabel("选择图片: ");
    88. leftPanel.add(infoLabel);
    89. //设置下拉框
    90. imgComboBox = new JComboBox<String>(items);
    91. imgComboBox.setBackground(Color.PINK);
    92. leftPanel.add(imgComboBox);
    93. //设置添加按钮
    94. startBtn = new JButton("Start");
    95. startBtn.setBackground(Color.PINK);
    96. leftPanel.add(startBtn);
    97. //添加
    98. topPanel.add(leftPanel, BorderLayout.WEST);
    99. //右面板
    100. JPanel rightPanle = new JPanel();
    101. rightPanle.setBackground(Color.PINK);
    102. rightPanle.setBorder(new TitledBorder("游戏状态区"));
    103. rightPanle.setLayout(new GridLayout(1,2));
    104. nameTxt = new JTextField("图片名称:小熊");
    105. nameTxt.setEditable(false);
    106. nameTxt.setBackground(Color.PINK);
    107. stepTxt = new JTextField("步数:0");
    108. stepTxt.setEditable(false);
    109. stepTxt.setBackground(Color.PINK);
    110. rightPanle.add(nameTxt,BorderLayout.WEST);
    111. rightPanle.add(stepTxt,BorderLayout.EAST);
    112. topPanel.add(rightPanle, BorderLayout.EAST);
    113. //把这个面板添加到窗口
    114. this.add(topPanel,BorderLayout.NORTH);
    115. }
    116. private void init() {
    117. //设置窗体的标题
    118. this.setTitle("拼图游戏");
    119. //设置窗体的大小
    120. this.setSize(1000, 720);
    121. //设置窗体在屏幕居中
    122. this.setLocationRelativeTo(null);
    123. //设置固定大小
    124. this.setResizable(false);
    125. //设置窗口的默认关闭操作
    126. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    127. selectedPicture = this.picMap.get(items[0]);
    128. }
    129. }

  • 相关阅读:
    摩根士丹利选出10家公司参加其多元文化创新实验室的首个全球班
    【深度思考】:人工智能的发展会带来生产力和生产关系的变革吗?
    [Azure - Security] Azure的多重身份验证(二):在Azure portal 登陆时候设置MFA/2FA验证
    20.1 OpenSSL 字符BASE64压缩算法
    一文理解OpenStack网络
    java计算机毕业设计web智慧医疗平台设计与实现源码+mysql数据库+系统+lw文档+部署
    给cmd控制台程序 套壳 美化
    JAVA【操作BLOB类型字段】【批量操作】
    通过HTTP来总结网络编程知识
    LLVM 文档收集
  • 原文地址:https://blog.csdn.net/yyjy12/article/details/134496850