版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
XX学院智能移动终端应用开发设计报告〔20XX/20XX学年第XX学期〕题目:基于Android系统的贪吃蛇游戏专业:小组成员:设计成绩:年月日摘要Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的操作系统。早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续对Android系统开发运营,它采用了软件堆层〔softwarestack,又名软件叠层〕的架构,主要分为三局部。底层Linux内核只提供根本功能,其他的应用软件那么由各公司自行开发,局部程序以Java编写。1工程背景说明针对当今游戏开发的流行趋势,游戏的设计已成为主流,随着计算机技术及硬件技术的不断开展,用户的需求量也越来越多,并且用户追求的效果也越来越好,在此形势下好的设计方法尤为重要,基于android系统的游戏设计方法简单且效率较高。贪吃蛇游戏也是很多人热衷的游戏,用户不仅要求其界面设计精美,更希望操作简单,程序执行速度快。Android支持使用Java作为编程语言来开发应用程序,而Android的Java开发方面从接口到功能,都有层出不穷的变化。考虑到Java虚拟机的效率和资源占用,谷歌重新设计了Android的Java,以便能提高效率和减少资源占用,因而与J2ME等不同。操作系统与应用程序的沟通桥梁,应用分为两层:函数层〔Library〕和虚拟机〔VirtualMachine〕。Android的中间层多以Java实现,并且采用特殊的Dalvik虚拟机〔DalvikVirtualMachine〕。Dalvik虚拟机是一种“暂存器型态”〔RegisterBased〕的Java虚拟机,变量皆存放于暂存器中,虚拟机的指令相对减少。贪吃蛇游戏是一款老牌的游戏,同时也是一款比拟需要耐心地游戏。贪吃蛇游戏就是一条小蛇,不停地在屏幕上游走,吃各个方向出现的食物,越吃越长。只要蛇头碰到屏幕四周,或者碰到自己的身子,小蛇就立即毙命。“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢送。本文基于Java技术和android开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。整个游戏程序分为三个功能模块,五个类模块,实现了游戏的开始、暂停、结束。通过本游戏的开发,到达学习android平台操作技术和熟悉软件开发流程的目的。2工程概述2.1设计的目的与意义贪吃蛇游戏是一款非常经典的游戏,贪吃蛇游戏的设计比拟复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。因此,在设计开发过程中,需要处理好各个类之间间的逻辑依赖关系和数据通信关系。正是因为如此,本次设计的目的在于学习Java程序设计根本技术,学习用android开发Java程序的相关技术,熟悉游戏“贪吃蛇”的需求,熟悉工程开发的完整过程。学会怎样进行一个工程的需求分析、概要设计、详细设计等软件开发过程,熟练地掌握Java程序设计的根本技术和方法,熟练地掌握android环境的使用方法,培养初步的工程分析能力和程序设计能力。2.2设计的主要内容贪吃蛇游戏设计与实现,主要分为以下三个模块:游戏主界面模块、游戏控制模块和游戏菜单模块。在此只实现游戏的游戏主界面模块、游戏控制模块和游戏菜单模块,并且只是实现开始、暂停、退出等最根本简单的功能。本次设计要到达的目标分别从以下模块进行阐述:〔1〕游戏菜单模块:这个模块主要是为进入游戏做准备,是进入游戏的第一步,提供“开始游戏”“游戏帮助”“退出游戏”等按钮,通过帮助按钮简单介绍游戏规那么。〔2〕游戏主界面模块:游戏的主界面是进入游戏后,能够给玩家第一感官的局部,主要包括游戏图形区域界面、游戏分数以及关卡的显示更新界面、提示退出游戏的快捷方式,游戏开始按钮、暂停游戏按钮以及退出游戏按钮。从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。〔3〕游戏控制模块:这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、退出,移动,加速等功能。为了能够给玩家一个很好的游戏环境,这局部应该做到易懂、易操作。2.3设计实现的主要功能本软件在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。〔1〕游戏主界面模块:主要包括游戏图形区域界面、游戏开始按钮、暂停游戏按钮、关闭按钮。游戏的主界面应该力求美观,爽心悦目。〔2〕游戏控制模块:主要完成控制游戏的开始、暂停、退出等功能,这局部应该做到易懂、易操作而且准确率高,不易出错。〔3〕游戏菜单模块:是进入游戏主界面的第一步,提供“游戏帮助”等功能。这局部使贪吃蛇游戏软件更加完善。游戏需求分析3.1需求分析用户的特点游戏开发成功后,最终用户为各个年龄段的人群,用户范围相当广泛。本游戏友好的用户界面,简单易学的按钮操作以及简单通俗的游戏规那么,使广阔的用户不需要专门进行培训,就可以立即学会如何使用。功能需求贪吃蛇是一款经典的游戏,一条蛇在封闭围墙里,通过按键盘上下左右四个键控制蛇向上下左右四个方向移动,如果蛇头撞倒食物,那么食物被吃掉,蛇身体长一节,同时记1分;假设吃到奖励苹果,加两分;假设吃到毒苹果,那么减3分。在游戏过程中,如果长按住方向键不放,那么蛇的移动速度加快,松开方向键,恢复原速。如果蛇在移动中撞到墙或障碍物或者蛇头撞倒自己身体,那么游戏结束!〔1〕游戏主界面模块需求游戏界面主框架主要包括游戏图形区域界面、游戏开始按钮、游戏暂停按钮、关闭按钮。〔2〕游戏图形区域界面的需求游戏画布区主要应该包括游戏画布中贪吃蛇随机出现的位置,贪吃蛇重新出现的位置,事物随机出现的位置。〔3〕游戏菜单模块的需求游戏菜单模块主要是为进入游戏主界面做准备,提供“游戏帮助”介绍游戏规那么。同时提供进入游戏和退出游戏等功能。属性需求在可使用性方面,要求各个功能实现简单,操作方便,系统处理正确;整个系统恢复性能好,连接速度快,以确保系统可使用性好。另外,还要求系统的可扩展性、可维护性、可移植性良好。3.2功能模块分析软件开发过程中的功能模块设计,主要解决实现该游戏需求的程序模块设计问题。包括如何把该游戏划分成假设干个模块、决定各个模块之间的接口、模块之间传递的信息,以及模块结构的设计等。游戏功能本系统主要完成以下几方面的功能:游戏控制功能——包括游戏的开始、暂停、退出。界面布局:其他辅助功能〔如游戏帮助,游戏积分,游戏过关等〕总设计模块的划分游戏总设计模块划分为游戏主要界面模块、游戏控制模块和游戏菜单模块。游戏主界面模块游戏主界面模块主要是指游戏的框图,其包括一下内容:1、游戏界面的边界,即游戏中的墙;2、游戏中蛇的构成,以及苹果的构成;3、游戏中障碍物的构成;4、游戏中分数显示以及关卡显示。游戏控制模块〔1〕游戏开始控制:我们的程序是使用上键开始游戏,启动游戏后会有一个初始菜单界面,我们点击“开始游戏”,弹出一句话“请按上键开始游戏”。游戏开始后蛇向下移动,然后由控制上下左右键来控制蛇的移动。在程序中我们重新建了一个activity来控制游戏的开始,使游戏的开始界面更美观。〔2〕游戏暂停控制:我们是使用center键来控制游戏的暂停的,这是一项人性化的设计,当玩家在游戏过程中突遇紧急情况时可以按center键暂停游戏,等玩家空闲后按center键可以继续游戏。〔3〕游戏退出控制:在游戏的退出上我们的程序使用了多种方式来应对不同的情况,当玩家正在游戏中时,如想退出可以按“1”键,程序会自动跳转到初始菜单界面,在初始菜单界面点击“退出游戏”即可退出游戏。如果玩家在游戏中由于碰到墙或者咬到自己或者碰到障碍物而导致游戏结束的,游戏或自动弹出一个界面,里面有提示是继续游戏还是退出游戏,当点击“取消”时,游戏就会自动跳转到初始菜单,再点击“退出游戏”即可。设计与实现具体实现过程分为以下3步:工程框架、游戏类图设计、界面设计。工程框架:新建一个Eclipse工程并命名为Snake,工程如下列图所示:图1Snake工程工程中包括4个Activity,分别为Snake〔主界面〕、Game〔游戏界面〕、Help〔游戏说明界面〕、AuthorView〔作者信息界面〕,通过不同Activity之间的转换实现不同界面之间的切换。游戏主界面如下列图所示:图2游戏主界面〔2〕游戏类图设计Game〔Activity〕继承了SnakeView类,SnakeView类继承了TileView类。TileView类继承了View。TiltView的基类是View,包含了贪吃蛇游戏画面的各个设定参数,主要负责绘制游戏画面。TileView类定义如下:publicclassTileViewextendsView{privatestaticfinalStringtag="yao";protectedstaticintmTileSize=20;//方格的边长protectedstaticintmXTileCount;//X轴上方格的个数protectedstaticintmYTileCount;//Y轴上方格的个数privatestaticintmXOffset;//绘图时X轴上的起始坐标privatestaticintmYOffset;//绘图时Y轴上的起始坐标privateBitmap[]mTileArray;//位图数组privateint[][]mTileGrid;//映射整个游戏画面的数组privatefinalPaintmPaint=newPaint();//画笔publicTileView(Contextcontext,AttributeSetattrs){super(context,attrs); Log.i(tag,"TileViewConstructor"); Log.i(tag,"mTileSize="+mTileSize); } //重置位图数组的长度publicvoidresetTiles(inttilecount){ mTileArray=newBitmap[tilecount]; } @Override //适应各种分辨率的屏幕,当改变屏幕大小尺寸时,同时修改tile的相关计数指标protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){ Log.i(tag,"onSizeChanged,"+"w="+w+"h="+h+"oldw="+oldw+"oldh="+oldh);mXTileCount=(int)Math.floor(w/mTileSize);mYTileCount=(int)Math.floor(h/mTileSize); Log.i(tag,"mXTileCount="+mXTileCount); Log.i(tag,"mYTileCount="+mYTileCount);mXOffset=((w-(mTileSize*mXTileCount))/2);mYOffset=((h-(mTileSize*mYTileCount))/2); Log.i(tag,"mXOffset="+mXOffset); Log.i(tag,"mYOffset="+mYOffset); mTileGrid=newint[mXTileCount][mYTileCount]; clearTiles(); } //这里做了一个Drawable到bitmap的转换publicvoidloadTile(intkey,Drawabletile){ Bitmapbitmap=Bitmap.createBitmap(mTileSize,mTileSize,Bitmap.Config.ARGB_8888); Canvascanvas=newCanvas(bitmap); tile.setBounds(0,0,mTileSize,mTileSize); tile.draw(canvas); mTileArray[key]=bitmap; }//清空图形显示publicvoidclearTiles(){ Log.i(tag,"TileView.clearTiles");for(intx=0;x<mXTileCount;x++){for(inty=0;y<mYTileCount;y++){ setTile(0,x,y); } } }//在相应的坐标位置绘制相应的砖块publicvoidsetTile(inttileindex,intx,inty){ mTileGrid[x][y]=tileindex; } //onDraw @Override//将直接操作的画布绘制到界面上publicvoidonDraw(Canvascanvas){ Log.i(tag,"onDraw");super.onDraw(canvas); Bitmapbmp;floatleft;floattop;for(intx=0;x<mXTileCount;x++){for(inty=0;y<mYTileCount;y++){if(mTileGrid[x][y]>0){ bmp=mTileArray[mTileGrid[x][y]]; left=x*mTileSize+mXOffset; top=y*mTileSize+mYOffset; canvas.drawBitmap(bmp,left,top,mPaint); } } } }}SnakeView类定义了游戏运行时的画面改变及蛇体和果子的更新方法。首先用Handler机制实现定时刷新,代码如下:classRefreshHandlerextendsHandler{//获取消息并处理 @OverridepublicvoidhandleMessage(Messagemsg){ SnakeView.this.update(); SnakeView.this.invalidate();//刷新view为基类的界面 Log.i(tag,"handleMessage|ThreadName="+Thread.currentThread().getName()); }//定时发送消息给UI线程,以此到达更新效果publicvoidsleep(longdelayMillis){this.removeMessages(0);//清空消息队列,Handler进入对新消息的等待 Log.i(tag,"sleep|ThreadName="+Thread.currentThread().getName()); //定时发送新消息,激活handler sendMessageDelayed(obtainMessage(0),delayMillis); } };定义SnakeView()函数初始化游戏,代码如下:publicSnakeView(Contextcontext,AttributeSetattrs){super(context,attrs); Log.i(tag,"SnakeViewConstructor"); initSnakeView();//构造函数中,初始化游戏 }定义initSnakeView()初始化SnakeView类,代码如下:privatevoidinitSnakeView(){ Log.e(tag,"initSnakeView"); //设置焦点,由于存在文字界面和游戏界面的跳转。这个focus是不可或缺的。 setFocusable(true); //取得资源中的图片,加载到砖块字典中。 Resourcesr=this.getContext().getResources(); resetTiles(4); loadTile(RED_STAR,r.getDrawable(R.drawable.redstar)); loadTile(YELLOW_STAR,r.getDrawable(R.drawable.yellowstar)); loadTile(GREEN_STAR,r.getDrawable(R.drawable.greenstar)); }此外还定义了updateWalls()、updateApples()、updateSnake()绘制墙、果子、蛇,以及更新画面函数、保存位置坐标函数等,具体代码请详见目录。〔3〕界面设计界面设计包括游戏主界面〔Snake〕、作者信息界面、游戏说明界面、游戏界面的设计。界面的设计采用的是xml文档形式,在xml文档中规划好界面布局布局后,分别在java文件中声明。主界面设计:主界面包括一个TextView、一个imagebutton、三个button,其main.xml文档如下:<?xmlversion="1.0"encoding="utf-8"?><AbsoluteLayoutxmlns:android="://schemas.android/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"android:background="@drawable/icon"> <LinearLayout android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"> <TextViewandroid:textColor="#ff3456ff"android:textSize="40sp"android:layout_height="wrap_content"android:visibility="visible"android:text="Snake"android:layout_width="wrap_content"android:id="@+id/text"android:gravity="center_horizontal"></TextView> <ImageButton android:visibility="visible" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ImageButton1"> </ImageButton> <Button android:id="@+id/Button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="visible"> </Button><Button android:id="@+id/Button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="visible"> </Button><Button android:id="@+id/Button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="visible"> </Button> </LinearLayout></AbsoluteLayout>其对应的Snake.java文件如下:publicclassSnakeextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);initialstart();//初始化}publicvoidinitialstart(){ ImageButtonimageButton=(ImageButton)this.findViewById(R.id.ImageButton1); Buttonbutton1=(Button)this.findViewById(R.id.Button1); Buttonbutton3=(Button)this.findViewById(R.id.Button3); Buttonbutton5=(Button)this.findViewById(R.id.Button5);button1.setText("作者信息");button3.setText("退出");button5.setText("游戏说明");imageButton.setImageResource(R.drawable.icon1);//按钮注册到各自的监听器imageButton.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewview){ Intentintent=newIntent();intent.setClass(Snake.this,Game.class);startActivity(intent);//跳转到Game界面Snake.this.finish();}});button1.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewview){//setContentView(R.layout.author); Intentintent=newIntent();intent.setClass(Snake.this,AuthorView.class);startActivity(intent);//跳转到作者信息界面Snake.this.finish();//注销跳转之前的界面}});button3.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewview){Snake.this.finish();//退出应用程序}});button5.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewview){ Intentintent=newIntent();intent.setClass(Snake.this,Help.class);startActivity(intent);//跳转到游戏说明界面Snake.this.finish();}});}}游戏界面设计:游戏界面包括一个button,一个my.game.snake.SnakeView,其game.xml文档如下:<?xmlversion="1.0"encoding="utf-8"?><FrameLayoutxmlns:android="://schemas.android/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> android:id="@+id/snake" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/background"/> <RelativeLayoutandroid:layout_height="fill_parent"android:id="@+id/relativeLayout1"android:layout_width="fill_parent"> <TextViewandroid:layout_width="wrap_content"android:textColor="#ff8888ff"android:textSize="24sp"android:visibility="visible"android:text="开始"android:layout_centerInParent="true"android:id="@+id/text"android:layout_height="wrap_content"android:gravity="center_horizontal"></TextView> <Buttonandroid:layout_width="wrap_content"android:text="返回"android:id="@+id/button4"android:layout_height="wrap_content"android:layout_alignParentBottom="true"></Button> </RelativeLayout></FrameLayout>相对应的Game.java文件如下:publicclassGameextendsActivity{ //定义游戏参数privateSnakeViewmSnakeView;privatestaticStringICICLE_KEY="snake-view";privateintmMode=READY;publicstaticfinalintPAUSE=0;publicstaticfinalintREADY=1;publicstaticfinalintRUNNING=2;publicstaticfinalintLOSE=3; @OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.game);mSnakeView=(SnakeView)findViewById(R.id.snake);//设置界面背景mSnakeView.setBackgroundResource(R.drawable.background);TextViewtv=(TextView)findViewById(R.id.text);Buttonbutton4=(Button)this.findViewById(R.id.button4);//根据TextView状态判断是否开始游戏mSnakeView.setStatusTextView(tv);if(savedInstanceState==null){ mSnakeView.setMode(SnakeView.READY); }else{ Bundlebundle=savedInstanceState.getBundle(ICICLE_KEY);if(bundle!=null){ mSnakeView.restoreState(bundle); }else{mSnakeView.setMode(SnakeView.PAUSE); } }//按钮注册到监听器button4.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewview){ Intentintent=newIntent();intent.setClass(Game.this,Snake.class);startActivity(intent);Game.this.finish();}});} //设置键盘监听事件,假设按下UP键那么开始游戏publicbooleanonKeyDown(intkeyCode,KeyEventmsg){if(keyCode==KeyEvent.KEYCODE_DPAD_UP){if(mMode==READY|mMode==LOSE){ mSnakeView.initNewGame(); mSnakeView.setMode(RUNNING); mSnakeView.update();return(true); } }returnsuper.onKeyDown(keyCode,msg); } //判断游戏状态是否为暂停protectedvoidonPause(){super.onPause();//PausethegamealongwiththeactivitymSnakeView.setMode(SnakeView.PAUSE);} @Override //保存事件状态publicvoidonSaveInstanceState(BundleoutState){outState.putBundle(ICICLE_KEY,mSnakeView.saveState()); }}作者信息界面设计:此界面包括一个TextView、一个button,其author.xml文档如下:<?xmlversion="1.0"encoding="utf-8"?><ScrollViewxmlns:android="://schemas.android/apk/res/android"android:layout_x="0dip"android:id="@+id/scrollView1"android:background="@drawable/background1"android:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_y="4dip"><AbsoluteLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><TextView//android:id="@+id/text"//android:text="姓名:性别:学院:" android:visibility="visible" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scrollbars="vertical"android:textSize="34dip"/><Buttonandroid:layout_width="wrap_content"android:text="返回"android:visibility="visible"android:layout_height="wrap_content"android:id="@+id/Button2"android:layout_x="269dip"android:layout_y="322dip"></Button></AbsoluteLayout></ScrollView>相对应的AuthorView.java文件如下:publicclassAuthorViewextendsActivity{ @OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.author);Buttonbutton2=(Button)this.findViewById(R.id.Button2);//按钮注册到监听器 button2.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewview){ Intentintent=newIntent();intent.setClass(AuthorView.this,Snake.class);//跳转到主界面startActivity(intent);//注销当前界面AuthorView.this.finish();} }); } }游戏说明界面设计:此界面包括一个TextView、一个button,其help.xml文档如下:<?xmlversion="1.0"encoding="utf-8"?><ScrollViewxmlns:android="://schemas.android/apk/res/android"android:layout_x="0dip"android:id="@+id/scrollView1"android:background="@drawable/background2"android:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_y="4dip"><AbsoluteLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><Buttonandroid:layout_width="wrap_content"android:text="返回"android:visibility="visible"android:layout_height="wrap_content"android:id="@+id
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度:数字产品交易条款3篇
- 二零二四年度广告投放合同标的媒体选择及投放时间2篇
- 燃煤企业危化品储存与使用手册
- 配件团队协作管理
- 2024年度汉中房地产开发合同2篇
- 2024年版权分销许可3篇
- 2024年酒店式公寓租赁返租合同3篇
- 2024年岗亭生产与交付合同3篇
- 商场物业2024年维修保养合同
- 房屋合同变更协议(2024版)2篇
- 小学英语合作学习的有效性策略研究调查报告
- 建设项目安全设施“三同时”
- 《骨科专科知识》PPT课件.ppt
- 校田径运动会裁判工作方法简介_ppt课件
- 各类人员绩效考核评价表
- 《包公审驴》课件ppt
- 亚马逊发票模板-(适用于亚马逊各个站点)
- 电动机检修方案.doc
- 燃气公司安全管理奖罚办法
- 呼吸类医学交流课件:慢阻肺急性加重的诊断与治疗
- 普通生物学24人类基因组
评论
0/150
提交评论