javaSwing超级玛丽游戏

一、摘要

摘要
近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用。J2SE称为Java标准版或Java标准平台。J2SE提供了标准的SDK开发平台。利用该平台可以开发Java桌面应用程序和低端的服务器应用程序,也可以开发Java Applet程序。
“超级玛丽”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本游戏中通过总结和分析JAVA游戏的开发流程和代码功能的设计,采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。开发了一款超级玛丽游戏,该游戏主要分为窗体类、场景类、马里奥类、敌人类、障碍物类等几个类。在主程序运行的线程中,用户控制的超级玛丽随方向键的操作而移动,并且可以实现马里奥游戏中的一些基本功能,例如踩死敌人或者顶掉砖块。本游戏采用双缓存技术,解决了游戏过程中的闪屏问题。通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。
本文在介绍Java相关技术和国内外发展现状的基础上,对“超级玛丽”游戏的整个生命周期的各个开发阶段进行了详细地介绍。为了保证程序代码的正确性和功能实现的可靠性,本文还介绍了游戏软件的程序调试过程和功能测试结果。

二、系统运行环境及开发软件:

开发环境:Windows 7;
(2)开发工具:eclipse;
(3)编程语言:Java语言;

三、可行性的分析

可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能够解决。要达到这个目的,必须分析几种主要的可能解法的利弊,从而判断原定的系统规模和目标是否现实,系统完成后所能带来的效益是否大到值得投资开发这个系统的程度。因此,可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。

1 技术可行性

本游戏是在Windows 7环境下开发的,一般的机器配置就可以了,对机器本身没有太高的要求,一般当前学校或个人电脑完全可满足要求,环境只需装上jdk 1.4或以上版本就行了,Java是现在全球最时髦的开发工具之一,它拥有一套庞大且完善的类库,内置了其他语言需要靠库甚至是操作系统才能支持的功能,拥有一个虚拟机。NeatBeans IDE 5.5是SUN公司开发的Java可视化集成开发工具,是目前最优秀的Java集成开发工具之一。

2 经济可行性

由于本系统使用到的工具一般机器都具备,使用环境也很简单,开发成本低,本课题研究的内容是涉及网络的游戏对战。当今形式下网络游戏俨然已经成为年轻人最时兴的消费方式之一,JAVA一直以来由于其可以“跨平台”以及“一次编译,到处运行”等特点,许多人直接它为网络编程语言,且由于JAVA游戏一般来说简单有趣,并且对用户硬件要求极小,所以JAVA游戏通常对85%的计算机用户都有吸引力。且政府态度和政策都是一种信号,表明2005年对本土网络游戏的扶持力度将加大;国内游戏厂商将可获得发展的核心技术平台;政策有利于保护中国游戏软件的自主知识产权;这为网络游戏发展创造了良好的政策环境。

3 操作可行性

由于在整个系统的开发过程中从操作简便、界面美观、灵活实用的用户要求为出发点,界面设计时充分考虑玩家的感受,界面比较直观,交互性很好,所以操作起来简单明了。

四、需求分析

所谓系统分析,就是指在整个系统开发工程中,解决“做什么”的问题,把要解决哪些问题,满足用户哪些具体的信息需求调查分析清楚,从逻辑上或是说从信息处理的功能需求上提出系统的方案,即逻辑模型,为下一阶段进行物理方案设计,解决怎么办提供依据。

1 用户需求分析

超级玛丽这款游戏是很多人童年经典的回忆,是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱。并且随着社会的快速发展,人们的生活节奏越来越快,人们对于童年的美好已经不愿意仅仅停留在回忆阶段。所以利用java语言开发一款超级玛丽游戏正是人们迫切需要的。

2功能需求分析

本系统主要是完成超级玛丽游戏的基本操作。本系统需要满足以下几点要求:
(1) 在开始界面按空格键进入游戏。
(2) 利用方向键来控制马里奥的运动。
(3) 碰撞检测:
A.马里奥在运动的过程中如果碰到障碍物则停止运动,在移动到悬崖上方是会掉下去,并失去一条生命。
B.对于有些敌人,如果马里奥跳到敌人头顶上,则敌人消失,否则马里奥失去一条生命。
(4)马里奥顶到金币会增加分数,当马里奥失去3条生命时游戏结束。

3.界面设计需求分析

  1. 选取和谐Q版的图片,使画面色彩和谐自然。
  2. 固定游戏界面大小与初始显示位置。
  3. 游戏采用900600像素显示,对于马里奥和障碍物选用6060像素的正
    方图片,对于较大的障碍物分割成多个60*60的小正方形。

五、系统概要设计

1系统模块设计

首先在对于系统的需求进行了分析,因为设计者的最初是要做一款游戏,所以窗体类必不可少。接下来继续分析,游戏中还需要背景类、障碍物类、敌人类、马里奥类这及格类。其次为了游戏的流畅以及游戏中图片调用的方便,专门为此再设计一个初始化类。

2.窗体类

该类主要用于存放游戏的场景以及其他各类,并且实现KeyListener接口,用于从键盘的按键中读取信息。该类中的一些属性主要包括了用于存放所有场景的list集合 allBG,马里奥类 mario,当前的场景 nowBG以及其他一些游戏中需要的标记等。而且在该类中,运用双缓存的技术使得游戏的流畅度更高,解决了游戏中出现的闪屏问题。

Myframe

  • allBG:List
  • mario:Mario
  • nowBG:BackGround
  • main():void
  • paint():void
  • keyPressed():void
  • kerReleased():void

2初始化类

用于存放游戏所需要的所有静态文件,在游戏开始的时候将所有文件导入,提高游戏的运行速度。并且在该类中将所有需要用到的图片进行分类,分为障碍物类,马里奥类,敌人类以及背景图片。当游戏运行时可以直接调用这些集合中的图片进行遍历,在调用的时候更加方便,而且可以使马里奥或者敌人在移动的时候产生动态效果。

StaticValue

  • allMarioImage:List
  • startImage:BufferedImage
  • init():void

3背景类

该类表示马里奥及障碍物和敌人所处的场景,并且将障碍物和敌人绘制到场景中。在该类中包括用于存放敌人和障碍物的list集合,以及当敌人或者障碍物被消灭后用于存放已经消失的敌人和障碍物的集合,这样做是为了在马里奥死亡时重置场景所用的。其次在该类中还使用了控制敌人移动的方法,是为了在程序之初控制敌人静止,然后在玩家点击空格以后在使得敌人开始移动。

BackGround

  • bgImage:BufferedImage
  • isOver:boolean
  • isDown:boolean
  • allEnemy:List
  • removeEnemy:List
  • enemyStartMove():void
  • reset():void

4.马里奥类

用来控制马里奥的行动,并且在该类中加入碰撞检测,判断马里奥是否与障碍物或者敌人发生碰撞。该类中的属性主要定义了马里奥所在的场景,马里奥的移动和跳跃的速度,以及马里奥在移动过程中需要显示的图片。另外该类中还定义了玩家的生命值和所获得的分数。并且在run()方法中还定义了当马里奥到达最后一关的旗子时,玩家将失去对马里奥的控制,剩下的由程序控制走到城堡,完整全部游戏。

Mario

  • x:int
  • y:int
  • xmove:int
  • ymove;int
  • life:int
  • isDead:boolean
  • leftMove():void
  • leftStop():void
  • jump():void
  • down():void
  • dead():void

5障碍物类

绘制场景中所需要的障碍物,例如地面、砖块、水管等等。该类中的属性包括了障碍物的坐标,障碍物所需要显示的图片等。并且在该类中也定义了障碍物类的重置方法,当马里奥死亡时,场景类会调用该方法。

Obstruction

  • x:int
  • y:int
  • type:int
  • starttype:int
  • showImage:BufferedImage
  • reset():void
  • setImage():void

6敌人类

该类中主要设置了两种敌人,一种是蘑菇怪,可以被马里奥踩死,另一种是食人花,不能被踩死。该类中的属性包括了敌人的坐标,敌人的初始坐标,需要显示的图片,以及敌人的移动方向和移动范围等。敌人的初始坐标主要是为了当敌人执行重置方法后将敌人的位置还原。

Enemy

  • x:int
  • y:int
  • startx:int
  • starty:int
  • showImage:BufferedImage
  • upMax:int
  • downMax:int
  • reset():void
  • dead():void

7.设计流程

在这里插入图片描述

六、程序截图

请添加图片描述
请添加图片描述

七、部分代码

gaamaCreature.java

import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.List;


class GameCreature extends GameObject
{
	protected int XSPE=10,YSPE=10;
	protected int xspe,yspe,xadd,yadd=3;
	protected List<GameObject> objs=null;
	
	public boolean draw = false;
	
	GameCreature(int x,int y,GameClient gc)
	{
		super(x,y,gc);
	}
	
	public void draw(Graphics g)
	{
		setObjs(gc.obj_map.objs);
		super.draw(g);
//		setAvailable();
//		getHasrun();
//		touchWithHero(gc.player1);
//		move();
//		action();
	}

	protected void setAvailable() 
	{
		if(available==false) return;
		if(getRectangle().intersects(new Rectangle(0,0,GameClient.F_W,GameClient.F_H)))
		{
			this.draw=true;
		}
		else if(x<=-GameClient.F_W/2)
		{
			draw=false;
			available=false;
		}
	}
	
	public void move()
	{
		super.move();
	}
	
	protected void xMove()
	{
		
	}
	
	protected void yMove()
	{
		
	}
	
	protected void disappear()
	{
		if(draw==true)
		{
			draw=false;
			available=false;
		}
		else return;
		
	}
	
	public void touchWithHero(Hero hero)
	{
		super.touchWithHero(hero);
	}
	
	protected void action()
	{
		super.action();
	}
	
	public void setObjs(List<GameObject> objs) {
		this.objs = objs;
	}
	
	public Rectangle getRectangle()
	{
		return new Rectangle(x,y,all_w,all_h);
	}
	public Rectangle getARectangle(int x,int y,int w,int h)
	{
		return new Rectangle(x,y,w,h);
	}
	public Rectangle getNextRectangle()
	{
		return new Rectangle(x+xspe,y+yspe,all_w,all_h);
	}


Hero.java

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


class Hero 
{
	protected static final int XSPE=12,YSPE=27;
	public int spe_add=2,xspe=0,yspe=0,spe1=0,rub_add=1,g_add=3,y_add=17,j_time=0,j_lim=2,die_t=0;
	public int hero_w=25,hero_h=40;
	public int x,y,x1,y1,x2,y2,hasrun_x=0;
	public final static int LIM_X1=0,LIM_X2=550;
	protected boolean march,can_j=true,finish=false;
	protected boolean b_l,b_u,b_r,b_d;
	public boolean live = true;
	public Action act = Action.UNSTAND;
	public Action touch = Action.STAND;
	public Action last_t = Action.UNSTAND;
	protected Dirction add_dir=Dirction.STOP;
	protected Dirction move_dir=Dirction.STOP;
	protected Dirction face_dir=Dirction.R;
	private List<GameObject> objs=null;
	protected static Map<String,Image> hero_img = new HashMap<String,Image>();
	public boolean big=false;
	protected GameClient gc=null;
	
	public Hero(int x, int y,GameClient gc) 
	{
		this.x = x;
		this.y = y;
		this.gc = gc;
	}
	
	public void draw(Graphics g)
	{
		move();
		Color c = g.getColor();
		g.setColor(Color.black);
		g.fillOval(x,y,5,5);
		g.fillOval(x,(y+hero_h),5,5);
		g.fillOval(x+hero_w,y,5,5);
		g.setColor(c);
		if(this.live==true)
		{
			this.setMarch();
			setObjs(gc.obj_map.objs);
			touchWithObjs();
		}
	}
	
	private void setHasrun() 
	{
		if(x+xspe>=LIM_X2)
		{
		hasrun_x+=xspe;
		}
	}

	public void setObjs(List<GameObject> objs) {
		this.objs = objs;
	}
	
	public void keyPressed(KeyEvent e) 
	{
		if(live==false||finish==true) return;
		int key=e.getKeyCode();
		if(key==KeyEvent.VK_LEFT) b_l=true;
		else if (key==KeyEvent.VK_UP) b_u=true;
		else if (key==KeyEvent.VK_RIGHT) b_r=true;
		else if (key==KeyEvent.VK_DOWN) b_d=true;
	}

	public void keyReleased(KeyEvent e) 
	{
		if(finish==true) return;
		int key=e.getKeyCode();
		if(key==KeyEvent.VK_LEFT) b_l=false;
		else if (key==KeyEvent.VK_UP) b_u=false;
		else if (key==KeyEvent.VK_RIGHT) b_r=false;
		else if (key==KeyEvent.VK_DOWN) b_d=false;
		//else if (key==KeyEvent.VK_F1) relive();
	}
	
	public void relive() 
	{
		if(live==false)
		{
			big=false;
			live=true;
			finish=false;
			x=50;
			y=100;
			xspe=0;
			yspe=0;
			die_t=0;
		}
	}
	
	public void reset()
	{
		hasrun_x=0;
		relive();
		//System.out.println("big "+big+" march "+march);
	}

	protected void setDir()
	{
		if(xspe>0) move_dir=Dirction.R;
		if(xspe<0) move_dir=Dirction.L;
		if(xspe==0) move_dir=Dirction.STOP;
	}
	
	protected void setMarch()
	{
		if(move_dir==add_dir) march=true;
		else march=false;
		if(finish==true) march=true;//�������ʱ���ߵ�״̬
	}
	
	protected void setFacedir()
	{
		if(add_dir!=Dirction.STOP)
		face_dir=this.add_dir;
	}
	
	protected int getXAdd()
	{
		if(finish==true) return 0;
		int add = 0;
		if(b_l==false&&b_r==false) 
		{
			add=0;
			add_dir=Dirction.STOP;
		}
		else if(b_l==true) 
		{
			add=(-spe_add);
			add_dir=Dirction.L;
		}
		else if(b_r==true) 
		{
			add=spe_add;
			add_dir=Dirction.R;
		}
		return add;
	}

	protected int get_rub_Add()
	{
		if(live==false||finish==true) return 0;
		int rub = 0;
		if(xspe!=0) 
		{
			if(move_dir==Dirction.R) rub=(-rub_add);
			else if(move_dir==Dirction.L) rub=(rub_add);
		}
		if(touch==Action.LTOUCH||touch==Action.RTOUCH)
		{
			rub=0;
		}
		return rub;
	}
	
	protected void jump()
	{
		if(can_j&&act==Action.STAND)
		{
			yspe-=y_add*1.3;
			b_u=false;
		}
		else if(can_j==true&&act==Action.UNSTAND)
		{	
			yspe=-y_add*1;
			b_u=false;
		}
		if(yspe<=-YSPE)
		{
			yspe=-YSPE;
			can_j=false;
		}
		j_time++;
		act=Action.UNSTAND;
		
		//��Ծ����
		new GameAudio("ˮ��").start();
	}
	
	public void move()
	{
		if(y>gc.F_H+100) return;
		xMove();
		yMove();
		setHasrun();
		if(y>600)
		{
			if(die_t==0)
			die();
		}
		if(x>gc.F_W&&finish==true)
		{
			xspe=0;
			yspe=0;
			live=false;
			gc.d_game=false;
			gc.d_menu=true;
		}
	}
	
	protected void die()
	{
		//������������
		live=false;
		die_t++;
		act=Action.UNSTAND;
		touch=Action.UNTOUCH;		
		xspe=0;
		yspe=-YSPE;
		hasrun_x=0;
		System.out.println("die");
		
		//ʧ����Ч
		new GameAudio("ʧ��").start();
	}
	
	public void finish()
	{
		if(finish==false)
		{
			finish=true;
			xspe=XSPE;
			
			//������Ч
			new GameAudio("��ף").start();
		}
	}
	
	private void yMove() {
		if(b_u==true&&can_j==true&&j_time<j_lim)
		{
			jump();
			b_u=false;
		}
		else if (act==Action.STAND&&yspe>0)
		{
			can_j=true;
			j_time=0;
			yspe=1;
		}
		else if (act==Action.UNSTAND)
		{
			yspe+=g_add;
		}
		int g_add1=g_add;
		if(touch==Action.UNTOUCH)
		{
			g_add=g_add1;
		}
		else if(touch==Action.LTOUCH)
		{
			yspe=0;
			//g_add=0;
		}
		else if(touch==Action.RTOUCH)
		{
			yspe=0;
			//g_add=0;
		}
		else if(touch==Action.BUNT)
		{
			yspe=0;
		}
		
		y+=yspe;
	}


	private void xMove() {
		this.setFacedir();
		this.setDir();
		int xadd=this.getXAdd();
		int radd=this.get_rub_Add();
		spe1+=(xadd+radd);

		if(touch==Action.UNTOUCH)
		{
			rub_add=1;
		}
		//��ײ�󵯻�
		else if(touch==Action.LTOUCH)
		{
			//xspe=-xspe/2;
			x+=hero_w/2;
			rub_add=3;
			b_l=false;
			if(b_l==false)
			{
				xspe=0;
			}
		}
		else if(touch==Action.RTOUCH)
		{
			//xspe=-xspe/2;
			x-=hero_w/2;
			rub_add=3;
			b_r=false;
			if(b_r==false)
			{
				xspe=0;
			}
		}
		if(-XSPE<spe1&&spe1<XSPE)
		{
			xspe=spe1;
		}
		else
		{
			spe1=xspe;
		}
		if((x+xspe>LIM_X2||x+xspe<LIM_X1)&&finish==false)//δ���յ���Խ���߽�ʱ
		{
			x=x1;
		}
		else
		{
			x+=xspe;
			x1=x;
		}
	}

	public Rectangle getRectangle()
	{
		return new Rectangle(x,y,hero_w,hero_h);
	}
	public Rectangle getARectangle(int x,int y,int w,int h)
	{
		return new Rectangle(x,y,w,h);
	}
	public Rectangle getNextRectangle()
	{
		return new Rectangle(x+xspe,y+yspe,hero_w,hero_h);
	}
	protected void touchWithObjs() 
	{
		if(live==false) return;
		GameObject obj1=null;
		GameObject obj2=null;
		for(int i=0;i<objs.size();i++)
		{
			GameObject obj=null;
			obj = objs.get(i);
			
			if((x>obj.x&&x<obj.x+obj.all_w&&y>obj.y&&y<obj.y+obj.all_h)
				||(x+hero_w>obj.x&&x+hero_w<obj.x+obj.all_w&&y>obj.y&&y<obj.y+obj.all_h))//��Խ������1
			{
				if(obj.y>=y-hero_h) 
					{
						y=obj.y-hero_h;
						yspe=1;
						System.out.println("Hero��Խ������1�˳�");
						return;
					}
				if(xspe>=0)
				{
					x=obj.x-hero_w;
				}
				else
				{
					x=obj.x+obj.all_w;
				}
				act=Action.UNSTAND;
				System.out.println("Hero��Խ������1");
			}
			if((obj.draw==true&&getNextRectangle().intersects(obj.getRectangle())==true&&(obj!=obj1&&obj!=obj2))||obj.throughCheck(this))
			{
				if(obj.throughCheck(this))//��Խ������2
				{
					if(obj.y>=y) return;
					x-=xspe;
					y-=yspe;
					System.out.println("Hero��Խ������2");
				}
				if(obj1==null)
				{
					obj1=obj;
					//System.out.println("obj1  "+obj.getRectangle());
				}
				else if(obj1!=null)
				{
					obj2=obj;
					//System.out.println("obj2  "+obj.getRectangle());
				}
				if(obj1!=null&&obj2!=null)
				{
					//System.out.println("������Ҫһ���µ�obj��   "+obj.getRectangle()+" obj1 "+obj1.getRectangle()+" obj2 "+obj2.getRectangle());
				}
			}
		}
		if(obj1!=null&&obj2==null)//ֻ��һ��������mario�Ӵ�ʱ
		{
			if(y<=obj1.y)
			{
				y=obj1.y-hero_h;
				act=Action.STAND;
			}
			else
			{
				act=Action.UNSTAND;
			}
			
			if(x>=obj1.x+obj1.all_w&&xspe<0)
			{
				touch=Action.LTOUCH;
			}
			else if(x+hero_w<=obj1.x&&xspe>0)
			{
				touch=Action.RTOUCH;
			}
			else if(y>=obj1.y+obj1.all_h&&yspe<0)
			{
				touch=Action.BUNT;
				y=obj1.y+obj1.all_h;
			}
			else
			{
				touch=Action.UNTOUCH;
			}
/*			if(touch!=Action.UNTOUCH)
			System.out.println("��һ�����弴����ײ "+act+" "+touch+" x "+x+" y "+y);*/
		}
		else if(obj1!=null&&obj2!=null)//������������mario�Ӵ�ʱ
		{
			int ground=0;//�ҳ���Ϊ������������Ϊǽ������
			if(x+hero_w>=obj1.x&&x<=obj1.x+obj1.all_w&&obj1.y>=y)
			{
				ground=1;
			}
			else if(x+hero_w>=obj2.x&&x<=obj2.x+obj2.all_w&&obj2.y>=y)
			{
				ground=2;
			}
			else
			{
				System.out.println("hero����������ײ����������mario��");
				return ;
			}
			//����ǽ����Ĵ���
			GameObject obj = null;
			if(ground==1)
			{
				obj=obj2;
			}
			else if(ground==2)
			{
				obj=obj1;
			}
			if(x+hero_w>=obj.x+obj.all_w&&xspe<=0)
			{
				touch=Action.LTOUCH;
			}
			else if(x<=obj.x&&xspe>=0)
			{
				touch=Action.RTOUCH;
			}
			//if(touch!=Action.UNTOUCH)
			//System.out.println("�����������弴����ײ     "+act+" "+touch+" xspe "+xspe+" yspe "+yspe);
		 
		}
		else if(obj1==null&obj2==null)
		{
			act=Action.UNSTAND;
			touch=Action.UNTOUCH;
			//System.out.println("û�����弴����ײ "+act+" "+touch+" x "+x+" y "+y);
		}

	}
}

八、联系与交流

q:969060742 完整报告、程序资源、代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/486301.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis分布式锁—SETNX+Lua脚本实现

使用redis实现分布式锁&#xff0c;就是利用redis中的setnx&#xff0c;如果key不存在则进行set操作返回1&#xff0c;key已经存在则直接返回0。 优点&#xff1a; 设置expiretime过期时间&#xff0c;可以避免程序宕机长期持有锁不释放。redis作为一个中间服务&#xff0c;所…

下载的音频转换成mp3怎么转?4个好用简单的方法

不同音乐平台下载的音频格式文件不同&#xff0c;比如网易云的ncm格式、酷狗的kgm格式、B站的m4s格式、微信语音的silk格式、手机录音的amr、m4a格式&#xff0c;这些音频一旦脱离了原本的平台便无法播放&#xff0c;那么如何把下载的音频转换成兼容性高的MP3格式以便于我们在更…

linux系统------------Mysql数据库介绍、编译安装

目录 一、数据库基本概念 1.1数据(Data) 1.2表 1.3数据库 1.4数据库管理系统(DBMS) 数据库管理系统DBMS原理 1.5数据库系统&#xff08;DBS) 二、数据库发展史 1、第一代数据库 2、第二代数据库 3、第三代数据库 三、关系型数据库 3.1关系型数据库应用 3.2主流的…

Java生成p12证书

本文章使用的环境 jdk1.8&#xff0c;spring-boot2.6.13 一、pom依赖 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.49</version></dependency><dependency>&…

说一说Java中的四种引用类型?

引言 在JDK1.2之前Java并没有提供软引用、弱引用和虚引用这些高级的引用类型。而是提供了一种基本的引用类型&#xff0c;称为Reference。并且当时Java中的对象只有两种状态&#xff1a;被引用和未被引用。当一个对象被引用时&#xff0c;它将一直存在于内存中&#xff0c;直到…

NSCaching: Simple and Efficient NegativeSampling for Knowledge Graph Embedding

摘要 知识图嵌入是数据挖掘研究中的一个基本问题&#xff0c;在现实世界中有着广泛的应用。它的目的是将图中的实体和关系编码到低维向量空间中&#xff0c;以便后续算法使用。负抽样&#xff0c;即从训练数据中未观察到的负三元组中抽取负三元组&#xff0c;是KG嵌入的重要步…

优思学院|质量工程师的该有哪些技能与素养?

质量工程师作为制造业中的核心角色&#xff0c;致力于确保产品的整体质量。这不仅涉及到测试和监控过程&#xff0c;还包括创建文档、设计质量测试&#xff0c;并且定义测试结果应达到的标准&#xff0c;所以他既懂得生产技术&#xff0c;又精通管理知识。在本篇文章中&#xf…

springboot3使用​自定义注解+Jackson优雅实现接口数据脱敏

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 内容简介 实现思路 实现步骤 1.自定义脱敏注解 2.编写脱敏策略枚举类 3.编写JSON序列化实现 4.编写测…

【Python小工具系列】使用 Python 循环批量打开网页链接

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

工程项目管理系统专业解决方案!企智汇工程项目管理专业解决方案!

1.企智汇工程项目管理系统打造数智化全流程平台&#xff0c;打通全公司数据&#xff0c;实现公司业财一体化全方位管理。 企智汇工程项目管理系统&#xff0c;打通钉钉与企业微信的入口、可与财务系统做数据对接&#xff0c;统一共享数据源的企业一站式数智化项目管理平台&…

openGauss学习笔记-250 openGauss性能调优-使用Plan Hint进行调优-Join方式的Hint

文章目录 openGauss学习笔记-250 openGauss性能调优-使用Plan Hint进行调优-Join方式的Hint250.1 功能描述250.2 语法格式250.3 参数说明250.4 示例 openGauss学习笔记-250 openGauss性能调优-使用Plan Hint进行调优-Join方式的Hint 250.1 功能描述 指明Join使用的方法&#…

Affinity Publisher:你的出版利器,让创意绽放光彩!mac/win版

Affinity Publisher是一款功能强大的桌面出版软件&#xff0c;专为专业出版人员、设计师和印前专家设计。它提供了从构思到印刷的完整工作流程&#xff0c;让用户能够轻松创建高质量的出版物&#xff0c;包括杂志、书籍、小册子、海报等。 Affinity Publisher软件获取 Affinit…

C语言字节对齐关键字__attribute__((aligned(n)))的使用

0 前言 在进行嵌入式开发的过程中&#xff0c;我们经常会见到对齐操作。这些对齐操作有些是为了便于实现指针操作&#xff0c;有些是为了加速对内存的访问。因此&#xff0c;学习如何使用对齐关键字是对于嵌入式开发是很有必要的。 1 对齐规则 1.0 什么叫做对齐 众所周知&a…

Spring Bean 依赖注入(下)

不管是在属性上面还是在方法上面加了Autowired注解都是根据属性的类型和名字去找bean&#xff0c; set方法多个形参也是这么找 拿到所有的属性和方法的注入点后&#xff0c;会去调用Inject()方法 遍历每一个注入点然后进行注入 字段的注入 一开始肯定是没有缓存的&#xff0…

SpringBoot3+JPA+MySQL实现多数据源的读写分离(基于EntityManagerFactory)

1、简介 在Spring Boot中配置多个数据源并实现自动切换EntityManager&#xff0c;这里我编写了一个RoutingEntityManagerFactory和AOP&#xff08;面向切面编程&#xff09;的方式来实现。 这里我配置了两个数据源&#xff1a;primary和secondary&#xff0c;其中primary主数…

Redis - 高并发场景下的Redis最佳实践_翻过6座大山

文章目录 概述6座大山之_缓存雪崩 &#xff08;缓存全部失效&#xff09;缓存雪崩的两种常见场景如何应对缓存雪崩&#xff1f; 6座大山之_缓存穿透&#xff08;查询不存在的 key&#xff09;缓存穿透的原因解决方案1. 数据校验2. 缓存空值3. 频控4. 使用布隆过滤器 6座大山之_…

hash冲突四种解决办法,hash冲突除了拉链法还有什么?

1. 看hashmap 源码&#xff0c;有个问题&#xff0c;key 存放是 先hash 再与hash值的高16位值 进行异或运算。再与槽位size() 求模取余。如果多个不同的key 得出de数组位置相同。则采用链表依次存储。 2. 那么除了拉链法还有什么其他解决hash冲突的方法呢&#xff1f; a. 建立…

【学习】Web安全测试需要考虑哪些情形

一、数据加密 某些数据需要进行信息加密和过滤后才能在客户端和服务器之间进行传输&#xff0c;包括用户登录密码、信用卡信息等。例如&#xff0c;在登录某银行网站时&#xff0c;该网站必须支持SSL协议&#xff0c;通过浏览器访问该网站时&#xff0c;地址栏的http变成https…

堂哥让我给他做个真人动漫头像

背景 堂哥最喜欢的动漫是死神。他给了我一张死神主角一户的头像&#xff0c;以及自己的头像&#xff0c;希望我产出一张真人动漫头像。 一户的头像&#xff1a; 堂哥自拍照&#xff1a; 最近&#xff0c;有大佬部署了个stable diffusion&#xff0c;正好拿来一试身手。 stab…

vue项目报这个错是 Same `value` exist in the tree: 0008E3000E1A?

警告 "Same value exist in the tree: 0008E3000E1A" 表示在树形选择器中存在相同的值。这通常是由于树形选择器的数据中存在重复的值造成的。就是返回的值中&#xff0c;有俩个id相同