当前位置: 首页 > news >正文

基于Java的推箱子游戏设计与实现

基于Java的推箱子游戏设计与实现

摘    要

社会在进步,人们生活质量也在日益提高。高强度的压力也接踵而来。社会中急需出现新的有效方式来缓解人们的压力。此次设计符合了社会需求,Java推箱子游戏可以让人们在闲暇之余,体验游戏的乐趣。具有操作简单,易于上手的特点。

推箱子游戏的玩法十分简单——控制人物绕过障碍物,到达目的地。此次毕业设计基于Java语言。将游戏地图做成通用的关卡设计,关卡用二维数组实现,在二维数组中设置值域来表示不同对象,运用二维数组的遍历算法来加载对应图片实现了游戏图片初始化状态。同时,通过初始化多个不同二维数组实现了游戏地图关卡的设计,方法巧妙且简单易行,有效的解决了图片排布问题。充分运用类和方法的调用来实现游戏关卡的初始化。用读取键值的方法判断游戏人物移动、停止、到达目的地。舒缓的音乐配合有趣的步骤,相信能引起很多人的兴趣。作为一个具有悠久历史的游戏,也能够引起人的怀念和共鸣。

关键词  Java 游戏 二维数组 算法 读取键值 栈

引    言

策略性游戏可以锻炼人的思维能力还能缓解人的压力,使人们暂时忘却生活当中的烦恼,增强人们的逻辑思维能力,游戏的艺术美也吸引着越来越多的玩家和厂商,寓教于乐,在放松人们心情的同时还可以活跃双手。在人类的社会生活当中,游戏占有很大的比重,并且随着社会的发展而不断发展。而且游戏本身具有激发人类潜在行为的特质,是一种能够吸引人们参与其中的活动,其本身具有强烈的吸引力使游戏者卷入其中;再者适当的游戏、合理的时间安排,能够让玩家在娱乐的同时还可以锻炼其反应速度及灵敏程度,亦可让玩家从压力中释放出来。因此游戏逐渐成为人们生活中不可缺少的一部分,游戏产业也正逐步发展成熟。

经典的推箱子游戏是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。它的玩法也非常简单,在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,控制人物不停的移动将箱子推到目的位置才能顺利的完成任务。难点在于移动的位置,以及箱子到达指定位置的顺序,只有多加思考才能获得游戏的胜利。反复推敲,锻炼了人们的耐性。本次的开发尽量多的设置了关卡数目,增强游戏的耐玩性,同时在画面上有所提高,借鉴了许多达人的经验和技术,引发了我对游戏的热爱,丰富了个人生活,相信推箱子游戏在今后的社会总会越来越引人注目。

3  详细设计

3.1  游戏总体结构与代码

推箱子的小游戏界面如图3-1所示:

图3-1小游戏界面

(1)界面框架与按钮设计

本游戏界面简单清晰,操作界面优美,有很强的带入性,游戏操作模块分为:“悔一步”,“重来”,“上一关”,“下一关”,“第1关”,“最终关”,“选关”“音乐关”并且各个按钮的名称与相关功能为:

“悔一步”:返回上一移动状态(可以连续返回多步);

“重来”:重新开始当前关;

“上一关”:返回到当前关的上一关;

“下一关”:跳转到当前关的下一关;

“第1关”:游戏系统默认开始关为第一关,此按钮让玩家可以方便从其它关卡直接跳转到第一关;

“最终关”:可以跳转到最后一关,即游戏系统默认的最后一个关。

mainFrame()

{

super("推箱子v2.0");

setSize(720,720);

setVisible(true);

setResizable(false);

setLocation(300,20);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Container cont=getContentPane();

cont.setLayout(null);

cont.setBackground(Color.black);

Menu choice=new Menu("    选项");

choice.add(renew);choice.add(last);choice.add(next);choice.add(choose);choice.add(back);

choice.addSeparator();choice.add(exit);

renew.addActionListener(this);

last.addActionListener(this);

next.addActionListener(this);

choose.addActionListener(this);

exit.addActionListener(this);

back.addActionListener(this);

Menu setmuc=new Menu("    设置音乐")

setmuc.add(nor);setmuc.add(qin);setmuc.add(po);setmuc.add(guang);setmuc.add(eye);

nor.addActionListener(this);

qin.addActionListener(this);

po.addActionListener(this);

guang.addActionListener(this);

eye.addActionListener(this);

Menu help=new Menu("    帮助");

help.add(about);

about.addActionListener(this);

MenuBar bar=new MenuBar();

bar.add(choice);bar.add(setmuc);bar.add(help);

setMenuBar(bar);                                        

}

3.2  选关模块

“选关”:选择想要挑战的关卡。当游戏玩家想要自主选择关卡时,可以随意输入想要跳入的关卡,节约了时间,玩家同过选择的关卡可以有效地挑战自我,连接上次的游戏进度。

其中,这个部分的部分代码为:

void Tuixiangzi(int i)

{

Levelmap=new Readmap(i);

Levelmaptmp=new Readmap(i);

map=Levelmap.getmap();

manX=Levelmap.getmanX();

manY=Levelmap.getmanY();

maptmp=Levelmaptmp.getmap();

repaint();

}

int maxlevel(){return max;}

public void paint(Graphics g)

{

for(int i=0; i<20; i++)

for(int j=0; j<20; j++)

    {

    g.drawImage(myImage[map[j][i]],i*len,j*len,this);

}

g.setColor(new Color(0,0,0));

g.setFont(new Font("楷体_2312",Font.BOLD,30));

g.drawString("现在是第",150,40);

g.drawString(String.valueOf(level),310,40);

g.drawString("关",360,40);

}

推箱子选关模式如图3-2所示

图3-2  选关模块

3.3  地图的绘制形成

地图以二维数组的形式进行存储,不同的数家代表了不同的含义。在本小游戏的地图文件中,0~9这十个数字的定义如下所示:

编号0:代表未定义的区域;

编号1:代表障碍物(或者边界);

编号2:代表草地;

编号3:代表箱子(未到指定位置);

编号4:代表目的地;

编号5:代表小人向下移动方向;

编号6:代表小人向左移动方向;

编号7:代表小人向右移动方向;

编号8:代表小人向上移动方向;

编号9:代表到达指定位置时的箱子。

例如下图3-3所示(左边是二维数组的地图文件,右边是相对应的小游戏界面):

               

图3-3 地图文件与相应界面

推箱子小游戏的游戏性,其主要功能是给用户一个良好的游戏界面,游戏中包括50关的地图文件。地图文件是是先写好的,所有界面信息以数的形式存放在一个20*20的二维数组当中并且把这些地图文件统一放在一个地图文件中,便于程序调用地图文件。然后,每一关就会按照这些数组数据重新绘制地图,从而达到小游戏的可用性及其相应的目的。

推箱子地图文件如图3-4所示:

图3-4地图文件

部分代码如下所示:

private int[][] mymap=new int[20][20];

FileReader r;

BufferedReader br;

String bb="";

int[] x;int c=0;

Readmap(int k)

{

level=k;

String s;

File f=new File("maps\\"+level+".map");

r=new FileReader(f);

br=new BufferedReader(r);

}

while ((s=br.readLine())!=null)

{

bb=bb+s;

}

byte[] d=bb.getBytes();

int len=bb.length();

int[] x=new int[len];

for(int i=0;i<bb.length();i++)x[i]=d[i]-48;

for(int i=0;i<20;i++)

{

for(int j=0;j<20;j++)

    {

mymap[i][j]=x[c];

        if(mymap[i][j]==5)

        {

mx=j;my=i;

        }

        c++;

    }

    }

3.4  小人与箱子移动的算法

小人与箱子的移动中包括了正移动以及“悔一步”的负移动。

正移动:小人向上、下、左、右的移动是一个判断算法,其判断都是通过判断小人前面是否是草地或者是箱子或者是障碍物(或者边界)。如果是障碍物或者是边界,就不能够进行移动;如果是没有箱子或者是障碍物,就可以自由移动;又如果是有箱子,就要判断是否可以移动箱子,最后再讨论箱子被推过的位置,小人移动的位置,以及它们的原位置和被遮挡住的新位置的图形变化等等,需要运用算法使其重新绘制地图,填补空白。算法判断完毕后,传出数据并且将其记录在一个堆栈中,以备“悔一步”时使用。

负移动:通过记录在堆栈中的数据来判断,前一步小人的移动方向以及移动中使用过的算法,逆向将代码重新运行,同时绘制并刷新地图以达到前一步的状态。

其中,这个部分的部分代码为:

void moveup()

 {

if(map[manY-1][manX]==2||map[manY-1][manX]==4)

{

if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)

map[manY][manX]=4;

else map[manY][manX]=2;

map[manY-1][manX]=8;

repaint();manY--;mystack.push(10);

}

else if(map[manY-1][manX]==3)

{

if(map[manY-2][manX]==4)

{

if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)

map[manY][manX]=4;

else map[manY][manX]=2;

map[manY-1][manX]=8;

map[manY-2][manX]=9;

repaint();manY--;mystack.push(11);

}

else if(map[manY-2][manX]==2)

{

if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)

map[manY][manX]=4;

else map[manY][manX]=2;

map[manY-1][manX]=8;

map[manY-2][manX]=3;

repaint();manY--;mystack.push(11);

}

else {map[manY][manX]=8;repaint();}

}

else if(map[manY-1][manX]==9)

{

if(map[manY-2][manX]==4)

{

if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)

map[manY][manX]=4;

else map[manY][manX]=2;

map[manY-1][manX]=8;

map[manY-2][manX]=9;

repaint();manY--;mystack.push(11);

}

else if(map[manY-2][manX]==2)

{

if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)

map[manY][manX]=4;

else map[manY][manX]=2;

map[manY-1][manX]=8;

map[manY-2][manX]=3;

repaint();manY--;mystack.push(11);

}

else {map[manY][manX]=8;repaint();}

}

if(map[manY-1][manX]==1)

{

map[manY][manX]=8;repaint();

}

}

3.5  小人上下移动模块

在本小游戏系统中,小人与箱子的移动应该是能带给玩家较为逼真的视觉感受,这样才能体现系统的有效性与娱乐性。玩家通过控制小人,推动箱子在草地上避过障碍物与边界死角来到达指定的终点位置。

其中,这个部分代码分为上下左右移动。其中代码原理相同,转向利用下一步位置的判断。

void moveleft(){

……}

void movedown(){

……}

void moveright(){

……}

  小人向后转的代码如下:

void backup(int t)

{

int n=t;

if(n==10)

{

if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)

{

map[manY][manX]=4;

}

else map[manY][manX]=2;

}

else if(n==11)

{

if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)

{

map[manY][manX]=9;

}

else map[manY][manX]=3;

if(maptmp[manY-1][manX]==4||maptmp[manY-1][manX]==9)

{

map[manY-1][manX]=4;

}

else map[manY-1][manX]=2;

}

map[manY+1][manX]=8;

repaint();manY++;

}

小人移动如图3-5所示:

图3-5 小人移动

3.6  悔棋模块

在推箱子小游戏中,数据的存储是非常重要的,不然就无法进行“悔一步”的操作。本小游戏系统受用了堆栈的存储方式来存储并且控制小人与箱子的移动以及地图文件的变换。而“悔一步”的操作让玩家可以进行反悔这一步操作,可避免因一时失手走错而导致的阻塞书面,可以节省玩家重新开始的时间。

其中,这个部分的部分代码为:

else if(e.getSource()==btnback||e.getSource()==back)

{

if(panel.isMystackEmpty())JOptionPane.showMessageDialog(this, "您还未移动!!!");

else

{

switch(panel.back())

{

case 10:panel.backup(10);break;

case 11:panel.backup(11);break;

case 20:panel.backdown(20);break;

case 21:panel.backdown(21);break;

case 30:panel.backleft(30);break;

case 31:panel.backleft(31);break;

case 40:panel.backright(40);break;

case 41:panel.backright(41);break;

}

}

推箱子悔棋如图3-6所示:

图3-6悔棋模块

3.7  音乐控制

在推箱子小游戏中,音乐的选择是非常重要的,通过音乐选择可以提高游戏的娱乐性。让游戏玩家可以再轻松越快的环境中进行游戏,同时游戏的随关卡转换也是本次设计的一大特点。使用了Java MIDI技术中的Sequence类和Sequencer容器和其中的getSequence()方法等。

其中,这个部分的部分代码为:

public void itemStateChanged(ItemEvent ie)

 {

int no=jc.getSelectedIndex();

switch(no)

{

case 0:sound.setMusic("nor.mid");

 if(sound.isplay())

 sound.mystop();

 sound.loadSound();

 btnmuc.setLabel("音乐关");

 nor.setEnabled(false);

 qin.setEnabled(true);

 guang.setEnabled(true);

 eye.setEnabled(true);

 po.setEnabled(true);

panel.requestFocus();

break;

case 1:sound.setMusic("qin.mid");

 if(sound.isplay())

 sound.mystop();

 sound.loadSound();

 btnmuc.setLabel("音乐关");

 nor.setEnabled(true);

 qin.setEnabled(false);

 guang.setEnabled(true);

 eye.setEnabled(true);

 po.setEnabled(true);

panel.requestFocus();

break;

case 2:……

case 3:……

case 4:sound.setMusic("eyes on me.mid");

if(sound.isplay())

sound.mystop();

sound.loadSound();

btnmuc.setLabel("音乐关");

nor.setEnabled(true);

qin.setEnabled(true);

guang.setEnabled(true);

eye.setEnabled(false);

po.setEnabled(true);

panel.requestFocus();break;

}

运行结果如图3-7所示:

图3-7 音乐选择

4  游戏测试

4.1  软件测试

4.1.1  软件测试简介

测试是软件开发过程中的一个非常重要的环节。通过测试可以用来检验一个系统的性能和品质是否达到系统最初设计时给出的各项需求指标。

测试的目的就是希望能以最少的人力和时间发现潜在的各种错误和缺陷。应根据开发各阶段的需求、设计等文档或程序的内部结构精心设计测试用例,并利用这些用例来运行程序以便发现错误,这个过程与整个软件开发过程基本上是平行进行的。一个规范化的测试过程通常包括以下基本的测试活动:

(1)制定测试计划。在充分考虑了整个项目的开发时间和开发进度以及一些人为因素和客观条件后制定测试计划,保证其是基本可行的。测试计划应主要包括测试的内容、进度安排、测试所需的环境等。

(2)编制测试大纲。测试大纲是测试的依据。

(3)根据测试大纲设计和生成测试用例,产生测试设计说明文档。

(4)实施测试。依据预先编制好的测试大纲和设计好的测试用例,对被测软件进行完整的测试。

(5)生成测试报告。

4.2 测试方法

软件测试方法可以分为静态测试和动态测试。

(1)静态测试:是指被测试程序不在机器上运行,而是采用人工检测和计算机辅助分析的手段对程序进行检测。

(2)动态测试:是指通过运行程序来发现错误,可以采用黑盒测试法和白盒测试法。黑盒测试法也称功能测试或数据驱动测试,其是在完全不考虑软件的内部结构和特性的情况下,测试软件的外部特性。在测试过程中,把程序看作一个不能打开的黑盒子,测试者在程序接口进行测试,只需要检查程序功能是否达到了系统功能需求各项指标,判断程序是否能在保持外部信息的完整性的同时适当程度地接受数据输入并产生相应的输出信息。经常使用的黑盒测试方法主要有等价类划分、边界值划分、错误推测和因果图等,主要应用于软件确认测试。白盒测试法也称结构测试或逻辑驱动测试,它是在知道产品内部工作过程前提下,根据程序的内部结构和逻辑来设计测试用例,对程序的路径和过程进行测试,检查是否满足设计的需要。白盒测试常用的技术有逻辑覆盖、循环覆盖和基本路径测试等。

4.3 测试步骤

有效的软件测试实际上分为4步进行,即:单元测试、集中测试、确认测试、系统测试。

(1)单元测试

单元测试也称模块测试,侧重于模块中的内部处理逻辑和数据结构。

(2)集成测试

即使所有模块通过了单元测试,但在集成以后仍可能出现问题,这就需要集成测试来发现错误。集成测试通常可以分为非增量式集成和增量式集成。

(3)确认测试

经过集成测试以后,软件就被集成起来,这时软件接口方面的问题都已解决,将进入确认测试阶段。确认测试的任务是进一步检查软件的功能和性能是否与用户要求的达成一致。

(4)系统测试

是将已经确认的软件、计算机硬件、外设和网络等其它因素结合在一起,进行系统的各种集成测试和确认测试,其目的是通过与系统的需求相比较,发现所开发的系统与用户需求相矛盾的地方。系统测试是为了发现错误而执行程序的过程,成功的测试是发现了至今尚未发现的错误的测试。

测试的目的就是希望能以最少的人力和时间发现潜在的各种错误和缺陷。应根据开发各阶段的需求、设计等文档或程序的内部结构精心设计测试用例,并利用这些实例来运行程序,以便发现错误。信息系统测试应包括软件测试、硬件测试和网络测试。硬件测试、网络测试可以根据具体的性能指标来进行,此处所说的测试更多的是指软件测试。

系统测试是保证系统质量和可靠性的关键步骤,是对系统开发过程中的系统分析系统设计和实施的最后复查。根据测试的概念和目的,在进行信息系统测试时应遵循以基本原则。

应尽早并不断地进行测试。测试不是在应用系统开发完之后才进行的。由于原始问题的复杂性、开发各阶段的多样性以及参加人员之间的协调等因素,使得毛开发各个阶段都有可能出现错误。因此,,测试应贯穿在开发的各个阶段,尽早纠正错误,消除隐患。

测试工作应该避免由原开发软件的人或小组承担,一方面,开发人员往往不愿召认自己的工作,总认为自己开发的软件没有错误;另一方面,开发人员的错误很对由本人测试出来,很容易根据自己编程的思路来制定测试思路,具有局限性。测试工作应由专门人员来进行,这样会更客观,更有效。

设计测试方案的时候,不仅要确定输入数据,而且要根据系统功能确定预期的输出结果。将实际输出结果与预期结果相比较就能发现测试对象是否正确。

在设计测试用例时,不仅要设计有效合理的输入条件,也要包含不合理、失效的输入条件。测试的时候,人们往往习惯按照合理的、正常的情况进行测试,而忽略了对异常、不合理、意想不到的情况进行测试,而这些可能就是隐患。

在测试程序时,不仅要检验程序是否做了该做的事,还要检验程序是否做了不该做的事。多余的工作会带来副作用,影响程序的效率,有时会带来潜在的危害或错误 。

严格按照测试计划来进行,避免测试的随意性。测试计划应包括测试内容、进度安排、人员安排、测试环境、测试工具和测试资料等。严格的按照测试计划可以;认证进度,使各方面都得以协调进行。

妥善保存测试计划、测试用例,作为软件文档的组成部分,为维护提供方便。

测试用例都是精心设计出来的,可以为重新测试或追加测试提供方便。当纠正锱 前的测试用例,或在其基础上修改,然后进行测试。

测试是开发过程中一个独立且非常重要的阶段,测试过程基本上与开发过程平行。

一个规范化的测试过程通常包括以下基本的测试活动。

(1)拟定测试计划。在制定测试计划时,要充分考虑整个项目的开发时间和开发进童以及一些人为因素和客观条件等,使得测试计划是可行的。测试计划的内容主要有测试的内容、进度安排、测试所需的环境和条件、测试培训安排等。

(2)编制测试大纲。测试大纲是测试的依据。它明确详尽地规定了在测试中针对系统的每一项功能或特性所必须完成的基本测试项目和测试完成的标准。

(3)根据测试大纲设计和生成测试用例。在设计测试用例的时候,可综合利用前面介绍的测试用例和设计技术,产生测试设计说明文档,其内容主要有被测项目、输人数据、测试过程、预期输出结果等。

(4)实施测试。测试的实施阶段是由一系列的测试周期组成的。在每个测试周期中,测试人员和开发人员将依据预先编制好的测试大纲和准备好的测试用例,对被测软件或设备进行完整的测试。

(5)生成测试报告。测试完成后,要形成相应的测试报告,主要对测试进行概要说明,列出测试的结论,指出缺陷和错误,另外,给出一些建议,如可采用的修改方法,各项修改预计的工作量及修改的负责人员。

总的来说测试包括一下基本流程和步骤:

4.4  游戏系统性能分析

经过对系统进行测试和运行。总结出游戏系统性能如下:

(1)界面友好,游戏操作方便

系统风格可爱,界面简单,功能较完善,游戏操作简单。 

(2)系统响应较快,运行较稳定

在系统运行时,游戏过程中的消息响应处理很快,且系统整体运行安全且稳定。

(3)部分系统功能仍需完善

由于开发时间等方面的原因,该系统还可以在联网进行玩家比赛、难度调节等方面予以完善。

相关文章:

基于Java的推箱子游戏设计与实现

基于Java的推箱子游戏设计与实现 摘 要 社会在进步&#xff0c;人们生活质量也在日益提高。高强度的压力也接踵而来。社会中急需出现新的有效方式来缓解人们的压力。此次设计符合了社会需求&#xff0c;Java推箱子游戏可以让人们在闲暇之余&#xff0c;体验游戏的乐趣。具有…...

Spark vs Flink分布式数据处理框架的全面对比与应用场景解析

1. 引言 1.1 什么是分布式数据处理框架 随着数据量的快速增长&#xff0c;传统的单机处理方式已经无法满足现代数据处理需求。分布式数据处理框架应运而生&#xff0c;它通过将数据分片分布到多台服务器上并行处理&#xff0c;提高了任务的处理速度和效率。 分布式数据处理框…...

python_excel列表单元格字符合并、填充、复制操作

读取指定sheet页&#xff0c;根据规则合并指定列&#xff0c;填充特定字符&#xff0c;删除多余的列&#xff0c;每行复制四次&#xff0c;最后写入新的文件中。 import pandas as pd""" 读取指定sheet页&#xff0c;根据规则合并指定列&#xff0c;填充特定字…...

nums[:]数组切片

问题&#xff1a;给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 使用代码如下没有办法通过测试示例&#xff0c;必须将最后一行代码改成 nums[:]nums[-k:]nums[:-k]切片形式&#xff1a; 原因&#xff1a;列表的切片操作 …...

【Arthas 】Can not find Arthas under local: /root/.arthas/lib 解决办法

报错 [INFO] JAVA_HOME: /opt/java/openjdk [INFO] arthas-boot version: 4.0.4 [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER. [1]: 12 org.springframework.boot.loader.JarLauncher 1 [ER…...

录用率23%!CCF推荐-B类,Early Access即可被SCI数据库收录,中美作者占比过半

International Journal of Human-Computer Interaction&#xff08;IJHCI&#xff09;创刊于1989年&#xff0c;由泰勒-弗朗西斯&#xff08;Taylor & Francis, Inc.&#xff09;出版&#xff0c;主要发表关于交互式计算&#xff08;认知和人体工程学&#xff09;、数字无障…...

IP 地址与蜜罐技术

基于IP的地址的蜜罐技术是一种主动防御策略&#xff0c;它能够通过在网络上布置的一些看似正常没问题的IP地址来吸引恶意者的注意&#xff0c;将恶意者引导到预先布置好的伪装的目标之中。 如何实现蜜罐技术 当恶意攻击者在网络中四处扫描&#xff0c;寻找可入侵的目标时&…...

Vue_API文档

Vue API风格 Vue 的组件可以按两种不同的风格书写&#xff1a;选项式 API&#xff08;Vue2&#xff09; 和组合式 API&#xff08;Vue3&#xff09; 大部分的核心概念在这两种风格之间都是通用的。熟悉了一种风格以后&#xff0c;你也能够很快地理解另一种风格 选项式API(Opt…...

WebSocket 设计思路

WebSocket 设计思路 1. 核心结构体 1.1 Manager (管理器) // Manager 负责管理所有WebSocket连接 type Manager struct {clients sync.Map // 存储所有客户端连接broadcast chan []byte // 广播消息通道messages chan Message // 消息处理通道config *config.WebSo…...

Jenkins持续集成与交付安装配置

Jenkins 是一款开源的持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;工具&#xff0c;它主要用于自动化软件的构建、测试和部署流程。为项目持续集成与交付功能强大的应用。下面我们来介绍下它的安装与配置。 环境准备 更新系统组件&#xff08;这…...

ESP32作为Wi-Fi AP模式的测试

一、AP模式的流程 初始化阶段 (Init Phase): 1.1: Main task&#xff08;主任务&#xff09;初始化LwIP&#xff08;轻量级TCP/IP协议栈&#xff09;。 ESP_ERROR_CHECK(esp_netif_init()); 1.2: 创建和初始化Event task&#xff08;事件任务&#xff09;。 ESP_ERROR_CHECK…...

【爬虫】单个网站链接爬取文献数据:标题、摘要、作者等信息

源码链接&#xff1a; https://github.com/Niceeggplant/Single—Site-Crawler.git 一、项目概述 从指定网页中提取文章关键信息的工具。通过输入文章的 URL&#xff0c;程序将自动抓取网页内容 二、技术选型与原理 requests 库&#xff1a;这是 Python 中用于发送 HTTP 请求…...

Android RIL(Radio Interface Layer)全面概述和知识要点(3万字长文)

在Android面试时,懂得越多越深android framework的知识,越为自己加分。 目录 第一章:RIL 概述 1.1 RIL 的定义与作用 1.2 RIL 的发展历程 1.3 RIL 与 Android 系统的关系 第二章:RIL 的架构与工作原理 2.1 RIL 的架构组成 2.2 RIL 的工作原理 2.3 RIL 的接口与协议…...

leetcode_2816. 翻倍以链表形式表示的数字

2816. 翻倍以链表形式表示的数字 - 力扣&#xff08;LeetCode&#xff09; 搜先看到这个题目 链表的节点那么多 已经远超longlong能够表示的范围 那么暴力解题 肯定是不可以的了 我们可以想到 乘法运算中 就是从低位到高位进行计算 刚开始 我想先反转链表 然后在计算 然后在进…...

【论文阅读】MAMBA系列学习

Mamba code&#xff1a;state-spaces/mamba: Mamba SSM architecture paper&#xff1a;https://arxiv.org/abs/2312.00752 背景 研究问题&#xff1a;如何在保持线性时间复杂度的同时&#xff0c;提升序列建模的性能&#xff0c;特别是在处理长序列和密集数据&#xff08;如…...

MySQL教程之:批量使用mysql

在前几节中&#xff0c;您以交互方式使用mysql输入语句并查看结果。您也可以运行mysql批量模式。为此&#xff0c;请将要运行的语句放在文件中&#xff0c;然后告诉mysql从文件中读取其输入&#xff1a; $> mysql < batch-file 如果您在Windows下运行mysql&#xff0c;…...

17_Redis管道技术

Redis管道(Pipeline)技术是一种在 Redis 客户端与服务器之间进行高效数据交互的技术。 1.Redis管道技术介绍 1.1 传统请求响应模式 在传统的请求-响应模式下,客户端每发送一个命令后会等待服务器返回结果,然后再发送下一个命令。这种方式在网络延迟较高的情况下会导致性…...

【LC】3270. 求出数字答案

题目描述&#xff1a; 给你三个 正 整数 num1 &#xff0c;num2 和 num3 。 数字 num1 &#xff0c;num2 和 num3 的数字答案 key 是一个四位数&#xff0c;定义如下&#xff1a; 一开始&#xff0c;如果有数字 少于 四位数&#xff0c;给它补 前导 0 。答案 key 的第 i 个数…...

【redis】ubuntu18安装redis7

在Ubuntu 18下安装Redis7可以通过以下两种方法实现&#xff1a;手动编译安装和使用APT进行安装。 Ubuntu 18系统的环境和版本&#xff1a; $ cat /proc/version Linux version 4.15.0-213-generic (builddlcy02-amd64-079) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)…...

d2j-dex2jar classes.dex 执行报错:not support version 问题解决

这个错误是由于 dex2jar 工具不支持你的 classes.dex 文件的版本导致的。通常情况下&#xff0c;这是因为你尝试使用的 dex2jar 版本不支持 Android 较新的 DEX 文件格式&#xff08;例如 DEX 格式 038 或更新版本&#xff09;。 解决方法 以下是一些解决此问题的步骤&#x…...

智慧城市应急指挥中心系统平台建设方案

建设背景与目标 智慧城市应急指挥中心系统平台的建设&#xff0c;源于对城市管理精细化、智能化的迫切需求。平台旨在通过整合各方资源&#xff0c;实现应急事件的快速响应与高效处置&#xff0c;提升城市安全管理水平。 前端设计与信息采集 前端设计注重立体化、全方位信息…...

QT鼠标、键盘事件

一、鼠标 鼠标点击 mousePressEvent 鼠标释放 mouseReleaseEvent 鼠标移动 mouseMoveEvent 鼠标双击 mouseDoubleClickEvent 鼠标滚轮 QWheelEvent 二、键盘 键盘按下 keyPressEvent 键盘松开keyReleaseEvent 一、鼠标 #include <QMouseEvent> 鼠标点击 mouse…...

Ceph分布式存储集群,不仅仅是一个简单的对象存储解决方案

Ceph 作为 OpenStack 的存储后端 块存储&#xff08;Cinder 后端&#xff09; Ceph 的 RBD&#xff08;RADOS Block Device&#xff09;模块作为 OpenStack Cinder 服务的后端&#xff0c;为虚拟机提供块级别的存储资源。RBD 支持快照、克隆和恢复等功能&#xff0c;能够满足虚…...

DSP+Simulink——点亮LED灯(TMSDSP28379D)超详细

实现功能&#xff1a;DSP28379D-LED灯闪烁 :matlab为2019a :环境建立见之前文章 Matlab2019a安装C2000 Processors超详细过程 matlab官网链接&#xff1a; Getting Started with Embedded Coder Support Package for Texas Instruments C2000 Processors Overview of Creat…...

Linux 环境下编译安装 OpenCV 4.8.x

在 Linux 环境下编译安装 OpenCV 4.8.x 需要安装一系列依赖库。以下是详细的步骤说明&#xff0c;并附上每个依赖库的作用解释。 1. 环境准备 操作系统 推荐使用 Ubuntu 20.04/22.04 或其他基于 Debian 的 Linux 发行版。 编译器 GCC 9 或更高版本&#xff08;默认已安装&a…...

phpenc加密程序源码

免费扩展加密程序&#xff0c;类似于sg11加密&#xff0c;支持单个PHP&#xff08;免费&#xff09;文件以及批量PHP文件&#xff08;ZIP压缩包格式&#xff09;源码加密的保护平台&#xff0c;加密后的源码文件保持原有代码结构&#xff0c;可以跨平台运行&#xff0c;可以运行…...

学英语学Elasticsearch:04 Elastic integrations 工具箱实现对第三方数据源的采集、存储、可视化,开箱即用

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#xff1a; 先看关键单词&#xff0c;再看英文&#xff0c;最后看中文总结&#xff0c;再回头看一遍英文原文&#xff0c;效果更佳&#xff01;&#xff01; 关键词 ingestion 摄取 /ɪnˈdʒɛstʃən/ observability 可观察性 …...

2024.10.12 校招 实习 内推 面经

&#x1f6f0;️ &#xff1a;neituijunsir 交* 流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 中车电动2025届校园招聘正式启动 校招 | 中车电动2025届校园招聘正式启动 2、校招 | 莱斯信息2025届校园招聘 校招 | 莱斯信息2025届校园招聘 3、招聘 | 中电熊猫2025…...

ios越狱脚本巨魔商店安装教程

使用爱思助手安装 安装爱思助手&#xff1a;在电脑上安装 iTunes 和爱思助手&#xff0c;并使用 Apple ID 登录2。 IPA 签名&#xff1a;打开爱思助手&#xff0c;选择工具箱中的 IPA 签名。点击添加 IPA 文件&#xff0c;选择下载的 TrollInstallerX.ipa 文件。选择使用 Apple…...

浅谈容灾技术方案详解

一、什么是容灾&#xff1f; 容灾指的是&#xff0c;在异地搭建一套或多套和主生产系统一样的IT系统&#xff0c;用于应对在系统因发生意外&#xff08;自然灾害、人为灾害、设备系统故障等&#xff09;造成业务影响的情况&#xff0c;达到尽量让生产业务损失最小的目的。 二…...

广州定制型网站/人力资源和社会保障部

前言 在上一篇文章中 我向大家介绍了如何 在node-red中使用高德地图的api sdk。并向大家展示了如何使用template来显示一个地图组件。那么本篇文件中我就教大家如何实现实现一个3D地图显示到面板上。 并实现一个地图中常用的功能,轨迹回放,这在路线规划,车辆导航中非常使用…...

网站繁体js/营销策划经典案例

题目&#xff1a; 我是超链接 题意&#xff1a; 将一个图划分成若干个部分&#xff0c;要求&#xff1a;1、可以互达的点在一个部分中 2、在一个部分中的点至少单向到达。要求分成部分最少 题解&#xff1a; 1A纪念 第一个要求就是强联通分量缩点&#xff0c;第二个要求就…...

乌海网站建设/seo推广公司教程

一、介绍 早期的SSLv2根据经典的公钥基础设施PKI(Public Key Infrastructure)设计&#xff0c;它默认认为&#xff1a;一台服务器&#xff08;或者说一个IP&#xff09;只会提供一个服务&#xff0c;所以在SSL握手时&#xff0c;服务器端可以确信客户端申请的是哪张证书。 但是…...

后台风格网站/传媒公司

union all 和union都是讲两个结果集合并为一个 union union取唯一值&#xff0c;记录没有重复 [SQL 语句 1]UNION[SQL 语句 2] union all union all是直接连接&#xff0c;取到得是所有值&#xff0c;记录可能有重复 [SQL 语句 1]UNION ALL[SQL 语句 2] 效率&#xff1a;…...

股票网站排名哪个好/关键词优化seo优化排名

由于自己重装了系统&#xff0c;所以需要重新配置环境变量&#xff0c;安装软件&#xff0c;所以记录一下。选择最下面的window x64进行下载&#xff0c;下载到本地后点击运行&#xff1a;之后傻瓜安装一直next就可以了&#xff0c;其实也不需要刻意把jdk换到其他盘&#xff0c…...

wordpress页面的template/搜索百度下载安装

转自http://siqun.blog.163.com/blog/static/213496001201341231121720/ 每个进程各自有不同的用户地址空间&#xff0c;任 何一个进程的全局变量在另一个进程中都看不到&#xff0c;所以进程之间要交换数据必须通过内核&#xff0c;在内核中开辟一块缓冲 区&#xff0c;进程1…...