一文教你从零开始设计并实现一个Java扫雷游戏,java中级开发工程师面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

,这个组件是文本显示的组件,在设置了不可编辑的属性后,该组件在显示的外观上会有变化,边框会变灰一些,意味着该组件不能够点击或者输入。然后使用一个方法随着时间动态的在时间区以一秒为单位增加,计数区则会随着用户标记雷而减一,可以减到负数。

在设置界面的时候还需要进行一些设置,比如设置属性来让玩家在关闭游戏窗口时,系统会自动释放资源,并关闭窗口。

4.2雷区的布置

当玩家第一次点开格子的时候系统随机布雷并启动定时器,但是为什么要在点过一次格子之后才布雷呢?原来这就是要让玩家第一次不会点到地雷,要不然玩家该多郁闷,这样才能提高玩家的游戏欲。具体实现如下所示:

判断地雷区是否处于可动作状态:

判断为左键且该格子为未探测状态:

布置地雷:

判断地雷应该被布置的位置:

4.3游戏中主要模块的介绍与使用

4.3.1鼠标事件

我们通过点击鼠标左键或者鼠标右键来完成游戏,使用系统自带的MouseDown和MouseUp事件来响应玩家的操作。

函数原型如下:

组件名称:

组件名称:

这两个原型中的参数,Button参数值分别表示玩家用鼠标的左键或者右键进行点击的。其意义如下:

1:左键      2:右键

如果同时按两个按键,那么系统就会传回3,因为点左键是1,点右键是2,一起点就是两个值相加了。

在本次的扫雷设计中,我们会用鼠标的MouseUp事件来响应玩家的操作,其中鼠标左键用来点开玩家认为没有雷的格子,鼠标右键用来标记玩家认为下面藏有雷的格子。使用MouseaUp事件而不用MouseaDown事件的原因是,前者是在当鼠标按键抬起是触发,而后者是当按键按下就触发。假如玩家在点击某一个格子的时候突然发现好像点错了,此时玩家只要继续按下鼠标右键,再抬起的时候就会发现格子被标记成地雷了,现在的游戏一般都有这个功能,这可以有效的提升玩家的游戏体验。

在人机交互的界面上,鼠标的操作是很重要的,但是程序的设计不合理会使鼠标无法发挥应有的功能。在鼠标点击事件中使用MouseUp来响应事件在上面也进行了解释,这样就可以很巧妙的让玩家体会到游戏的贴心之处,可以有效的提升玩家的游戏体验。

当鼠标左键点击格子时:

当鼠标右击标识有雷的格子时:

4.4地雷及雷区表面探测情况

在雷区的设计上,我使用循环加载组件的方法让雷区布满格子,如果玩家点击了格子就会让该格子下面隐藏的组件显示出来

玩家通过单击格子来点开格子,右击格子标记地雷。由于使用了两个数组记录地雷的位置以及被点开的信息,所以可以通过两层嵌套循环来判断该格子周围雷的数目,而且系统会点开该格子周围8个格子中没有雷的格子,这又需要用到递归调用来一直进行这个点开格子并验证的过程,直到不符合条件为止。利用这种嵌套循环以及递归调用,都会使一个耗时耗力的问题变得容易解决起来,使得代码结构也变得清晰明了,并且会提高系统的计算速度。

4.5清除未靠近地雷的格子

开始之前需要介绍并学习一下“递归”,递归的狭义解释就是一个方法调用自己本身,通过一个判断语句决定是否结束调用。在代码的设计上也是一种非常重要的代码结构,通过这种方法编写代码,会使得代码结构看起来相当简单明了。但是需要注意的是,如果操作不当会是系统无限循环调用,使得游戏崩溃,所以在编写代码时必须使用判断的语句来控制循环调用的结束,以停止该方法的递归调用。

当玩家在进行游戏时点击了任意一个格子,系统会检测周围8个格子下是否藏雷,如果雷都被标记或者没有雷就会被点开并循环调用继续判断被点开格子周围的雷数。

设计的时候需要考虑的判断条件:玩家点击了某一个格子后判断该格子下是否藏雷;如果没有雷则判断周围8个格的雷数并显示;若雷都被标记出来或者本来就没有雷则点开周围的格子递归判断被点开格子周围的雷。

由于递归是循环调用方法本身,所以需要一个判断语句来结束调用,当被点开的格子周围有雷时在格子上显示雷数并结束递归调用。

递归方法虽然很好但也有一些的缺点,除了结束条件的选取很重要外,如果在扫雷设计中将雷区的尺寸设置过大,而地雷数却很少的话会使的循环调用变慢。所以在游戏的玩法设计上也要小心谨慎,不可以胡乱定义,以免造成系统负担,使得游戏无法顺利进行下去。

代码部分如下所示

4.6游戏难度的选择

我设计的扫雷有在难度的选择上有三种难度,分别是初、中、高级,这三种难度定义的雷数和雷区的尺寸是固定的,假如玩家想要自己定义扫雷的难度可以自己设置雷数和尺寸,只要打开“自定义”配置弹窗,在之后的弹框里按提示输入雷数和尺寸,行数最大为24,列数最大为30,如果玩家设置的雷数超过了范围(比如雷数大于格子的总数或小于零),系统会默认雷数为行数减一与列数减一的乘积。

4.7菜单栏的功能

初级:设置格子总数为9*9,地雷总数为10颗雷,尺寸为300*380然后重新开始游戏。

中级:设置格子总数为16*16,地雷总数为40颗雷,尺寸为480*580然后重新开始游戏。

高级:设置格子总数为16*30,地雷总数为99颗雷,尺寸为800*500然后重新开始游戏。

自定义:设置格子总数为最大24*30,最多雷数为24*30的难度,然后重新开始游戏。

扫雷榜: 打开并显示时间最短的扫雷记录,可以进行更新和重新记分。

4.8游戏的判断

4.9游戏成功完成

游戏要求玩家在最短的时间内完成游戏,当玩家将所有的雷标记出来并且其它格子都点开以后游戏胜利,系统会弹出提示框告诉玩家“您真厉害,请输入您的名字,记录上榜!”,系统会记录玩家最短完成游戏的时间。

4.10游戏失败

如果玩家不幸点击到了有雷的格子,该格子的地雷会引爆其他的地雷,游戏失败,系统会将剩下的地雷全部显示出来,并弹框提示“你输了,请继续努力!”,玩家可以选择弹框上的重新开始游戏选项来开始一局新的游戏。

格子类的对象有一个标识该格子是否是雷的属性,通过该属性来判断玩家点到的是不是地雷。在游戏结束时也是通过该属性来判断哪些格子下有雷并显示出来。

具体代码如下所示:

5.类设计


5.1MineGame

MineGame类主要负责开始游戏,菜单的设计,以及难度的转换。展示该类的UML图

(1)成员变量

bar 是窗体的菜单栏变量。

fileMenu1 是扫雷游戏的菜单,叫做“游戏”。

fileMenu2 是扫雷的另一个菜单,叫做“帮助”。

初级 是扫雷游戏的难度变量。

中级 是扫雷游戏的难度变量。

高级 是扫雷游戏的难度变量。

扫雷榜 是扫雷的统计信息变量。

mineArea 是MineArea雷的对象,是设计雷区的变量。

file 是文件变量,用来读取扫雷记录。

hashtable 是用来临时存放扫雷记录。

showHeroRecord 是用来显示扫雷记录的变量。

(2)成员方法

MiwneGaame()通过该方法设置了游戏整体的位置和布局,并实现菜单栏功能,初始化统计信息。

actionPerformed(ActionEvent e)是响应点击菜单项的方法,通过该方法可以实现选择不同难度调整游戏的雷数和尺寸。玩家点选不同的菜单项会让该方法执行不同的操作。

main()方法是游戏开始的方法,通过new了一个MineGame的对象来实现游戏的开始。

5.2Block

Block类是一个POJO类,主要记录了雷区一个个格子的属性,比如名字,周围雷的数目等等。展示该类的UML图

(1)成员变量

Name是记录格子名字的变量。

isMine是标记格子下有无地雷的变量。

isMark是标记格子被标记状态的变量。

mineIcon记录了块的图标的变量。

isOpen是标记格子的点开状态的变量。

arounfdMinqeNmber是记录格子周围8个格子中雷的数量的变量。

(2)成员方法。

Block()无参构造方法,以防止创建错误参数的对象。

Block(String name,int aroundMineNumber,ImageIcon mineIcon,boolean isMine,boolean isMark,boolean isOpen)全参构造方法,可以为变量赋值。

setNamqe()方法可以设置块的名字。

getName()获取块的名字。

setAounMineNuber()方法可以设置块周围雷的数目。

setMineIicon()方法可以设置块的图标。

getMineIcon()获取块的图标。

setIsMinae()方法可以设置块是否是雷。

getAroundMineNumber()获取块周围雷的数目。

getIsMine()获取块是否是雷。

setIsMarek()方法可以设置块是否被标记。

getIsMark()获取块是否被标记。

setIsOpen(boolean p)设置块是否被挖开。

getIsOpen()获取块是否被挖开。

toString()以字符串的格式输出该对象。

5.3BlockView

BlockView类继承了JPanel类,主要布置每一个格子的布局,用来定义每个格子的属性。显示该类的UML图如图4-6所示。

(1)成员变量

blockeNameOrIcona 该变量用来显示格子的名字和图标属性。

blockeCoverq 是一个标记变量。

card 卡片式布局,显示第一次添加的组件。

(2)成员方法

BlockView()构造方法,初始化变量,设置块上属性显示的位置为居中,并添加组件。

giveView()方法,给每一个格子提供视图,如果该格子下有雷,会调用方法赋予该格子“地雷”的图标,但被覆盖在下面。如果下面没有雷,会显示该格子周围地雷的数目,同样会被覆盖住。该方法被调用时显示雷或者数字。

seeBlouckNamerOrIcon()方法是用来让块的属性显示出来。

seeBlouckCovear()方法是让cover遮盖块的属性。

getBlouckCovear()方法是得到用来遮盖的按钮。

5.4Record

Record类主要实现通关后弹窗提示通关的窗口,以及记录成绩。当玩家扫雷成功时,该对象提供了保存成绩到文件的界面。展示该类的UML图如图4-7所示。

(1)成员变量

time  用来给游戏计时。

grade  记录难度的变量。

key  表示一个判断的变量。

message  记录成绩的数据变量。

textName  一个文本显示组件。

label  一个可输入文本输入框组件。

确定,取消  两个按钮组件,一个代表确定,一个代表取消。

(2)成员方法

Record() 构造方法,初始化变量,设置窗口是否可以调整大小。

setGrade() 方法可以设置成绩。

writeRecord() 方法可以读写记录,如果没有记录会先创建一个新的文档来保存记录,下次直接修改覆盖记录。

setTime() 方法是用来设置时间的。

actionPerformed(ActionEvent e) 方法是响应鼠标的点击事件的方法,当玩家点击弹窗上的任意位置都会触发,但是只有点到正确的位置才会执行操作。比如点击确认,就可以把玩家的游戏记录存放到本地的文件中。

5.5ShowRecord

ShowRecord类是显示扫雷记录的类。展示该类的UML图如图4-8所示。

  1. 成员变量

file 记录成绩的文档。

name 名字。

hashtable 是记录成绩的变量。

show 是一个显示成绩的按钮组件变量。

Rescore 是一个初始分数的按钮组件变量。

Label1[] 显示成绩的组件。

Label2[] 显示成绩的组件。

Label3[] 显示成绩的组件。

(2)成员方法

ShowRecord() 方法是该类的构造方法,初始化成员变量。

readAndShow() 方法会把在文档中记录的玩家通关信息筛选出来(按游戏完成是花费的时间最短为条件筛选),并显示到弹出的对话框中。

actionPerformed(ActionEvent e)方法是响应玩家操作的方法,当玩家想要显示游戏记录的时候系统会响应玩家的要求并调用显示成绩的方法,在弹框中刷新成绩。

5.6MineArea

MineArea类主要用于雷区的初始化以及鼠标事件的响应。展示该类的UML图如图4-9所示。

  1. 成员变量

reStart 是用来显示一个重新开始的按钮。

block 是一个二维数组,定义了所有雷区的格子。

blockView 是一个二维数组,是给每一个格子提供显示视图的。

lay 是负责定义每一个格子下有雷或者没有雷。

row, colum 是负责记录雷区行列数的变量。

mineCount 是记录地雷总数的变量。

markMount 是记录玩家标记的地雷数的变量。

mark 是ImageIcon类型的变量,用来存放地雷图标。

time 是记录时间的变量。

grade 是记录难度的变量,分别有“初级”、“中级”、“高级”三种难度。

pCenter 是JPanel类型的变量,定义布局中部的控件

pNorth 是JPanel类型的变量,分别位于布局的北部的控件。

showTime 是显示扫雷时间的变量。

showMareedCoint 是显示玩家标记后剩余的雷数的变量。

record 是一个对话框变量,用来显示玩家的最好记录,当玩家点击菜单中的英雄榜时会显示该对话框。

lose 是游戏失败时显示的对话框变量。

spendTime 是一个标记变量。

panel 一个轻量级容器变量,嵌套在对话框中。

str 显示失败的提示语的一个文本框变量。

reStart1 是一个按钮对象,位于失败对话框里,玩家点击后会触发与reStart一样的操作。

  1. 成员方法

MineArea()方法是该类的构造方法,初始化组件和一下对象,设置字体颜色、边框颜色等,并调用初始化雷区的方法来初始化雷区。

initMineArea()方法用来设置雷数和游戏界面所有格子的数量,初始化雷区。

initMine()方法是真正执行初始化的方法。

setRow(int row)方法用来设置行数。

setColum(int colum)方法用来设置列数。

setMineCount(int mineCount)方法用来设置地雷总数。

setGrade(int grade)方法用来设置难度。

actionPerformed(ActionEvent)方法是响应鼠标点击格子的事件的方法,当点击的格子下面没有雷,该方法会显示该格子周围雷的数目,有雷则显示雷的图标。

show()方法是显示格子内容,并且使用递归调用来显示周围格子的内容,直到这个格子周围有雷。

mousePressed(MouseEvent)方法响应玩家对格子进行的鼠标左键单击事件和鼠标右键点击事件。

inquireWin()方法是在玩家在游戏过程中满足获胜条件是触发的方法,同时会调用其他方法弹框提示玩家游戏结束。

5.7LayMines

LayMines是计算不是雷的格周围雷个数的类,以及设置点选之后的图片样式。标明该类的UML图

  1. 成员变量

mineIcon 图片资源变量。

  1. 成员方法

LayMines() 构造方法,定义图片资源。

layMinesForBlock(Block block[][], int mineCount) 方法会判断是否是第一次点击格子,如果玩家是第一次点击格子,开始随机产生雷,但是雷不会布置到第一次点的格子上。如果不是第一次点击且该格子没有雷时会计算周围8个格子中有雷的数目并显示出来。

6.游戏实现


6.1游戏难度自定义

玩家可以自己选择游戏难度,其中有初级,中级,高级以及自定义四种难度,所对应的游戏界面的尺寸也不相同,以及地雷的总数也不相同,雷数越多则难度越大,同时玩家可以自定义游戏难度,通过输入行列数以及地雷数设置游戏界面的大小以及难度。

分别展示了初级、中级、高级以及自定义难度的游戏界面尺寸和雷数。

6.2扫雷

6.3玩家通过右键进行扫雷,并显示小红旗

玩家在游戏过程中会对某一格周围是否有雷进行判断,当玩家认为格子下有雷时就可以通过使用鼠标右键点击该格子,将该格子标识为小红旗如图5-6所示。

6.4玩家因触碰到雷而导致游戏结束

如图5-7所示,当玩家在点开了有雷的格子时,游戏失败,系统会自动将所有的地雷显示出来,并且会弹出一个窗口提示玩家:“你输了,请继续努力!”。除此以外还有两个选项,当玩家选择重新开始按钮时,游戏界面初始化,雷区中的雷全部取消,等待玩家第一次点击格子后开始布雷;如果用户点的是取消的话,就可以关掉这个提示的弹框。

6.5玩家扫雷成功

如图5-8所示,当所有的地雷用都被玩家用小红旗标识出来,并且非雷的格子也被点开时游戏结束,计时停止,系统弹框提醒玩家“您真厉害,请输入您的名字,记录上榜!”,玩家可以在这个界面输入自己的名字来保存扫雷成绩。

6.6玩家游戏数据显示

每当玩家成功扫完所有的雷后,系统会自动的记录本次的成绩,保存在本地的txt文档中,内容是三种难度,玩家姓名以及对应难度玩家所用的最少游戏时间。当玩家点击查看英雄榜的时候系统默认只显示三种难度和匿名。

玩家点击关闭时此窗口会关掉这个弹窗,当点击重新记分时,统计信息会清空,点击显示成绩就好刷新并将历史最好的成绩显示出来。界面也会发生变化,可以显示出游戏用时。

6.7程序打包发布过程

至此扫雷游戏已经编写好了,我们可以将这个游戏打包发布,这就需要利用jar.exe命令来将编写好的扫雷游戏的class文件打包发布。

(1)编写清单文件。首先需要使用“记事本”,根据要求自己编写一个清单文件,格式和内容要和这里给的样子一样,具体内容如下:

将清单文件保存到E:\workspace\扫雷\bin\com\zx\mine中,也就是和编写的扫雷游戏程序生成的字节码存放的位置相同,保证这些文件放在一个目录下。

需要注意的是,清单文件中的所有内容均为键值对的形式存放,键值直接必须空一个空格。

  1. 生成JAR文件。E:\workspace\扫雷\jarcfmGame.jarMymoon.mf*.class,这条命令中有一些参数需要明白:

①参数c意味着要让系统生成一个文件,这个文件叫做JAR。

②参数f意味着要让系统产生JAR文件的名字。

③参数m意味着显示清单文件的名字。

最后就可以将这个生成的JAR文件复制到任何一个安装了Java运行环境(电脑上的jdk版本不能太低)的电脑上,玩家就可直接用鼠标双击图标来运行自己编写的扫雷小游戏了。

6.8游戏测试结果

6.9游戏难度自定义测试

游戏难度自定义测试用例:

预期结果

选择不同的难度后可以正确的初始化雷区

输入条件

分别点击初级、中级、高级和自定义

测试结果

点选不同难度后系统会自动改变雷区大小和地雷数

本次扫雷游戏设计将游戏的难度设定为初、中、高以及自定义四种难度,前三种难度对应的游戏界面的尺寸以及地雷总数是不同的,难度越大雷数越多,尺寸也越大,玩家扫雷时就需要更加的动脑思考才能通关。除了固定的难度以外还可以自定义难度,玩家需要自己输入尺寸与雷数,系统根据玩家的要求生产新的游戏,难度可以更加的灵活,这样可以让玩家更满意。

测试了四种难度的选择,由图可以看出难度的选择功能正常,可以自由变换尺寸和地雷总数。

7扫雷测试


扫雷胜利测试用例:

预期结果

成功的将所有地雷标记出来后,游戏可以立马结束且会弹框提示输入玩家名字

输入条件

将所有地雷标记并将非雷格子点开

测试结果

游戏结束并且显示了要求玩家输入名字的弹框

扫雷失败测试用例:

预期结果

点击了有雷的格子后游戏可以立马结束且弹框提示玩家游戏失败

输入条件

点击有雷的格子

测试结果

游戏正确的结束且弹框提示了游戏失败的提示

玩家可以通过左键单击格子点开格子,右键单击标识地雷的方式完成游戏。当玩家将所有的地雷都标识出来且其他的格子都被点开的情况下,游戏胜利。系统会弹框提示玩家成功完成了游戏任务“您真厉害,请输入您的名字,记录上榜!”。玩家可以在弹出的弹框中输入自己的名字,若不输入则默认为匿名,然后系统会保存玩家的游戏记录。当玩家点击扫雷榜的时候可以查看自己用时最短的游戏记录。

如图6-7所示,玩家可以通过左键单击格子点开格子,右键单击标识地雷的方式完成游戏。当玩家在进行扫雷游戏的时候,不小心点击了有雷的格子,这时候地雷被引爆了,所有未被标记的和已被标记的都被引爆,游戏结束。此时系统会自动将所有的地雷显示出来,方便玩家查看之前标记的正确与否,可以总结经验。然后系统弹框提示“你输了,请继续努力!”,玩家可以点击重新开始的按钮重开游戏,继续挑战扫雷游戏,也可以选择结束游戏。

7.1玩家游戏数据显示测试

最佳成绩测试用例:

预期结果

点击“最佳成绩”按钮时会显示玩家最佳的游戏记录

输入条件

打开游戏的扫雷榜,点击“最佳成绩”按钮

测试结果

游戏可以正确的显示玩家的游戏记录

重新记分测试用例:

预期结果

点击“重新记分”按钮时会清除玩家以往的游戏记录

输入条件

打开游戏的扫雷榜,点击“重新记分”按钮

测试结果

点击按钮后游戏记录消失,再点击“最佳成绩”按钮只会显示默认的成绩

如图6-8和图6-9所示,玩家在进行游戏时,如果成功的扫完雷,系统会提示并保存游戏记录。在扫雷榜上玩家可以进行查看。但是当玩家反复通关后,系统会自动的将用时最短的扫雷记录显示出来,所以玩家在查看记录的时候只能看到最快一次通关的记录。

通过图6-10可以看出,当玩家点击了“重新记分”按钮后,之前游戏记录都会被清除掉,只会显示默认的数据:时间为999秒,名字是匿名。

7.2游戏数据显示区测试

计时区显示测试用例:

预期结果

第一次点击雷区的格子时,计时区开始计时,游戏结束时计时停止,重新开始游戏时,计时归零

输入条件

点击雷区的任意一格,然后结束游戏,最后点击“重新开始”按钮

测试结果

当点击雷区任意一格后计时开始,计时正常。然后点击有雷的格子结束游戏发现计时停止。点击“重新开始”后计时区的计时正确归零

当点击雷区中的任意一格后,计时区开始正常计时。当游戏结束时计时区的计时就会停止,最后点击了“重新开始”后计时区的计时归零。

地雷数显示区测试用例:

预期结果

标记地雷后计数区的数字会减1,如果标记数超过地雷数,计数区会用负数显示

输入条件

先标记一颗地雷,然后将所有的地雷标记出来

测试结果

标记一颗地雷后,计数区可以正确的减少1个,然后当所有的地雷全被标记后,如果继续标记,计数区可以正确的以负数表示

当标记了一颗地雷后计数区中的数字会相应的减少一个,表示有一颗雷被找到了。但是如果标记数超过了地雷的数目,计数区会以负数显示,表示有的地雷标记错了

7.3递归算法测试

递归调用测试用例:

预期结果

当点击一个周围八个格子中都没有雷的格子时,系统会将这8个格子也点开

输入条件

点开一个周围没有雷的格子

测试结果

系统正确的将周围的八个格子点开,如果这些格子中周围的格子没有雷的话还会自动点开

当点击一个周围八个格子中都没有雷的格子时,系统会将周围的格子点开,被点开的格子也会显示周围的地雷数。如果被点开的格子周围还是没有地雷,系统就会递归调用再把周围的格子点开。

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

;width:290.55pt;">

系统正确的将周围的八个格子点开,如果这些格子中周围的格子没有雷的话还会自动点开

当点击一个周围八个格子中都没有雷的格子时,系统会将周围的格子点开,被点开的格子也会显示周围的地雷数。如果被点开的格子周围还是没有地雷,系统就会递归调用再把周围的格子点开。

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

[外链图片转存中…(img-TJT5Fq55-1713672420099)]

[外链图片转存中…(img-2nDn24eN-1713672420100)]

[外链图片转存中…(img-ax3Zyzsi-1713672420100)]

[外链图片转存中…(img-Dn633JjT-1713672420101)]

[外链图片转存中…(img-8opfmaBB-1713672420101)]

[外链图片转存中…(img-K5R7k8l9-1713672420102)]

[外链图片转存中…(img-P6ubeUO4-1713672420102)]

[外链图片转存中…(img-DHyldhn2-1713672420103)]

[外链图片转存中…(img-a19D1IHk-1713672420103)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-KXsAx8BF-1713672420104)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 15
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值