收藏 分销(赏)

俄罗斯方块游戏系统设计(含程序).doc

上传人:可**** 文档编号:2381396 上传时间:2024-05-29 格式:DOC 页数:41 大小:528.50KB
下载 相关 举报
俄罗斯方块游戏系统设计(含程序).doc_第1页
第1页 / 共41页
俄罗斯方块游戏系统设计(含程序).doc_第2页
第2页 / 共41页
俄罗斯方块游戏系统设计(含程序).doc_第3页
第3页 / 共41页
俄罗斯方块游戏系统设计(含程序).doc_第4页
第4页 / 共41页
俄罗斯方块游戏系统设计(含程序).doc_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、 毕业设计(论文)正文题 目俄罗斯方块游戏专 业班 级姓 名学 号指导教师职 称俄罗斯方块游戏摘要: 在现代信息高速发展的时代,电子游戏已经深入了人们的日常生活,成为了老少咸宜的娱乐方式,但是游戏设计结合了日新月异的技术,在一个产品中整合了复杂的艺术,设计,声音和软件,所以并不是人人皆知,直到今天,在中国从事游戏设计的人仍然很少,但是游戏行业的发展之快,远超如汽车,家电等传统行业,也正因为如此,游戏人才的教育培养远落后于行业的发展。 俄罗斯方块是一个老少咸宜的小游戏,它实现有四个正方形的色块组成,然后存储于一个数组的四个元素中,计算机随机产生七种不同类型的方块,根据计算机时钟控制它在一定的时间

2、不停的产生,用户根据键盘的四个方向键进行向左,向右,向下,翻转操作。然后程序根据这七种方块折叠成各种不同的类型。 论文描述了游戏开发的背景,意义,算法分析,功能实现,功能测试。以C+为开发语言进行设计与实现。关键词:电子游戏,算法,C+,测试The Russian square piece Abstract : In the era of high-speed development of electronic of information, computer game has enter peoples daily life, become an amusement adapt to old

3、 and young. But game design is a combination of fast-moving technology ,the complexity of integrating design,art,audio and software into a single production,so this thechnology isnt known by everyone .up-to-date,there are few people work at game design all the same,whereas,thedevelopment of game ind

4、ustry more faster than traditional industry as home appliances and automobile,by the reason of this situation,the education and training of person with ablity of game design drop behind the development of game industry. The Russian square piece is a get-away drama with all proper old young ,it carry

5、 out to be constitute by four pieces of colours of exact square piece ,then save in one four chemical elements of the piece set ,random creation dissimilarity of calculator seven the square piece of the category type ,control it according to the calculator clock in certain time continuously creation

6、 , the customer is inside out according to four directions key control of the keyboard ,to left ,rightwards and get down ,(the realization of the control key is to be carry out by the event handing of the direction key of the keyboard) Then the procedure pileds according to these seven kinds of squa

7、re pieces various different model. The thesis has described the game history ,has developed this game history ,has developed this game environment, development significance of game .Knowledge abiding by a software engineering ,definition begins from software problem ,proceed to carry out feasibility

8、 study ,need analysis ,essentials design,the at last has carried out a testing on the software engineering knowledge hierarchy .The computer games design and practice are designed o eclipse developing platform with C+ developing instrument ,under Microsoft Windows XP system this time.Key Words: elec

9、tronic game calculate way C+ test目 录1引言11.1课题背景11.2毕设意义22需求与算法分析32.1需求分析32.1.1 游戏需求32.1.2游戏界面需求42.1.3 游戏形状(方块)需求42.2算法分析52.2.1定义方块的数据结构52.2.2俄罗斯方块流程53系统功能实现73.1产生主窗口73.2定义俄罗斯方块数据结构83.3游戏的主逻辑93.4销行功能实现113.5中断操作流程的实现133.6变形的实现153.7 游戏区域绘图的实现163.8 游戏方块绘制203.9 烟花燃放功能224功能测试244.1测试环境244.2图像功能测试244.3销行和计分

10、功能测试274.4速度功能测试285总结29参考文献30致谢31装订线 毕业设计俄罗斯方块的程序设计1引言计算机游戏产业在随着网络的发展有了长足的发展。游戏最早起源于纯文字的交互游戏MUD,MUD是英文Multi-user Dungeons的缩写。纯文字交互,顾名思义,是一纯文字的形式来进行游戏。即,所有的场景描述、物品的样子、所有人的行动、时间的描述都是用文字的方式表达的。总之,文字MUD是一个很需要想象力的游戏形式,需要从文字转化成玩家自己脑海中的现实场景。随着电子元器件的发展,电子产品迅速发展。掌上游戏机和电视游戏机在80年代和90年代风靡一时,此时由苏联人Alex Pajitnov制作

11、的游戏俄罗斯方块在掌上游戏机和电视游戏机上流行,其造成的轰动和经济价值成为游戏史上的大事。所以本文通过用C+实现俄罗斯方块学习游戏的整个设计和测试过程,学习用基于Windows的游戏程序设计。1.1课题背景 俄罗斯方块是个老幼皆宜的小游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键的消息函数实现)。然后程序根据这七种方块堆叠成各种不同的模型。基于Windows的游戏设计有很多方式,如基于java跨平台的设计,基于

12、.net平台的设计和基于MFC的设计,三种设计各有优缺。基于java的设计能够充分运用java跨平台的特性,便于移植,可以做到一次代码在不同环境下的运行,从而大大提高可移植性,便于在移动设备上运行,但是基于java的设计由于运行在虚拟机上,效率比较低。基于.net平台的设计可以利用.net平台提高的接口大大简化设计过程,然而其通用性不好,需要.net平台支持,在执行效率上也不如MFC程序。基于MFC的程序设计具有执行高效的特点,跟windows的契合比较好,但不具有跨平台能力。 相比三种设计方案,为了能够在Windows平台上以更好的性能运行,本文采用VC+基于MFC的设计,来完成俄罗斯方块的

13、游戏。 1.2毕设意义此次毕设通过用C+设计与实现俄罗斯方块游戏。包括系统的需求分析;系统总框图及每个模块的设计分析;MFC应用程序架构;框架的扩展;算法的设计与实现;游戏的内部实现;游戏区域绘图的实现;系统存在的问题及错误处理;以及游戏的测试和改进。通过此次毕业设计,我对软件设计的过程有了清晰的认识,通过编写游戏的各个方面工作学习了设计思想,程序架构,数据结构和算法,同时也对windows程序设计特别是基于MFC的程序设计有了直观的认识。通过游戏的测试学习到了常用的测试过程,测试方法。2需求与算法分析2.1需求分析2.1.1 游戏需求功能性需求如下:随机给出不同的形状(长条形、Z字形、反Z形

14、、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,若同时消去两行以上则会放烟花来庆祝,游戏可以设置难度,难度主要由方块的下降速度决定,下降速度越大难度越大,若在游戏中各形状填满了给定区域,为输者。如下表(表2.1)为游戏功能性需求表。功能 简介 顺时针旋转顺时针旋转转块逆时针旋转逆时针旋转转块绘制转块指定画板上绘制转块擦除矩形指定画板上擦除矩形右移动右移动转块左移动左移动转块下移动下移动转块丢下转块在画板上丢下转块燃放烟花在面板内根据一次得分多少燃放烟花计分根据用户消去的行数计分表2.1示例作为玩家,玩家可以控制难度,查看帮助等,对于操作性的需求如下: 玩家可以自己

15、来控制方块下落的速度。 玩家可以自己来控制游戏的难度。 玩家可以看到游戏的积分。 对本游戏有帮助说明和作者介绍等2.1.2游戏界面需求良好的用户界面,有提示显示和分数显示。让方块在一定的区域内运动和变形,该区域用一种颜色表明,即用一种颜色作为背景,最好设为黑色。还需用另一种颜色把黑色围起来,宽度适中,要实现美感。将整体界面分为三部分:左侧半部分用来存放俄罗斯方块,是游戏的活动区,用户操作的图形变化在这个主界面区完成。右上侧部分显示下一次要产生的俄罗斯方块形状,以便用户预先知道,增加游戏的可玩性。右侧下半部分用来显示用户的分数和当前等级,以便让用户有成就感增加可玩性。如图为整体的界面设计需求效果

16、,将整个界面分成了三部分,显得简易清爽,作为用户界面让玩家感觉比较舒服得体。如图2.1所示:图2.1示例2.1.3 游戏形状(方块)需求良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆 时针变形,一般为逆时针。为了使游戏更加美观更具可玩性,在绘制方块的过程中不采用默认的绘制方式,而是用经过处理的图片效果,这样让组成的方块更加美观,同时彩色的方块也让人赏心悦目,增加了游戏的可玩性。下图(图2.2)就是用来拼接方块颜色的样板色。图2.2示例由图可见这种带有实体效果的方块比一般的二维方块更具立体效果,更美

17、观,会更吸引玩家。2.2算法分析2.2.1定义方块的数据结构对于方块在某一瞬间的位置标识,我们采用一个42的小数组标识出来,即用4个存储单位空间存储当前下坠物的每一子块的位置,也就是说,用4个存储单位空间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个典的坐标值(x,y),而每个方块按照从左到右的方式进行编号,并且在编号过程中对于同一列的方块实行从上到下进行编号 。如图2.3所示:(x0,y0)(x1,y1)(x2,y2)(x3,y3)2301(x0,y0)(x1,y1)(x2,y2)(x3,y3)0123方块编号图2.3示例方块表示方法,即四个小方块

18、的坐标设定:其中一个方块是原点,坐标为(0,0);右侧方块坐标(1,0),下面的方块坐标(0,1),以此类推。 如下为程序中定义的各种方块的数据结构定义。 2.2.2俄罗斯方块流程俄罗斯方块流程(图2.4):到达底部游戏结束到达底部结束销行操作生成下一个下坠物将新生的下坠物代替旧的“下一个下坠物“将旧的“下一个下坠物”用作当前 下坠物销行操作游戏结束处理下降一个单位开始图2.4示例如图中所示是俄罗斯方块的处理流程,从开始判断是否到底底部,到达则做销行操作,然后生成下一个下坠物,将新的下坠物代替旧的下一个下坠物,将旧的下坠物当做当前的下坠物,下到底部判断是否做销行操作,然后判断游戏是否结束,未结

19、束则继续新一轮的生产方块,若方块达到了顶部,占满了空间则游戏结束。 3系统功能实现3.1产生主窗口通过InitInstance函数来初始化窗口的各个信息,包括窗口的位置,位图信息按钮和时钟初始化等。InitInstance函数的实现如下,程序首先调用CreatWindow函数创建初始窗口句柄,然后设置窗口显示坐标,将窗口居中,用空的位图来初始化使界面内都是是空的。定义好窗口和时钟最后讲窗口显示出来。BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)HWND hWnd;int x,y;hInst = hInstance; / Store in

20、stance handle in our global variablehWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd)return FALSE; /窗口居中, 高度包含标题栏的30x=GetSystemMetrics(SM_CXSCREEN);y=GetSystemMetrics(SM_CYSCREEN);MoveWindow(hWnd,(x-GAMEWIDTH)/

21、2,(y-GAMEHEIGHT-30)/2,GAMEWIDTH,GAMEHEIGHT+30,false);/设置dchdcwindow=GetDC(hWnd);hdcmem=CreateCompatibleDC(hdcwindow);hdccanvas=CreateCompatibleDC(hdcwindow);/用空位图初始化DChmapnull=CreateCompatibleBitmap(hdcwindow,GAMEWIDTH,GAMEHEIGHT);SelectObject(hdccanvas,hmapnull);SelectObject(hdcmem,hmapnull);/位图初始化

22、bmStart.Init(hInstance,IDB_BITMAP_START);bmStart.SetDevice(hdccanvas,hdcmem);bmStart.InitSizeList(1,PICW,PICH);bmBack.Init(hInstance,IDB_BITMAP_BACK);bmBack.SetDevice(hdccanvas,hdcmem);bmBack.InitSizeList(1,200,200);bmSquare.Init(hInstance,IDB_BITMAP_SQUARE);bmSquare.SetDevice(hdccanvas,hdcmem);bmSq

23、uare.InitSizeList(5,22,22);bmBomb.Init(hInstance,IDB_BITMAP_BOMB);bmBomb.SetDevice(hdccanvas,hdcmem);bmBomb.InitSizeList(5,22,22,1);/按钮mybutton.Init(hInstance,IDB_BITMAP_BUTTON);mybutton.SetDevice(hdccanvas,hdcmem);mybutton.InitButton(6,BtRect);/按钮myclock.Init(hWnd,TIME_INFO);/时钟srand(unsigned)time(

24、NULL);/初始化随机函数/ 显示窗口ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;3.2定义俄罗斯方块数据结构俄罗斯方块通过坐标来实现,其数据结构如下:/每四个点,表示一种方块/(一维,二维都可以做)POINT gl_square28=/方形0,0,1,0,0,1,1,1,/长条0,-1,0,0,0,1,0,2,/Z-1,-1,0,-1,0,0,1,0,/Z-1,1,0,1,0,0,1,0,/L-1,-1,-1,0,0,0,1,0,/L-1,0,0,0,1,0,1,-1,/-1,0,0,0,1,0,0,-1,;3.3游戏

25、的主逻辑 将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此需要对它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。而判断是否已经到达了底部,可以通过当前下坠物件所对应的接触面的方块位置为被占用状态来确定,利用数组记录17种下坠物的14种形态的接触面信息。统计分数:在消行处理里面有一个专门用来统计消行数的变量,然后根据变量的值决定分数的多少,程序统计分数是:消一行得10分,同时消2行得30分,消得3行得60分,消得4行得100分。如果总分数达到过关条件就过关,改变游戏速度。没有达到过关分数或者没有满行,则加载下一个方块继续游戏。如图3.1所示:是否堆积方块,

26、判断接触面状态及是否得分2.统计分数判断是否过关关数增加,游戏速度将变快。调用游戏速度模块增加游戏速度视图重绘(InvalidateView())1.判断行满、处理销行、堆积方块向下移动图3.1示例以下为实际代码中游戏的主要逻辑检测函数Checkgame的代码部分,根据系统的状态确定是否生产新的方块还是移动当前方块直到其落到底部判断是否该销行,进行下次的循环。if(INVALID=squareNow.id)/如果没有当前移动的方块/生成当前方块memcpy(&squareNow,&squareNext,sizeof(squareNext);squareNow.pos.x=4;squareNow

27、.pos.y=0;iTime=0;if(!CanMove()/如果新生成的方块无法移动,失败iState=GAME_FAIL;myclock.ReStart(TIME_FAIL);/生成下一个CreateNext();else/移动当前方块iTime+;if(iTime=12-iSpeed)iTime=0;if(!CanMove()/清除当前方块squareNow.id=INVALID;/写入数组PutSpare();elsesquareNow.pos.y+;3.4销行功能实现当俄罗斯方块占满了空间内的一块或者多行时,系统就该消去一行,同时给用户相应的得分,当用户得分达到20分以上时则根据分数

28、等级给予用户烟花表演以示鼓励。用户游戏空间有19行,10列,每次判断销行时从最低行开始判断是否十列都被俄罗斯方块填满,填满则清楚该行然后循环判断。其代码如下。void GAMEBOX:ClearRow()int i;int m,n;/行列int iNum;int iScoreRow=0,10,30,60,100;/分值,1行10分,2行30,3行60,4行100int iRow;/消去多少行iRow=0;/第19行,是最底一行for(m=19;m0;m-)iNum=0;for(n=0;n0;i-)/移动memcpy(gamemapi,gamemapi-1,10*sizeof(int);mems

29、et(gamemap0,0,10*sizeof(int);m+;/重要,再次检测这一行if(iNum=0)/空行,不再判断break;/以下代码会根据消去的行数,判断是否然后烟花,以及燃放烟花的级数。iScore+=iScoreRowiRow;/增加分数if(iRow=2)/消除两行以上BeginBomb(iRow);3.5中断操作流程的实现(1) 处理键盘事件关于按键命令消息的响应,可以通过对WM_KEYDOWN消息的处理函数进行截获并重写来实现,下面是对该处理函数KeyProc。根据输入的字符选择适当的操作。void GAMEBOX:KeyProc(int iKey)/只有游戏进行中,才响

30、应按键if(iState!=GAME_IN)return;switch(iKey)case VK_UP:Rotate();break;case VK_LEFT:MoveLeft();break;case VK_RIGHT:MoveRight();break;case VK_DOWN:MoveDown();break;以上就是在输入上下左右键时要做的操作,程序会根据键盘输入选择是向哪移动。以下为一些功能键输入后的反应,如输入F2可燃放2级的烟花,输入F3可燃放3级烟花,输入F4可燃放4级烟花。按F12可以加快游戏的速度,按ESC可以退回到主菜单然后退出游戏。case KEY_F2:BeginBo

31、mb(2);break;case KEY_F3:BeginBomb(3);break;case KEY_F4:BeginBomb(4);break;case KEY_F12:if(iSpeed9)iSpeed+;break;case VK_ESCAPE:iState=GAME_MENU;break;default:break;3.6变形的实现当按下向上键时,将会执行方块变化事件(change())。常见的方块有7种(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),所有图形都是用两个一维数组来统计它的横坐标和纵坐标,每个方块有4种不同的变化形状。void GAMEBOX:Rotate(

32、)int i;int m,n;/行列int iCan=1;int temp;/正方形不旋转if(ID_SQAURE=squareNow.id)return;for(i=0;i4;i+)/旋转后的小块坐标/旋转公式(x,y)旋转90度变为(-y,x),再加上当前位置m=squareNow.pos.y+squareNow.chipi.x;n=squareNow.pos.x-squareNow.chipi.y;if( n9| m19| VALID=gamemapmn)iCan=0;break;if(iCan)for(i=0;i4;i+)temp=squareNow.chipi.x;/旋转后的小块坐标

33、squareNow.chipi.x=-squareNow.chipi.y;squareNow.chipi.y=temp;3.7 游戏区域绘图的实现首先将外部位图文件square.bmp中的位图动态导入(映射)到内存位图里面,根据游戏区域中的二维数组中的内部数据将所有数据状态中为被占用状态的小方块区域用指定的小方块图样类型来填充,然后将已经绘制好的游戏区域图像一次性的拷贝到与屏幕关联的设备环境中,从而达到屏幕的显示。程序中通过MYBITMAP类来实现游戏区域的绘图工作,以下代码为MYBITMAP类中显示函数Show和ShowNoBack函数。void MYBITMAP:Show(int id,i

34、nt x,int y)SelectObject(hdcsrc,hBm);BitBlt(hdcdest,x,y,wlistid,hlistid,hdcsrc,0,ylistid,SRCCOPY);void MYBITMAP:ShowNoBack(int id,int x,int y)SelectObject(hdcsrc,hBm);BitBlt(hdcdest,x,y,wlistid,hlistid,hdcsrc,0,ylistid+hlistid,SRCAND);BitBlt(hdcdest,x,y,wlistid,hlistid,hdcsrc,0,ylistid,SRCPAINT);游戏的主

35、要逻辑类GAMEBOX中定义了游戏的基本数据状态结构,用来定义游戏的显示状态,游戏中根据显示状态的不同显示不同的界面程序。/游戏数据/基本数据enum eGameStateGAME_INFO,GAME_MENU,GAME_MENU_HELP,GAME_MENU_SET,GAME_LOAD,GAME_IN_PRE,GAME_IN,GAME_WIN,GAME_ITEM,GAME_FAIL,GAME_PASS;根据上面定义的游戏状态值,在GAMEBOX类中用类方法Show来显示不同状态下的程序,其具体实现如下,程序用Switch语句判断当前的状态值,然后根据状态进行相应的操作。void GAMEBO

36、X:Show()int i;switch(iState)case GAME_INFO:/黑色背景SelectObject(hdccanvas,hBrush);SelectObject(hdccanvas,hPen);Rectangle(hdccanvas,0,0,GAMEWIDTH,GAMEHEIGHT);bmStart.Stretch(PIC0,30,100,GAMEWIDTH-60,GAMEHEIGHT-200);/第一秒 从左至右显示图片if(iAni=25)i=25-iAni;Rectangle(hdccanvas,GAMEWIDTH-i*i,0,GAMEWIDTH,GAMEHEIGH

37、T);/按平方公式变化break;case GAME_MENU:bmBack.Stretch(PIC0,0,0,GAMEWIDTH,GAMEHEIGHT);/显示按钮mybutton.HideAll();mybutton.Show2(BT_START);mybutton.Show2(BT_HELP);mybutton.Show2(BT_SET);break;case GAME_MENU_HELP:bmBack.Stretch(PIC0,0,0,GAMEWIDTH,GAMEHEIGHT);mybutton.HideAll();mybutton.Show2(BT_OK);ShowHelp();br

38、eak;case GAME_MENU_SET:bmBack.Stretch(PIC0,0,0,GAMEWIDTH,GAMEHEIGHT);mybutton.HideAll();mybutton.Show2(BT_LEFT);mybutton.Show2(BT_RIGHT);mybutton.Show2(BT_OK);ShowSet();break;当游戏进入界面后,游戏界面的显示如下将游戏界面分成3个部分,用黑色部分显示背景,然后在右上角显示下一次产生的俄罗斯方块,右下角显示分数和速度等。case GAME_IN:/黑色背景SelectObject(hdccanvas,hBrush);Sele

39、ctObject(hdccanvas,hPenWhite);Rectangle(hdccanvas,0,0,GAMEWIDTH,GAMEHEIGHT);/Rectangle(hdccanvas,20,18,244,462);Rectangle(hdccanvas,LEFT_RECT_X,LEFT_RECT_Y,242,460);/右上角Rectangle(hdccanvas,RIGHT_RECT_X,RIGHT_RECT_Y,RIGHT_RECT_X+132, RIGHT_RECT_Y+132);ShowInfoNow();/分数,速度文字ShowSquare();/方块ShowBomb();

40、/特效break;3.8 游戏方块绘制一个游戏方块被定义成一个MYBITMAP的对象,在俄罗斯方块定义位图对象bmSquare,然后通过对bmSquare的相关操作来达到达到绘图的目的,GAMEBOX类通过调用ShowSquare来显示方块,首先显示在右上角的方块,定义好原始坐标后,通过方块位图对象bmSqure调用MYBITMAP类的show方法绘制方块坐标。void GAMEBOX:ShowSquare()int i;int x0,y0;/坐标原点int m,n;/右上角显示下一个x0=RIGHT_RECT_X+2*ITEM_EDGE;y0=RIGHT_RECT_Y+2*ITEM_EDGE

41、;for(i=0;i4;i+)bmSquare.Show(squareNext.icolor,x0+squareNext.chipi.x*ITEM_EDGE,y0+squareNext.chipi.y*ITEM_EDGE);绘制完右上角的方块后则继续绘制当前移动的方块,定义方块的初始坐标,判断方块是否在界面内如果方块在界面内则显示。/当前移动的方块x0=LEFT_RECT_X+squareNow.pos.x*ITEM_EDGE;y0=LEFT_RECT_Y+squareNow.pos.y*ITEM_EDGE;if(squareNow.id!=INVALID)for(i=0;i=0)bmSquare.Show(squareNow.icolor,x0+squareNow.chipi.x*ITEM_EDGE,

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服