版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 南昌航空大学嵌入式报告课程名称:Android移动应用设计与开设计名称:贪食蛇游戏学院:信息工程学院 班级: 学号: 姓名:- II - 目 录§1 系统描述11.1 本设计的目的和意义11.2 设计的主要内容11.4 设计实现功能和目标21.5游戏设计环境3§2 游戏需求分析32.1 游戏处理流程32.2 需求分析42.3 功能模块设计62.4 类模块设计72.5 游戏图形界面的图形显示更新功能8§3 游戏的基本实现83.1 GameConstants地图和移动93.2 Operator类103.3 Block类173.4 GameActivity类183.5
2、 Menu菜单Activity253.6 Welcome欢迎菜单313.7 GameView自定义的View控件333.8 Food 食物类37§4运行结果38§5总结41- 41 - 基于手机android平台的 “贪吃蛇”的设计和实现内容提要: “贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本文基于Java技术和android开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。整个游戏程序分为三个功能模块,五个类模块,实现了游戏的开始、暂停、结束。通过本游戏的开发,达到学习android平台操作技术和熟悉软件开发流程的目的。§
3、;1 系统描述1.1 本设计的目的和意义 贪吃蛇游戏是一款非常经典的手机游戏,贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。因此,在设计开发过程中,需要处理好各个类之间间的逻辑依赖关系和数据通信关系。正是因为如此,本次设计的目的在于学习Java程序设计基本技术,学习用android开发Java程序的相关技术,熟悉游戏“贪吃蛇”的需求,熟悉项目开发的完整过程。学会怎样进行一个项目的需求分析、概要设计、详细设计等软件开发
4、过程,熟练地掌握Java程序设计的基本技术和方法,熟练地掌握android环境的使用方法,培养初步的项目分析能力和程序设计能力。 1.2 设计的主要内容贪吃蛇游戏设计与实现,主要分为以下三个模块:游戏主界面模块、游戏控制模块和游戏菜单模块。在此只实现游戏的游戏主界面模块、游戏控制模块和游戏菜单模块,并且只是实现开始、暂停、退出等最基本简单的功能。本次设计要达到的目标分别从以下模块进行阐述:(1)游戏菜单模块:这个模块主要是为进入游戏做准备,是进入游戏的第一步,提供“开始游戏”“游戏帮助”“退出游戏”等按钮,通过帮助按钮简单介绍游戏规则。(2)游戏主界面模块:游戏的主界面是进入游戏后,能够给玩家
5、第一感官的部分,主要包括游戏图形区域界面、游戏分数以及关卡的显示更新界面、提示退出游戏的快捷方式,游戏开始按钮、暂停游戏按钮以及退出游戏按钮。从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。(3)游戏控制模块:这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、退出,移动,加速等功能。为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。 1.4 设计实现功能和目标本设计所开发的是基于android手机平台的一个贪吃蛇游戏软件,主要实现游戏的开始、暂停、退出等功能,分为: 游戏主界面模块、游戏控制模块和游戏菜单三个模块。性能:本软件在设计方面本着方
6、便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。(1)游戏主界面模块:主要包括游戏图形区域界面、游戏开始按钮、暂停游戏按钮、关闭按钮。游戏的主界面应该力求美观,爽心悦目。(2)游戏控制模块:主要完成控制游戏的开始、暂停、退出等功能,这部分应该做到易懂、易操作而且准确率高,不易出错。(3)游戏菜单模块:是进入游戏主界面的第一步,提供“游戏帮助”等功能。这部分使贪吃蛇游戏软件更加完善。1.5游戏设计环境android模拟器,模拟实现手机上的贪吃蛇游戏开发。软件包括: android-sdk eclipse jdk-6u10-rc2-b
7、in-b32-windows-i586-p-12_sep_2008§2 游戏需求分析2.1 游戏处理流程 本次游戏设计的处理流程图如下所示。开始初始化界面和蛇身放置食物蛇开始运动蛇吃到食?蛇长大蛇死亡?继续续?退出界面NNYNY游戏者按键选择Y2.2 需求分析2.2.1 用户的特点 游戏开发成功后,最终用户为各个年龄段的人群,用户范围相当广泛。本游戏友好的用户界面,简单易学的按钮操作以及简单通俗的游戏规则,使广大的用户不需要专门进行培训,就可以立即学会如何使用。2.2.2 功能需求贪吃蛇是一款经典的手机游戏,一条蛇在封闭围墙里,通过按键盘上下左右四个键控制蛇向上下左右四个方向移动,如
8、果蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记1分;若吃到奖励苹果,加两分;若吃到毒苹果,则减3分。在游戏过程中,如果长按住方向键不放,则蛇的移动速度加快,松开方向键,恢复原速。如果蛇在移动中撞到墙或障碍物或者蛇头撞倒自己身体,则游戏结束!(1) 游戏主界面模块需求游戏界面主框架主要包括游戏图形区域界面、游戏开始按钮、游戏暂停按钮、关闭按钮。(2) 游戏图形区域界面的需求游戏画布区主要应该包括游戏画布中贪吃蛇随机出现的位置,贪吃蛇重新出现的位置,事物随机出现的位置。(3) 游戏菜单模块的需求游戏菜单模块主要是为进入游戏主界面做准备,提供“游戏帮助”介绍游戏规则。同时提供进入游戏和退出游戏等
9、功能。2.2.3 属性需求在可使用性方面,要求各个功能实现简单,操作方便,系统处理正确;整个系统恢复性能好,连接速度快,以确保系统可使用性好。另外,还要求系统的可扩展性、可维护性、可移植性良好。2.3 功能模块设计软件开发过程中的功能模块设计,主要解决实现该游戏需求的程序模块设计问题。包括如何把该游戏划分成若干个模块、决定各个模块之间的接口、模块之间传递的信息,以及模块结构的设计等。2.3.1 游戏功能 本系统主要完成以下几方面的功能:游戏控制功能包括游戏的开始、暂停、退出界面布局其他辅助功能(如游戏帮助,游戏积分,游戏过关等)2.3.2 总设计模块的划分游戏总设计模块划分为游戏主要界面模块、
10、游戏控制模块和游戏菜单模块。2.3.3 游戏主界面模块游戏主界面模块主要是指游戏的框图,其包括一下内容:1、游戏界面的边界,即游戏中的墙;2、游戏中蛇的构成,以及苹果的构成;3、游戏中障碍物的构成;4、游戏中分数显示以及关卡显示。2.3.4 游戏控制模块(1)游戏开始控制:我们的程序是使用上键开始游戏,启动游戏后会有一个初始菜单界面,我们点击“开始游戏”,弹出一句话“请按上键开始游戏”。游戏开始后蛇向下移动,然后由控制上下左右键来控制蛇的移动。 在程序中我们重新建了一个activity来控制游戏的开始,使游戏的开始界面更美观。(2)游戏暂停控制:我们是使用center键来控制游戏的暂停的,这是
11、一项人性化的设计,当玩家在游戏过程中突遇紧急情况时可以按center键暂停游戏,等玩家空闲后按center键可以继续游戏。(3)游戏退出控制:在游戏的退出上我们的程序使用了多种方式来应对不同的情况,当玩家正在游戏中时,如想退出可以按“1”键,程序会自动跳转到初始菜单界面,在初始菜单界面点击“退出游戏”即可退出游戏。如果玩家在游戏中由于碰到墙或者咬到自己或者碰到障碍物而导致游戏结束的,游戏或自动弹出一个界面,里面有提示是继续游戏还是退出游戏,当点击“取消”时,游戏就会自动跳转到初始菜单,再点击“退出游戏”即可。2.4 类模块设计src源码目录:GameConstants地图和移动;Operato
12、r为主要的逻辑运算类,判断移动,吃食物,死亡;Guttler为蛇类;Block为用来标记每一个坐标点上的小方块,主要记录方块在二维数组中的坐标;GameActivity为显示游戏主Activity,没找到更好的音效,就没用增加音效Menu为菜单Activity;Welcome为 欢迎菜单;自己的图片;GameView为自定义的View控件,显示并更新游戏画面2.5 游戏图形界面的图形显示更新功能在初始菜单界面,我们的程序设置了三个功能键:“开始游戏”“游戏帮助”“退出游戏”,“开始游戏”是进入游戏的入口,“游戏帮助”是告诉玩家如何玩这个游戏,“退出游戏”是玩家退出游戏的出口。§3 游
13、戏的基本实现 3.1 GameConstants地图和移动package oneRain.Guttler.constants;import android.app.Activity;import android.content.SharedPreferences;import oneRain.Guttler.logic.Operator;public class GameConstants /设置移动方向public static final int UP = 1;public static final int LEFT = 2;public static final int DOWN = 3
14、;public static final int RIGHT = 4;/设置常量public static final int GREEN_START = 1;public static final int RED_START = 2;public static final int YELLOW_START = 3;/消息类型public static final int MSG_UPDATE = 1;public static final int MSG_GAMEOVER = 2;public static final int MSG_PAUSE = 3;/方块的大小public stati
15、c int SIZE = 20;/更新频率public static int UPDATE_RATE = 500;/控制类public static Operator operator = null;/地图二维数组public static int map;/设置当前方向public static int curOrientation = 3;/设置当前分数public static int score = 0;/设置第一次吃得到的分数public static int eveScore = 10;/SharedPreferencespublic static SharedPreference
16、s sp;/地图选择列表public static final String maps = ""2"型的", ""I"型的", ""U"型的"/地图选择public static int mapChoice = 4;3.2 Operator为主要的逻辑运算类,判断移动,吃食物,死亡;package oneRain.Guttler.logic;import java.util.ArrayList;import java.util.List;import java.util.Ra
17、ndom;import oneRain.Guttler.constants.GameConstants;import oneRain.Guttler.model.Block;import oneRain.Guttler.model.Food;import oneRain.Guttler.model.Guttler;public class Operator /贪吃蛇对象private Guttler guttler = null;/食物对象private Food food = null;/地图二维数组private int map = null;private int xCount, yCo
18、unt;private boolean foodFlag = false;/构造方法:参数部分可以对蛇的大小及位置做修改public Operator(int snakeLength, int xCount, int yCount) this.xCount = xCount;this.yCount = yCount;/初始化地图initMap(xCount, yCount);/初始化贪吃蛇initSnake(snakeLength);/初始化地图public void initMap(int xCount, int yCount)map = new intyCountxCount;food =
19、 new Food();/初始化蛇public void initSnake(int snakeLength)Block head = new Block(10, 1);List<Block> body = new ArrayList<Block>();for(int i=0; i<snakeLength; i+)body.add(new Block(9-i, 1);guttler = new Guttler(head, body, snakeLength);/以时间为变化更新地图public int update(int orientation)/每一层更新都是
20、一次重绘clearTile();buildWall();if(!foodFlag)updateFood();foodFlag = true;buildFood();Block b = new Block();int x = 0;int y = 0;/主要分为移动和吃苹果两种情况switch(orientation)case GameConstants.UP:x = guttler.getHead().getX()-1;y = guttler.getHead().getY();break;case GameConstants.LEFT:x = guttler.getHead().getX();y
21、 = guttler.getHead().getY()-1;break;case GameConstants.DOWN:x = guttler.getHead().getX()+1;y = guttler.getHead().getY();break;case GameConstants.RIGHT:x = guttler.getHead().getX();y = guttler.getHead().getY()+1;break;b.setX(x);b.setY(y);/判断是移动还是吃食物还是死亡if(mapxy = GameConstants.GREEN_START) |(mapxy =
22、GameConstants.YELLOW_START)/死亡return null;else if(mapxy = 0)/移动return move(b);else /吃食物return eat(b);/生成食物private void buildFood() if(foodFlag)setTile(GameConstants.RED_START, food.getFood().getX(), food.getFood().getY();/初始化食物public void updateFood()int x, y;/获取随机数doRandom random = new Random();x =
23、 Math.abs(random.nextInt() % (yCount-1);y = Math.abs(random.nextInt() % (xCount-1);/防止第一行或者第一列(左边和上边的墙)if(x = 0)x = 1;if(y = 0)y = 1;while(mapxy != 0);setTile(GameConstants.RED_START, x, y);food.setFood(new Block(x, y);/吃食物的情况public int eat(Block block)foodFlag = false;map = move(block);Block tail =
24、 guttler.getBody().get(guttler.getBody().size()-1);guttler.getBody().add(tail);setTile(GameConstants.YELLOW_START, tail.getX(), tail.getY();/根据吃食物的多少来修改刷新的频率,和积分/延迟变短 GameConstants.UPDATE_RATE = (int) (GameConstants.UPDATE_RATE * 0.95);/得分增加GameConstants.score += GameConstants.eveScore;GameConstants
25、.eveScore = (int) (GameConstants.eveScore * 1.1);return map;/移动的情况public int move(Block block)/为身体赋值for(int i=guttler.getBody().size()-1; i>0; i-)/依次赋值guttler.getBody().set(i, guttler.getBody().get(i-1);/为身体第一个节点赋值赋值guttler.getBody().set(0, guttler.getHead();/为头赋值guttler.setHead(block);/为蛇头赋值setT
26、ile(GameConstants.RED_START, guttler.getHead().getX(), guttler.getHead().getY();/为蛇的身体赋值for(int i=0; i<guttler.getBody().size(); i+)Block b = guttler.getBody().get(i);setTile(GameConstants.YELLOW_START, b.getX(), b.getY();return map;/清空操作public void clearTile()for(int x=0; x<yCount; x+)for(int
27、 y=0; y<xCount; y+)setTile(0, x, y);/设置地图显示内容public void setTile(int picIndex, int x, int y)mapxy = picIndex;/根据不同的选择绘制不同的墙public void buildWall()switch(GameConstants.mapChoice)case 0:build2Wall(); /绘制"2"型墙break;case 1:buildIWall(); /绘制"I"型墙break;case 2:buildUWall(); /绘制"
28、U"型墙break;default:buildNormalWall(); /绘制普通墙break;/绘制2型的墙public void build2Wall()buildNormalWall();int i, j;for(j=xCount/4; j<xCount*3/4; j+)setTile(GameConstants.GREEN_START, yCount/6, j);for(i=yCount/6; i<yCount/2; i+)setTile(GameConstants.GREEN_START, i, xCount*3/4);for(j=xCount/4; j<
29、;xCount*3/4+1; j+)setTile(GameConstants.GREEN_START, yCount/2, j);for(i=yCount/2; i<yCount*5/6; i+)setTile(GameConstants.GREEN_START, i, xCount/4);for(j=xCount/4; j<xCount*3/4; j+)setTile(GameConstants.GREEN_START, yCount*5/6, j);/绘制I型的墙public void buildIWall()buildNormalWall();int i, j;for(j=
30、xCount*2/5; j<xCount*3/5+1; j+)setTile(GameConstants.GREEN_START, yCount/4, j);for(i=yCount/4; i<yCount*3/4; i+)setTile(GameConstants.GREEN_START, i, xCount/2);for(j=xCount*2/5; j<xCount*3/5+1; j+)setTile(GameConstants.GREEN_START, yCount*3/4, j);/绘制U型墙public void buildUWall()buildNormalWal
31、l();int i, j;for(i=yCount/4; i<yCount*3/4; i+)setTile(GameConstants.GREEN_START, i, xCount/4);for(j=xCount/4; j<xCount*3/4+1; j+)setTile(GameConstants.GREEN_START, yCount*3/4, j);for(i=yCount/4; i<yCount*3/4; i+)setTile(GameConstants.GREEN_START, i, xCount*3/4);/绘制普通墙public void buildNormal
32、Wall()/左右两边for(int x=0; x<yCount; x+)setTile(GameConstants.GREEN_START, x, 0);setTile(GameConstants.GREEN_START, x, xCount-1);/上下两边for(int y=0; y<xCount; y+)setTile(GameConstants.GREEN_START, 0, y);setTile(GameConstants.GREEN_START, yCount-1, y);3.3 Block为用来标记每一个坐标点上的小方块,主要记录方块在二维数组中的坐标;packag
33、e oneRain.Guttler.model;public class Block /定义图片块得x,y轴坐标private int x;private int y;public Block() super();/构造方法public Block(int x, int y) this.x = x;this.y = y;/Setter,Getter方法public int getX()return x;public void setX(int x) this.x = x;public int getY()return y;public void setY(int y) this.y = y;
34、3.4 GameActivity为显示游戏主Activity,没找到更好的音效,就没用增加音效package oneRain.Guttler.ui;import oneRain.Guttler.R;import oneRain.Guttler.constants.GameConstants;import oneRain.Guttler.view.GameView;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.cont
35、ent.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.KeyEvent;import android.view.ViewGroup;import android.view.ViewGroup.LayoutParams;import android.widget.LinearLayout;public class GameActivity extends
36、Activity private LinearLayout layout = null;private GameView gameView = null;MyHandler handler = new MyHandler();/音乐播放/private MediaPlayer mp = null;/是否暂停private boolean isPaused = false; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.la
37、yout.main); / initMusic(); initData(); initView(); ut.start(); / public void initMusic()/ / mp = MediaPlayer.create(this, R.raw.becauselove);/ / mp.start();/ public void initData() GameConstants.curOrientation = GameConstants.DOWN; GameConstants.map = null; GameConstants.operator = null; GameConstan
38、ts.UPDATE_RATE = 500; GameConstants.score = 0; GameConstants.eveScore = 10; GameConstants.mapChoice = getIntent().getIntExtra("map", 4); Overrideprotected void onResume() super.onResume();public void initView() layout = (LinearLayout)findViewById(R.id.layout); gameView = new GameView(this)
39、; gameView.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); layout.addView(gameView); Overrideprotected void onPause() super.onPause();Overrideprotected void onStop() /GameConstants.mapChoice = 4;super.onStop();Overrideprotected void onDestroy() super.o
40、nDestroy();ut.setFlag(false);/mp.stop();private UpThread ut = new UpThread();/更新数据线程public class UpThread extends Threadprivate boolean flag = true;public void setFlag(boolean flag)this.flag = flag;Overridepublic void run() while(flag)try Thread.sleep(GameConstants.UPDATE_RATE);catch (InterruptedExc
41、eption e) e.printStackTrace();/判断是否暂停if(!isPaused) /没暂停的时候update();else /暂停的时候Message msg = new Message();msg.what = GameConstants.MSG_PAUSE;handler.sendMessage(msg);/更新数据public void update()GameConstants.map = GameConstants.operator.update(GameConstants.curOrientation);if(GameConstants.map = null)
42、/死了ut.setFlag(false);Message msg = new Message();msg.what = GameConstants.MSG_GAMEOVER;handler.sendMessage(msg);else /没死Message msg = new Message();msg.what = GameConstants.MSG_UPDATE;handler.sendMessage(msg);/响应更新信息,更新UIpublic class MyHandler extends HandlerOverridepublic void handleMessage(Message
43、 msg)switch(msg.what)case GameConstants.MSG_UPDATE:gameView.invalidate();break;case GameConstants.MSG_GAMEOVER:/游戏死亡/看看有没有更新排行榜int first = GameConstants.sp.getInt("first", 0);int second = GameConstants.sp.getInt("second", 0);int third = GameConstants.sp.getInt("third",
44、0);String congratulation = ""if(GameConstants.score < third) /未上榜else if(GameConstants.score > first) /比第一还牛xSharedPreferences.Editor editor = GameConstants.sp.edit();int t = GameConstants.sp.getInt("second", 0);editor.putInt("third", t);int s = GameConstants.sp.g
45、etInt("first", 0);editor.putInt("second", s);editor.putInt("first", GameConstants.score);mit();congratulation = "您一不小心就破了第一的记录."else if(GameConstants.score > second) /上了榜,但是没第一多,比第二多SharedPreferences.Editor editor = GameConstants.sp.edit();int t = GameConst
46、ants.sp.getInt("second", 0);editor.putInt("third", t);editor.putInt("second", GameConstants.score);mit();congratulation = "您一不小心就破了第二的记录."else if(GameConstants.score > third) /上了榜,但是没第一多,没第二多,比第三多SharedPreferences.Editor editor = GameConstants.sp.edit();edi
47、tor.putInt("third", GameConstants.score);mit();congratulation = "您一不小心就破了第三的记录."/弹出对话框AlertDialog.Builder builder = new AlertDialog.Builder(GameActivity.this);builder.setTitle("Game Over");builder.setMessage("你的分数是: " + GameConstants.score + "n"+ con
48、gratulation);builder.setPositiveButton("懂了", new DialogInterface.OnClickListener()public void onClick(DialogInterface dialog, int which) /退出程序Intent i = getIntent();i.putExtra("result", 1);GameActivity.this.setResult(0, i);finish(););builder.setNegativeButton("再玩一次", ne
49、w DialogInterface.OnClickListener()public void onClick(DialogInterface dialog, int which) Intent i = getIntent();i.putExtra("result", 0);GameActivity.this.setResult(0, i);finish(););builder.create().show();/gameView.invalidate();break;case GameConstants.MSG_PAUSE:/调用GameView重绘gameView.invalidate();break;/* * 按键监听 */Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) switch(keyCode)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年遵义市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)参考答案详解
- 广元市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(完整版)
- 大足县农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(培优)
- 2026年巢湖市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(基础+提升)
- 伊犁州农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(突破训练)
- 宁波市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(精练)
- 2026年遵义市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(能力提升)
- 白山市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及完整答案详解一套
- 2026年黔南布依族苗族自治州农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(轻巧夺冠)
- 贵阳市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(完整版)
- 丰收节发言稿
- 第三单元参考活动1《续一个南社的梦》教学设计 2024-2025学年苏少版初中综合实践活动八年级上册
- GB/T 19973.2-2025医疗产品灭菌微生物学方法第2部分:用于灭菌过程的定义、确认和维护的无菌试验
- 中国重症患者肠外营养治疗临床实践专家共识(2024)解读
- 软件系统试运行方案计划
- 山东省枣庄市薛城区2024-2025学年八年级上学期11月期中数学质量检测试题(附答案)
- 江苏省南京市鼓楼区2024-2025学年七年级上学期期中数学试卷(含答案解析)
- 2024年大学入党积极分子党校培训考试必考题库及答案(共210题)
- GB/T 44143-2024科技人才评价规范
- 内科诊疗规范指南
- 先天性硬膜下囊肿护理查房
评论
0/150
提交评论