HTML5 游戏开发实战 | 推箱子

news2024/11/23 4:19:44

经典的推箱子是一个来自日本的古老游戏,目的是在训练玩家的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙地利用有限的空间和通道,合理安排移动的次序和位置,才能顺利地完成任务。

推箱子游戏功能如下:

游戏运行载入相应的地图,屏幕中出现一个推箱子的工人,其周围是围墙、人可以走的通道、几个可以移动的箱子和箱子放置的目的地。让玩家通过按上、下、左、右键控制工人推箱子,当箱子都推到了目的地后出现过关信息,并显示下一关。推错了玩家可以撤销移动或者重新玩这关,直到通过全部关卡。

推箱子游戏的运行界面如上图所示。

本游戏使用的图片元素的含义如图9-2所示。

01、箱子游戏设计的思路

先来确定一下开发难点。对工人的操作很简单,就是4个方向移动。注意在工人移动时箱子也移动,此效果对按键处理的要求也比较简单。当箱子到达目的地位置时,需会产生游戏过关事件,需要一个逻辑判断。那么仔细想一下,这些所有的事件都发生在一张地图中。这张地图包括了箱子的初始化位置、箱子最终放置的位置,以及围墙障碍等。每一关地图都要更换,这些位置也要变。所以每一关的地图数据是最关键的,它决定了每一关的不同场景和物体位置。那么下面就重点分析一下地图。

假设把地图想象成一个网格,每个格子就是工人每次移动的步长,也是箱子移动的距离,这样问题就简化多了。首先设计一个16×16的二维数组curMap。按照这样的框架来思考。对于格子的X,Y两个屏幕像素坐标,可以由二维列表下标换算。

每个格子状态值分别用值(0)代表通道Block,(1)代表墙Wall,(2)代表目的地Ball,(3)代表箱子Box,(4)代表工人CurMan,(5)代表放到目的地的箱子redBox。文件中存储的原始地图中格子的状态值采用相应的整数形式存放。

在玩家通过键盘控制工人推箱子的过程中,需要按游戏规则进行判断是否响应该按键指示。下面分析一下工人将会遇到什么情况,以便归纳出所有的规则和对应算法。为了描述方便,可以假设工人移动趋势方向为向右,其他方向原理是一致的。如图9-4所示,P1、P2分别代表工人移动趋势方向的前两个方格。

■ 图9-4工人移动趋势(向右)

游戏规则判断如下。

(1) 判断P1是否出界,出界则退出规则判断,布局不做任何改变。

if(p1.x< 0) return false;
if(pl.y< 0) return false;
if(pl.y>= curMap.length) return false;
if(p1.x>= curMap[0].length) return false;

(2) 前方P1是围墙。

如果工人前方是围墙(即阻挡工人的路线)

{

退出规则判断,布局不做任何改变;

}

if(curMap[p1.y][p1.x] == 1
return false; //如果是墙,不能通行

(3) 前方P1是箱子,如图9-5所示。

■ 图9-5工人前方是箱子

(3) 前方P1是箱子,如图9-5所示。

在前面的情况中,只要根据前方P1处的物体就可以判断出工人是否可以移动,而在第3种情况中,需要判断箱子前方P2处的物体才能判断出工人是否可以移动。此时有以下几种可能。

① P1处为箱子或者放到目的地的箱子,P2处为墙或箱子。

如果工人前方P1处为箱子或者放到目的地的箱子,P2处为墙或箱子,退出规则判断,布局不做任何改变。

if(curMap[pl.y][p1.x]== 3 curMap[p1.y][p1.x]== 5)
//如果是箱子,继续判断前一格
if(curMap[p2.y][p2.x] == 1  curMap[ p2.y][p2.x]== 3
curMap[p2.y][p2.x]== 5)
return false;
//前一格如果是墙或箱子,则不能前进

② P1处为箱子或者放到目的地的箱子,P2处为通道。

如果工人前方P1处为箱子,P2处为通道,工人可以进到P1方格,P2方格状态为箱子。修改相关位置格子的状态值。

③ P1处为箱子或者放到目的地的箱子,P2处为目的地。

如果工人前方P1处为箱子,P2处为目的地,工人可以进到P1方格,P2方格状态为放置好的箱子。修改相关位置格子的状态值。

//如果是箱子,继续判断前一格
if(curMap[pl.y][p1.x]== 3 curMap[p1.y][p1.x]== 5)if(curMap[p2.y][p2.x]==0 curMap[p2.y][p2.x]== 2) //如果 P2 为通道或者目的地
//记录现在的地图
oldMap = copyArray(curMap);//箱子前进一格
curMap[p2.y][ p2.x]= 3;//如果原始地图是目的地或者是放到目的地的箱子if(CurLevel[p2.y][p2.x] == 2 CurLevel[p2.y][p2.x] == 5)curMap[p2.y][p2.x] = 5;
canReDo = true;//工人前进一格
curMap[ p1.y][p1.x] = 4; //4 代表工人
//处理工人原来位置是显示目的地还是通道平地//获取工人原来位置原始地图信息var v= CurLevel[per position.y][per position.x];if(v== 2 v== 5)[ //如果原来位置是目的地或者放到目的地的箱子curMap[per_position.y][per position.x]=2;
//显示目的地
else
//显示通道平地
curMap[per position.y][per position.x]=0;

综合前面的分析,可以设计出整个游戏的实现流程。

02、推箱子游戏设计的步骤

游戏页面pushbox.html

<htmI >
< head >
<title>推箱子游戏</title>
< meta http - equiv = content - type content = "text/html; charset = utf - 8"></head >
<body onload ="init()”onkeydown ="DoKeyDown(event)"><canvas id="myCanvas”width="560"heght ="560">浏览器还不支持哦</canvas><div id="msg"></div>
<img id="block”src = "img/block.gif”style = "display:none;">< img id ="wall"src ="img/wall.gif"style = "display:none;"><img id="ball"src ="img/ball.gif”style="display:none;1< img id="box”src ="img/box.gif"style ="display:none;">< img id= "redbox”src ="img/redbox.gif"style ="display:none;">< img id="pleft"src = "img/left.png"style ="display:none;'<img id="pright”src = "img/right.png"style="display:none;"><img id="pup”src ="img/up.png”style="display:none;">< img id="pdown”src ="img/down.pngstyle ="display:none;"><input type ="button"value ="上一关"onclick ="NextLevel( - 1)">< input type ="button"value ="下一关"onclick ="NextLevel(1)">
< input type="button"value ="撤销移动”onclick ="Redo()">
<input type="button"value ="重玩本关”onclick ="NextLevel(0)">
< input type="button"value ="游戏说明”onclick ="DoHelp()">< script type = "text/javascript"src = "mapdata100.js"></script><script type ="text/javascript"src = "pushboxl.js"></script>
</body>
</html>

游戏页面主要设置图片素材对应的id 。例如,箱子图片的id是“box" ,目的地图片的id是“ball" ,通道图片的id是“block" ,已在目的地的箱子id是“redbox" ,墙图片的id 是“wall" 。人物的上下左右方向图片的id分别是“pleft" 、“pright" 、“pup" 、“pdown" 。

界面上添加 5 个功能按钮,实现“上一关”“下一关”“撤销移动”“重玩本关”“游戏说明”功能。

设计脚本( pushbox1.js )

1. 设计游戏地图

整个游戏在16×16区域中,使用二维数组curMap存储游戏的状态。其中,方格状态值0代表通道,1代表墙,2代表目的地,3代表箱子,4代表工人,5代表放到目的地的箱子。例如图9-1所示推箱子游戏界面的对应数据如下:

每关地图方格状态值采用levels数组存储,如levels[0]存储第一关,levels[1]存储第二关,以此类推。本游戏存储100关信息,所以把数组levels单独放置在"mapdata100.js"脚本文件中。

第一关如下:

var levels =[];
levels[0]=[
[00,00,000000000000
[00,000000000000001
[0,0,0,0,0,0,00000000001
0.000.0000000000001
[0.0.0.0.0.0.11.0.00.0.0.001
0000000,0,0,0,0.0.01
0000001,0,0,0,01
[0,0,0,01.1.0.0.0.07
[0,0,0,0,1,2,03,4,1,1,10000]
[0.0,0,0,1,1,11,3,1,0000001
[0,0,0,0,0,0,0,1,2,1,0,0,00001
[0,0,0,0,0,0,01,1,1,0000001
[0,0,0,0,0,0,000,0,0,0,00001
[0,0,0,0,0,0,00,0,0,0,0,0,0001
[0,0,00,0,0,0,0,0,0,0,0,0,000]
[0,0,0,0,0,0,0,00,0,0,0000

第二关如下:

[0,0,0,0,1,4,0,0,1,0,0,0,0,0,0,01[0,0,0,0,1,0,3,3,1,0,1,1,1,0,0,0][0,0,0,0,1,0,3,0,1,0,1,2,1,0,0,0][0,0,0,0,1,1,1,0,1,1,1,2,1,0,0,01[0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0]
[0,0,0,0,0,1,0,0,0,1,00,10,001
[0,0,0,0,0,10,0,0,1,1,110001
0,0,0,0,0,1,1,1,1,1,00,00001
0.0.0.0.0.0.0.0.0.00000001
00.0.0.0.00.0.00000001
0000000000000000
00,0000,0,00,0,00,00001l;

程序初始时,获取对应的图片,并将本关iCurLevel的地图信息levels[iCurLevel]复制到当前游戏地图数据数组curMap和CurLevel。curMap初始与CurLevel相同,游戏中记录不断改变游戏状态。CurLevel是当前关游戏地图数据,游戏中不变,主要用来获取箱子目的地和判断游戏是否结束。

var w= 32;
var h = 32;
var curMap;
var oldMap;
var CurLevel;
var iCurLevel=0;
var curMan;
var UseTime = 0;
var MoveTimes = 0;
//当前游戏地图数据数组,初始与 CurLevel 相同,游戏中改变//保存上次人物移动前地图数据数组
//当前关游戏地图数据,游戏中不变,用来判断游戏是否结束
//当前是第几关//当前小人图片
//当前关用时,单位为秒
//移动次数
var mycanvas = document.getElementById('myCanvas');
var context = mycanvas.getContext(2d');
var block = document.getElementById("block");
var box = document.getElementById("box");
var wall= document.getElementById("wall")
var ball = document.getElementById("ball");
var redbox = document.getElementById("redbox");
var pdown = document.getElementById("pdown");
var pup = document.getElementById("pup”);
var pleft = document.getElementById("pleft");
var pright = document.getElementById("pright");var msg = document.getElementById("msg”);
function init()
initLevel();
showMoveInfo();

initLevel()函数将本关地图信息复制到当前游戏地图数据数组curMap和CurLevel,并在屏幕上画出通道、箱子、墙、人物、目的地信息。

function initLevel()
curMap = copyArray(levels[iCurLevel]);
oldMap = copyArray(curMap);
CurLevel = copyArray(levels[ iCurLevel]);
curMan = pdown;
DrawMap(curMap)
function copyArray(arr)
//画出通道、箱子、墙、人物、目的地信息
//复制二维数组
var b =[];
for(i= 0;i<arr.length;i++ )blil= arr[il.concat();return b;

为了保存工人所在位置,使用per_position保存。初始位置在(5,5)坐标。当然,在绘制游戏时会根据地图信息修改工人所在位置per_position。

function Point(x,y)
this.x =x;
this.y= y;
var per_position = new Point(5,5);

2. 绘制整个游戏区域图形

绘制整个游戏区域图形就是按照地图level存储图形代号,获取对应图像,显示到Canvas上。全局变量per_position代表工人当前位置(x,y),从地图level读取时如果是4(工人值为4),则per_position记录当前位置。游戏中为了达到清屏效果,每次工人移动后重画屏幕前,用通道重画整个游戏区域,相当于清除原有画面后再绘制新的图案。

function InitMap(
//西通道,平铺方块
for(var i= 0;i< CurLevel.length;i++)ffor(var j= 0;j< CurLevel[i].length;j++)(context.drawImage(block,w*i,h*j,w,h);
function DrawMap(level)
//画箱子、墙、人物、目的地
//context.clearRect ( 0 ,0 ,w*16 ,h*16 );//画通道,平铺方块InitMap();//行号
for(i= 0;i< level.length;i++)
//列号for(j= 0;j< level[i].length;j++)var pic=block;
switch(level[il[j])
//通道
case 0:
pic = block;break;case 1:
//墙
pic = wall;
break;case 2:
//目的地
pic = ball;
break;
case 3:
//箱子
pic = box;
break;
case 5:
//放到目的地的箱子
pic =redbox;
break;
case 4:
pic = curMan;
per position.x=j;
//工人
//per_position 记录工人当前位置x,y
per position.y=i;
break;
//绘制图像context.drawImage(pic,w*j- (pic.width - w)/2,h *(i) -(pic.height - h),picwidth,pic.height);

3. 按键事件处理

游戏中对用户的按键操作,采用Canvas对象的KeyPress按键事件来处理。KeyPress按键处理函数DoKeyDown(event)根据用户的按键消息,计算出工人移动趋势方向前两个方格位置坐标p1、p2,将所有位置作为参数调用TryGo(p1,p2)方法判断并进行地图更新。

function DoKeyDown(event)
switch(event.keyCode)
case 37:
//判断用户按键,获取移动方向
//left 向左键
go('left');
msg.innerHTML ="left";
break;
case 38:
//up 向上键
go( 'up') ;
break;
case 39:
//right 向右键
go('right');
break;
case 40:
//down 向下键
go('down');
break;
function go(dir)
var p1,p2;
switch(dir)
case"left"
//按键处理
//分别代表工人移动趋势方向前两个方格//分析按键消息
//向左
//人物图片为向左走的图片pl =new Point(per_position.x- 1,per_position.y);p2 = new Point(per_position.x- 2,per_position.y);
curMan = pleft;
break;//向右case"right"//人物图片为向右走的图片curMan = pright;pl = new Point(per_position.x+1,per_position.y);p2 = new Point(per_position.x +2per_position.y);
break;//向上"up"case//人物图片为向上走的图片curMan=pup;p1 =new Point(per_position.x,per_position.y- 1);p2 = new Point(per_position.x,per_position.y- 2);case
break;"斐督瘁d卵板钞阿蚌豢wn"//向下//人物图片为向下走的图片curMan = pdown;pl = new Point(per_position.x,per_position.y+1);p2 = new Point(per position.x,per position.y+2);break;
if(TryGo(p1,p2))
this.MoveTimes++;showMoveInfo();
DrawMap(curMap);if(CheckFinish())
alert("恭喜过关。");NextLevel(1);
//如果能够移动
//次数加 1
//显示移动次数信息
}
DrawMap(curMap);
if(CheckFinish())
{
alert("恭喜过关。");
NextLevel(1);
}
}

TryGo(p1,p2)方法是最复杂的部分,实现前面所分析的所有的规则和对应算法。

function TryGo(p1,p2)
//判断是否可以移动
//判断是否在游戏区域
if(p1.x<0) return false;
if(pl.y< 0) return false;
if(pl.y>= curMap.length) return false;
if(pl.x>= curMap[0].length) return false;
//如果是墙,不能通行if(curMap[pl.y][p1.x]== 1)return false;if(curMap[pl.y][p1.x]==3 curMap[pl.y][p1.x]==5) //如果是箱子,继续判断前一格
if(curMap[p2.y][p2.x]== 1  curMap[p2.y][p2.x] == 3curMap[p2.y][p2.x] == 5)//前一格如果是墙或箱子,则不能前进return false;if(curMap[p2.y][p2.x]== 0 curMap[p2.y][p2.x]== 2) //如果 P2 为通道或者目的地
oldMap = copyArray(curMap);//记录现在地图//箱子前进一格curMap[p2.y][p2.x] = 3;//如果原始地图是目的地或者是放到目的地的箱子if(CurLevel[p2.y][p2.x] == 2CurLevel[ p2.y][p2.x]== 5)curMap[ p2.y][p2.x]= 5;
canReDo = true;
//工人前进一格
curMap[p1.y][p1.x] = 4;
//以下处理工人原来位置是显示目的地还是通道平地var v= CurLevel[per_position.y][per_position.x];
if(v== 2v== 5)curMap[per_position.y][per_position.x]=2else
curMap[per_position.y][per_position.x]=0;
per_position=pl;
//获取工人原来位置原始地图信息//如果原来是目的地
//显示通道平地
//记录位置
return true;

CheckFinish()函数用于判断是否完成本关。如果原始地图目标位置上没放箱子(也就是此位置不是放到目的地的箱子curMap[i][j]!=5),则表明有没放好的箱子,游戏还未过关,反之游戏过关。

function CheckFinish(
for(var i= 0;i< curMap.length;i++)
//验证是否过关
//行号
[j]!= 5)
for(var j= 0;j< curMap[ i].length;j++)//如果原始地图的目标位置上没放箱子,则还没结束if(CurLevel[i][j]== 2 && curMap[i]lj]!= 5 CurLevel[i][j]== 5 && curMap[i
//列号
return false;
return true;

4. 显示帮助信息

var showHelp = false;
function DoHelp()
showHelp =!showHelp;
if(showHelp)
msg.innerHTML="用键盘的上、下、左右键移动小人,把箱子全部推到小球的位置即可关.箱子只可向前推,不能往后拉,并且小人一次只能推动一个箱子.";
else
showMoveInfo();
function showMoveInfo()
msq.innerHTML="第"+(CurLevel + 1)+"关移动次数:”+ MoveTimes;showHelp = false;

5. 撤销功能

游戏中oldMap用于保存每次移动前的地图信息,执行撤销就是把oldMap恢复到当前地图curMap中。同时根据地图中记录的信息找到工人位置,修改per_position记录的工人位置信息,最后重新绘制整个游戏屏幕就可以恢复到上一步的状态。

var canReDo = false;
function Redo()if (canReDo == false)
//撤销功能
//不能撤销
return;
//恢复上次地图
curMap = copyArray(oldMap);
for (var i=0;i< curMap.length; i++)
//行号
//列号for (var j= 0;j< curMap[i].length; j++)
if (curMap[i][j]== 4)per_position = new Point(j,i);
//如果此处是工人
this.MoveTimes --
canReDo = false;
showMoveInfo();
DrawMap(curMap);
//次数减 1
//显示移动次数信息
//画箱子、墙、人物、目的地信息

6. 选关功能

游戏中有“上一关”“下一关”“重玩本关”这3个选关功能,这3个选关功能实现方法是一样的。参数i如果是1,则是“下一关”;参数i如果是-1,则是“上一关”;参数i如果是0,则是“重玩本关”。主要根据关卡号iCurLevel,调用initLevel()函数初始化本关地图,并在屏幕上画出箱子、墙、人物、目的地信息。

function NextLevel(i)
//初始化 i
iCurLevel=iCurLevel + i;if(iCurLevel<0)
iCurLevel= 0;
return;
var len = levels.length;if(iCurLevel> len - 1)
iCurLevel = len - 1;
return;
initLevel();UseTime = 0;MoveTimes = 0:showMoveInfo();

至此,完成经典的推箱子游戏。

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

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

相关文章

java9新特性之-String存储结构变更--集合工厂方法-- InputStream 加强--增强的 Stream API讲解

String存储结构变更 Motivation The current implementation of the String class stores characters in a char array, using two bytes (sixteen bits) for each character. Data gathered from many different applications indicates that strings are a major component o…

Ubuntu22.04编译安装FFmpeg

FFmpeg介绍 概述 FFmpeg是一款用C语言编写的跨平台免费开源多媒体处理工具&#xff0c;该软件可实现音视频的采集、编解码、转码、过滤以及流媒体相关操作等功能。 同时&#xff0c;FFmpeg也为其他多种语言和操作系统提供了开发组件&#xff0c;包括Java、Python、C等和Wind…

【吴恩达deeplearning.ai】基于LangChain开发大语言应用模型(下)

以下内容均整理来自deeplearning.ai的同名课程 Location 课程访问地址 DLAI - Learning Platform Beta (deeplearning.ai) LangChain for LLM Application Development 基于LangChain开发大语言应用模型&#xff08;上&#xff09; 一、LangChain: Q&A over Documents基于文…

SpringMVC原理分析 | Controller配置、RestFul风格

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Controller配置 控制器Controller 控制器复杂提供访问应用程序的行为&#xff0c;通常通过接口定义或注释定义的两种方法实现控制器负责解析用户的请求并将其转换为一…

ModaHub AI模型开源社区——Milvus向量数据库存储相关概念

目录 存储相关概念 分区和数据段 数据段&#xff08;segment&#xff09; 分区&#xff08;partition&#xff09; 集合、分区和数据段的关系 元数据 常见问题 存储相关概念 分区和数据段 建立集合时&#xff0c;Milvus 根据参数 index_file_size 控制数据段的大小。另…

R+VIC 模型融合实践技术应用及未来气候变化模型预测

目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&#xff0c;由于适用的尺度主要的是中小流域&#xff0c;所以在预测气候变化对水文过程影响等方面都有所不足。 VIC模型…

“未来之光:揭秘创新科技下的挂灯魅力“

写在前面&#xff1a; 高度信息化当下时代&#xff0c;对电脑及数字设备的需求与日俱增无处不在&#xff0c;随之而来的视觉疲劳和眼睛问题也攀升到了前所未有的高度。传统台灯对于长时间使用电脑的人群来说是完全无法解决这些问题的。一款ScreenBar Halo 屏幕挂灯&#xff0c;…

【Java】Java核心要点总结 71:ThreadPoolExecutor

文章目录 1)为什么需要线程池&#xff1f;2)线程池内部怎么保证线程安全?3)创建线程的方式 newSingleThreadExecutor底层4) ThreadPoolExecutor参数使用5) 线程池的工作机制6)拒绝策略分四种7)队列有哪些&#xff1f; 参考&#xff1a; 1)为什么需要线程池&#xff1f; 重复利…

设计模式之备忘录模式笔记

设计模式之备忘录模式笔记 说明Memento(备忘录)目录白箱备忘录模式备忘录模式示例类图游戏角色类备忘录角色类备忘录对象管理对象测试类 黑箱备忘录模式备忘录模式示例类图备忘录接口游戏角色类备忘录对象管理对象测试类 说明 记录下学习设计模式-备忘录模式的写法。JDK使用版…

JDBC小记——连接池

目录 连接池介绍 常用连接池 DBCP连接池 硬编码方式 配置文件方式 C3P0连接池 C3P0和DBCP的区别 硬编码方式 配置文件方式 Druid连接池 硬编码方式 配置文件方式 DBUtils 连接池介绍 由于建立数据库连接是一种非常耗时、耗资源的行为&#xff0c;所以预先通过连接…

在vite+vue3项目中配置使用css预处理器(less/sass)以及路径别名

一、在vite项目中使用css预处理器 vite已经将这些预处理器的loader内置了&#xff0c;我们不用再像在webpack项目中那样&#xff0c;需要下载和配置一堆相关的loader&#xff0c;我们只需要下载less&#xff0c;sass依赖&#xff0c;就能直接在项目中使用啦 使用npm或者yarn来…

Springboot-- 注解字段校验,并统一设置返回值

Springboot-- 注解字段校验&#xff0c;并统一设置返回值 引包&#xff1a;import org.springframework.validation.annotation.Validated; <!--web--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…

配置鼠标右键菜单功能 :一键csv转excel

配置右键菜单功能 &#xff1a;一键csv转excel 无需点开文件&#xff0c;双击即可以生成新的excel文件 步骤&#xff1a; 1、配置Python&#xff0c;安装依赖库 pip install openpyxl pip install pandas2、创建Python文件 csv_to_excel.py # -*- coding:utf-8 -*- impor…

【计算机组成原理】函数栈帧

目录 一、源代码理论分析 二、主函数的创建 三、c语言代码的汇编 注&#xff1a;不同编译器环境的函数栈帧存在一定差异&#xff0c;本文使用VS2019 一、源代码理论分析 源代码&#xff1a; int Add(int x, int y) {int z 0;z x y;return z; }int main() {int a 10;…

u盘安装centos 7

1.下载 通过阿里云站点&#xff1a;http://mirrors.aliyun.com/centos/7/isos/x86_64/&#xff0c;下载iso文件。 2.制作启动u盘镜像 2.1 下载制作工具 下载u启动 http://uqidong.als98.cn/ 。 2.2 制作镜像 准备u盘&#xff0c;插入机器&#xff0c;运行u启动。 注意…

机器学习之基于PCA的人脸识别

目录 PCA人脸数据降维 matlab代码实现 思路分析 PCA人脸重构 matlab代码实现 思路分析 PCA人脸可视化 matlab代码实现 思路分析&#xff1a; PCA人脸识别 matlab代码实现 思路分析 PCA人脸数据降维 matlab代码实现 picturesdir(C:\Users\Yezi\Desktop\机…

数字逻辑与模拟电子技术-部分知识点(2)——模电部分-半导体三极管、基本线性运放电路、正弦波振荡电路

目录 半导体三极管 三极管的放大的条件 基本放大电路计算 基本线性运放电路 同相放大电路 反相放大电路 加法器放大电路 正弦波振荡电路 正弦波振荡的条件 半导体三极管 三极管的放大的条件 主要是依靠它的发射极电流能够通过基区传输&#xff0c;然后到达集电极而实现…

【KMP算法】时间复杂度O(N)的字符串匹配算法

目录 案例&#xff1a;假定我们给出字符串 ”ababcabcdabcde”作为主串&#xff0c; 然后给出子串&#xff1a; ”abcd”,现在我们需要查找子串是否在主串中 出现&#xff0c;出现返回主串中的第一个匹配的下标&#xff0c;失败返回-1 ; 1.BF算法&#xff08;暴力算法&#x…

java8新特性之--强大的Stream API详细讲解

强大的Stream API Stream API说明 Java8中有两大最为重要的改变。第一个是 Lambda 表达式&#xff1b;另外一个则 是 Stream API。Stream API ( java.util.stream) 把真正的函数式编程风格引入到Java中。 这是目前为止对Java类库最好的补充&#xff0c;因为Stream API可以极…

CVPR 23 | 高分辨率缺陷异常定位新范式:PyramidFlow

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/abs/2303.02595 论文代码&#xff1a;暂未发布 0. 背景 由于复杂的工业制造过程中的不可控因素&#xff0c;不可避免地会给产品带来不可预见的缺陷。由于人类视觉系…