上次完成到游戏首页的制作,今天完成了游戏基础界面的制作以及事件的简单添加。由于功能尚未完全实现,因此游戏界面的菜单列表只是简单地添加了一下,其余菜单列表以及倒计时等在后续的制作中逐一完善。

  1.首先在昨天frame1的基础上增加了方法frame2(),frame2()为生成游戏界面。

    frame2为游戏界面的窗口,在frame2上添加panel2,为panel2设置BorderLayout布局,使用该布局是为了方便制作界面顶部的菜单,这样可以将菜单固定在NORTH,而连连看的主体图形放在CENTER,便于二者分别制作且不会混乱。

  在panel2的中央添加panel1,panel1用来放置连连看的图形,由于图形的排列非常规整,很容易就会想到用GridLayout布局。事先规划好连连看的图形几行几列,直接在初始化的时候就可以直接设置布局。我这里是简单模式9*14.。

  

    static JFrame frame2=new JFrame("工大连连看");
JPanel panel1=new JPanel();//gridlayout
JPanel panel2=new JPanel();//borderlayout //布局
panel1.setLayout(new GridLayout(9,14,0,0));//按照9*14设置网格
panel2.setLayout(new BorderLayout());
panel2.add(panel1,BorderLayout.CENTER);
frame2.add(panel2);

  然后是和之前一样的设置窗口图标,其实这个可有可无,但是总是用Java的一杯咖啡当做图标多有不妥,所以我直接把校徽插入进去了。

        Toolkit tool=frame1.getToolkit();
Image image1=tool.getImage("E:\\学习\\Sophomore\\软件设计\\picture\\hit.jpg");
frame2.setIconImage(image1);

  这一部分没什么技术含量,就不做过多解释了。

  2.菜单栏的简单制作。前面已经说过了,由于功能尚未完全实现,菜单列表只是简单地添加了一下,其余菜单列表以及倒计时等在后续的制作中再做逐一完善。

  在这里我只是给菜单栏添加了背景颜色及两个按钮。背景颜色的选择在这里有必要说明一下,大家都知道如果直接用color类中的RED、BLUE等设置背景颜色时颜色的深浅明暗无法选择,会导致整个画面看起来对比度很大。而通过像素来设置的话需要明确知道与该颜色相关的几个数值,也是很不方便。在这里就有一种很方便的方法,用color的decode函数,通过浏览器的开发者模式能够非常方便地找到喜欢的颜色编码。网络上有很多相关教程,在这里我就不做过多解释了,总之通过颜色的代码可以很方便调整颜色。放一个我之前参考过的教程:https://blog.csdn.net/ArthurCaoMH/article/details/85923949

        //添加按钮及设置菜单背景(尚未完成)
JPanel panel_button=new JPanel();
JButton button1=new JButton("退出");
JButton button2=new JButton("重新开始");
panel_button.add(button2);
panel_button.add(button1);
panel_button.setOpaque(true);
panel_button.setBackground(Color.decode("#dbe4f5"));
panel2.add(panel_button,BorderLayout.NORTH);

  3.添加连连看的主体——图形。这里我用的比较low的方法,计算出哪个格子应该是图形,哪个格子应该是背景,然后逐个设置。

  图形的添加我使用的JButton,直接将JButton放在panel1的网格中。起初误用成了JLabel,但是后来发现JLabel不方便进行事件处理,所以又改成了JButton。周围的背景使用JLabel,直接将JLabel的背景色设置成自己喜欢的颜色,然后添加到网格中即可。

  这一部分我的代码相对比较复杂,原因是我在网格中添加组件使用的方法比较基础,便于思考但是写起来比较麻烦。

  另外图片的添加用到了随机数,其实单纯的随机可能会出现无解的情况,我把这个问题留到后面处理了,在这里先不考虑无解,直接暴力随机插。

  还有涉及到的其他问题在下面的代码中我添加了注释,这一部分我改了很长时间,因为界面一直打不到我想要的效果。要想做得不太丑,制作过程中要考虑的地方很多。

          //添加图形(不能完全随机)及游戏背景
  String[] logo= {"E:\\学习\\\\Sophomore\\软件设计\\picture\\c.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\c++.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\go.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\eclipse.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\codeblocks.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\java.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\js.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\liteide.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\PHP.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\python.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\sql.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\vs.jpg"};
   JButton[][] imgbutton= new JButton[7][11];//用数组存储button
  ImageIcon[][] img=new ImageIcon[7][11];//用数组方便后面事件判断 for (int i=1;i<14;i++) {//第一行全部为空白,供之后连线使用
JLabel whitelabel=new JLabel();
whitelabel.setOpaque(true);
whitelabel.setBackground(Color.decode("#e1edef"));
panel1.add(whitelabel);
} for(int i=0;i<7;i++) {//2-8行
JLabel whitelabel=new JLabel();
whitelabel.setOpaque(true);
whitelabel.setBackground(Color.decode("#e1edef"));
panel1.add(whitelabel);//每一行的第一列为空白
for(int j=0;j<11;j++) {//2-12列
Random r=new Random();
int rand=r.nextInt(12);
img[i][j]=new ImageIcon(logo[rand]);
img[i][j].setImage(img[i][j].getImage().getScaledInstance(62, 58,Image.SCALE_DEFAULT));
imgbutton[i][j]=new JButton(img[i][j]);//插入图片的button
imgbutton[i][j].setOpaque(true);
imgbutton[i][j].setBackground(Color.decode("#e1edef"));//将每个按钮的背景颜色设置与周围一致,否则图片周围会为灰色
panel1.add(imgbutton[i][j]);//代表第i行第j列的图形
}
JLabel whitelabel2=new JLabel();
whitelabel2.setOpaque(true);
whitelabel2.setBackground(Color.decode("#e1edef"));
panel1.add(whitelabel2);//每一行最后一列为空白
}    for (int i=0;i<13;i++) {//第9行
JLabel whitelabel=new JLabel();
whitelabel.setOpaque(true);
whitelabel.setBackground(Color.decode("#e1edef"));
panel1.add(whitelabel);
}

  4.下面是注册事件监听器。这一部分我只写了框架,具体代码还没有完成。其中Function是我要开始写的另一个类,只开了头所以先不放了。先把事件监听器的框架放上。这里用到了匿名函数,我之前没有注意过匿名函数只能使用外部的final变量,所以找bug找了很久。这一部分后续可能会有较大改动,谨慎参考!

        //添加事件监听器
try{
for(int i=0;i<7;i++) {
   for(int j=0;j<11;j++) {
final int m=i;
final int n=j;
imgbutton[i][j].addActionListener(new ActionListener() {
//如果此时栈为空,则入栈;如果栈不为空,则flag判断
public void actionPerformed(ActionEvent event) {
if(Function.stack.empty()) {//如果此时栈为空,点击的button入栈
int[] arr= {m,n};//把点击的button的i j作为数组入栈
Function.stack.push(arr);//数组入栈
}else {
Function.flag(Function.stack,m,n);//执行flag()函数
}
}
});
}
}
}catch(Exception e) {
System.err.print(e);
}
frame2.setSize(1000,650);
frame2.setVisible(true);

  目前完成的效果图先放上,水平比较low求轻喷,同时欢迎大家交流!

(目前的效果图,图标迎合了广大程序员的喜好哈哈哈)

最后放几张制作过程中的图片供大家参考一下过程,同时祝大家少走弯路~

(这里是因为只添加了图片,没有设置背景颜色导致里面都是灰色)

(隐隐约约不对劲了没有?这是还没有意识到应该用button,我用的JLabel就是这种效果)

(这里也还没有意识到,只是完善了菜单栏的颜色)

(这里终于意识到了,但是一开始把所有的网格都设置成了JButton,奇丑无比不说,周围居然可以点击在功能上很不对了)

这是目前的界面~期待后续优化~

软件设计之基于Java的连连看小游戏(二)——游戏基础界面的制作及事件的添加的更多相关文章

  1. 软件设计之基于Java的连连看小游戏(一)——开题及游戏首页的制作

    原本计划紧张忙碌的考试月在图书馆和实验室度过,结果突如其来为期两周的软件设计把课余时间几乎捆绑在了机房.软设没有太多知识上的要求,只要成品简洁美观.实用准确即可.考虑了很久决定要用Java swing ...

  2. 软件设计之基于Java的连连看小游戏(三)——所有功能的实现

    新年快乐!期末接二连三的考试实在太忙了忘记连连看没有更新完,今天想要学习生信时才发现.所以这次直接把连连看所有功能全部放上. 在传统的连连看的基础上,我增加了上传头像的功能,即可以自行上传图片作为游戏 ...

  3. Java 获取微信小程序二维码(可以指定小程序页面 与 动态参数)

    一.准备工作 微信公众平台接口调试工具 小程序的唯一标识(appid) 小程序的密钥(secret) 二.获取access_token 打开微信公众平台接口调试工具,在参数列表中输入小程序的appid ...

  4. Java获取微信小程序二维码

    tip:通过该接口,仅能生成已发布的小程序的二维码. tip:可以在开发者工具预览时生成开发版的带参二维码. tip:接口A加上接口C,总共生成的码数量限制为100,000,请谨慎调用. tip: P ...

  5. 基于@AspectJ和schema的aop(二)---@AspectJ基础语法

    @AspectJ使用jdk5.0和正规的AspectJ切点表达式描述切面, 由于spring只支持方法的连接点,所以Spring只支持部分AspectJ的切点语言. 1.切点表达式函数 AspectJ ...

  6. C#软件设计——小话设计模式原则之:依赖倒置原则DIP

    前言:很久之前就想动笔总结下关于软件设计的一些原则,或者说是设计模式的一些原则,奈何被各种bootstrap组件所吸引,一直抽不开身.群里面有朋友问博主是否改行做前端了,呵呵,其实博主是想做“全战”, ...

  7. [计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(二)

    上一节链接:http://www.cnblogs.com/zjutlitao/p/4116783.html 前言: 在上一节中我们已经大致介绍了该软件的是什么.可以干什么以及界面的大致样子.此外还详细 ...

  8. 基于Qt的P2P局域网聊天及文件传送软件设计

    基于Qt的P2P局域网聊天及文件传送软件设计 zouxy09@qq.com http://blog.csdn.net/zouxy09         这是我的<通信网络>的课程设计作业,之 ...

  9. 基于Java Mina框架的部标jt808服务器设计和开发

    在开发部标GPS平台中,部标jt808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言.需要购买jt808GPS服务器源码 ...

随机推荐

  1. CSS属性继承

    在CSS中有一些属性是可以继承的,跟继承家产一样,哎,一代一代的往下传,而有些属性就比较惨了,不能继承,只能自己来设置. 我简略的总结了一下一些可以继承和不可以继承的属性 可继承 1.字体系列属性:f ...

  2. SpringBoot系列——Filter 过滤器

    前言 本文记录一下在SpringBoot项目中是如何使用Filter过滤器 代码.测试 Filter过滤器是servlet包下面的东西,因此我们不需要再额外引包 方法一 直接实现Filter接口,并使 ...

  3. 【TencentOS tiny】深度源码分析(5)——信号量

    信号量 信号量(sem)在操作系统中是一种实现系统中任务与任务.任务与中断间同步或者临界资源互斥保护的机制.在多任务系统中,各任务之间常需要同步或互斥,信号量就可以为用户提供这方面的支持. 抽象来说, ...

  4. C# 调用POST请求

    public static void PostUrl_Ex(string url, string postData) { try { //对于提交内容中的中文使用UrlEncode方式编码 发送 // ...

  5. 需要知道的jQuery对象和DOM对象之间的转换

    jQuery对象和DOM对象之间的转换 jQuery对象就是通过jQuery包装DOM对象后产生的对象. jQuery对象和DOM对象不能互相调用对方的方法或属性,但它们之间可以进行转换. 两者都无法 ...

  6. ArcGIS Server 10.4切片图的制作与发布

    场景:有一张遥感卫星图,需要以切片图的形式发布 需要的资料:tif的格式遥感图像 发布步骤: 1.选择Service Editor-->Parameters-->Anti-Aliasing ...

  7. ActiveMQ持久化到MySQL以及使用SSL协议通讯

    最近公司事情稍微少了点,研究下怎么优化几个系统的交互,因为我们目前使用的是长链接的同步接口,就考虑用下MQ来处理下.由于公司对安全有要求且和CA业务有关,则使用了SSL协议.此文使用的是Activem ...

  8. lambada 表达式

    1.lambada的存在来由 匿名类的一个问题是,如果匿名类的实现非常简单,例如只包含一个方法的接口,那么匿名类的语法可能看起来不实用且不清楚.在这些情况下,您通常会尝试将功能作为参数传递给另一个方法 ...

  9. CodeForces - 1238D(思维)

    题意 https://vjudge.net/problem/CodeForces-1238D 如果一个字符串的每个字母,属于至少一个(长度大于1)的回文串,则称这个字符串为good. 一个长度为n的字 ...

  10. Linux 和 Windows 查看当前运行的 python 进程及 GPU、CPU、磁盘利用率

    目录 查看当前 python 进程 Linux Windows 查看 GPU 利用率 Linux Windows Linux CPU 利用率 Linux 磁盘利用率 查看当前 python 进程 Li ...