jQuery小游戏(二)

jQuery小游戏(二)

今天是新年的第二天,本人在这里祝大家,新年快乐,万事胜意💕

紧接jQuery小游戏(一)的内容,我们开始继续往下咯😜

  1. 游戏中使用到的方法
  • keydown:当键盘按下时,立刻被触发;如果按住不放的话,会重复触发此事件,keydown()方法的参数是回调函数,当keydown事件触发时运行回调函数。一般keydownkeyup配合使用,下面会讲到keyup,说到keydown,我们会联想到另外一个事件keypress(当用户按下键盘上的字符键时触发,如果按住不让的话,会重复触发此事件),发生keypress事件意味着按下的键会影响到屏幕中文本的显示
  • keyup:当键盘按下,再次抬起时,被触发;在发生keydownkeyup事件时,event对象的keyCode属性会包含一个代码,与键盘上的一个特定的键对应。对数字、字母键,keyCode属性的值与ASCII码中对应小写字母或者数字的编码相同

需要注意的是:这三个键盘事件依次顺序为:keydown->keypress->keyup

  • orientationchange:便于开发者进行设备的判断,是处于垂直模式还是水平模式
  • 0:表示垂直模式
  • 90:表示左转水平模式(主屏幕键在右侧)
  • -90:表示右转水平模式(主屏幕键在左侧)
    当用户旋转设备改变了模式,就会触发orientationchange事件。但 event对象上没有暴露任何有用的信息,这是因为相关信息都可以从 window.orientation属性中获取;所有iOS设备都支持orientationchange事件和window.orientation属性;因为orientationchange事件被认为是window事件,所以也可以通过给元素添加 onorientationchange 属性来指定事件处理程序
keydown: function(e) {
				var t = i.checkKey(e.keyCode);
				n.event.keyDownGo && n.event.keys[t] != undefined && (n.event.keys[t] = !0),
				n.event.keyUpGo && n.event.lastKey[t] != undefined && (n.event.lastKey[t] = !1),
				n.event.keyPressCtrl[t] && n.event.keyPressedGo && (n.event.pressedKey[t] != undefined && (n.event.pressedKey[t] = !0), n.event.keyPressCtrl[t] = !1),
				n.event.keyDownCallBack != null && n.event.keyDownCallBack(e),
					t = null
			},
			keyup: function(e) {
				var t = i.checkKey(e.keyCode);
				n.event.keyDownGo && n.event.keys[t] != undefined && (n.event.keys[t] = !1),
				n.event.keyUpGo && n.event.lastKey[t] != undefined && (n.event.lastKey[t] = !0),
				n.event.keyPressedGo && (n.event.pressedKey[t] != undefined && (n.event.pressedKey[t] = !1), n.event.keyPressCtrl[t] = !0),
				n.event.keyUpCallBack != null && n.event.keyUpCallBack(e),
					t = null
			},
			orientationchange: function(e) {
				n.event.orientationChange != null && n.event.orientationChange(e)
			},
			swipeStart: function(e, t) {
				n.event.swipeCallBack != null && (n.event.swipeDate = Date.now(), n.event.pageStarOffX = e, n.event.pageStarOffY = t)
			},
			swipeSuccess: function(e, t) {
				if (n.event.swipeDate) {
					if (Date.now() - n.event.swipeDate < n.event.swipeTimeout) if (Math.abs(e - n.event.pageStarOffX) >= n.event.swipeRange || Math.abs(t - n.event.pageStarOffY) >= n.event.swipeRange) return n.event.swipeCallBack(n.event.pageStarOffX, n.event.pageStarOffY, e, t),
						!0;
					n.event.swipeDate = null
				}
				return ! 1
			},
  • touchstart:手指触摸屏幕时事件触发
  • touchend:手指离开屏幕时触发
  • touchmove:手指在屏幕上滑动式触发
  • touchcancel:系统取消touch事件的时候触发(该事件仅适用于带有触摸屏的设备)
touchstart: function(e) {
				e.preventDefault(),
					n.event.pageOffX = i.getOffsetX(e),
					n.event.pageOffY = i.getOffsetY(e),
				n.event.touchStart != null && n.event.touchStart(e, n.event.pageOffX, n.event.pageOffY);
				if (i.buttonLayoutEventHandler(e.type, n.event.pageOffX, n.event.pageOffY)) return ! 1;
				i.swipeStart(n.event.pageOffX, n.event.pageOffY)
			},
			touchend: function(e) {
				e.preventDefault();
				if (i.swipeSuccess(n.event.pageOffX, n.event.pageOffY)) return ! 1;
				if (i.buttonLayoutEventHandler(e.type, n.event.pageOffX, n.event.pageOffY)) return ! 1;
				n.event.touchEnd != null && n.event.touchEnd(e, n.event.pageOffX, n.event.pageOffY)
			},
			touchmove: function(e) {
				e.preventDefault(),
					n.event.pageOffX = i.getOffsetX(e),
					n.event.pageOffY = i.getOffsetY(e),
				n.event.touchMove != null && n.event.touchMove(e, n.event.pageOffX, n.event.pageOffY)
			},
			touchcancel: function(e) {
				n.event.pageOffX = i.getOffsetX(e),
					n.event.pageOffY = i.getOffsetY(e),
				n.event.touchCancel != null && n.event.touchCancel(e, n.event.pageOffX, n.event.pageOffY)
			},
  • mouseDown:鼠标按下事件,当鼠标的左键按下时触发

mouseDownclick点击事件不同,点击会包括两个动作,按下鼠标和松开鼠标,如果一个元素同时绑定了这两个事件,那么mousedown就会先触发,mouseup是鼠标按下后,松开鼠标按键这个动作会触发的事件,一定是先有按下动作的存在,才会有松开动作的出现。两者多配合mousemove使用于网页一些元素的拖拽事件

  • mouseUp:事件与其他浏览器原生事件一样,用于在鼠标按钮被释放时触发相应的操作
  • mouseMove:鼠标移动事件,在页面移动一像素就会触发的事件
click: function(e) {
				n.event.clickCallBack != null && n.event.clickCallBack(e, i.getOffsetX(e), i.getOffsetY(e))
			},
			mouseDown: function(e) {
				var t = i.getOffsetX(e),
					r = i.getOffsetY(e);
				if (i.buttonLayoutEventHandler(e.type, t, r)) return ! 1;
				n.event.mouseDownCallBack != null && n.event.mouseDownCallBack(e, t, r),
					i.swipeStart(t, r),
					t = r = null
			},
			mouseUp: function(e) {
				var t = i.getOffsetX(e),
					r = i.getOffsetY(e);
				if (i.buttonLayoutEventHandler(e.type, t, r)) return ! 1;
				if (i.swipeSuccess(t, r)) return ! 1;
				n.event.mouseUpCallBack != null && n.event.mouseUpCallBack(e, t, r),
					t = r = null
			},
			mouseMove: function(e) {
				n.event.mouseMoveCallBack != null && n.event.mouseMoveCallBack(e, i.getOffsetX(e), i.getOffsetY(e))
			},
			pageFocus: function(e) {
				if (n.event.focused) return n.event.focused = !1,
					!1;
				n.event.pageFocusCallBack != null && n.event.pageFocusCallBack(e)
			},
			pageUnFocus: function(e) {
				n.event.pageUnFocusCallBack != null && n.event.pageUnFocusCallBack(e)
			},
			checkKey: function(e) {
				var t = "0";
				for (var n in r.event.key) if (r.event.key[n] == e) {
					t = n;
					break
				}
				return t
			},

  • navigator:用于获取浏览器信息,通常通过UserAgent来识别浏览器类型
    注意:在IE浏览器中,由于UserAgent无法准确判断,因此可以使用ActiveXObject来识别

解释:

  • navigator.appCodeName:IE/Firefox/Chrome 等浏览器中,值为Mozilla
  • navigator.appName:IE/Firefox/Chrome 等浏览器中,均为Netscape
  • toLowerCase():用于返回调用该方法的字符串转换为小写后的新字符串;常用于比较字符串时忽略大小写的场景
    既然我们这里讲解了toLowerCase()方法,那衍生一下,看看toUpperCase()方法吧,其实跟toLowerCase()方法相反
  • toUpperCase():用于返回调用该方法的字符串转换为大写后的新字符串;常用于格式化字符串显示,如标题、标识符等
    注意:对于非字母字符,toLowerCase()和toUpperCase()都不会影响
getDeviceConfig: function() {
				var e = navigator.userAgent.toLowerCase();
				return e.indexOf("duopaosafari") != -1 ? {
					device: "duopaoSafari",
					fps: 1,
					touch: !0,
					zoom: 1
				}: e.indexOf("iphone") != -1 || e.indexOf("ipod") != -1 ? {
					device: "iphone",
					fps: 1,
					touch: !0,
					zoom: 1
				}: e.indexOf("ipad") != -1 ? {
					device: "ipad",
					fps: 1,
					touch: !0,
					zoom: 1
				}: e.indexOf("duopaoandroid") != -1 ? {
					device: "duopaoAndroid",
					fps: 1,
					touch: !0,
					zoom: 1
				}: e.indexOf("duopaowindowsphone") != -1 ? {
					device: "duopaoWindowsPhone",
					fps: 1,
					touch: !0,
					zoom: 1
				}: e.indexOf("opera mobi") != -1 ? {
					device: "operamobile",
					fps: 1,
					touch: !0,
					zoom: 1
				}: e.indexOf("flyflow") != -1 ? {
					device: "flyflow",
					fps: 1,
					touch: !0,
					zoom: 1
				}: e.indexOf("android") != -1 ? {
					device: "android",
					fps: 1,
					touch: !0,
					zoom: 1
				}: e.indexOf("iemobile") != -1 ? {
					device: "iemobile",
					fps: 1,
					touch: !1,
					zoom: 1
				}: e.indexOf("j2me") != -1 ? {
					device: "j2me",
					fps: 1,
					touch: !1,
					zoom: 1
				}: e.indexOf("symbian v5") != -1 ? {
					device: "symbian5",
					fps: 1,
					touch: !0,
					zoom: 1
				}: e.indexOf("symbian v3") != -1 ? {
					device: "symbian3",
					fps: 1,
					touch: !1,
					zoom: 1
				}: e.indexOf("chrome") != -1 ? {
					device: "chrome",
					fps: 1,
					touch: !1,
					zoom: 1
				}: e.indexOf("firefox") != -1 ? {
					device: "firefox",
					fps: 1,
					touch: !1,
					zoom: 1
				}: e.indexOf("msie") != -1 ? {
					device: "ie",
					fps: .5,
					touch: !1,
					zoom: 1
				}: e.indexOf("windows") != -1 ? {
					device: "ie",
					fps: .5,
					touch: !1,
					zoom: 1
				}: e.indexOf("safari") != -1 ? {
					device: "safari",
					fps: 1,
					touch: !1,
					zoom: 1
				}: e.indexOf("opera") != -1 ? {
					device: "opera",
					fps: 1,
					touch: !1,
					zoom: 1
				}: {
					device: "",
					fps: 1,
					touch: !1,
					zoom: 1
				}
			},
  • fillStyle:设置或返回用于填充绘画的颜色、渐变或模式
	<body>
		<canvas id="zhouqiCanvas" width="200" height="100" style="border:1px solid #d3d3d3;">
	</canvas>
	<script type="text/javascript">
		var zhou = document.getElementById('zhouqiCanvas');//获取canvas标签
		var qi = zhou.getContext('2d');//获得context对象
		//createLinearGradient:创建线性的渐变对象
		//渐变开始点的 x 坐标,渐变开始点的 y 坐标,渐变结束点的 x 坐标,渐变结束点的 y 坐标
		var gra = qi.createLinearGradient(0,0,0,170);
		gra.addColorStop(0,"black");
		gra.addColorStop(1,"white");
		
		qi.fillStyle = gra;
		
		qi.fillRect(40,20,120,120);
	</script>
	</body>

fillStyle效果
在这里插入图片描述

  • fillRect:用于绘制一个填充的矩形

fillRect(x, y, width, height)

  • x:矩形起始点的 x 轴坐标
  • y:矩形起始点的 y 轴坐标
  • width:矩形的宽度,负值的话宽度是绝对值,但是往左移动宽度绝对值像素
  • height:矩形的高度,负值的话高度是绝对值,但是往上移动高度绝对值的像素
  • fillText:用于在画布上绘制填色的文本;文本的默认颜色是黑色
  • measureText:用于测量文本的宽度
  • getAnchor:这里将getAnchor分离,在HTTP请求中,get方法用于从服务器检索资源,而Anchor是URL中的一个部分,它通常指向某个网页的特定位置,也被称为片段标识符。它不会影响服务器端的请求,也不会被发送到服务器,而是仅用于在浏览器端的页面导航
  • graphics:用于进行图像绘制操作的抽象类,可以绘制直线、矩形、椭圆等图形

衍生讲一下:
graphics2D:继承自graphics类,提供了更多的绘制方法和功能,可以进行更高级的图像绘制操作

setImage: function(e, t, r, i, s) {
				if (!e || !t) return ! 1;
				n.image.imgs[e] || (n.image.imgs[e] = new Image, n.image.imgs[e].onload = function() {
					n.image.countLoaded++,
						this.loaded = !0,
					this.cache && m.canvas.pass(this.id, this.width, this.height).drawImage(this.id, 0, 0).pass().base().delImage(this.id, !0)
				},
					n.image.imgs[e].src = t + (n.image.version != "" ? "?v=" + n.image.version: ""), n.image.imgs[e].id = e, n.image.imgs[e].url = t, n.image.imgs[e].benchId = r, n.image.imgs[e].bench = i, n.image.imgs[e].cache = s, n.image.imgs[e].refreshed = !1)
			},
			setAudio: function(e, t, r, i, s, o) {
				if (!e || !t) return ! 1;
				if (!n.audio.audios[e]) {
					var u = new Audio(t + (n.image.version != "" ? "?v=" + n.image.version: ""));
					u.id = e,
						u.autoplay = i,
						u.preload = s,
						u.autobuffer = o,
						u.loop = r,
						n.audio.audios[u.id] = u,
						u = null
				}
			},
			loadingCallBack: function(e, t, r) {
				var i = m.canvas.screen.getWidth(),
					s = m.canvas.screen.getHeight(),
					o = i,
					u = 5,
					a = parseInt(i - o >> 1),
					f = s - u,
					e = e > t ? t: e,
					l = parseInt(e / t * 100) + "%";
				m.canvas.fillStyle(n.canvas.bgColor).fillRect(0, 0, i, s).fillStyle("#00FFFF").fillRect(a, f, parseInt(e / t * o), u).fillStyle("#FFF").fillText("loading " + r, 5, s - 10).fillText(l, i - m.canvas.measureText(l).width - 5, s - 10),
					i = s = o = u = a = f = l = null
			},
			loadingEndCallBack: null,
			getAnchor: function(e, t, n, i, s) {
				var o = e,
					u = t;
				switch (s) {
					case r.canvas.graphics.ANCHOR_HV:
						o -= parseInt(n / 2),
							u -= parseInt(i / 2);
						break;
					case r.canvas.graphics.ANCHOR_LV:
						u -= parseInt(i / 2);
						break;
					case r.canvas.graphics.ANCHOR_RV:
						o -= n,
							u -= parseInt(i / 2);
						break;
					case r.canvas.graphics.ANCHOR_HT:
						o -= parseInt(n / 2);
						break;
					case 0:
					case r.canvas.graphics.ANCHOR_LT:
					default:
						break;
					case r.canvas.graphics.ANCHOR_RT:
						o -= n;
						break;
					case r.canvas.graphics.ANCHOR_HB:
						o -= parseInt(n / 2),
							u -= i;
						break;
					case r.canvas.graphics.ANCHOR_LB:
						u -= i;
						break;
					case r.canvas.graphics.ANCHOR_RB:
						o -= n,
							u -= i
				}
				return {
					x: o,
					y: u
				}
			},
  • buttonsButtonsDataTables的扩展,将控制按钮添加到表中
initUrlParams: function(e) {
				if (e.indexOf("?") >= 0) {
					var t = e.split("?"),
						r = [];
					t[1].indexOf("&") >= 0 ? r = t[1].split("&") : r.push(t[1]);
					var i = [];
					for (var s = 0; s < r.length; s++) r[s].indexOf("=") >= 0 && (i = r[s].split("="), n.request.gets[i[0]] = i[1]);
					i = null,
						r = null,
						t = null
				}
			},
			audioEnded: function() {
				m.audio.replay(this.id)
			},
			pageLoaded: function() {
				n.image.inited = !0,
					n.system.pageLoad(m)
			},
			buttonLayoutAction: function() {
				var e = n.buttonLayout.buttons,
					t;
				for (var r = e.length - 1; r >= 0; r--) if (t = e[r]) t.action().render(),
				t.goned && t.endPath() && e.splice(r, 1);
				e = t = null
			},
			buttonLayoutEventHandler: function(e, t, r) {
				var i = n.buttonLayout.buttons,
					s, o = !1;
				for (var u = i.length - 1; u >= 0; u--) if (s = i[u]) if (m.comm.collision(s.x, s.y, s.width, s.height, t - 5, r - 5, 10, 10)) {
					switch (e) {
						case "mousedown":
						case "touchstart":
							s.hovered = !0,
								s.repeated = !0,
								s.pressed = !0,
								s.released = !1;
							break;
						case "mouseup":
						case "touchend":
							s.hovered && (s.released = !0, s.hovered = !1),
								s.repeated = !1,
								s.pressed = !1;
							break;
						default:
					}
					o = !0
				} else if (e == "mouseup" || e == "touchend") s.hovered = !1,
					s.repeated = !1;
				return i = s = null,
					o
			}
		},
		s,
		o,
		u,
		a,
		f,
		l,
		c,
		h,
		p,
		d,
		v = {
			arr: [],
			len: 0,
			v: 0
		};

先这样吧,朋友们,早点休息啦,明天还要早起呢🎆

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

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

相关文章

Linux的常用指令的用法

目录 Linux下基本指令 whoami ls指令&#xff1a; 文件&#xff1a; touch clear pwd cd mkdir rmdir指令 && rm 指令 man指令 cp mv cat more less head tail 管道和重定向 1. 重定向&#xff08;Redirection&#xff09; 2. 管道&#xff08;Pipes&a…

蓝桥杯之c++入门(一)【C++入门】

目录 前言5. 算术操作符5.1 算术操作符5.2 浮点数的除法5.3 负数取模5.4 数值溢出5.5 练习练习1&#xff1a;计算 ( a b ) ⋆ c (ab)^{\star}c (ab)⋆c练习2&#xff1a;带余除法练习3&#xff1a;整数个位练习4&#xff1a;整数十位练习5&#xff1a;时间转换练习6&#xff…

51单片机开发:定时器中断

目标&#xff1a;利用定时器中断&#xff0c;每隔1s开启/熄灭LED1灯。 外部中断结构图如下图所示&#xff0c;要使用定时器中断T0&#xff0c;须开启TE0、ET0。&#xff1a; 系统中断号如下图所示&#xff1a;定时器0的中断号为1。 定时器0的工作方式1原理图如下图所示&#x…

【设计测试用例自动化测试性能测试 实战篇】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a; c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 设计测试用例…

指针(C语言)从0到1掌握指针,为后续学习c++打下基础

目录 一&#xff0c;指针 二&#xff0c;内存地址和指针 1&#xff0c;什么是内存地址 2&#xff0c;指针在不同系统下所占内存 三&#xff0c;指针的声明和初始化以及类型 1,指针的声明 2,指针 的初始化 1&#xff0c; 初始化方式优点及适用场景 4,指针的声明初始化类型…

利用Redis实现数据缓存

目录 1 为啥要缓存捏&#xff1f; 2 基本流程&#xff08;以查询商铺信息为例&#xff09; 3 实现数据库与缓存双写一致 3.1 内存淘汰 3.2 超时剔除&#xff08;半自动&#xff09; 3.3 主动更新&#xff08;手动&#xff09; 3.3.1 双写方案 3.3.2 读写穿透方案 3.3.…

MySQL(高级特性篇) 14 章——MySQL事务日志

事务有4种特性&#xff1a;原子性、一致性、隔离性和持久性 事务的隔离性由锁机制实现事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证&#xff08;1&#xff09;REDO LOG称为重做日志&#xff0c;用来保证事务的持久性&#xff08;2&#xff09;UNDO LOG称为回…

S4 HANA明确税金本币和外币之间转换汇率确定(OBC8)

本文主要介绍在S4 HANA OP中明确明确税金本币和外币之间转换汇率确定(OBC8)相关设置。具体请参照如下内容&#xff1a; 明确税金本币和外币之间转换汇率确定(OBC8) 以上配置&#xff0c;我们可以根据不同公司代码所配置的使用不同的汇率来对税金外币和本币之间进行换算。来针对…

SpringBoot 日志与配置文件

SpringBoot 配置文件格式 Properties 格式 Component ConfigurationProperties(prefix "person") //和配置文件person前缀的所有配置进行绑定 Data public class Person {private String name;private Integer age;private Date birthDay;private Boolean like;pr…

oracl:数据查询语言DQL

SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理和操作关系数据库的标准编程语言。 sql分类: 基本查询语法 数据查询语言&#xff08;DQL - Data Query Language&#xff09; 查询的关键词 select where对查询结果进行过滤…

Hive:窗口函数(1)

窗口函数 窗口函数OVER()用于定义一个窗口&#xff0c;该窗口指定了函数应用的数据范围 对窗口数据进行分区 partition by 必须和over () 一起使用, distribute by经常和sort by 一起使用,可以不和over() 一起使用.DISTRIBUTE BY决定了数据如何分布到不同的Reducer上&#xf…

多目标优化策略之一:非支配排序

多目标优化策略中的非支配排序是一种关键的技术,它主要用于解决多目标优化问题中解的选择和排序问题,确定解集中的非支配解(也称为Pareto解)。 关于什么是多目标优化问题,可以查看我的文章:改进候鸟优化算法之五:基于多目标优化的候鸟优化算法(MBO-MO)-CSDN博客 多目…

神经网络和深度学习

应用 类型 为什么近几年飞速发展 数据增长&#xff0c;算力增长&#xff0c;算法革新 逻辑回归 向量化 浅层神经网络(Shallow neural network) 单条训练数据前向传播计算表达式 batch训练数据前向传播计算表达式 反向传播计算表达式 参数随机初始化 不能全部设为0 原因是同一…

生成模型:扩散模型(DDPM, DDIM, 条件生成)

扩散模型的理论较为复杂&#xff0c;论文公式与开源代码都难以理解。现有的教程大多侧重推导公式。为此&#xff0c;本文通过精简代码&#xff08;约300行&#xff09;&#xff0c;从代码运行角度讲解扩散模型。 本文包括扩散模型的3项技术复现&#xff1a; 1.DDPM (Denoising…

浅谈网络 | 容器网络之Flannel

目录 云原生网络架构深度解构&#xff1a;Flannel的设计哲学与实现机制Flannel架构解析&#xff1a;三层核心设计原则UDP模式&#xff08;用户态隧道&#xff09;VXLAN模式&#xff08;内核态隧道&#xff09;Host-GW模式&#xff08;直连路由&#xff09; 生产环境架构选型与调…

新鲜速递:DeepSeek-R1开源大模型本地部署实战—Ollama + MaxKB 搭建RAG检索增强生成应用

在AI技术快速发展的今天&#xff0c;开源大模型的本地化部署正在成为开发者们的热门实践方向。最火的莫过于吊打OpenAI过亿成本的纯国产DeepSeek开源大模型&#xff0c;就在刚刚&#xff0c;凭一己之力让英伟达大跌18%&#xff0c;纳斯达克大跌3.7%&#xff0c;足足是给中国AI产…

用BGP的路由聚合功能聚合大陆路由,效果显著不?

正文共&#xff1a;666 字 11 图&#xff0c;预估阅读时间&#xff1a;1 分钟 之前我们统计过中国境内的IP地址和路由信息&#xff08;你知道中国大陆一共有多少IPv4地址吗&#xff1f;&#xff09;&#xff0c;不过数量比较多&#xff0c;有8000多条。截止到2021年底&#xff…

AI DeepSeek-R1 Windos 10 环境搭建

1、安装&#xff1a; 下载 Python |Python.org CUDA Drivers for MAC Archive | NVIDIA pip 和virtualenv Download Ollama on Windows 如下图 2、下载模型 deepseek-r1 ollama run deepseek-r1 或者可以ollama run deepseek-r1:8b 或 3、安装一个可视化对话Chatbox 下载 …

SOME/IP--协议英文原文讲解4

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.1.3 End…

工作总结:git篇

文章目录 前言基础Gerrit1.克隆2.新建本地分支和checkout3.添加到暂存区新增文件到暂存区修改已经添加到暂存区的文件取消添加到暂存区的文件 4.提交到本地仓库在不重复提交的情况下&#xff0c;修改本次提交 5.提交到远程仓库6.评审其他辅助命令 前言 目前也算是工作一段时间…