Java GUI制作双人对打游戏(上)

文章目录

  • 前言
  • 什么是Java GUI
  • 一、打开IDEA 新建一个Maven项目(后续可以打包、引入相关依赖也很容易)
  • 二、引入依赖
  • 三.绘制UI界面
  • 四.绘制JPanel面板
  • 总结


前言

什么是Java GUI

Java UI,即Java用户界面,是指使用Java编程语言创建的图形用户界面(GUI)。Java提供了多种工具和技术来创建和管理用户界面,使得开发者能够构建具有丰富交互性和吸引力的应用程序。

在Java中,用于构建UI的主要库和框架包括:

Swing:Swing是Java平台标准版(Java SE)的一部分,它提供了一组丰富的GUI组件和布局管理器,用于构建跨平台的桌面应用程序。Swing组件包括按钮、文本框、标签、滑块等,以及更复杂的组件如表格和树形结构。
JavaFX:JavaFX是一个用于构建富客户端应用程序的图形和媒体库。它提供了现代化的UI组件、动画、Web集成和媒体支持。与Swing相比,JavaFX更加现代和灵活,适用于构建复杂的用户界面和多媒体应用程序。
AWT:AWT(Abstract Window Toolkit)是Java中最早的GUI工具包,提供了基本的窗口、按钮和文本框等组件。然而,随着Swing和JavaFX的出现,AWT的使用逐渐减少,但仍在一些旧的或特定的应用程序中使用。
在构建Java UI时,开发者通常会遵循以下步骤:

设计界面:首先,开发者需要设计应用程序的用户界面,确定所需的组件、布局和交互方式。
选择库和框架:根据应用程序的需求和目标平台,选择适合的Java UI库和框架。
创建组件:使用所选库和框架提供的API创建所需的UI组件,并设置它们的属性(如大小、颜色、字体等)。
布局管理:使用布局管理器来组织和管理组件在界面上的位置和大小。Java提供了多种布局管理器,如边界布局、网格布局和流式布局等。
事件处理:为组件添加事件监听器,以便在用户与界面交互时执行相应的操作(如点击按钮、选择菜单项等)。
测试和调试:在开发过程中不断测试和调试UI,确保其正常运行并符合设计要求。
通过Java UI技术,开发者可以创建出功能强大、外观美观的应用程序,提供丰富的用户体验。这些应用程序可以运行在桌面、移动设备或其他Java支持的平台上。

在这里插入图片描述

上图是制作成功的效果图 通过A、D来控制蓝色人物前进防御和后退,J、K、L来控制拳、防御、踢腿
红色人物对应的是左箭头、右箭头以及1、2、3.


制作这个小游戏 作者打算用2篇博文来分享整个过程 本文作为一个引入

一、打开IDEA 新建一个Maven项目(后续可以打包、引入相关依赖也很容易)

建完之后的整体结构如下:
在这里插入图片描述

二、引入依赖

因为需要播放MP3格式的背景音乐于是要引入相关依赖:
在pom.xml中添加下面的代码

    <dependencies><dependency><groupId>javazoom</groupId><artifactId>jlayer</artifactId><version>1.0.1</version></dependency></dependencies>

三.绘制UI界面

代码如下:

package src;
import javazoom.jl.player.Player;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
public class UI extends JFrame implements KeyListener {WarPanel warPanel=new WarPanel();Player player;public UI(){this.setTitle("赤色妖精花2.0");this.setLocation(0,0);this.setSize(1024,680);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);this.add(warPanel);this.addKeyListener(this);warPanel.action();}public static void main(String[] args) {UI ui=new UI();ui.init();}public void init(){while(true){try{InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("music/bgm12.mp3");playmusic(resourceAsStream);Thread.sleep(82800);}catch (Exception e){e.printStackTrace();}}}public void playmusic(InputStream inputStream) throws Exception{
//        BufferedInputStream bufferedInputStream=new BufferedInputStream(inputStream);player=new Player(inputStream);player.play();}public void playmusic(String music) throws Exception{BufferedInputStream bufferedInputStream=new BufferedInputStream(new FileInputStream(music));player=new Player(bufferedInputStream);player.play();}public void sound(String str){try {FileInputStream in = new FileInputStream(str);AudioStream as=newAudioStream(in);AudioPlayer.player.start(as);}catch(Exception e){e.printStackTrace();}
}public void sound(InputStream inputStream){try {AudioStream as=newAudioStream(inputStream);AudioPlayer.player.start(as);}catch(Exception e){e.printStackTrace();}}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {
//        System.out.println(e.getKeyCode());warPanel.restart(e.getKeyCode());warPanel.manmove(e.getKeyCode());warPanel.mastermove(e.getKeyCode());}@Overridepublic void keyReleased(KeyEvent e) {warPanel.mastercancel(e.getKeyCode());warPanel.mancancel(e.getKeyCode());}
}

四.绘制JPanel面板

JPanel是Java Swing库中的一个关键组件,它提供了许多优点,使得开发者能够更高效地创建复杂的图形用户界面(GUI)。以下是JPanel的一些主要优点:
轻量级容器:JPanel是一个轻量级的容器,这意味着它使用了本地窗口系统的较少资源,因此更加高效。轻量级组件的绘制通常比重量级组件更快,并且更易于管理。
灵活的布局管理:JPanel允许使用各种布局管理器来控制其内部组件的布局。例如,你可以使用FlowLayout、BorderLayout、GridLayout等,这使得开发者能够轻松地排列和调整组件的位置和大小,以满足不同的界面设计需求。
嵌套和组合:JPanel可以嵌套在其他Swing容器中,如JFrame、JDialog等,这使得开发者能够创建复杂的界面结构。通过组合多个JPanel,你可以实现更精细的界面布局和组件组织。
事件处理:JPanel支持事件监听器,使得开发者能够响应用户与界面的交互,如按钮点击、鼠标移动等。这使得应用程序能够更加响应用户的操作,提供更好的用户体验。
自定义绘制:JPanel提供了绘制自定义图形、图像或文本的功能。你可以通过重写paintComponent方法来实现自定义绘制逻辑,从而创建独特的视觉效果。
易于扩展和集成:由于JPanel是Swing库的一部分,它与其他Swing组件具有良好的集成性。此外,由于其开源性质,开发者可以根据需要扩展JPanel的功能,以满足特定的应用需求。
综上所述,JPanel作为Java Swing库中的一个核心组件,具有轻量级、灵活布局、嵌套组合、事件处理、自定义绘制以及易于扩展和集成等优点,使得开发者能够高效地创建复杂的图形用户界面。

package src;import javazoom.jl.player.Player;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Timer;
import java.util.TimerTask;public class WarPanel extends JPanel {private static String LEFT="left";private static String RIGHT="right";private static String STATIC="static";String path=null;int x;int y;int bloodMan=430;int bloodMaster=413;int time=600;InputStream AsStream=this.getClass().getClassLoader().getResourceAsStream("music/victorymaster.mp3");InputStream AsStream1=this.getClass().getClassLoader().getResourceAsStream("music/victoryman.mp3");SuperMan superMan=new SuperMan();Matser matser=new Matser();public BufferedImage StreamToImage(String str){InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(str);BufferedImage bufferedImage=null;try {bufferedImage= ImageIO.read(resourceAsStream);} catch (Exception e) {e.printStackTrace();}return bufferedImage;}@Overridepublic void paint(Graphics g) {super.paint(g);InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("image/background1.jpg");BufferedImage read=null;try {read= ImageIO.read(resourceAsStream);} catch (Exception e) {e.printStackTrace();}Image image = new ImageIcon(read).getImage();g.drawImage(image, 0, 0, 1024, 680, null);if(time>0) {if(bloodMan>0&&bloodMaster>0){BufferedImage image11 = StreamToImage("image/bloodliang.png");Image image1 = new ImageIcon(image11).getImage();g.drawImage(image1, 10, 20, null);g.drawImage(image1, 510, 20, null);drawSuperMan(g);drawMaster(g);drawblood(g);g.setColor(Color.BLUE);Font font1 = new Font("黑体", Font.BOLD, 20);g.setFont(font1);g.fillRect(44, 38, bloodMan, 20);g.setColor(Color.RED);Font font = new Font("黑体", Font.BOLD, 20);g.setFont(font);g.fillRect(550, 38, bloodMaster, 20);g.setColor(Color.CYAN);Font font2 = new Font("黑体", Font.BOLD, 20);g.setFont(font2);g.drawString("" + time / 10, 502, 100);}else if(bloodMan<=0&&bloodMaster>0){g.setColor(Color.WHITE);Font font3 = new Font("黑体", Font.BOLD, 80);g.setFont(font3);g.drawString(" The red side ",200,300);g.drawString("won  the  game.",200,400);try {if(AsStream == null){}else {playmusic(AsStream);AsStream=null;}} catch (Exception e) {e.printStackTrace();}}else if(bloodMaster<=0&&bloodMan>0){g.setColor(Color.WHITE);Font font3 = new Font("黑体", Font.BOLD, 80);g.setFont(font3);g.drawString(" The blue side ",200,300);g.drawString("won   the   game.",200,400);try {if(AsStream1 == null){}else {playmusic(AsStream1);AsStream1=null;}} catch (Exception e) {e.printStackTrace();}}}else{if(bloodMaster>bloodMan){g.setColor(Color.WHITE);Font font3 = new Font("黑体", Font.BOLD, 80);g.setFont(font3);g.drawString(" The red side ",200,300);g.drawString("won  the  game.",200,400);try {if(AsStream == null){}else {playmusic(AsStream);AsStream=null;}} catch (Exception e) {e.printStackTrace();}}else{g.setColor(Color.WHITE);Font font3 = new Font("黑体", Font.BOLD, 80);g.setFont(font3);g.drawString(" The blue    side ",200,300);g.drawString("won  the  game.",200,400);try {if(AsStream1 == null){}else {playmusic(AsStream1);AsStream1=null;}} catch (Exception e) {e.printStackTrace();}}}time--;}public void drawblood(Graphics g){if (path ==null) {}else{BufferedImage image11 = StreamToImage(path);Image image = new ImageIcon(image11).getImage();g.drawImage(image, x, y, null);}}private void drawMaster(Graphics g) {matser.drawMe(g);}private void drawSuperMan(Graphics g){superMan.drawMe(g);}public void playmusic(InputStream inputStream) throws Exception{
//        BufferedInputStream bufferedInputStream=new BufferedInputStream(inputStream);Player player=new Player(inputStream);player.play();}public void manmove(int keyCode) {switch (keyCode){case KeyEvent.VK_A:superMan.setPose("left");break;case KeyEvent.VK_D:superMan.setPose("right");break;case KeyEvent.VK_J:if(superMan.getPose().equals("foot")){}else{superMan.setPose("hand");InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("music/handhit.wav");sound(resourceAsStream);}case KeyEvent.VK_K:if(superMan.getPose().equals("foot")||superMan.getPose().equals("hand")){}else{superMan.setPose("defense");}break;case KeyEvent.VK_L:if(superMan.getPose().equals("hand")){}else{superMan.setPose("foot");InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("music/footman.wav");sound(resourceAsStream);}break;}}public void mastermove(int keyCode) {switch (keyCode){case KeyEvent.VK_RIGHT:matser.setPose("right");break;case KeyEvent.VK_LEFT:matser.setPose("left");break;case KeyEvent.VK_NUMPAD1:if(matser.getPose().equals("hand")){}else{matser.setPose("foot");InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("music/footmaster.wav");sound(resourceAsStream);}break;case KeyEvent.VK_NUMPAD3:if(matser.getPose().equals("foot")){}else{matser.setPose("hand");InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("music/hithand.wav");sound(resourceAsStream);}break;case KeyEvent.VK_NUMPAD2:if(matser.getPose().equals("foot")||matser.getPose().equals("hand")){}else{matser.setPose("defense");}break;}}public void mastercancel(int keyCode) {switch(keyCode){case KeyEvent.VK_NUMPAD2:if(matser.getPose().equals("foot")||matser.getPose().equals("hand")){}else{matser.setPose(STATIC);}break;}}public void action(){Timer timer=new Timer();timer.schedule(new TimerTask() {public void run() {hit();repaint();}},20,100);//delay延迟20毫秒后,period每隔10毫秒执行一次run里面的内容}public void mancancel(int keyCode) {switch(keyCode){case KeyEvent.VK_K:if(superMan.getPose().equals("foot")||superMan.getPose().equals("hand")){}else{superMan.setPose(STATIC);}break;}}//碰撞检测int j=0;public void hit(){boolean toright1=superMan.toright;boolean toright2=matser.toright;Image image1;String imagePath1 = superMan.getImagePath();if(imagePath1==null){BufferedImage image11 = StreamToImage("master/toright1.png");image1= new ImageIcon(image11).getImage();}else{BufferedImage image11 = StreamToImage(imagePath1);image1 = new ImageIcon(image11).getImage();}int width1 = image1.getWidth(null);int height1 = image1.getHeight(null);int x1=superMan.getManx();int y1=superMan.getMany();String pose1 = superMan.getPose();//        System.out.println(width1);
//        System.out.println(height1);
//        System.out.println(x1);
//        System.out.println(y1);String imagePath2 = matser.getImagePath();BufferedImage image12 = StreamToImage(imagePath2);Image image2 = new ImageIcon(image12).getImage();int width2 = image2.getWidth(null);int height2 = image2.getHeight(null);int x2=matser.getManx();int y2=matser.getMany();String pose2 = matser.getPose();
//        man的拳 master的静态if(pose1.equals("hand")&&pose2.equals("static")){if(toright1){if(x1+width1>x2&&x1+width1<x2+width2&&y1+height1/3>y2&&y1+height1/3<y2+height2){j++;x=x1+width1;y=y1+height1/5;path="image/blood1.png";InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("music/afterhit1.wav");sound(resourceAsStream);bloodMaster-=10;x2+=5;matser.setManx(x2);if(j>5){j=0;}}else{path=null;}}else{if(x1>x2&&x1<x2+width2&&y1+height1/3>y2&&y1+height1/3<y2+height2){j++;x=x1;y=y1+height1/5;path= "image/blood1.png";InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("music/afterhit1.wav");sound(resourceAsStream);x2-=5;matser.setManx(x2);bloodMaster-=10;if(j>5){j=0;}}else{path=null;}}}
//        man的脚 master的静态else if(pose1.equals("foot")&&pose2.equals("static")){if(toright1){if(x1+width1>x2&&x1+width1<x2+width2&&y1+height1/3>y2&&y1+height1/3<y2+height2) {x = x1 + width1;y = y1 + height1 *3/ 5;path = "image/blood1.png";InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("music/afterhit1.wav");sound(resourceAsStream);x2+=5;matser.setManx(x2);bloodMaster -= 8;}else{path=null;}}else{if(x1>x2&&x1<x2+width2&&y1+height1/3>y2&&y1+height1/3<y2+height2) {x = x1;y = y1 + height1 *3/ 5;path = "image/blood1.png";InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("music/afterhit1.wav");sound(resourceAsStream);x2-=5;matser.setManx(x2);bloodMaster -= 8;}else{path=null;}}}
//          master的拳 man的静态else if(pose2.equals("hand")&&pose1.equals("static")){if(toright2){if(x2+width2>x1&&x2+width2<x1+width1&&y1+height1/3>y2&&y1+height1/3<y2+height2){x = x2+width2;y = y2 + height1 / 5;path = "image/blood1.png";InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("music/afterhit.wav");sound(resourceAsStream);bloodMan -= 10;x1+=3;superMan.setManx(x1);}else{path=null;}}else {if(x2>x1&&x2<x1+width1&&y1+height1/3>y2&&y1+height1/3<y2+height2){x = x2;y = y2 + height1 / 5;path = "image/blood1.png";InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("music/afterhit2.wav");sound(resourceAsStream);bloodMan -= 10;x1-=3;superMan.setManx(x1);}else{path=null;}}}else if(pose1.equals("static")&&pose2.equals("foot")){if(toright2){if(x2+width2>x1&&x2+width2<x1+width1&&y1+height1/3>y2&&y1+height1/3<y2+height2){j++;x=x2+width2;y=y2+height1*3/5;path="image/blood1.png";InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("music/afterhit.wav");sound(resourceAsStream);bloodMan-=10;x1+=5;superMan.setManx(x1);if(j>5){j=0;}}else{path=null;}}else{if(x2>x1&&x2<x1+width1&&y1+height1/3>y2&&y1+height1/3<y2+height2){j++;x=x2;y=y2+height1*3/5;path="image/blood1.png";InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("music/afterhit.wav");sound(resourceAsStream);bloodMan-=10;x1-=5;superMan.setManx(x1);if(j>5){j=0;}}else{path=null;}}}else{path=null;}}public void sound(InputStream inputStream){try {AudioStream as=newAudioStream(inputStream);AudioPlayer.player.start(as);}catch(Exception e){e.printStackTrace();}}public void sound(String str){try {FileInputStream in = new FileInputStream(str);AudioStream as=newAudioStream(in);AudioPlayer.player.start(as);}catch(Exception e){e.printStackTrace();}}public void restart(int keyCode) {if(time<=0||bloodMan<=0||bloodMaster<=0)switch(keyCode){case KeyEvent.VK_SHIFT:time=600;bloodMan=430;bloodMaster=413;}}
}

总结

以上是这款对打游戏的初始构建,后续的博文将完成剩下的部分

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

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

相关文章

springBoot+vue编程中使用mybatis-plus遇到的问题

mybatis-plus中遇到的问题Code Companion Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)…

02 SQL基础 -- 初识SQL

一、初识 SQL 1.1 概念介绍 数据库中存储的表结构类似于 excel 中的行和列,在数据库中,行称为记录,它相当于一条结论,列称为字段,它代表了表中存储的数据项目 行和列交汇的地方称为单元格,一个单元格只能输入一条记录 SQL是为操作数据库而开发的语言。国际标准化组织(…

Rust语言入门第二篇-Cargo教程

文章目录 Rust语言入门第二篇-Cargo教程一&#xff0c;Cargo 是什么二&#xff0c;Cargo教程Cargo.toml文件src/main.rs 文件构建并运行Cargo项目 Rust语言入门第二篇-Cargo教程 本节提供对cargo命令行工具的快速了解。我们演示了它为我们生成新包的能力&#xff0c;它在包内编…

windows如何卸载干净 IDEA

Windows 系统要想彻底卸载 IDEA, 步骤如下&#xff1a; 1、卸载 IDEA 程序 点击屏幕左下角 Windows 图标 -> 设置&#xff1a; 在应用中找到 IDEA, 单击它会出现卸载按钮&#xff0c;点击开始卸载&#xff1a; 勾选第一栏 Delete IntelliJ IDEA 2022.2 caches and local hi…

Go语言开发工具Vscode配置

Go语言开发工具Vscode配置方法分享&#xff1a; 1.下载安装vscode https://code.visualstudio.com/ 2.汉化vscode 3.vscode中安装Go语言插件 源自&#xff1a;大地老师Golang语言beego入门实战视频教程下载地址

【noVNC】使用noVNC实现浏览器远程VNC(基于web的远程桌面)

一、操作的环境 windows 10系统乌班图 Ubuntu 22 二、noVNC 部署方式 原理&#xff1a;开启 Websockify 代理来做 WebSocket 和 TCP Socket 之间的转换 2.1 noVNC和VNC服务端同一台机器 使用方式&#xff0c;查看另一篇博文 &#xff1a;【noVNC】使用noVNC实现浏览器网页访…

双向链表的实现(详解)

目录 前言初始化双向链表的结构为双向链表的节点开辟空间头插尾插打印链表尾删头删查找指定位置之后的插入删除pos节点销毁双向链表 前言 链表的分类&#xff1a; 带头 不带头 单向 双向 循环 不循环 一共有 (2 * 2 * 2) 种链表 带头指的是&#xff1a;带有哨兵位节点 哨兵位&a…

基于springboot实现人事管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现人事管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;作为学校以及一些培训机构&#xff0c;都在用信息化战术来部署线上学习以及线上考试&#xff0c;可以与线下的考试有机的结合在一起&#xff0c;实现基于vue的人事系统在技术…

numpy学习笔记(3),数组连接

6. 连接数组 6.1. 连接数组&#xff0c; 6.2. 分割数组&#xff0c; 6.3. 算术运算&#xff0c; 6.4. 广播&#xff08;重点&#xff09; 6.1 连接数组 concatenatehstackvstack 6.1.1 使用concatenate函数 沿指定轴连接多个数组&#xff0c;语法格式如下&#xff1a; num…

Linux:调试器 - gdb

Linux&#xff1a;调试器 - gdb gbd基本概念gbd调试浏览断点运行变量 gbd基本概念 GDB (GNU Debugger) 是一个强大的命令行调试工具,用于调试各种编程语言(如C、C、Java、Python等)编写的程序。使用 gdb可以帮助开发人员更快地定位和修复程序中的缺陷,提高代码质量和开发效率。…

二叉树经典OJ题(2)

一、根据二叉树创建字符串 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public://前序遍历&#xff1a;根 左 右//左子树为空&#xff0c;右子树不为空的时候&#xff0c;不能省略左//左不为空&#xff0c;右子树为空的时候&#xff0c;可以省略右//都为空&am…

Java基于微信小程序的校园外卖平台设计与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

使用Python爬虫代理IP快速增加博客阅读量

目录 前言 二、Python爬虫代理IP技术简介 1.什么是爬虫&#xff1f; 2.什么是代理IP&#xff1f; 3.为什么使用代理IP&#xff1f; 三、使用Python爬虫代理IP增加博客阅读量的步骤 1.获取代理IP地址 2.模拟多次访问 3.定时任务 四、注意事项 五、总结 前言 随着互联…

Matlab 2024安装教程(附免费安装包资源)

鼠标右击软件压缩包&#xff0c;选择“解压到MatlabR2024a“。 2.打开解压后的文件夹&#xff0c;鼠标右击“MATHWORKS_R2024A“选择装载。 鼠标右击“setup“选择”以管理员身份运行“。点击“是“&#xff0c;然后点击”下一步“。复制一下密钥粘贴至输入栏&#xff0c;然后…

【Tars-go】腾讯微服务框架学习使用01--初始化服务

1 初始INIT-Demo运行 按照官网描述 go get 安装框架依赖 # < go 1.16 go get -u github.com/TarsCloud/TarsGo/tars/tools/tarsgo go get -u github.com/TarsCloud/TarsGo/tars/tools/tars2go # > go 1.16 go install github.com/TarsCloud/TarsGo/tars/tools/tarsgolat…

SSH安全设置

今天发现自己的公有云服务器被攻击了 然后查看了登录日志&#xff0c;如上图 ls -sh /var/log/secure vim /var/log/secure然后增加了安全相关的设置 具体可以从以下方面增加安全性&#xff1a; 修改默认SSH端口公有云修改安全组策略及防火墙端口设置登录失败次数锁定用户及限…

MySQL事务与事务原理

目录 事务 事务的四大特性ACID 事务隔离级别 事务原理 存储引擎 四大特性的保证 MVCC 事务链 ReadView 事务 事务指逻辑上的一组操作&#xff0c;组成这组操作的各个单元&#xff0c;要么全部成功&#xff0c;要么全部失败。 start transaction; -- 开启事务 或者 b…

B端:设置页面如何减少用户的录入操作。

录入操作尤其是文字录入是比较是比较繁琐的&#xff0c;尤其是在移动端小屏幕上&#xff0c;简直就是灾难。不过我们可以通过合理的设置、识别、记忆、自动填充等技术来有效的减少录入。 在 B 端设置页面中&#xff0c;可以采取多种方式来减少用户的录入操作&#xff0c;提高用…

第二期书生浦语大模型训练营第三次作业

任务一&#xff1a;在茴香豆 Web 版中创建自己领域的知识问答助手 构建个人回答助手 进入web页面&#xff0c;传输属于自己的文件&#xff0c;此处进行输入大量投资领域资料&#xff0c;构建个人投资者问答助手 回答示例 茴香豆缺陷 此处会发现茴香豆仍然存在一些缺点&#…

一、基础算法-快速排序

1.快速排序 快速排序主要利用了分治的思想&#xff0c;具体步骤为&#xff1a; step1 确定分界点&#xff0c;常用为q[left],q[right],q[mid]&#xff0c;也可以是随机的 step2 调整区间&#xff0c;将比分界点小的放左边&#xff0c;大的放右边 step3 利用递归处理左右两端 …