本篇博客主要是对推箱子地图编辑器功能的代码讲解。
首先给出这段代码的部分运行截图


重难点:

地图编辑器主要有三个重难点
需要有一个绘制地图的界面
能够实现地图绘制的功能
地图绘制完成后需要将地图内容保存下来
下面就是每块内容的代码片段:

界面显示

界面显示分成绘图区与功能区
绘图区为label数组(大小为20*20)
功能区为8个按钮,对应各自的功能

public void init() {//界面显示for(i=0;i<20;i++) {for(j=0;j<20;j++) {mymap[i][j]=0;jl[i][j]=new JLabel(new ImageIcon());//实例化labelthis.add(jl[i][j]);jl[i][j].addMouseListener(new mouse());//label添加监听器jl[i][j].setBounds(i*30+90, j*30+20, 30, 30);//设置label位置和大小jl[i][j].setOpaque(true);//true表示不透明,false表示透明}}//窗体添加控件this.add(jb1);this.add(jb2);this.add(jb3);this.add(jb4);this.add(jb5);this.add(jb6);this.add(jb7);this.add(jb8);//按钮设置位置和大小jb1.setBounds(35, 640, 80, 40);jb2.setBounds(125, 640, 80, 40);jb3.setBounds(215, 640, 80, 40);jb4.setBounds(305, 640, 80, 40);jb8.setBounds(395, 640, 80, 40);jb5.setBounds(485, 640, 80, 40);jb6.setBounds(575, 640, 80, 40);jb7.setBounds(665, 640, 80, 40);//给按钮添加鼠标事件jb1.addMouseListener(new mouse());jb2.addMouseListener(new mouse());jb3.addMouseListener(new mouse());jb4.addMouseListener(new mouse());jb5.addMouseListener(new mouse());jb6.addMouseListener(new mouse());jb7.addMouseListener(new mouse());jb8.addMouseListener(new mouse());//设置按钮背景jb1.setBackground(new Color(140,199,181));jb2.setBackground(new Color(140,199,181));jb3.setBackground(new Color(140,199,181));jb4.setBackground(new Color(140,199,181));jb5.setBackground(new Color(140,199,181));jb6.setBackground(new Color(140,199,181));jb7.setBackground(new Color(140,199,181));jb8.setBackground(new Color(140,199,181));}

主要功能实现

地图的绘制功能需要鼠标先点击想要绘制的图片相对应的按钮,然后再点击label后就可以在点击的label上面显示相对应的图片。但对于墙块,空白块一个个点击太过繁琐,所以可以使用持续按压进行绘制,但由于java中没有专门对鼠标持续按压进行监听的监听器,所以只能通过对鼠标按压与释放,进入的监听器进行组合实现上述功能。
当鼠标按压时,标识符为1,当鼠标释放时,标识符为0,只有当标识符为1且进入label就改变label的图片。

class mouse extends MouseAdapter{@Overridepublic void mousePressed(MouseEvent e) {//鼠标按压事件// TODO Auto-generated method stubif(e.getSource()==jb1) {pd=1;}//点击“墙块”按钮else if(e.getSource()==jb2) {pd=2;}//点击“玩家”按钮else if(e.getSource()==jb3) {pd=3;}//点击“箱子”按钮else if(e.getSource()==jb4) {pd=4;}//点击“目的地”按钮else if(e.getSource()==jb5) {//点击“清空”按钮for(i=0;i<20;i++) {for(j=0;j<20;j++) {jl[i][j].setIcon(new ImageIcon());//改变label图片mymap[i][j]=0;//改变label对应数据}}}else if(e.getSource()==jb6) {save();}//点击“保存”按钮else if(e.getSource()==jb7) {new game_tui_1();dispose();}//点击“返回”按钮else if(e.getSource()==jb8) {pd=5;}//点击“空白块”按钮else {//点击labelfor(i=0;i<20;i++) {for(j=0;j<20;j++) {if(e.getSource()==jl[i][j]) {//获取点击了哪个labelpd_press=1;//用于标识判断按压if(pd==0) {}//pd=0表示没有点击任何按钮,点击label不做任何操作else if(pd==1) {jl[i][j].setIcon(new ImageIcon("shiyan4_image/wall.png"));mymap[i][j]=1;}//将label显示图片墙块else if(pd==2) {jl[i][j].setIcon(new ImageIcon("shiyan4_image/player.png"));mymap[i][j]=5;}//将label显示图片玩家else if(pd==3) {jl[i][j].setIcon(new ImageIcon("shiyan4_image/box1.png"));mymap[i][j]=3;}//将label显示图片箱子else if(pd==4) {jl[i][j].setIcon(new ImageIcon("shiyan4_image/destination.png"));mymap[i][j]=4;}//将label显示图片目的地else if(pd==5) {jl[i][j].setIcon(new ImageIcon());mymap[i][j]=0;}//将label显示空白块} }}}}@Overridepublic void mouseReleased(MouseEvent e) {//鼠标释放事件// TODO Auto-generated method stubfor(int i=0;i<20;i++) {for(int j=0;j<20;j++) {if(e.getSource()==jl[i][j]) {pd_press=0;//释放将按压标识改回0}}}}@Overridepublic void mouseEntered(MouseEvent e) {//鼠标进入事件// TODO Auto-generated method stub//长按绘图for(int i=0;i<20;i++) {for(int j=0;j<20;j++) {if(e.getSource()==jl[i][j]&&pd_press==1) {//鼠标进入label且处在按压if(pd==0) {}//pd=0表示没有点击任何按钮,点击label不做任何操作else if(pd==1) {jl[i][j].setIcon(new ImageIcon("shiyan4_image/wall.png"));mymap[i][j]=1;}//绘图墙块else if(pd==5) {jl[i][j].setIcon(new ImageIcon());mymap[i][j]=0;}//绘图空白块} }}}}

地图写入

地图写入是在点击保存按钮后需要实现的,且地图不是任何时候都能保存的,需要一个简单的判断,需要满足以下条件:
存在玩家控制的方块,且只有一个
存在箱子 和 目的地
箱子和目的地的数量相等
这些判断条件可以使玩家绘制出的地图更具有可玩性。

public void save() {//保存数据到文件// TODO Auto-generated method stubString content="";FileOutputStream fout;byte[] b;try {File file=new File("shiyan4_maps\\11.map");//文件路径,根据实际自行修改if(!file.exists())  file.createNewFile();//判断11.map文件是否存在,不存在新建一个fout=new FileOutputStream(file,false); //创建文件输出流,false代表覆盖修改,ture代表添加修改//覆盖修改:覆盖之前的内容   添加修改:保留之前的内容,在原来基础上添加内容for(int i=0;i<20;i++) {for(int j=0;j<20;j++) {content=content+mymap[j][i];}if(i!=19)content=content+"\r\n";//“\r\n” 是回车}b=content.getBytes();if(pd_save()==1) {//判断是否要保存fout.write(b);//文件写入JOptionPane.showMessageDialog(null, "                       文件写入成功!!", "消息",JOptionPane.PLAIN_MESSAGE);}else {JOptionPane.showMessageDialog(null, "        文件写入失败!!", "消息",JOptionPane.ERROR_MESSAGE);}}catch (IOException e) {// TODO Auto-generated catch blocke.getMessage();}}public int pd_save() {//判断是否要保存//保存要满足的条件:存在玩家控制,箱子数要等于目的地数int num_player=0,num_end=0,num_box=0;for(int i=0;i<20;i++) {for(int j=0;j<20;j++) {if(mymap[i][j]==5) num_player++;else if(mymap[i][j]==4) num_end++;else if(mymap[i][j]==3) num_box++;}}if(num_player!=1||num_end!=num_box||num_end==0)return 0;else return 1;}

最后附上 推箱子 地图编辑器功能 完整的代码

地图编辑器完整代码

import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class game_tui_3 extends JFrame{JButton jb1 =new JButton("墙块");JButton jb2 =new JButton("玩家");JButton jb3 =new JButton("箱子");JButton jb4 =new JButton("目的地");JButton jb8 =new JButton("空白块");JButton jb5 =new JButton("清空");JButton jb6 =new JButton("保存");JButton jb7 =new JButton("返回");JLabel[][] jl=new JLabel[20][20];int[][] mymap=new int[20][20];int pd=0;int i=0,j=0;int pd_press=0;public game_tui_3() {//自定义方法init();//初始化//窗口属性this.setTitle("地图编辑器");//窗体名称this.setSize(800, 730);//窗体大小this.setDefaultCloseOperation(3);//窗体关闭按钮功能this.setLocationRelativeTo(null);//窗体居中this.setResizable(false);//窗体不可拉伸this.setLayout(null);this.getContentPane().setBackground(new Color(214,213,183));//设置背景颜色this.setVisible(true);//窗体可视}public static void main(String[] args) {// TODO Auto-generated method stubnew game_tui_3();}public void save() {//保存地图数据到文件// TODO Auto-generated method stubString content="";FileOutputStream fout;byte[] b;try {File file=new File("shiyan4_maps\\11.map");//文件路径,根据实际自行修改if(!file.exists())  file.createNewFile();//判断11.map文件是否存在,不存在新建一个fout=new FileOutputStream(file,false); //创建文件输出流,false代表覆盖修改,ture代表添加修改//覆盖修改:覆盖之前的内容   添加修改:保留之前的内容,在原来基础上添加内容for(int i=0;i<20;i++) {for(int j=0;j<20;j++) {content=content+mymap[j][i];}if(i!=19)content=content+"\r\n";//“\r\n” 是回车}b=content.getBytes();if(pd_save()==1) {//判断是否要保存fout.write(b);JOptionPane.showMessageDialog(null, "                       文件写入成功!!", "消息",JOptionPane.PLAIN_MESSAGE);}else {JOptionPane.showMessageDialog(null, "        文件写入失败!!", "消息",JOptionPane.ERROR_MESSAGE);}}catch (IOException e) {// TODO Auto-generated catch blocke.getMessage();}}public int pd_save() {//判断是否要保存//保存要满足的条件:存在玩家控制,箱子数要等于目的地数int num_player=0,num_end=0,num_box=0;for(int i=0;i<20;i++) {for(int j=0;j<20;j++) {if(mymap[i][j]==5) num_player++;else if(mymap[i][j]==4) num_end++;else if(mymap[i][j]==3) num_box++;}}if(num_player!=1||num_end!=num_box||num_end==0)return 0;else return 1;}public void init() {//界面显示for(i=0;i<20;i++) {for(j=0;j<20;j++) {mymap[i][j]=0;jl[i][j]=new JLabel(new ImageIcon());//实例化labelthis.add(jl[i][j]);jl[i][j].addMouseListener(new mouse());//label添加监听器jl[i][j].setBounds(i*30+90, j*30+20, 30, 30);//设置label位置和大小jl[i][j].setOpaque(true);//true表示不透明,false表示透明}}//窗体添加控件this.add(jb1);this.add(jb2);this.add(jb3);this.add(jb4);this.add(jb5);this.add(jb6);this.add(jb7);this.add(jb8);//按钮设置位置和大小jb1.setBounds(35, 640, 80, 40);jb2.setBounds(125, 640, 80, 40);jb3.setBounds(215, 640, 80, 40);jb4.setBounds(305, 640, 80, 40);jb8.setBounds(395, 640, 80, 40);jb5.setBounds(485, 640, 80, 40);jb6.setBounds(575, 640, 80, 40);jb7.setBounds(665, 640, 80, 40);//给按钮添加鼠标事件jb1.addMouseListener(new mouse());jb2.addMouseListener(new mouse());jb3.addMouseListener(new mouse());jb4.addMouseListener(new mouse());jb5.addMouseListener(new mouse());jb6.addMouseListener(new mouse());jb7.addMouseListener(new mouse());jb8.addMouseListener(new mouse());//设置按钮背景jb1.setBackground(new Color(140,199,181));jb2.setBackground(new Color(140,199,181));jb3.setBackground(new Color(140,199,181));jb4.setBackground(new Color(140,199,181));jb5.setBackground(new Color(140,199,181));jb6.setBackground(new Color(140,199,181));jb7.setBackground(new Color(140,199,181));jb8.setBackground(new Color(140,199,181));}class mouse extends MouseAdapter{@Overridepublic void mousePressed(MouseEvent e) {//鼠标按压事件// TODO Auto-generated method stubif(e.getSource()==jb1) {pd=1;}//点击“墙块”按钮else if(e.getSource()==jb2) {pd=2;}//点击“玩家”按钮else if(e.getSource()==jb3) {pd=3;}//点击“箱子”按钮else if(e.getSource()==jb4) {pd=4;}//点击“目的地”按钮else if(e.getSource()==jb5) {//点击“清空”按钮for(i=0;i<20;i++) {for(j=0;j<20;j++) {jl[i][j].setIcon(new ImageIcon());//改变label图片mymap[i][j]=0;//改变label对应数据}}}else if(e.getSource()==jb6) {save();}//点击“保存”按钮else if(e.getSource()==jb7) {/*new game_tui_1();dispose();*/}//点击“返回”按钮,由于单独代码,所以页面跳转代码注释了else if(e.getSource()==jb8) {pd=5;}//点击“空白块”按钮else {//点击labelfor(i=0;i<20;i++) {for(j=0;j<20;j++) {if(e.getSource()==jl[i][j]) {//获取点击了哪个label,图片路径根据实际自行修改pd_press=1;//用于标识判断按压if(pd==0) {}//pd=0表示没有点击任何按钮,点击label不做任何操作else if(pd==1) {jl[i][j].setIcon(new ImageIcon("shiyan4_image/wall.png"));mymap[i][j]=1;}//将label显示图片墙块else if(pd==2) {jl[i][j].setIcon(new ImageIcon("shiyan4_image/player.png"));mymap[i][j]=5;}//将label显示图片玩家else if(pd==3) {jl[i][j].setIcon(new ImageIcon("shiyan4_image/box1.png"));mymap[i][j]=3;}//将label显示图片箱子else if(pd==4) {jl[i][j].setIcon(new ImageIcon("shiyan4_image/destination.png"));mymap[i][j]=4;}//将label显示图片目的地else if(pd==5) {jl[i][j].setIcon(new ImageIcon());mymap[i][j]=0;}//将label显示空白块} }}}}@Overridepublic void mouseReleased(MouseEvent e) {//鼠标释放事件// TODO Auto-generated method stubfor(int i=0;i<20;i++) {for(int j=0;j<20;j++) {if(e.getSource()==jl[i][j]) {pd_press=0;//释放将按压标识改回0}}}}@Overridepublic void mouseEntered(MouseEvent e) {//鼠标进入事件// TODO Auto-generated method stub//长按绘图for(int i=0;i<20;i++) {for(int j=0;j<20;j++) {if(e.getSource()==jl[i][j]&&pd_press==1) {//鼠标进入label且处在按压,图片路径根据实际自行修改if(pd==0) {}//pd=0表示没有点击任何按钮,点击label不做任何操作else if(pd==1) {jl[i][j].setIcon(new ImageIcon("shiyan4_image/wall.png"));mymap[i][j]=1;}//绘图墙块else if(pd==5) {jl[i][j].setIcon(new ImageIcon());mymap[i][j]=0;}//绘图空白块} }}}}
}
如有错误
欢迎指出

下一篇:用JAVA制作小游戏——推箱子(四)

用JAVA制作小游戏——推箱子(三)相关推荐

  1. 用JAVA制作小游戏——推箱子(二)

    本篇博客主要是推箱子游戏界面功能的代码讲解. 首先先给出这段代码的部分运行截图: 重难点: 游戏界面主要有五个重难点: 固定好地图的位置 地图的显示 构建菜单栏 读取地图数据 玩家操作功能实现 地图的 ...

  2. 用JAVA制作小游戏——推箱子(一)

    本篇博客是对推箱子游戏首页代码的展示 效果图: 难点: 在背景图上添加按钮. 由于直接使用add方法,会变成图片一块区域,按钮一块区域,彼此互不重叠,形成的界面效果不太好,因此用了JLayeredPa ...

  3. 用JAVA制作小游戏——飞机大战(三)

    本篇博客是对飞机大战游戏项目完整代码的展示 详细代码讲解: 用JAVA制作小游戏--飞机大战(一) 用JAVA制作小游戏--飞机大战(二) 最下方附整个程序的文件下载链接 代码展示 主界面 impor ...

  4. 用JAVA制作小游戏——飞机大战(二)

    本篇博客是对飞机大战游戏使用代码的展示 重难点: 首先需要鼠标能够控制战机,使鼠标在窗口内时始终能够使战机的位置与鼠标相同,实现鼠标控制战斗机移动. 其次需要能够以一定的速度产生子弹和敌机,并且以一定 ...

  5. 用java制作小游戏:小恐龙跑酷

    用java制作小游戏:小恐龙跑酷 插入链接与图片 运行图片:( 第一次做游戏,画风比较丑哈!最左边的就是主角小恐龙了,中间的是障碍物仙人掌,右边的小狗也是障碍物,右上角的是分数条) 图片: 以下是Ja ...

  6. Java小游戏-推箱子

    摘要 推箱子是来自于日本的一个古老游戏,目的是在于训练逻辑思维能力,在一个狭小的空间里,要把木箱推到指定的位置,稍不小心箱子就会无法移动或者被通道堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安 ...

  7. C语言小游戏 ——推箱子

    文章目录 (1)内容描述 (2)功能 (3)设计目的 (4)总体设计 (5)明显缺点 (6)个人总结 7. 实例 实例一 实例二 实例三 实例四 实例五: (1)内容描述 描述:用户进入页面后可以进行 ...

  8. python小游戏——推箱子代码开源

    ♥️作者:小刘在这里 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放,愿所有的美好,再疫情结束后如约而至. 目录 一.效 ...

  9. c语言写一个简单的小游戏-推箱子

    在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...

最新文章

  1. java拍照搜题软件下载_修改版|学生福利!!免费拍照搜题秒出答案,扫一扫作业出答案!...
  2. XML文件读取数据绑定到DropDownList
  3. STL源代码分析(ch 1)组态2
  4. compiz把xfce4系统搞崩溃后的恢复方案
  5. 信号扫描_图文并茂,一文读懂信号源
  6. css毛玻璃效果白边_使用css模拟vista毛玻璃效果
  7. java保存的时候保存多张表,表驱动,如何在表中存储一个方法
  8. PHP5.3x被弃用的函数及代替方法
  9. iPhone系统更新提醒怎么关闭?
  10. Notification使用详解之四:由后台服务向Activity发送进度信息
  11. vue $slot基本用法
  12. 姜启源《数学模型》笔记
  13. php 中文逗号 转英文,PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式...
  14. 如何在网页下载腾讯视频为本地MP4格式
  15. 【OpenCV-Python】教程:5-3 光流
  16. 关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
  17. android开发基础2-基本UI组件(明日科技教程)
  18. Chrome网页接口测试工具
  19. atlas mysql_使用Atlas配置MySQL读写分离
  20. 问卷生成选项,选项排序,设定答案

热门文章

  1. 网络游戏:为什么失败
  2. RabbitMq(七) Topic模式介绍及代码示例
  3. 自编fun函数求 N*N矩阵四周元素的平均值
  4. 只删除字符串前面的‘*’号。
  5. 赢在微点答案专区英语_2019年KPL秋季赛总决赛明日开启 线上观赛赢海量福利
  6. 布式事务实践 解决数据一致性 Spring事务机制
  7. echarts柱状图x轴文字纵向显示
  8. 微信小程序提醒并延迟跳转
  9. Toolbar详解 · Material Design Part 2
  10. Bootstrap研究3-基础html元素