自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(802)
  • 资源 (13)
  • 收藏
  • 关注

原创 Matplotlib绘制多个图形的方法

通过matplotlib绘制多个图形,相当于在一块画布(figure)中创建多个坐标系(axes),每个坐标系表示一个图形。相关链接1 画布、坐标系与图形的关系,请参考。

2025-01-14 10:55:54 393

原创 Matplotlib绘制单个图形的方法

第13-16行代码设置坐标系的横纵坐标标签以及设置图片的标题,此时的坐标系axes是隐式生成的默认坐标系,可以通过plt对坐标系进行操作;“2 通过隐式创建画布与坐标系进行绘图”中,隐式地创建了axes,通过plt直接对创建的axes进行操作,设置其标题、x轴标签和y轴标签。其中,第13行代码通过plt.subplot()创建画布及坐标系,并将坐标系保存在axes变量中,之后第14-17行代码都是通过axes对坐标系进行操作,绘图、设置标题以及横纵坐标标签。图3 通过隐式创建画布与坐标系进行绘图的代码。

2025-01-13 11:09:30 704

原创 使用Matplotlib显示中文的方法

设置局部字体的代码如图6所示。图6 设置局部字体的代码其中,第5-6行设置了用于显示标题的字体title_font;第7-8行设置了用于显示x轴标签的字体x_font;第9-10行设置了用于显示y轴标签的字体y_font。

2025-01-12 11:07:59 778

原创 导入sklearn库时报错的解决方法

下载完成后,安装python,之后按照numpy、scipy、pandas和scikit-learn的顺序重新安装相关库,之后就可以成功导入sklearn库了,如图5所示。使用相同的指令,可以对scipy和pandas进行删除,删除之后使用《安装scikit-learn库》中提到的方法,重新安装numpy、scipy和pandas模块。如果升级相关模块后,依然无法导入sklearn库,此时可以将numpy、scipy和pandas模块删除后重新安装,删除模块的指令如图3所示。图4 下载最新python。

2025-01-07 16:06:47 556

原创 安装scikit-learn库

scikit-learn库是针对Python机器学习库,它建立在NumPy、SciPy和Matplotlib之上,提供了大量的机器学习算法和工具,适用于各种机器学习任务。

2025-01-07 09:51:16 168

原创 《Python游戏编程入门》注-第9章8

其中,第88行代码定义了函数中使用的全局变量,level表示当前关卡数,levels表示每关砖块的分布;其中,print_text()函数MyLibrary.py中定义,其作用是显示信息,第一个参数表示使用的字体;在while True循环中监听键盘是否被按下,如果按下判断按下的是否是回车按键,如果是回车按键,则调用goto_next_level()函数实现跳关,代码如图15所示。通过自定义函数goto_next_level()实现游戏的跳关,该函数的代码如图14所示。使用如图13所示的代码实现以上功能。

2025-01-06 20:33:49 148

原创 《Python游戏编程入门》注-第9章7

在对挡板和小球碰撞进行处理之后,接下来通过自定义函数collision_ball_blocks()处理小球与砖块之间的碰撞。

2025-01-06 20:31:47 67

原创 《Python游戏编程入门》注-第9章6

通过自定义函数collision_ball_paddle()实现小球与挡板的碰撞检测,代码如图12所示。图12 小球与挡板的碰撞检测的代码其中,第161行使用pygame.sprite.collide_rect()函数判断小球与挡板是否发生碰撞,如果发生碰撞,则该函数返回值是True;第162行代码将小球移动的纵坐标该为负值,此时小球会向上移动;第163-168行代码确定发生碰撞后,小球是向左上方反弹还是右上方反弹,如图13所示。图13 碰撞后小球反弹原理图。

2025-01-03 10:14:05 130

原创 《Python游戏编程入门》注-第9章5

在显示了关卡对应的砖块以及挡板之后,接下来显示小球,并且让小球能够动起来。

2025-01-03 10:07:33 27

原创 《Python游戏编程入门》注-第9章4

其中,第149行代码通过pygame.key.get_pressed()方法获取按键信息,并将信息保存到keys中,当玩家按下向左的方向键时,keys[K_LEFT]的值是True,当玩家按下向右的方向键时,keys[K_RIGHT]的值是True,当玩家按下“Esc”键时,keys[K_ESCAPE]的值是True,第150-152行代码的作用是当玩家按下了“Esc”键,则游戏退出。此时,运行代码后,在砖块之下就会显示挡板,并且可以通过鼠标和键盘控制挡板左右移动了,如图11所示。图8 监听鼠标的代码。

2024-12-26 16:06:28 53

原创 《Python游戏编程入门》注-第9章3

在显示了每个关卡的砖块后,接下来显示挡板。

2024-12-26 16:02:59 134

原创 《Python游戏编程入门》注-第9章2

第84行代码通过设置砖块精灵类的set_image()方法设置精灵图片,其中第一个参数block_image为第78行代码导入的图片,第二个和三个参数分别表示图片中,每个砖块的宽度和高度,第四个参数表示图片中的砖块有4列。第89行代码获取每个砖块对应的值,第一关中砖块的值是1,第二关中砖块值是2,以此类推。第92-93行代码判断该位置处有没有砖块,如果有砖块,则将此处的砖块精灵加入到精灵组中,在图6所示的砖块数据中可以看到,如果有砖块,则此位置处的值大于零,如果没有砖块,则此位置处的值是0。

2024-12-24 11:12:07 41

原创 《Python游戏编程入门》注-第9章1

9.1 Block Breaker游戏简介”中介绍了Block Breaker游戏。该游戏通过元组定义游戏中的每一个关卡,只需要对数据进行修改,而不需要改变游戏代码,就可以实现关卡的切换。Block Breaker游戏是通过小球来消除砖块,玩家移动屏幕下方的挡板防止小球跌落,当消除掉所有砖块后,游戏将会跳转到下一关卡,如图1所示。每个关卡中,砖块的颜色和分布是由数据进行控制的,如图2、图3所示。图1 Block Breaker图2 第二关图3 第三关。

2024-12-24 11:05:25 141

原创 《Python游戏编程入门》注-第8章9

第136-137行代码的作用是当玩家的血量超过100时,只显示100的血量,防止“爆”血量;第138-139行代码随机设置能量块下一次出现的位置,health.X和health.Y分别表示能量块的横纵坐标。其中,第153-154行代码判断玩家的血量player_health,当血量小于等于0时,将游戏结束的标志game_over设置为True;第155-156行代码的作用是,当游戏结束后,显示“GAME OVER”信息,如图21所示。在游戏的过程中,会在随机位置产生能量块,玩家吃到能量块后,血量会增加。

2024-11-29 10:23:08 241

原创 《Python游戏编程入门》注-第8章8

5 玩家与僵尸的冲突检测玩家与僵尸的冲突检测的代码如图15所示。图15 玩家与僵尸的冲突检测的代码其中,第118行代码使用pygame.sprite.spritecollideany()函数检测精灵(player)与精灵组(zombie_group)之间的冲突,当发生冲突时,该函数返回与player发生冲突的僵尸,此时attacker的值不为None;

2024-11-29 10:19:55 164

原创 《Python游戏编程入门》注-第8章7

第64-75行代码分别判断“上”、“下”、“左”和“右”键或“a”、“s”、“w”和“d”键,此时,设置玩家移动的方向,并且将玩家是否移动的标志player_moving设置为True;通过键盘的“上”、“下”、“左”和“右”键或“a”、“s”、“w”和“d”键控制玩家在相应的方向移动,以躲避僵尸的攻击。程序运行后,通过“上”、“下”、“左”和“右”键或“a”、“s”、“w”和“d”键实现移动玩家的效果,如图15所示。通过设置精灵的起始帧和结束帧让精灵动起来,代码如图12所示。图13 设置玩家速度的代码。

2024-11-27 09:40:37 126

原创 《Python游戏编程入门》注-第8章6

其中,第53行使用if语句判断游戏是否结束的标志game_over,如果游戏没有结束,则运行54-64行代码,game_over在while True循环之外定义,初始值为False。以上代码的作用是创建玩家精灵player,导入玩家图片“farmer walk.png”,设置玩家精灵的位置postion和方向direction属性,最后将player加入到精灵组player_group中。运行程序,此时发现僵尸的运动速度非常快,加入图7所示代码,可以让僵尸速度变慢。导入玩家图片的代码如图9所示。

2024-11-27 08:56:18 46

原创 《Python游戏编程入门》注-第8章5

Zombie Mob”游戏的界面如图1所示。图1 “Zombie Mob”游戏的界面从图1中可以看出,玩家通过键盘操纵游戏中的人物躲避僵尸的同时,还要想方设法去吃“能量块”,来保持自己的血量。如果玩家被僵尸碰到,则血量会减少。

2024-11-25 09:25:34 48

原创 《Python游戏编程入门》注-第8章4

其中,pygame.sprite.spritecollide()函数的第一个参数表示单个精灵,第二个参数表示精灵组,第三个参数如果是True,表示碰撞后精灵组的精灵消失,False表示不消失。代码运行效果如图7所示。其中,pygame.sprite.groupcollidey()函数的前两个参数表示两个精灵组,后两个参数表示碰撞后是否在精灵组中删除碰撞的精灵,True表示删除,False表示不删除,程序运行的效果如图12所示。创建两个玩家精灵,并将这两个玩家精灵都加入到玩家精灵组中,代码如图10所示。

2024-11-22 15:06:10 238

原创 《Python游戏编程入门》注-第8章3

Python游戏编程入门》的“8.2.3”-“8.2.5”小节中介绍了精灵冲突检测的几种方法:两个精灵间的圆检测、精灵和组之间的矩形检测以及两个组之间的矩形检测。

2024-11-22 15:02:40 173

原创 《Python游戏编程入门》注-第8章2

其中,calc_velocity()函数的第一个参数direction表示僵尸运行的方向,第二个参数vel表示僵尸的速度,默认值是1.0。如图6所示,direction=0时,表示僵尸向上移动时,其纵坐标值减小,因此其垂直速度为velocity.y的值是-vel,如第9-10行所示。第20-21行代码表示,当僵尸垂直向上移动到屏幕的上边界,则将僵尸的移动方向改为向下。首先要计算僵尸的速度,之后根据速度得到僵尸的位置,最后根据位置实时显示僵尸,实现让僵尸动起来的效果。计算僵尸速度的代码如图8所示。

2024-11-21 17:53:46 65

原创 《Python游戏编程入门》注-第8章1

8.1 Zombie Mob游戏简介”介绍了Zombie Mob游戏,如图1所示。图1 Zombie Mob游戏在游戏中,玩家必须躲避僵尸的同时,还要想方设法取吃“能量块”。

2024-11-21 12:26:01 51

原创 《Python游戏编程入门》注-第7章

Python游戏编程入门》第7章“用精灵实现动画:Escape the Dragon游戏”中通过pygame.sprite模块(精灵)实现了动画效果。

2024-11-21 11:19:19 125

原创 《Python游戏编程入门》注-第6章3

其中,第59-60行中的old_pos.x和old_pos.y是飞船前一时刻的横纵坐标,delta_x和delta_y是飞船旋转经过的横轴和纵轴的距离;其中,pygame.transform.rotate()函数的作用是逆时针旋转图片,该函数的第一个参数指定了要旋转的图片,第二个参数表示旋转的角度。飞船刚刚绘制出来是如图10所示的内容,如果要实现飞船围绕星球飞行的效果,则要对显示的飞船图片进行实时旋转,如图11所示。如图1显示的游戏界面中,左上角会显示飞船的实时位置信息,代码如图18所示。

2024-11-18 19:15:53 220

原创 《Python游戏编程入门》注-第6章2

从图6中可以看出,widht和height分别是恒星位图的宽度和高度,要向确定恒星的位置,就要确定恒星位图左上角的位置。因为飞船位图的宽度和高度比较大,直接显示导入的位图效果不好,在导入位图之后,通过第17行所示的pygame.transform.smoothscale()函数对位图进行平滑缩小处理,该函数的第一个参数指定了要缩小的位图,第二个参数指定了缩小后位图的宽度和高度。显示恒星的步骤同显示星空相同,分别是导入恒星位图与绘制恒星位图。图1所示的游戏界面中,恒星的位置在星空中心,如图6所示。

2024-11-13 10:33:02 47

原创 《Python游戏编程入门》注-第6章1

6.1 认识Orbiting Spaceship实例程序”中介绍了该游戏,如图1所示。图1 游戏界面位图是一种由像素组成的图像,每个像素都包含了颜色和位置信息。位图使用像素网格来表示图像,每个像素都有自己的颜色值。位图可以存储丰富的图像细节和颜色信息,但它们也会占用较大的文件大小。位图图像通常以文件格式如JPEG、PNG或BMP保存。

2024-11-13 10:27:34 163

原创 《Python游戏编程入门》注-第5章6

其中,第45-46行代码获取时针与x轴的夹角,第45行代码中的wrap_angle()是自定义函数,该函数的作用是保证夹角在0°-355°之间,代码如图9所示,该函数的参数表示时针与x轴夹角的角度值,hours是在“3 获取当前时间”中获取的当前时间小时数;第47-48行代码获取时针针尖位置的横纵坐标hour_x和hour_y,其原理如图10所示,时针针尖位于图10中红色圆上,radius是白色圆的半径,radius-80是红色圆的半径;绘制分针和秒针的原理与绘制时针的原理类似,代码如图11和12所示。

2024-11-11 17:40:26 82

原创 《Python游戏编程入门》注-第5章5

Python游戏编程入门》的“Analog Clock示例程序”部分讲解了模拟时钟的实现方法。该模拟时钟可以通过时针、分针和秒针的旋转,显示当前时间,如图1所示。图1 模拟时钟。

2024-11-11 10:01:29 143

原创 《Python游戏编程入门》注-第5章4

其中,在“2.4 获取小圆圆心的位置”中获取到小圆圆心位置坐标是相对于大圆圆心的,因此第33行代码将相对坐标转换为绝对坐标,原理如图7所示,pos_x和pos_y是大圆圆心的坐标,x和y是小圆圆心的相对坐标,而pos才是小圆圆心的绝对坐标;其中,第18行代码判断是否完全显示了一个大圆,如果是,圆心角的角度设置为0,第20-23行代码随机生成颜色,并保存在变量color中。其中,x和y分别表示小圆圆心的横纵坐标,angle表示圆心角,radius表示大圆的半径。获取小圆圆心位置坐标的原理如图7所示。

2024-11-06 09:39:16 149

原创 《Python游戏编程入门》注-第5章3

Python游戏编程入门》的“5.2.3 圆示例”中实现了一个不断改变颜色的圆,当整个圆都被显示出来之后,会改变其颜色,如图1所示。图1 不断改变颜色的圆。

2024-11-06 09:35:20 326

原创 《Python游戏编程入门》注-第5章2

通过水平方向和垂直方向的两个坐标值就可以确定一个位置,水平方向一般用X来表示,叫做横坐标;垂直方向一般用Y表示,叫做纵坐标,如图1所示。图1 坐标示意图从图1中可以看出,X轴(水平方向)向右是正值,向左是负值;Y轴(垂直方向)向上是正值,向下是负值。

2024-11-05 10:35:38 269

原创 《Python游戏编程入门》注-第5章1

弧度”与“角度”都是用来衡量角的大小,“角度”比较好理解,比如0°、90°是直角、180°是平角以及360°是周角等。“弧度”的单位是rad,1rad指的是长度为圆半径的弧所对应的圆心角。

2024-11-05 10:08:39 169

原创 《Python游戏编程入门》注-第4章9

其中,鼠标只能控制挡板的横坐标,而不能控制挡板的纵坐标,也就是说,挡板的纵坐标是固定的,始终位于屏幕最下方。第61行代码将挡板的横坐标设置为鼠标的横坐标,第62-64行代码表示当鼠标移动到屏幕之外,挡板就位于屏幕的边缘,不能随着鼠标移动到屏幕外面。在“2.2.3 判断玩家是否接住炸弹”中提到,pos_x和pos_y是挡板的位置,它们与鼠标的位置mouse_x和mouse_y的关系如图17所示。挡板是通过鼠标来控制的,因此需要监听鼠标事件,在图7代码的基础上添加如图8所示的代码。图19 显示挡板的代码。

2024-11-04 15:20:43 56

原创 《Python游戏编程入门》注-第4章8

当炸弹圆心的纵坐标bomb_y大于挡板左上角的纵坐标pos_y,并且炸弹圆心的横坐标bomb_x位于挡板左上角的横坐标pos_x与pos_x+120(120是挡板宽度)时,如图11所示,表示此时挡板接住了炸弹,此时的处理如图12所示。以上所示的代码是在图5第26-27行代码基础上进行添加,如果游戏未开始标志game_over是False,则表示游戏已经开始,此时如41-42行所示,修改bomb_y即圆圈圆心的纵坐标,实现下落的效果。要实现炸弹落下的效果,实际上就是实时改变圆圈圆心的纵坐标,代码如图9所示。

2024-11-04 15:16:07 87

原创 《Python游戏编程入门》注-第4章7

该游戏通过鼠标控制屏幕下方的挡板左右移动,来“抓住”从上方掉落的“黄色炸弹”,如果炸弹撞击到挡板,就算玩家“抓住”了炸弹,那么会有另一个炸弹继续落下。如果玩家没有“抓到”炸弹,则会丢掉性命(性命数在屏幕左上方显示),直到玩家性命变为0,游戏结束,如图1所示。图1 Bomb Catcher游戏首先,自定义显示信息的函数print_text(),代码如图4所示。图4 自定义函数print_text()该函数的作用是在指定位置处,使用指定字体与颜色显示指定信息。

2024-11-04 15:13:26 681

原创 《Python游戏编程入门》注-第4章6

实时显示鼠标位置和按键状态的游戏如图1所示。图1 实时显示鼠标位置和按键状态从图1中可以看到,游戏界面主要分为上下两部分。其中,上半部分通过鼠标事件的方式获取并显示鼠标位置、移动距离、鼠标按键按下和释放的状态;下半部分通过“轮询鼠标”的方式获取并显示鼠标位置和鼠标按键状态。

2024-11-01 20:15:09 1104

原创 《Python游戏编程入门》注-第4章3

Python游戏编程入门》的“4.2.3 鼠标事件”中提到了监听鼠标事件的方法。鼠标事件主要包括鼠标移动MOUSEMOTION、鼠标释放MOUSEBUTTONUP和鼠标按下MOUSEBUTTONDOWN三种。

2024-11-01 10:43:53 1087

原创 《Python游戏编程入门》注-第4章5

第32-28行代码判断“回车”按键是否被按下,如果该按键被按下时,keys[K_RETURN]的值是True,第33行代码判断是否是在游戏未开始的时候按下的“回车”按键,如果是,则把游戏开始的表示game_over设置为False,表示游戏已开始;其中,pygame.key模块中的get_pressed()函数的作用是获取键盘中所有按键的状态,该函数的返回值是一个布尔类型数据的序列,这些布尔数据表示键盘中所有按键的状态,True表示按下,False表示没有按下。在游戏进行中,会显示倒计时,如图2所示。

2024-10-31 12:31:25 1020

原创 《Python游戏编程入门》注-第4章4

玩家需要根据游戏的提示在10秒钟内按下相应按键,游戏会计算出玩家按键的速度。游戏启动界面如图1所示。图1 游戏启动界面此时,按下“回车”按键,游戏开始,如图2所示。图2 游戏开始从图2中可以看出,游戏过程中,会显示倒计时和实时的按键速度。注意1 “KeyboardDemo.py”源代码可以在《python游戏编程入门注-第2章1》中提到的地址中下载。注意2 “KeyboardDemo.py”文件的位置是“python游戏编程入门->code->code->chap04”。

2024-10-31 09:18:01 688

原创 《Python游戏编程入门》注-第4章2

Python游戏编程入门》的“4.2.2 键盘事件”中介绍了通过键盘事件来监听键盘按键的方法。

2024-10-29 10:02:49 771 1

Windows7下VS2008维护模式破解工具.rar

VS2008试用版的估计期X天后结束,需要重新输入注册码时。Windows7会将VS2008维护模式中输入注册码的控件隐藏,使用本工具,可以在Windows7下显示VS2008维护模式中的输入注册码的控件,完成VS2008的重新注册!

2019-05-31

贪吃蛇源代码

Windows控制台的贪吃蛇源代码,基于VS2010,可实现速度控制。

2019-01-16

基于VS2015套接字完成端口模型源代码

《VS2015实现套接字完成端口模型》文章中提到的套接字完成端口模型源代码。文章地址为https://blog.csdn.net/hou09tian/article/details/80911809

2018-07-04

基于对话框程序的注册码快捷键粘贴功能的实现

程序的注册码的格式一般为“XXXX-XXXX-XXXX-XXXX”,在使用时将注册码输入到多个编辑框控件中,每个编辑框中输入一段。手动输入注册码非常麻烦,而采用快捷键进行粘贴时,只能逐个编辑框进行粘贴,而不能一次性粘贴完毕。 以上功能可以通过编程实现。

2017-04-23

Windows文件系统过滤驱动开发教程(第二版)

大约两年以前我在驱动开发网上发表了一组描述如何开发 Windows 文件系统过滤驱动的文章。非常庆幸这些文章能 给大家带来帮助。 原本的文章中我使用了自己编写的代码。我不打算在这里论述代码风格的优劣并发起一场辩论,无可怀疑的是,读者们 大多喜欢看到类似微软范例的代码。为此我把文章中的代码换成微软标准的文件过滤驱动范例 sfilter 的代码。赠于喜欢此 书的读者和驱动开发的后来者们。 网友们帮我整理的原版已经非常流行。为了区别起见,称为第二版。

2017-04-23

基于Java语言的安卓系统编程学习第一部分

基于Java语言的安卓系统程序编程:包括Eclipse环境搭建、项目结构解析、按键、菜单、控件UI、图像按键等。本内容为第一部分。

2017-04-23

Windows Graphics Programming Win32 Gdi And Directdraw.chm

This book is about Windows graphics programming using Win32 GDI API, with an introduction to DirectDraw, and an even more brief introduction to Direct3D Immediate Mode. It covers common features implemented on all Win32 platforms, pure 32-bit features implemented on Windows NT/2000 only, and the most recent additions to GDI for Windows 2000 and Windows 98. For example, alpha blending, transparent bit blting, gradient fill, right-to-left reading order, layered window, and sending JPEG/PNG images to printer are fully covered.

2017-01-31

DirectDraw中文手册

DirectX 编程是现在图形编程特别是游戏编程的热点.而广大的 DirectX 编程爱好者被其帮助文档中的英文所苦,于是民间有不少的爱好者开始自己翻译其手册为中文,然后放在网上让大家共享.然而,由于缺乏组织,很多人都在做着重复的工作,结果浪费了很多的时间和精力.如果把这些自发的力量组织起来,无疑是件很有意义的事.而实现跨地域的组织工作,正是 Internet 的特长.因此我们决定在国际互联网上建立一个站点来专门进行 DirectX 手册的翻译组织工作,然后把翻译过的作品放在我们的主页上让每一个需要的人都可以得到.

2017-01-31

VS2008编译驱动程序的配置方法

编译驱动程序的常用方法有两种,一种是通过WDK/DDK的COMMAND环境进行编译,另外一种是通过Visual Studio系列软件实现界面编译。通过Visual Studio编译驱动程序需要对其进行相关配置,本文以VS2008和WDK7600为例,讲解了实现编译驱动程序的配置方法。

2016-10-23

ddkwizard_setup_v1.2.0a及ddkward.cmd

VS2008产生及编译驱动的工具。包括ddkwizard_setup_v1.2.0a.exe,ddkbuild_bat和ddkbuild_cmd。

2016-10-23

filespy源代码

能通过Netware Client32连接到网络,查看所有的用户在使用哪些文件,还可以查看某个用户对文件的权限,以及用户登录的时间等,当网络上要更新某个应用程序时,这个软件可以用来要求正在使用程序的用户退出.

2016-09-25

黑客调试技术解密pdf

本书是帮助应用程序员和系统程序员理解调试过程的指南,揭示了各种调试器的实用使用技巧,说明了如何操作调试器以及如何客服障碍和修复调试器,介绍了黑客利用调试器和反汇编器来寻找程序弱点和实施攻击的方法

2016-09-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除