Samsung smart tv俄罗斯方块应用

RK3572-Android16-记录一次OTA升级失败解决方案 这里记录一次解决RK3576 Android16 OTA 用Recovery 升级失败的一次解决案例,将部分经验作为总结。本次OTA升级耗时了几天,最终是RK给出的解决方案,再加上经验来解决了其它部分问题新平台,高一点的Android版本,可能本身有bug,多请教平台来,不要蒙着干,干不出来的。 阅读详情

var tbl; 

var status = 0; 

var timer; 

var score = 0; 

var board = new Array(18); 

	for(var i=0;i<18;i++){ 

		board[i] = new Array(10); 
	} 

	for(var i=0;i<18;i++){ 

		for(var j=0; j<10; j++){ 

				board[i][j] = 0; 
		} 
	} 
 
 
	var activeBlock; 

	function generateBlock(){ 

		activeBlock = null; 
		activeBlock = new Array(4); 

		var t = (Math.floor(Math.random()*20)+1)%7; 

		switch(t){ 

				case 0:{ 

					activeBlock[0] = {x:0, y:4}; 
					activeBlock[1] = {x:1, y:4}; 
					activeBlock[2] = {x:0, y:5}; 
					activeBlock[3] = {x:1, y:5}; 
					break; 
				} 

				case 1:{ 

					activeBlock[0] = {x:0, y:3}; 
					activeBlock[1] = {x:0, y:4}; 
					activeBlock[2] = {x:0, y:5}; 
					activeBlock[3] = {x:0, y:6}; 
					break; 
				} 

				case 2:{ 

					activeBlock[0] = {x:0, y:5}; 
					activeBlock[1] = {x:1, y:4}; 
					activeBlock[2] = {x:1, y:5}; 
					activeBlock[3] = {x:2, y:4}; 
					break; 
				} 

				case 3:{ 

					activeBlock[0] = {x:0, y:4}; 
					activeBlock[1] = {x:1, y:4}; 
					activeBlock[2] = {x:1, y:5}; 
					activeBlock[3] = {x:2, y:5}; 
					break; 
				} 

				case 4:{ 

					activeBlock[0] = {x:0, y:4}; 
					activeBlock[1] = {x:1, y:4}; 
					activeBlock[2] = {x:1, y:5}; 
					activeBlock[3] = {x:1, y:6}; 
					break; 
				} 

				case 5:{ 
				
					activeBlock[0] = {x:0, y:4}; 
					activeBlock[1] = {x:1, y:4}; 
					activeBlock[2] = {x:2, y:4}; 
					activeBlock[3] = {x:2, y:5}; 
					break; 
				} 

				case 6:{ 
		
					activeBlock[0] = {x:0, y:5}; 
					activeBlock[1] = {x:1, y:4}; 
					activeBlock[2] = {x:1, y:5}; 
					activeBlock[3] = {x:1, y:6}; 
					break; 
				} 
		}	 


		for(var i=0; i<4; i++){ 

				if(!isCellValid(activeBlock[i].x, activeBlock[i].y)){ 

						return false; 
				} 
		}
		
				return true; 
		} 

	function moveDown(){ 

			if(checkBottomBorder()){ 

					erase(); 

					for(var i=0; i<4; i++){ 

					activeBlock[i].x = activeBlock[i].x + 1; 
				
					} 

				paint(); 
			}else{ 
 
			clearInterval(timer); 

			updateBoard(); 

			var lines = deleteLine(); 

	if(lines!=0){ 

		score = score + lines*10; 
		updateScore(); 
		eraseBoard(); 
		paintBoard(); 
	} 


	if(!generateBlock()){ 

			alert("Game over!"); 
			document.getElementById("state").innerText="哥游戏结束了"
			status = 2; 
			return; 
	} 
	
		paint(); 

		timer = setInterval(moveDown,1000) 
	} 
} 

		function moveLeft(){ 

				if(checkLeftBorder()){ 
						
							erase(); 

							for(var i=0; i<4; i++){ 

								activeBlock[i].y = activeBlock[i].y - 1; 
							} 
				
						paint(); 
				} 
		} 


	function moveRight(){ 

		if(checkRightBorder()){ 
		
				erase(); 

				for(var i=0; i<4; i++){ 
	
				activeBlock[i].y = activeBlock[i].y + 1; 
				
				} 
			
				paint(); 
		} 
} 


		function rotate(){ 

			var tmpBlock = new Array(4); 

				for(var i=0; i<4; i++){ 

						tmpBlock[i] = {x:0, y:0}; 
				} 

				for(var i=0; i<4; i++){ 

					tmpBlock[i].x = activeBlock[i].x; 

					tmpBlock[i].y = activeBlock[i].y; 
				} 

var cx = Math.round((tmpBlock[0].x + tmpBlock[1].x + tmpBlock[2].x + tmpBlock[3].x)/4); 
var cy = Math.round((tmpBlock[0].y + tmpBlock[1].y + tmpBlock[2].y + tmpBlock[3].y)/4); 

		for(var i=0; i<4; i++){ 

				tmpBlock[i].x = cx+cy-activeBlock[i].y; 
				tmpBlock[i].y = cy-cx+activeBlock[i].x; 
		} 

		for(var i=0; i<4; i++){ 

				if(!isCellValid(tmpBlock[i].x,tmpBlock[i].y)){ 
				return; 
				} 
		} 

		erase(); 
 
		for(var i=0; i<4; i++){ 

				activeBlock[i].x = tmpBlock[i].x; 
				activeBlock[i].y = tmpBlock[i].y; 
		} 

		paint(); 
} 
 
		function checkLeftBorder(){ 

				for(var i=0; i<activeBlock.length; i++){ 

						if(activeBlock[i].y==0){ 
					
						return false; 	
				}
				
				if(!isCellValid(activeBlock[i].x, activeBlock[i].y-1)){ 

					return false; 
				} 
			} 

			return true; 
		} 
 
		
		function checkRightBorder(){ 

					for(var i=0; i<activeBlock.length; i++){ 

							if(activeBlock[i].y==9){ 
							return false; 
					} 

					if(!isCellValid(activeBlock[i].x, activeBlock[i].y+1)){ 

						return false; 
					} 
				} 
		return true; 
		} 


		function checkBottomBorder(){ 

				for(var i=0; i<activeBlock.length; i++){ 

					if(activeBlock[i].x==17){ 

						return false; 
					} 

					if(!isCellValid(activeBlock[i].x+1, activeBlock[i].y)){ 
		
						return false; 
					} 
			} 

			return true; 
	} 


	function isCellValid(x, y){ 

			if(x>17||x<0||y>9||y<0){ 
			
				return false; 
			} 

			if(board[x][y]==1){ 

				return false; 
			} 

	return true; 
	} 
 

	function erase(){ 

		for(var i=0; i<4; i++){ 
			
			tbl.rows[activeBlock[i].x].cells[activeBlock[i].y].style.backgroundColor="white"; 
		} 
	} 
 

	function paint(){ 

			for(var i=0; i<4; i++){ 

				tbl.rows[activeBlock[i].x].cells[activeBlock[i].y].style.backgroundColor="red"; 
			} 
	} 


	function updateBoard(){ 

			for(var i=0; i<4; i++){ 
			board[activeBlock[i].x][activeBlock[i].y]=1; 
	} 
} 


	function deleteLine(){ 
	
			var lines = 0; 

			for(var i=0; i<18; i++){ 
			var j=0; 
			for(; j<10; j++){ 

				if(board[i][j]==0){ 
				break; 
			} 
	} 

		if(j==10){ 

				lines++; 

				if(i!=0){ 

					for(var k=i-1; k>=0; k--){ 
					
						board[k+1] = board[k]; 
					} 
				} 
		board[0] = generateBlankLine(); 
		} 
	} 
return lines; 
} 


	function eraseBoard(){ 

			for(var i=0; i<18; i++){ 
		
				for(var j=0; j<10; j++){ 

					tbl.rows[i].cells[j].style.backgroundColor = "white"; 
				} 
			}	 
	} 


		function paintBoard(){ 

			for(var i=0;i<18;i++){ 
				
					for(var j=0; j<10; j++){ 

						if(board[i][j]==1){ 

						tbl.rows[i].cells[j].style.backgroundColor = "red"; 
					
						} 
			} 
		} 
	} 


	function generateBlankLine(){ 
	
			var line = new Array(10); 

				for(var i=0; i<10; i++){ 

						line[i] = 0; 
				} 
		return line; 
	} 


	function updateScore(){ 

			document.getElementById("score").innerText=" " + score; 
	} 

//一下方法已经停用,谢谢
	function keyControl(){ 

			if(status!=1){ 
			return; 
	} 

	var code = event.keyCode; 

		switch(code){ 
			
			case 37:{ 
			moveLeft(); 
			break; 
		} 

		case 38:{ 
			rotate(); 
			break; 
		}
		
		case 39:{ 

			moveRight(); 
			break; 
		}
		

		case 40:{ 
		moveDown(); 
		break; 
		} 
	} 
} 


	function begin(e){ 

		e.disabled = true; 
		status = 1; 

		tbl = document.getElementById("board"); 
		
		if(!generateBlock()){ 

			alert("Game over!"); 

			status = 2; 
			return; 
		} 

	paint(); 
	
		timer = setInterval(moveDown,1000); 
	}
	
document.onkeydown=keyControl; 

主要是看你会不会写js,和普通的web 版本的js俄罗斯唯一的不同就是事件处理方面,在main.js里面处理事件,是用的一个全局方法,所以一定要注意js文件的载入顺序,然后就没什么了,有数学背景的话做什么都好做。

最近不能研究android了,十一想买一部 I9100,以后主攻android游戏开发。



ESD放电路径分析 当金属外壳接地情况下,大部分外部干扰信号将会通过外壳,外壳到接地点,再由接地点回到干扰信号的地,实现干扰信号的回流,这点不仅仅适用于​ESD,对于其他的RI类干扰,也同样适合。发现内部金属板跟外壳的搭接处存在较多的缝隙点,该缝隙点对于频率较高的信号能够实现较为理想的回流,但是对于频率没有那么高的信号,则较难以实现回流,我们尝试将这些缝隙用铜箔包裹住,充分降低该金属板跟外壳的接触阻抗​。我们分析,路径3其实是不期望的路径,我们最期望的路径是1,或者2的内部金属部件跟外壳良好接触情况下的路径。 阅读详情

相关推荐

射频测试基础知识总结

表示可以辐射到空间的电磁频率,频率范围从300KHz~110GHz之间,射频简称RF,是高频交流变化电磁波的简称,其每秒变化小于1000次被称为低频电流,超过10000次的称为高频电流,而射频就是这种高频电流。为了确保天线接收的信号能够在接收机的最后一级被正确的恢复,一个好的低噪音放大器需要在放大信号的同时产生尽可能低的噪音以及失真。两种,带内试验的范围也有一定的差别,比如,带内试验主要是检测信号的质量,如功率、频谱宽度、调制质量,而带外测试的是信号的杂散、谐波,主要是看对频带之外的干扰有多大。

cny70的博客 9628

Android 开发入门实践(二):Kotlin 空安全,从可空类型到安全访问

延续 NewsApp 项目中的新闻标题练习,记录 Kotlin 安全调用。

Easyhood的博客 286

如何理解反步法设计控制器?

假设以二阶系统为例,被控对象的系统状态方程为: 基于反步控制的具体方法如下: 1.1步骤一 定义期望状态为xd,状态误差e1,为: e1=x1-xd; 则e1的导数为: 1.2步骤二 定义虚拟控制量为: e2定义为: 1.3步骤三 定义Lyapunov能量函数为: 1.4步骤四 定义总Lyapunov能量函数为: 因此设计的控制律为: 设计c>0,则: 满足Lyapunov的稳定性判定条件...

weixin_42736130的博客 2万+

Android 模块化收口:能力组合框架、手写 LifecycleOwner 与热修复共存

二十多个模块业务高度相似却各有差异,核心矛盾在于“统一与灵活”的平衡。通过角色接口组合(如IProjectAware、IVoiceAware)实现能力按需注入,新增功能零侵入;用模板方法锁定生命周期流程,确保顺序一致;结合@CallSuper与工厂方法,既约束关键逻辑,又保留子类自由。最终实现:骨架统一、填空自由,管得住业务,又不侵入业务。

mmsx990的博客 397

snipersim安装

snipersim安装记录,便于后续使用tip:snipersim需要在python2的环境下编译。

weixin_53507617的博客 917

告别降级CUDA!手把手教你为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly + vLLM推理环境

本文详细指导如何为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly和vLLM推理环境,特别针对CUDA 12.8的适配问题提供解决方案。从硬件准备到源码编译,再到模型部署与性能调优,手把手教你构建高效AI推理系统。

weixin_33724046的博客 409

Android 开发入门实践(十三):用 Intent、UiState 和 Reducer 理解 MVI 的状态更新

本文记录第141—145课对MVI架构的入门实践,通过“返回列表”功能逐步构建意图(NewsIntent)、状态(NewsUiState)与状态转换(reduce)机制。基于单向数据流,用户操作生成意图,ViewModel通过Reducer根据旧状态计算新状态,并通过StateFlow更新Compose界面。代码实现清晰分离关注点,强化了对状态管理、事件驱动与数据流的理解。

Easyhood的博客 317

JavaSpringBoot + VUE 相关开发环境配置合集

1.Java环境-JDK安装 参照:Java基础1-环境篇:JDK安装与环境变量配置 Java基础1-环境篇:JDK安装与环境变量配置_第一段代码的博客-优快云博客_jdk 2.Web服务器-Tomcat安装 原创Java服务器Tomcat安装和配置 3.Maven(后面为了项目兼容性,使用了3.0.5版本) 原创Maven安装和配置(Maven3.0.5) 4.nginx 原创nginx轻量级Web服务器安装和配置 5 数据库mysql 原创数据库Mysql安装和配置 ...

第一段代码的博客 3164

Android Message源码阅读

本文梳理了Android Handler机制中Message的核心设计:链表结构、消息复用池(sPool)及回收机制,重点解析了异步消息与同步屏障(SyncBarrier)的协同机制。当主线程需优先处理UI绘制等高优先级任务时,系统通过postSyncBarrier插入屏障,使Looper跳过普通同步消息,优先执行标记为异步的UI渲染任务,确保帧率流畅。该机制是保障Android界面响应性的关键技术之一。

u012116089的博客 200

阿里云CDN HTTPS 证书配置流程

可以使用HTTPS方式访问资源,如果浏览器中URL旁边出现锁的HTTPS标识,表示HTTPS安全加速已生效。: 证书配置完成后,需要留意证书过期时间并在证书过期前手动配置新的证书。注意 ⚠️ 一定是需要复制 以下标识之间的内容。如果已在阿里云数字证书管理服务中购买了证书,请选择。,该证书将在阿里云数字证书管理服务中保存。如果使用第三方服务商签发的证书,请选择。第四步,在指定域名的左侧导航栏,单击。第二步,在左侧导航栏,单击。开关,并配置证书相关参数。页面,找到目标域名,单击。中选择已购买的证书。

w风雨无阻w的专栏 2209

浊音/清音/爆破音的时域及频域特性

第一周作业 浊音/清音/爆破音的时域及频域特性 思路:使用Audacity进行录制,时域部分将音频放大观察波形规律,频域部分生成并进行频谱分析。 (1)浊音U 时域分析: 时域表现为短周期性,波形比较规律。 频域分析: 频域上表现为频率集中在低频区域,共振峰较为明显,短时能量较高。 (2)清音S 时域分析: 时域波形没有周期性,整体振幅小于浊音。 频域分析: 频域波形平缓,无共振峰,能量比较集中。 (3)爆破音t 时域分析: 脉冲波,更为尖锐,整体上振幅降低。 频域分析: 没有像浊音一样的共振

Leylaaaa的博客 1228

安卓部署Linux性能实测:一颗移动处理器,能否胜任日常 Linux 开发?

本文通过在一加Ace5上部署NimoteCode的ARM64 Linux环境,测试了其在CoreMark、SQLite编译及并行构建中的表现。结果显示,尽管单核性能约2.34GHz,多核扩展比达6.15×,但优化编译耗时仍高达35秒,反映移动处理器虽具备一定开发能力,却受限于文件系统开销与运行环境(如PRoot)。实际开发中,非优化构建效率较高,而并行编译可显著提速。结论:安卓手机可作为轻量级开发辅助工具,但无法替代桌面环境,真正价值在于便携性与即时响应,而非全功能替代。

一个不知名码农的专栏 321

【突变检验合集】含Pettitt突变检验等

突变检验方法合集

WW、forever的博客 3534

云手机私有化部署完整方案:基于ARM服务器搭建私有安卓云集群

ARM 服务器是私有化安卓云集群最优硬件底座,原生架构匹配 Android,高密度、低损耗,非常适合企业内网场景。整套私有化方案的核心,从来不是 “跑起来安卓”,而是隔离可控、可审计、可运维、可扩容。两条路线各有取舍:开源自建灵活、门槛高;商用私有化交付开箱即用、安全能力完备,是当前企业生产环境主流方案。六边云手机私有化方案,补齐了自建方案在驱动适配、管控平台、审计合规、信创适配上的短板,适合对数据主权、内网隔离有强需求的政企、自研 App、垂直行业客户。

a598652的博客 330

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

CTF 命令执行题学习笔记:终端特殊字符 $IFS 与 %09 的用法(HelloCTF RCE-labs)

空格被过滤时:用%09(TAB)或$IFS代替空格关键词被过滤时:用通配符?或字符类[f]拼出被禁的词,让 WAF 在原始字符串里看不到它,shell 在执行时再展开这类技巧在后续的命令执行题里会反复用到,建议亲手在靶机上敲一遍感受一下。

YY888888_的博客 542

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android 开发入门实践(九):把新闻数据与页面状态交给 ViewModel

本文记录第110—117课学习成果:将页面标题、新闻列表及选中编号逐步迁移至NewsViewModel,通过ViewModelProvider获取实例并读取数据。页面调用ViewModel方法处理选择与返回,实现状态管理解耦。过程中纠正了对Activity重建机制的误解,并厘清mutableStateOf的可观察性与ViewModel对象生命周期的区别,深化了对Compose状态更新机制的理解。

Easyhood的博客 219

Android 17 全栈性能分析关键字与源码手册

FrameTimeline 找异常帧,ATrace 找阶段,thread_state 找等待类型,ftrace 找内核原因,Simpleperf 找 CPU 热点,驱动源码找最终触发条件;任何根因结论都必须回到同一对象、同一时间窗口和同一条依赖链。

weixin_43228946的博客 371

Android 顶点上传:Heap 到 Direct 的零拷贝,省的是 JNI 次数

一帧数十万次putFloat的性能瓶颈源于频繁跨JNI边界,每次开销远超传输字节数。通过将写入与上传解耦:用堆内ByteBuffer高速写入,最后一次性put(writeBuf)批量传至堆外DirectByteBuffer,将数百万次边界调用压缩为一次,实现近10倍性能提升。关键在于复用堆外缓冲区、统一端序,并结合“更新-绘制”分离,仅在数据变更时上传顶点,平移缩放时零开销重绘,彻底释放CPU瓶颈。

mmsx990的博客 477

谷歌相机9.2下载(GCam 安卓通用版 安装与使用说明)

谷歌相机9.2版移植自Pixel原生相机,支持Camera2 API的Android 10+设备安装,凭借多帧合成技术在夜景、HDR+与人像模式表现优异。可提升暗光画质、优化动态范围与背景虚化效果,支持视频防抖及配置文件自定义。安装需确认机型兼容性,建议备份原相机,避免冲突。资源可通过kuake链接获取,仅限学习测试使用。

2611_96675819的博客 150

Android 系统启动与调试中的日志抓取方式全解析

│ 用户操作/系统事件 ││ │▼ ▼│ (驱动/硬件/内存管理) │ │ (App/SystemServer) ││ │ │ ││ │▼ ▼│ dmesg 命令 │ │ logd daemon ││ cat /proc/kmsg │ │ (分类存储到分区) ││ │▼ ▼│ 串口 UART │ │ logcat 命令 ││ (硬件直连,最早输出) │ │ adb logcat ││ │▼│ (汇总所有日志+系统状态) │工具最佳用途关键优势主要局限dmesg。

zhaoshuzhaoshu的专栏 265

Android 开发入门实践(十):用 Kotlin 协程完成模拟加载、取消与异常处理

本文记录第118—125课对NewsApp的协程改造:从viewModelScope.launch启动协程,逐步加入delay模拟等待、suspend函数封装、withContext(Dispatchers.IO)切换线程并观察上下文恢复机制。通过日志验证withContext完成后恢复原执行上下文(非自动回主线程),纠正了初始理解偏差。引入Job管理任务,实现加载取消与重复点击防护,结合异常处理与状态管理,完成可观察、可中断的异步流程。

Easyhood的博客 388

go消息推送之极光推送 (JPush REST API + SDK,覆盖安卓与iOS)

使用 gorush有个绕不开的问题:国内安卓设备上 FCM 基本不可达,华为、小米、OPPO、vivo 各自为政——此时可用极光推送(JPush)作解决方案。它的思路和前面几家都不一样:App 集成极光 SDK 后拿到统一的 RegistrationID,服务端发一条 REST 请求,极光云端自动把消息路由到 APNs、各家厂商通道或极光自有长连接。这里给出了:一个用纯标准库直接调用极光的;另一个用社区维护的,类型化参数,接口注释与官方文档逐条对应。两个功能相同,可放在一起对比学习。

qq_40467670的博客 177

【Android】听写播放器改版:中英文书写速度拆项与「正在读」高亮

现象:把播放页主体抽成后,里面给LazyColumn加想让它占满剩余高度,编译报错(weight 不可用)。原因weight不是通用修饰符,是RowScope的扩展函数。是个普通函数,函数体里没有接收者,自然调不到。解决private fun ColumnScope.PlaybackBody(...) { /* 这里就能用 Modifier.weight(1f) */ }调用处仍在原来的Column { }里,无需改动。预防:Compose 的布局修饰符都是作用域绑定。

木头大左的博客 241

工业智能体:从Codex/Claude到项目实战~系列文章11:Codex 批量重构老系统:激活历史 DCS/PLC 存量代码

本期提出规模化重构工业老系统(如DCS/PLC代码)的可执行方法论:通过AST静态分析量化风险,按“盘点评估→样板重构→批量迁移→回归灰度”四阶段推进;利用Codex实现模块级批量重构,并以“金标准样本”确保数值一致性;接入CI流水线实现自动化守护。强调“小步改、保语义、可回滚”,结合绞杀者模式渐进替代,实现存量代码的安全激活。来自华北理工大学段一凡的博客文章

段一凡的博客 366

android 动画掉帧

动画

yeshen.org 241

MySQL 数据库账户及授权

MySQL 8.0默认使用caching_sha2_password认证插件,可通过show variables like '%password%'查看密码策略。通过validate_password插件可设置密码强度,策略等级包括LOW、MEDIUM、STRONG,支持长度、大小写、数字、特殊字符及字典检查。密码策略可临时或永久配置。用户需先创建账户再授权,遵循最小权限原则,避免root账户远程访问。常用权限如CREATE、DROP、SELECT、INSERT、UPDATE等按级别分配,确保安全与管理规范

Y_P_W的博客 186

mysql初阶--表的操作

本文系统讲解MySQL表的DDL操作:通过SHOW TABLES查看表,CREATE TABLE创建表(支持临时表、校验语句),DESCRIBE或SHOW CREATE TABLE查看结构,ALTER TABLE修改列名、类型、增删字段及重命名表,以及DROP TABLE删除表。强调这些操作属于数据定义语言(DDL),影响表结构而非数据本身。结合存储引擎、字符集(推荐utf8mb4)、建表规范与常见报错,为后续数据操作打下坚实基础。

2601_97033068的博客 518
上一篇: Android APK反编译
下一篇: SMart Tv ----最流行电台
程序员迈克
博客等级 码龄16年 36粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值