Java基础项目---飞机大战的简易实现

news2024/11/17 19:35:23

推荐阅读

智能化校园:深入探讨云端管理系统设计与实现(一)
智能化校园:深入探讨云端管理系统设计与实现(二)


文章目录

  • 推荐阅读
  • 前言
  • 一、系统分析
    • 问题描述
    • 总体设计
    • 功能流程图
  • 二、程序和算法的介绍
    • FlyingObject(本机和所有敌机父类)
    • Airplane(小敌机类)
    • Bee(小蜜蜂敌机类)
    • Bullet(子弹类)
    • Flying(本机类)
    • Enemy(敌机接口)和Award(奖励接口)
    • Game(总体框架实现类,主类)
  • 三、界面设计
    • 游戏界面设计


前言

Java基础知识学完后,大家可能都有过自己动手敲一个小游戏的想法吧,我自己之前也动手敲了一个常见的飞机大战小游戏,最近整理了一下之前的笔记,把我之前敲得代码的思路和逻辑等跟大家分享一下。

一、系统分析

问题描述

本程序是一个利用Java应用软件制作的飞机大战小游戏。在游戏过程中,用户通过鼠标的移动来控制飞机的运行方向,用鼠标点击控制游戏开始,鼠标移出界面表示暂停;鼠标移入继续进行游戏;程序运行窗口的右上角显示用户在游戏过程中所得的分数和飞机的生命值。当飞机生命值为0时游戏结束。本程序界面美观,随机奖励的设定增加了游戏的趣味性。

总体设计

本项目一共用了一个软件包shoot.Day01包,6个类分别为Airplane(小敌机类)Bee(小蜜蜂敌机类)Bullet(子弹类)Flying(本机类)FlyingObject(本机父类,所有敌机父类)Game(总体框架实现类,主类),2个接口 Award(奖励接口)Enemy(敌机接口)。

功能流程图

在这里插入图片描述

二、程序和算法的介绍

FlyingObject(本机和所有敌机父类)

定义了所有飞行物的长宽,坐标,以及共同的移动属性,是否出界标准等

package shoot.Day01;
import java.awt.image.BufferedImage;

public abstract class FlyingObject{
     protected BufferedImage image;
     protected int width;
     protected int height;
     protected int x;
     protected int y;


     //共同的属性,行为
     protected abstract  void step();

     public abstract boolean outOfBounds();

     //判断子弹是否打中敌人,在一定区域范围就算打中。
     public boolean shootBy(Bullet bullet){
          int x1=this.x;
          int x2=this.x+this.width;
          int y1=this.y;
          int y2=this.y+this.height;
          int x= bullet.x;
          int y=bullet.y;

          return x>x1 &&x<x2 &&y>y1 &&y<y2;
     }
}

Airplane(小敌机类)

定义小敌机的属性,长宽,下落距离,随机产生小敌机,得分,判断是否出界等。

package shoot.Day01;
import java.util.Random;
public class Airplane extends FlyingObject implements Enemy{
    private int speed=3;

    //敌机的属性,长宽,下落距离,随机产生
    public Airplane(){
        image=Game.enemy;
        width=image.getWidth();
        height=image.getHeight();
        Random rand=new Random();
        x= rand.nextInt(Game.WIDTH-this.width);
        y=-this.height;

    }

    //得分
    public int getScore(){
        return 5;
    }


    //下落距离
    public void step(){
        y+=speed;
    }

    //判断是否出界
    public boolean outOfBounds(){
        return this.y>=Game.HEIGHT;
    }

}

Bee(小蜜蜂敌机类)

定义了小蜜蜂移动的格数,奖励,获取奖励类型,判断是否出界等。

package shoot.Day01;
import java.util.Random;


public class Bee extends FlyingObject implements Award{
    //设定小蜜蜂移动的格数,奖励
    private int xSpeed=1;
    private int ySpeed=2;
    private int awardType;

    //构造方法,自动调用
    public Bee(){
        image=Game.bee;
        //自动获取图片长宽
        width=image.getWidth();
        height=image.getHeight();
        Random rand=new Random();
        x= rand.nextInt(Game.WIDTH-this.width);
       y=-this.height;

       //奖励随机获取
        awardType= rand.nextInt(2);

    }

    //获取奖励类型
    public int getType(){
        return awardType;
    }

    //重写step方法
    public void step(){
        x+=xSpeed;
        y+=ySpeed;
        //判断小蜜蜂是否到达边界,并决定是否返回
        if (x>=Game.WIDTH-this.width){
            xSpeed=-1;
        }
        if (x<=0){
            xSpeed=1;
        }
    }

    //判断是否出界
    public boolean outOfBounds(){
        return this.y>=Game.HEIGHT;
    }
}

Bullet(子弹类)

定义了子弹基本的下落距离,子弹的移动方法,判断子弹是否出界等。

package shoot.Day01;

import java.util.Random;

public class Bullet extends FlyingObject{
    private int speed=3;

   //子弹构造方法,传参随本机
    public Bullet(int x,int y){
        image=Game.stack;
        width=image.getWidth();
        height=image.getHeight();
        this.x=x;
        this.y=y;
    }
    //子弹移动方法
    public void step(){
     y-=speed;
    }

    //判断子弹是否出界
    public boolean outOfBounds(){
        return this.y<=-this.height;
    }


}

Flying(本机类)

定义了本机的基本属性,生命值,火力值,状态,以及射击的方法,随鼠标移动的方法,生命值火力值增加减少的方法,判断是否撞上飞行物的方法。

package shoot.Day01;
import java.awt.image.BufferedImage;
import java.util.Random;
public class Flying extends FlyingObject {
    //本机属性,生命值,火力,状态
    private int life;
    private int doubleFire;
    private BufferedImage[] images;
    private int index;
    //构造方法
    public Flying() {
        image = Game.benji;
        width = image.getWidth();
        height = image.getHeight();
        x = 150;
        y = 400;
        life = 3;
        doubleFire = 0;
        images = new BufferedImage[]{
                Game.benji, Game.benji1
        };
        index = 0;
    }
    //本机状态的切换
    public void step() {
        //控制两种图片变换时间
        index++;
        int a = index / 50;
        int b = a % 2;
        image = images[b];

    }

    //射击方法
    public Bullet[] shoot() {
        //出炮口位置
        int xStep = this.width / 8;
        int yStep = 30;

        //单倍火力和双倍火力切换条件
        if (doubleFire > 0) {
            Bullet[] bs = new Bullet[2];
            bs[0] = new Bullet(this.x + xStep, this.y - yStep);
            bs[1] = new Bullet(this.x + 3 * xStep, this.y - yStep);
            doubleFire -= 2;
            return bs;

        } else {
            Bullet[] bs = new Bullet[1];
            bs[0] = new Bullet(this.x + 2 * xStep, this.y - yStep);
            return bs;
        }
    }
    public void moveTo(int x, int y) {
        this.x = x - this.width/2;
        this.y = y - this.height/2;
    }
    //随鼠标移动,但也要重写该方法
    public boolean outOfBounds(){
        return false;
    }
    //生命值增加和减少
    public  void addLife(){
        life++;
    }
    public int getLife(){
        return life;
    }
    public void clearLife(){
        life--;
    }
    //火力值增加和减少
    public void addDoubleFire(){
        doubleFire+=40;
    }
    public  void clearDoubleFire(){
        doubleFire=0;
    }
    //判断是否撞上敌人,在一定范围就算撞上
    public boolean hit(FlyingObject object ){
        int x1= object.x-this.width/2;
        int x2=object.x+object.width+this.width/2;
        int y1=object.y-this.height/2;
        int y2=object.y+object.height+this.height/2;
        int x=this.x+this.width/2;
        int y=this.y+this.height/2;

        return x>x1&&x<x2&&y>y1&&y<y2;
    }
}

Enemy(敌机接口)和Award(奖励接口)

Enemy(敌机接口)

package shoot.Day01;
public interface Enemy {
    public int getScore();
}

Award(奖励接口)

package shoot.Day01;

public interface Award {
    public int Double_File=0;
    public int LIFE=1;
    public int getType();
}

这两个接口没有设置太多的功能,大家可以根据自行需要去扩展。

Game(总体框架实现类,主类)

继承JPanel类,添加了图片,对各类进行初始化,并加入了计时器等操作。

package shoot.Day01;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Arrays;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Color;
import java.awt.Font;

/**
 * Game(总体框架实现类)主类
 * 继承JPanel类,添加了图片,对各类进行初始化,并加入了计时器等操作。
 * @author ioik
 */
//主程序
public class Game extends JPanel {
    //设定界面长,宽
    public static final int WIDTH=400;
    public static final int HEIGHT=654;

    public static BufferedImage background;
    public static BufferedImage start;
    public static BufferedImage jixu;
    public static BufferedImage benji;
    public static BufferedImage benji1;
    public static BufferedImage end;
    public static BufferedImage bee;
    public static BufferedImage stack;
    public static BufferedImage enemy;


    //设定三种状态
    public static final int START=0;
    public static final int RUNNING=1;
    public static final int PAUSE=2;
    public static final int GAME_OVER=3;
    private int state=START;

    //创建本机对象,敌人数组,子弹数组
    private Flying myfly=new Flying();
    private FlyingObject[] flyings={};
    private Bullet[] bullets={};




   //文件流错误必须要异常处理
    static {
        try{
            //插入图片
            background=ImageIO.read(Game.class.getResource("black.png"));
            start=ImageIO.read(Game.class.getResource("start.png"));
            jixu=ImageIO.read(Game.class.getResource("jixuyouxi.png"));
            end=ImageIO.read(Game.class.getResource("gameover.png"));
            benji=ImageIO.read(Game.class.getResource("benji.png"));
            benji1=ImageIO.read(Game.class.getResource("benji1.png"));
            enemy=ImageIO.read(Game.class.getResource("enemy.png"));
            bee=ImageIO.read(Game.class.getResource("bee.png"));
            stack=ImageIO.read(Game.class.getResource("stack.png"));

        }catch(Exception e){
            //抛出异常
            e.printStackTrace();
        }
    }

    //随机数方法 随机产生敌人和小蜜蜂奖励
    public FlyingObject nextOne(){
        Random rand=new Random();
        int type= rand.nextInt(20);
        if (type<5){
            return new Bee();
        }else{
            return new Airplane();
         }

    }

    //进入函数(自动的)
    int flyEnteredTIndex=0;
    public void enterAction(){
        flyEnteredTIndex++;
        //400ms,调用敌人产生函数每0.4秒产生一次敌人
        if (flyEnteredTIndex%40==0){
            FlyingObject one=nextOne();
            //敌人数组扩容,接收新产生敌人,并赋值于最后一个位置
            flyings=Arrays.copyOf(flyings,flyings.length+1);
            flyings[flyings.length-1]=one;
        }

    }
    //敌人,子弹动起来
    public void stepAction(){
        //调用本机动起来函数
        myfly.step();
        //调用所有子弹,敌人动起来
        for (int i=0;i<flyings.length;i++){
            flyings[i].step();
        }
        for (int i=0;i<bullets.length;i++){
            bullets[i].step();
        }
    }

    //射击方法
    int shootIndex=0;
    public void shootAction(){
        shootIndex++;
        //控制射击频率
        if (shootIndex%30==0){
            //存储子弹
          Bullet[] bs=myfly.shoot();
          bullets=Arrays.copyOf(bullets,bullets.length+bs.length);
          //新产生的子弹放入数组
          System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length);
        }
    }

    //确定是否越界
    public void outOfBoundsAction(){
        int index=0;
        //判断敌人对象是否越界
        FlyingObject[] flyingLives=new FlyingObject[flyings.length];
        for (int i=0;i<flyings.length;i++){
            FlyingObject f=flyings[i];
            //保留未出界对象,出界对象数组缩容除去
            if (!f.outOfBounds()){
                flyingLives[index]=f;
                index++;
            }
        }
        flyings=Arrays.copyOf(flyingLives,index);

        int j=0;
        //判断子弹是否出界
        Bullet[] ba=new Bullet[bullets.length];
        for (int i=0;i<bullets.length;i++){
            Bullet b=bullets[i];
            if (!b.outOfBounds()){
                ba[j]=b;
                j++;
            }
        }
        bullets=Arrays.copyOf(ba,j);
    }

    //子弹撞击
    public void bangAction(){
        for (int i=0;i<bullets.length;i++){
            Bullet b=bullets[i];
            bang(b);
        }
    }

    //子弹撞击方法
    int score=0;
    public void bang(Bullet b){
        int index=-1;
        for (int i=0;i<flyings.length;i++){
            FlyingObject f=flyings[i];
            //成功撞击的子弹
            if (f.shootBy(b)){
                index=i;
                break;
            }
        }

        //成功撞击的子弹确定撞击对象
        if (index!=-1){
            FlyingObject a=flyings[index];
            if (a instanceof Enemy ){
                //向上转型,如果是普通敌人对象就得分
                Enemy e=(Enemy) a;
                score+=e.getScore();
            }
            if (a instanceof Award){
                //如果是小蜜蜂对象,就判断得哪一种奖励,本机加火力值或者加生命值
                Award c=(Award) a;
                int type=c.getType();
                switch (type){
                        case Award.Double_File:
                              myfly.addDoubleFire();
                              break;
                        case Award.LIFE:
                             myfly.addLife();
                              break;
                }
            }

            //成功撞击的敌人需要除去,故进行数组缩容,除去被撞敌人
            FlyingObject t=flyings[index];
            flyings[index]=flyings[flyings.length-1];
            flyings[flyings.length-1]=t;
            flyings=Arrays.copyOf(flyings,flyings.length-1);

        }
    }

    //检查游戏是否结束
   public  void   checkGameOverAction(){
        if (isGameOver()){
           state=GAME_OVER;
        }
   }

   //判断游戏结束的条件
   public boolean isGameOver(){
        for (int i=0;i<flyings.length;i++){
            FlyingObject f=flyings[i];
            if (myfly.hit(f)){
                myfly.clearLife();
                myfly.clearDoubleFire();

                //撞击后的敌机消失,数组缩容
                FlyingObject t=flyings[i];
                flyings[i]=flyings[flyings.length-1];
                flyings[flyings.length-1]=t;
                flyings=Arrays.copyOf(flyings,flyings.length-1);
            }
        }
     return myfly.getLife() <=0;

    }



    //减少main函数的负担
    public void action(){

        //鼠标点击,运行状态下本机随着鼠标移动
        MouseAdapter  l=new MouseAdapter() {
            public void mouseMoved(MouseEvent e){
                if (state==RUNNING) {
                    int x = e.getX();
                    int y = e.getY();
                    myfly.moveTo(x, y);
                }
            }



            public void mouseClicked(MouseEvent e){
                switch (state){
                    //鼠标点击,开始游戏
                    case START:
                        state=RUNNING;
                        break;
                        //游戏结束后,敌人子弹消失,得分为0;再次点击,游戏重新开始
                    case GAME_OVER:
                        score=0;
                        myfly=new Flying();
                        flyings=new FlyingObject[0];
                        bullets=new Bullet[0];
                        state=START;
                        break;
                }
            }

            //移出鼠标,游戏暂停
            public void mouseExited(MouseEvent e){
                if (state==RUNNING){
                    state=PAUSE;
                }
            }
            //移入鼠标,游戏暂停
            public void mouseEntered(MouseEvent e){
                if (state==PAUSE){
                    state=RUNNING;
                }
            }
        };
        this.addMouseListener(l);
        this.addMouseMotionListener(l);


        //添加计时器,并设定时间间隔为10毫秒
        Timer timer=new Timer();
        int intervel=10;
        timer.schedule(new TimerTask() {
            public void run() {
                if (state == RUNNING) {
                    enterAction();
                    stepAction();
                    shootAction();
                    outOfBoundsAction();
                    bangAction();
                    checkGameOverAction();
                }
                repaint();
            }
        }, intervel, intervel);
    }


    //画板,画背景,画敌机,画本机,画状态
    public void paint(Graphics g){
        g.drawImage(background,0,0,null);
        paintmyfly(g);
        paintBullets(g);
        paintFlyingObjects(g);
        paintSA(g);
        paintState(g);
    }

    //画本机
    public void paintmyfly(Graphics g){
       g.drawImage(myfly.image,myfly.x,myfly.y,null);
    }

    //画敌机,小蜜蜂,随机产生
    public void paintFlyingObjects(Graphics g){
      for (int i=0;i<flyings.length;i++){
          FlyingObject f=flyings[i];
          g.drawImage(f.image,f.x,f.y,null);
      }
    }

    //画子弹
    public void paintBullets(Graphics g){
        for (int i=0;i<bullets.length;i++){
            Bullet b=bullets[i];
            g.drawImage(b.image,b.x,b.y,null);
        }
    }


    public void paintSA(Graphics g){
           g.setColor(new Color(0xFF0000));
           g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,24));
           g.drawString("SCORE:"+score,10,25);
           g.drawString("LIFE:"+myfly.getLife(),10,45);
    }
    public void paintState(Graphics g){
        switch (state){
            case START:
                g.drawImage(start,100,250,null);
                break;
            case PAUSE:
                g.drawImage(jixu,80,250,null);
                break;
            case GAME_OVER:
                g.drawImage(end,100,250,null);
                break;
        }
    }


    public static void main(String[] args){
        JFrame frame=new JFrame("Shooting");
        Game game=new Game();
        frame.add(game);
        frame.setSize(WIDTH,HEIGHT);
        frame.setAlwaysOnTop(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        game.action();

    }

}


三、界面设计

游戏界面设计

界面美观是用户游戏时,眼球的愉悦感和游戏的吸引力之一。
游戏界面:背景,本机,小敌机,小蜜蜂敌机

background=ImageIO.read(Game.class.getResource("black.png"));

将图片路径装在Game类中,,在游戏面板上,以此面板作为观察者用Graphics进行重画。
1.游戏面板进行时界面:
在这里插入图片描述
2.游戏进行界面
在这里插入图片描述
3. 游戏结束界面
在重画面板时进行判断若本机生命值为0,即弹出“Game Over”界面。
在这里插入图片描述
4. 分数显示栏,用标签和文本域实现,生命值初始为3。
在这里插入图片描述
到这一步,这个小游戏就基本上完成了,大家可以根据自己的需求去增加不同的功能哈。如果有啥问题,欢迎大家指出,谢谢大家。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DDNS-GO配置使用教程

环境&#xff1a;openwrt 下载地址&#xff1a;Releases jeessy2/ddns-go GitHub 下载 ssh至openwrt根目录&#xff0c;根据你的处理器选择要下载的版本&#xff0c;我是路由器&#xff0c;选择的是 ddns-go_5.7.1_linux_arm64.tar.gz wget github链接 安装 tar -zxvf…

Java面试题之JVM

Java面试题之JVM 1. JVM的组成部分及其作用&#xff1f;2. JVM的堆和栈的区别&#xff1f;3. 简述一下垃圾回收机制&#xff1f;(垃圾回收的原理&#xff1f;)4. 垃圾回收器都有什么&#xff1f;该怎么选择&#xff1f;5. 如何判断垃圾可以回收了&#xff1f;6. 垃圾回收算法有…

Redis原理篇(Dict的收缩扩容机制和渐进式rehash)

Dict&#xff08;即字典&#xff09; Redis是一种键值型数据库&#xff0c;其中键与值的映射关系就是Dict实现的。 Dict通过三部分组成&#xff1a;哈希表&#xff08;DictHashTable&#xff09;&#xff0c;哈希节点(DictEntry)&#xff0c;字典&#xff08;Dict&#xff09…

pgzrun 生命游戏制作过程详解

背景资料 康威生命游戏(Game of Life)是剑桥大学约翰何顿康威设计的计算机程序。 美国趣味数学大师马丁加德纳(Martin Gardner&#xff0c;1914-2010&#xff09;通过《科学美国人》杂志&#xff0c;将康威的生命游戏介绍给学术界之外的广大渎者&#xff0c;一…

互联网大厂职场各职级P6/P7和核心能力

目录 具体能力要求总结 具体能力要求 专业工匠 p5 被别人带领p6 独立完成项目全流程&#xff0c;指导 2-3 人 乐队指挥 p7 带行政团队 7-10 &#xff0c;项目团队&#xff0c;专项团队&#xff0c;复杂系统设计 1-3 个一般系统构成p8 领域专家 垂直 3 个团队 &#xff0c;横…

蓝桥杯基础知识3 memset()

蓝桥杯基础知识3 memset() #include <bits/stdc.h> using namespace std;int main(){int a[5]; //随机数for(int i 0;i < 5; i)cout << a[i] << \n;cout << \n;memset(a, 0, sizeof a); //0for(int i 0;i < 5; i)cout << a[i] << …

Proteus仿真stm32f103r6输出PWM/正弦波

资料下载地址&#xff1a;Proteus仿真stm32f103r6输出PWM/正弦波 一、仿真图 Proteus仿真stm32f103r6输出PWM/正弦波 二、程序 #include "pbdata.h"u16 fre; void RCC_Configuration(void); void GPIO_Configuration(void); void TIM3_Configuration();void Dela…

Kotlin程序设计(三)高级用法

Kotlin程序设计高级篇 在学习了前面的内容之后&#xff0c;相信各位小伙伴应该对Kotlin这门语言有了一些全新的认识&#xff0c;我们已经了解了大部分的基本内容&#xff0c;从本章开始&#xff0c;就是对我们之前所学的基本内容的进一步提升。 泛型 在前面我们学习了最重要…

【信息论与编码】【北京航空航天大学】实验二、哈夫曼编码【C语言实现】(下)图像编码压缩

实验2 哈夫曼编码&#xff08;下&#xff09;&#xff08;图像编码&#xff09; 实验简介&#xff1a; 本次实验为实验1&#xff1a;哈夫曼编码的后续补充&#xff0c;实验1见博客&#xff1a;实验一、哈夫曼编码【C语言实现】&#xff08;上&#xff09; 说明&#xff1a; 实…

Redis系列-15.Redis的IO多路复用原理解析

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

【REST2SQL】05 GO 操作 达梦 数据库

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 信创要求用国产数据库&#xff0c;刚好有项目用的达梦&#xff0c;研究一下go如何操作达梦数据库 1 准备工作 1.1 安…

查询速度提升15倍!银联商务基于 Apache Doris 的数据平台升级实践

本文导读&#xff1a; 在长期服务广大规模商户的过程中&#xff0c;银联商务已沉淀了庞大、真实、优质的数据资产数据&#xff0c;这些数据不仅是银联商务开启新增长曲线的基础&#xff0c;更是进一步服务好商户的关键支撑。为更好提供数据服务&#xff0c;银联商务实现了从 H…

关于高通Android 平台上qssi的介绍

1. QSSI 是 Qualcomm Single System Image 的缩写。 2. Android Q上开始支持QSSI。 3. QSSI 是用来编译system.img的 3.1 QSSI编译注意事项 lunch qssi ------ 编译system.img lunch target ------ 编译其余的image 3.2 有QSSI和没有QSSI的编译流程对比 没有QS…

3Dmax不能渲染怎么办?

使用3Dmax渲染异常的话&#xff0c;主要在于以下几点&#xff1a; 1.素材丢失导致渲染效果错误 max文件贴图丢失或对应路径不存在 2.相机位置 先要考虑是相机位置&#xff0c;不管用的普通相机还是物理相机。 看它的位置是不是放在了模型的里面或者是墙体的外面&#xff0c;…

如何构建Prompt,帮我生成QA,作为召回率检索的测试集?

最近在做搜索召回率的提升工作。粮草未动兵马先行&#xff01;在做之前应该先有一把尺子来衡量召回率的好坏。所以应该先构建测试数据集&#xff0c;然后去做标准化测试。 有了测试机集以后。再去做搜索优化&#xff0c;才能看出来效果。 当然可以选择一些开源的测试集。如果可…

“三指针法“合并两个有序数组(力扣每日一练)

我的第一想法确实是&#xff1a;先合并数组&#xff0c;再排序&#xff0c;搞完。 哈哈哈&#xff0c;想那么多干嘛&#xff0c;目的达成了就好了。 力扣官方题解是双指针&#xff1a; 还有糕手&#xff1a; Python&#xff1a; def merge(nums1, m, nums2, n):# 两个指针分别…

合并 K 个升序链表[困难]

一、题目 给你一个链表数组&#xff0c;每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数组如…

经管类CSSCI、北核期刊投稿指南数据(2023年更新)/经管类的期刊投稿指南

经管类CSSCI、北核期刊投稿指南&#xff08;2023年更新&#xff09; 1、内容包括&#xff1a;投稿指南-CSSCI版本、CSSCI扩展版本、北大核刊版本、建议期刊版本、所有期刊。 2、范围&#xff1a;CSSCI、CSSCI扩展、北大核刊 3、说明&#xff1a;包含经管类期刊的发表难度&am…

Spark六:Spark 底层执行原理SparkContext、DAG、TaskScheduler

Spark底层执行原理 学习Spark运行流程 学习链接&#xff1a;https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ 一、Spark运行流程 流程&#xff1a; SparkContext向管理器注册并向资源管理器申请运行Executor资源管理器分配Executor&#xff0c;然后资源管理器启动Execut…

Day4Qt

1.头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime>//时间类 #include <QTimer>//时间事件类 #include <QTimerEvent>//定时器类 #include <QTextToSpeech> namespace Ui { class Widget; }class Widget : publi…