基于51单片机的俄罗斯方块游戏毕业设计论文.docx

上传人:b****7 文档编号:9627477 上传时间:2023-02-05 格式:DOCX 页数:30 大小:210.40KB
下载 相关 举报
基于51单片机的俄罗斯方块游戏毕业设计论文.docx_第1页
第1页 / 共30页
基于51单片机的俄罗斯方块游戏毕业设计论文.docx_第2页
第2页 / 共30页
基于51单片机的俄罗斯方块游戏毕业设计论文.docx_第3页
第3页 / 共30页
基于51单片机的俄罗斯方块游戏毕业设计论文.docx_第4页
第4页 / 共30页
基于51单片机的俄罗斯方块游戏毕业设计论文.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

基于51单片机的俄罗斯方块游戏毕业设计论文.docx

《基于51单片机的俄罗斯方块游戏毕业设计论文.docx》由会员分享,可在线阅读,更多相关《基于51单片机的俄罗斯方块游戏毕业设计论文.docx(30页珍藏版)》请在冰豆网上搜索。

基于51单片机的俄罗斯方块游戏毕业设计论文.docx

基于51单片机的俄罗斯方块游戏毕业设计论文

基于51单片机的俄罗斯方块游戏毕业设计论文

1绪论

1.1课题背景

如今,计算机系统的发展已明显地朝三个方向发展,这三个方向就是:

巨型化,单片化,网络化。

对于解决复杂计算和高速数据处理的问题仍然是巨型机在起作用,因而,目前巨型机正在朝高速及高处理能力的方向发展。

单片机在出现时Intel公司就给其单片机取名为嵌入式微控制器[4]。

单片机的最明显的优势,就是可以嵌入到各种仪器、设备中。

这一点是巨型机和网络不可能做到的。

单片机在内部已集成了趆来趆多的部件,这些部件包括一般常用的电路,例如:

定时器,比较器,EEPROM,D/A转换器,串行通信接口,Watchdog电路等。

同时,俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,目前在网络单机游戏和kele8等上都有它的身影。

而它曾经造成的轰动与经济价值可以说是游戏史上一件大事。

因此,对它的研究,无论从技术上,还是社会意义上看都是很有价值的。

单片机在游戏上的应用是具有非常大的潜力的,它能将游戏带入到另一个阶段。

此次设计仅仅是为了举一个单片机在游戏应用方面的简单例子,它可以很好的说明单片机功能的强大,体现其更高的可控性和高集成度的好处,因此它可以在电子游戏方面成为一个不可计量的明日之星。

1.2课题的主要研究内容

本课题研究和实现了基于8051+RTX51到Tiny平台下的智能俄罗斯方块游戏系统。

主要研究内容是实现智能俄罗斯方块游戏系统软硬件平台的搭建;本系统以8051微处理器为核心来运行RTX51Tiny多任务实时操作系统,利用KEILC51开发工具进行软件开发,通过LCD12864液晶屏显示游戏界面。

该设计能实现单人单机游、双人单机对战游戏、游戏背景音乐的播放和单人最高积分存储等功能。

在俄罗斯方块游戏系统开发过程中,本文作者首先进行硬件平台的搭建,包括单片机最小系统的搭建、电源系统的搭建、串口下载器的设计、游戏手柄的设计、音效播放模块的设计以及LCD液晶显示接口的设计。

然后,作者才开展软件平台的构建,这也是本设计的重要部分,主要包括对RTX51Tiny操作系统的配置、俄罗斯方块模型的设计、模型图块的旋转及坐标变换设计、双人单机对战游戏设计和音效系统设计等。

最后,从硬件和软件两方面对完成的智能俄罗斯方块游戏系统进行调试及运行试验。

1.3课题的研究现状及意义

现今国内外的俄罗斯方块游戏设计主要有基于PC机上Windows平台的俄罗斯方块游戏、基于手机平台的智能俄罗斯方块游戏以及基于单片机平台的俄罗斯方块游戏等。

前两种属于高端游机,性能优越,但成本高,而且计算机编程已不是新命题,VB、VC、Delphi版本的俄罗斯方块游戏都有发布[9]。

从学术角度来看,针对俄罗斯方块游戏的开发,国内外也有不少学者展开过研究,比如Niko将进化算法引入到俄罗斯方块中并验证了其有效性,Hoogeboom探讨了俄罗斯方块游戏的构造问题,王宇等针对存在于俄罗斯方块中的两个数学问题提出解决方案,高凌琴探讨游戏功能要求、数据结构、图形旋转、坐标变换等关键技术,胡代弟在SPCE061A单片机实现了俄罗斯方块游戏[10]。

综上,国内外的研究多着重于游戏数学原理的讨论,也有部分文献涉及游戏的具体实现,但多是在Windows操作系统下实现的,在单片机平台下的开发俄罗斯方块游戏鲜少有文献刊载。

而单片机由于具有体积小、性能突出、价格低廉等特点,应用领域不断扩大,除了工业控制、智能化仪表、家用电器外,在智能化高档电子玩具产品也大量采用单片机芯片作为核心控制部件。

曾经80年代非常流行的掌上游戏机便是单片机在电子玩具中的应用之一,其中的俄罗斯方块游戏现已被我们所熟知。

本文探讨基于8051单片机硬件平台和RTX51Tiny多任务实时操作系统的俄罗斯方块游戏的设计与实现,将理论与实践相结合。

其主要目标是再现经典的俄罗斯方块游戏,并在此基础上实现双人单机对战游戏模式,以丰富产品功能,增强游戏的趣味性。

2系统硬件平台设计

2.1STC12C5A60S2单片机概述

STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051系列单片机,指令代码完全兼容传统8051,但速度快8~12倍。

用户程序空间为60KB,片上集成1280字节RAM,具有EEPROM功能,能够额外储蓄1KB的数据。

该单片机共有4个16位定时器,两个与传统8051兼容的定时器/计数器,即16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2路PCA模块可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟,此两路可编程计数器阵列(PCA)可用来再实现2个定时器。

此外,STC12C5A60S2内部还集成MAX810专用复位电路,2路PWM,8路高速度10位A/D转换(250K/S),针对电机控制,强干扰场地合。

综上所述,STC12C5A605S2单片机具有许多强大的功能,能够满足大多数用户对8位单片机的要求。

2.2STC12C5A60S2最小系统

单片机最小系统主要由电源、振荡、复位电路以及扩展电路等部分组成。

在本设计中,扩展了液晶显示接口。

因此,本设计的最小系统如图2-1所示。

图2-1STC12C5A60S2最小系统

Fig2-1STC12C5A60S2MinimumSystem

2.3电源系统

本设计的电源系统比较简单,直接由LM7805稳压芯片输出的+5V电源供电。

具体电路如图2-2所示。

图片2-2电源系统

Fig2-2PowerSystem

2.4振荡电路

单片机系统里都有振荡电路,在单片机系统里晶振作用非常大,全称叫晶体振荡器,它结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率趆高,那么单片机运行速度就趆快,单片机的一切指令执行都是依靠单片机晶振提供的时钟频率。

[4]

晶振通常与锁相环电路配合使用,以提供系统所需的时钟频率。

本设计中STC12C5A60S2使用12MHz的晶体振荡器作为振荡源,由于单片机内部带有振荡电路,所以外部只要连接一个晶振和两个电容即可,电容容量一般在15pF至50pF之间。

如图2-3所示即为本设计的振荡电路。

图2-3振荡电路

Fig2-3oscillatorycircuit

2.5复位系统

MCS51单片机通常采用上电自动复位和按钮复位两种方式。

通常因为系统运行等需要,常常需要人工复位,本设计采用按钮复位的方式,即按下开关一定时间就能使RTS引脚端为高电平,从而使单片机复位。

同时,简单复位电路中,干扰信号易串入复位端,由此可能会引起内部某些寄存器错误复位,这时可在RST引脚上接去耦电容。

在STC12C5A60S2单片机中有两个复位端口,即RST/P4.7、RST2/P4.6,当晶振频率小于或等于12MHz时,使用RST端口。

由于本设计使用外接12MHz的晶振作为振荡时钟,所以采用如图2-4所示的复位系统。

图2-4复位系统

Fig2-4RestSystem

2.6程序下载系统

单片机系统的传统编程方式是先将单片机从电路板上取下,放入专用的编程器进行编程,再放入电路板进行调试。

其缺点是频繁拔插器件容易损坏器件的引脚;如果频繁的调试程序,必须重复拔插,大降低了开发效率。

ISP(在线系统编程)技术是一种无需将存储芯片从嵌入式设备上取出就能对其进行编程的过程。

其优点是,即使器件焊接在电路板上,仍可对其进行编程。

在线系统可编程是Flash存储器的固有特性(通常无需额外电路),Flash几乎都采用这种方式编程。

ISP的实现相对要简单一些,一般通用做法是内部的存储器可以由上位机的软件通过串口来进行改写。

对于8051系列单片机来讲可通过SPI接口或其它的串行接口接收上位机传来的数据并写入存储器中。

而上位机PC机与下位机单片机通过RS-232串行接口总线进行的串行通信。

8051系列单片机带有一个全双工的串行接口,因此用RS-232串行接口总线非常方便。

PC机配置RS-232标准接口,RS-232信号电平为负逻辑(逻辑“0”为+12V;逻辑“1”为-12V),8051单片机输入、输出电平为TTL电平(逻辑“0”为小于等于0.5V;逻辑“1”为大于等于2.4V)。

所以8051单片机与PC机间点对点异步通信需加电平转换电路,否则将烧坏TTL电路。

MAX232是MAXIM公司生产的电平转换器件,只需在外部接入相应的电解电容即可。

因此,本设计采用直连串口线进行串口通信,其中STC12C5A60S2的P3^0/RXD和P3^1/TXD分别和下载器的第10管脚/T和第9管脚/R相连,串口线的第5管脚接地,2、3管脚和下载器的7、8管脚相连。

具体电路如图2-5所示。

图2-5程序下载系统

Fig2-5ProgramDownloadSystem

2.7音乐播放系统

在本设计中,音乐播放系统是通过三极管驱动有源蜂鸣器发声,而具体的音符声调则由程序控制。

因此,音乐播放系统的硬件电路非常简单。

具体接法为有源蜂鸣器正极直接接+5V电源,负极与三极管8050的发射极相连,8050的集电极直接接地,其基极串一个1K的电阻连接到STC12C5A60S2单片机的P2^0端口。

如图2-6所示。

图片2-6音乐播放系统

Fig2-6MusicPlayerSystem

2.8LCD液晶显示接口电路

液晶显示屏是整个系统硬件的重要组成部分,担当着人机交互的重要角色。

本设计采用铭正同创公司生产的MzL02D-12864液晶点阵屏作为显示器件。

它是一块128*64点阵的LCD显示模组,模组上的LCM采用COG技术将控制(包括显存)、驱动器集成在LCM的玻璃上,接口简单、操作方便。

其特点为单电源供电,对比度编程可调,可采用并行接口为6800/8080时序或者串行SPI的MPU接口方式,整块液晶屏由3.3V的白色LED背光,美观大方。

其外部接口分为电源端口、数据端口和命令端口三部分组成。

本设计中LCD的数据端口连接到STC12C5A60S2单片机的P0端口,LCD的命令端口连接到单片机的P2端口。

具体硬件电路如图2-7所示。

图2-7LCD液晶显示接口电路

Fig2-7LiquidDisplayInterfaceCircuit

2.9操作控制接口

操作控制模块是智能俄罗斯方块游戏系统的输入器件。

它包括主控制器和辅助控制器。

主控制器包括七个按键,分别为:

旋转/确定、向左/返回上级菜、向右/下一个、快速下降、使用道具、暂停、退出。

副控制器则包括五个按键,分别为:

旋转/确定、向左/返回上级菜、向右/下一个、快速下降、使用道具。

在硬件电路方面辅控制器比主控制器少两个按键的连接。

如图2-8所示为主控制器的接线图。

与单片机的具体接口可根据实际设定。

图片2-8控制模块接口

Fig2-8ControlInterface

3系统软件平台构建

3.1μVision简介

μVision是德国Keil公司开发的单片机IDE软件,最初主要用于8051系列单片机,目前也有支ARM系列单片机的专用版本MDK-ARM。

本设计使用的是keilμVision3版本的开发软件进行程序开发。

3.2LCD12864液晶屏显示原理

3.2.1LCD模块总线选择及时序

MzL02D模块提供了两个LCM的引脚(C86和PS引脚)供用户选择模块的接口类型,分别可以选择6800并行总线、8080并行总线或者SPI串行接口。

模块默认情况下PS为高电平、C86为高电平,此时为6800总线接口类型,本设计采用6800总线模式。

在此种接口模式下,WR线为读写控制信号线,当WR为高电平时为读状态,WR为低电来时为写入状态。

在6800总线接口模式下LCD的时序如图3-1所示。

图3-16800总线时序

Fig3-16800BusTiming

3.2.2LCD显示RAM区映射概况

驱动控制芯片的显示RAM区中,每个byte的数据对应屏上的点的排列方式为:

纵向排列,低位在上高位在下;如图3-2所示。

MzL02D-12864液晶显示模组的显示器上的显示点与驱动控制芯片中的显示缓存RAM是一一对应的;共有65(8Page*8bit+1)*132个位的显示RAM区。

而显示器的显示点阵大小为64*128点,所以实际上在液晶显示模块中有用的显示RAM区为64*128个位;按byte为单位划分,共分为8个Page,每个Page为8行,而每一行为128个位。

(即128列)。

图3-2字节数据排列情况

Fig3-2Bytedataarrangement

MzL02D-12864液晶显示模块的显示屏上的每一个点都对应有控制器片内的显示缓存RAM中的一个bit,显示屏上64*128个点分别对应着显示RAM的8个Page,每一个Page有128个byte的空间。

因此可知显示RAM区中的一个Page空间对应8行的点,而该Page中的一个byte数据则对应一列(8个点)。

用户如要点亮LCD屏上的某一个点时,实际上就是对该点所对应的显示RAM区中的某一个位进行置1操作,所以就要确定该点所处的行地址、列地址。

MzL02-12864液晶显示模组的行地址实际上就是Page的信息,每一个Page应有8行;而列地址则表示该点的横坐标,在屏上为从左到右排列,Page中的一个Byte对应的是一列(8行,即8个点),达128列。

可以根据这样的关系在程序中控制LCD显示屏的显示。

3.2.3LCD的驱动方法

在很多资料以及书籍当中,通常介绍有两种LCD模块的连接方法:

直接控制和间接控制;直接控制实际指的是LCD模块的总线接口直接与MCU端口连接,然后MCU通过程序控制端口来模拟LCD的总线时序来完成对其的控制操作;而间接控制指的是MCU本身就有外部总线拉出,与LCD的总线接口对应的连接上,程序中直接操作总线以控制LCD。

目前有很多MCU都把总线密封起来了,都没有引出外部总线;所以通常在用MCU控制LCD模块时,时常会选择直接控制的方式,即利用端口来模拟总线时序;当然了,如果本身就有总线而且也与LCD模块的总线配得上的话,肯定会使用总线连接的间控方式。

本设计采用直接控制的方式,将MzL02D-12864LCD模块的总配置为6800总线,这与绝大部分引出外部总线的MCU的时序是不一样的。

本设计的LCD12864模块中,用户程序对其进行显示控制时,无非就是通过对LCD模块内部的驱动控制器当中的寄存器进行设置操作;最常用的如LCD的显示开/关、操作显存地址(行与列地址)的设置等。

这些寄存器一般都在LCD模块的驱动控制器文档中有详细介绍。

3.2.4LCD驱动程序架构

LCD12864驱动程序主要由LCD底层驱动和LCD功能函数两部分组成。

用户在应用层直接使用功能函数即可。

具体框架如图3-3所示。

功能函数声明

图3-3LCD驱动程序架构

Fig3-3LCDDriverarchitectures

3.3俄罗斯方块游戏设计

3.3.1俄罗斯方块游戏功能简介

俄罗斯方块游戏的规则很简单,当方块从屏幕上方落下来时,玩家控制方块的位置以及旋转方块,巧妙地安排布置达到充分利用屏幕空间的目的。

每当屏幕的一整行被方块排满时,作为奖赏,整行从屏幕上消失,剩余的方块依次往下降一行。

当方块堆积达到无法再落下方块的时候,游戏结束。

本设计中游戏主要的功能点包括:

(1)每4个小方块可以组合成一组方块群,游戏共有7种方块群,每次随机产生一种;玩家使用向左、向右、快速向下这些按键控制方块的位置,旋转按键控制方块顺时针旋转。

在主控制手柄上还有退出、暂停按钮,可以实现随时切换到启动时的状态和暂停游戏的功能。

(2)在本设计中,系统为玩家提供了背景音乐,玩家可以根据个人喜好开启或关闭音效。

(3)单人模式下,玩家使用主控制器进行操作。

每消去一行,系统就给玩家加1分。

在单人模式下,如果积分超过系统记录的最高积分,系统将更新最高积分。

(4)本设计的亮点是实现双人对战游戏,通过主控制器在菜单选项中选择双人模式,第二玩家可以通过副控制器对第二游戏界面进行操作。

本游戏系统规定,双人对战游戏中积分可分为两个阶段。

第一阶段是普通积分阶段,即双方玩家每消去一行,其相应积分表加1分;第二阶段是多积分阶段,即每消去三行才获得1个积分。

双方先达到第二阶段末尾者,即可取胜。

同时,该设计中还为双方玩家增加了道具功能,即当使用该功能时,可令对手当前移动图块消失,随机出下一个图块。

当玩家一次性消去三行,就能获得一次道具功能,最多一次性累积2个道具。

系统默认为每个玩家提供1个道具。

这样不仅丰富了俄罗斯方块游戏的功能,而且使其更具趣味性。

3.3.2系统界面的设计

(1)菜单选项界面

当玩家将本设计的作品上电启动后,系统首先在LCD显示器件上呈现一个动态的开机动画。

然后,系统提供三个功能选项,即最高积分、游戏设置、开始游戏。

其中,“游戏设置”选项包含了两级子菜单。

一级菜单包括“模式选择”和“音效选择”。

在这两个选项后面给出单字提示,以说明当前相应设置选项的状态。

“模式选择”菜单包含的二级子菜单有“单人模式”和“双人模式”。

“音效选择”菜单包含的二级子菜单有“开音效”和“关音效”通过控制按键即可设置成相应状态。

“最高积分”菜单选项为玩家提供单人模式下系统记忆的最高积分。

如果选择了“开始游戏”菜单选项,则系统根据“游戏设置”选项中的设置启动相应的游戏界面。

菜单选项界面框架如图3-4所示。

关音效

图3-4菜单选项界面框架

Fig3-4Themenuoptioninterfaceframework

(2)游戏操作界面

首先,我们先来介绍单人模式下游戏界面的一些情况。

在启动单人模式后,LCD12864显示屏分成两屏,左半屏为俄罗斯方块游戏地图——map区,右半屏为俄罗斯方块图形预览区和实时积分显示区。

其结构框架如图3-5所示。

积分显示

图3-5单人模式界面结构框架

Fig3-5Thesingle-playergameinterfacearchitecture

其次,如果玩家启动的是双人模式,LCD12864显示屏也分为两屏,左屏由主控器操作,称为map1区,右屏由副控制器操作,称为map2区。

在两屏中间是双方积分显示区和各自的道具数量显示区。

其结构框架如图3-6所示。

map1区

图3-6双人模式界面结构框架

Fig3-6Doublemodeinterfacearchitecture

系统界面整体程序流程图如图3-7所示。

……

图3-7开机界面功能框架

Fig3-7Bootinterfacefunctionframe

3.3.3游戏系统“枚举算法”概述

本文绕开了涩难懂、比较复杂的“矩阵算法”,提出了另一种“枚举算法”来实现这个经典游戏。

“枚举算法”没有复杂的数学理论、避免了在程序中大量使用矩阵运算公式,设计思路清晰、明了,非常适合游戏设计的初学者理解和实现。

所谓枚举算法,就是直接枚举出游戏中各图块的基本形状和它们的旋转形状,然后控制每一种不同形状的方块在游戏戏中的产生、移动、旋转、落下、填满和清除等游戏过程。

3.3.4俄罗斯方块造型设计的方法

众所周知,俄罗斯方块一般有七种基本形状,每个基本形状都由4个正方形的小方块构成。

利用小方块不同的摆放位置,可产生19种旋转型图块。

这七种图形分别是“I型”、“L型”、“反L型”、“Z型”、“反Z型”、“口型”、“T型”。

如图3-8所示。

口型

图3-8方块模型

Fig3-8Squaremodel

本系统在构造19个方块模型时的思路是:

定义一个数组,用以存储各个模型中4个小方块的顶点坐标。

比如L型,其数据结构为{0,0,0,4,0,8,4,8}。

其中,每两个数据为一个小正方形的列、行坐标,如图3-9所示。

由图可知,整个界面的坐标原点在左上角,分别向右、向下作为横轴的正方向和纵轴的正方向。

图中每一格代表了LCD12864中的连续四行,第1格的坐标是(0,0);第2格的坐标是(0,4);第3格的坐标是(0,8);第4格的坐标是(4,8);其它图块也按此方法编辑数组内容。

1

图3-9L型

Fig3-9LShape

3.3.5随机产生俄罗斯方块的方法

(1)产生随机数的理论依据

为了实现随机落下各类方块图形,游戏过程序中必须抽取随机数来确定方块的类型。

随机数是一个既简单又复杂的问题。

本设计采用众所周知的线性叠加法,虽然没有完美的方法产生随机数,不过线性叠加法是一个合适的方法,它彻底解决了8位机随机数的问题。

如果从一个足够长的数字序列中的某一个点取出一边串的数字,那么这些数字就看似随机。

这个开始的点(数字)叫做种子。

如果从相同的点(种子)开始,将会得到相同的数字,这是因为我们是从固定的序列中取数字(所以叫伪随机)。

但这却是一个有用的特性,我们可以每次从不同的点取数,即改变种子,从而可以实现真正的随机。

(2)“线性叠加法”的概况

“线性叠加法”其实只涉及二个内容即:

乘法和加法。

只需三个步骤即:

第一,为了取得新的种子,旧的种子与一个常数A相乘;第二,所得的结果和第二个常数C相加;第三,新的种子就是第二步结果的低32位。

保留低32位很重要,用来获得下一个种子。

计算公式为:

种子=A*种子+C(3-1)

此公式在几何图中表示为一条直线,而且新种子由旧种子反复相加得来,所以叫线性叠加。

随机函数的关键在于选择优秀的“常数A”(也叫乘数A),其实也就是选择了一个固定的数字序列。

“常数C”,不像乘数A那样重要,但是一定是个奇数。

事实上,C可选1。

因为奇数(旧的种子)乘奇数(乘数A)是奇数,再加奇数(常数C)将会是一个偶数学偶数(旧的种子)乘奇数(乘数A),加奇数(常数C)将会是一个奇数。

如此种子会在奇数和偶数之间转变。

因为种了的变化足够随机,所以种子的值可以作为8位或16位随机数。

(3)KeilC51中“线性叠加法”的实现方法

在KeilC51中生成伪随机数需要用到两个函数,一个是srand(unsignedintseed),一个是rand()。

首先给srand(unsignedintseed)提供一个种子,该种子为unsignedint类型,其取值范围从0到65536,srand(unsignedintseed)根据这个种子会由上述特定的公式生成一个随机数序列;然后调用rand(),它会依次从这个序列中返回一个数,其值在0到32767之间。

因随机数函数rand()函数实际上是线性随机的,如果在不指定srand(unsignedintseed)的种子的情况下,它每次都使用默认的种子,因此生成的序列会是同一个,所以会取到相同的数字序列。

这可能会导致每次重新运行游戏时其随机数结果都是一样的。

为了解决该问题,本设计在玩家进入游戏时读取按键按下瞬间定时器T0的计数值,作为srand(unsignedintseed)的种子。

从而实现真正的随机。

(4)随机数程序流程图

如图3-10为随机数程序流程图。

将返回值进行处理后选择相应的方块数组

图3-10随机数程序流程图

Fig3-10Ramdomprocessflowprogramdiagram

3.3.6俄罗斯方块平移的实现方法

方块产生后,需要用全局变量来保存方块在游戏map区中的行坐标和列坐标。

方块的平移包括左移和右移两种情况,无论那种情况都要首先进行合法性判断。

(1)俄罗斯

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1