




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
枣 庄 学 院信息科学与工程学院课程设计任务书 题目: 手 机 俄 罗 斯 方 块 的 开 发 学 号: 2 0 1 0 1 2 2 2 0 2 3 8 姓 名: 张 永 义 专 业: 计算机应用技术 课 程: J2ME手机应用开发 指导教师: 刘 梦 琳 职称: 讲 师 完成时间: 2012 年5月-2012年6月枣庄学院信息科学与工程学院制 课程设计任务书及成绩评定课程设计的任务和具体要求课程设计的任务:开发一个手机俄罗斯方块小游戏。具体要求: 1、界面美观大方。 2、应完成的基本功能有: (1)可以灵活控制方块在图形框中运动。(2) 游戏过程中方块可以自由旋转。当某一行的方块排列满时,将自动将这一行方 块消除,然后将上面所有方块向下移动,可以支持连续消行。 (3)游戏的得分支持积分,并且按照公式: 得分 = 原来分数+ 100 * (2 同时消除的行数-1) (4)游戏中提供了一个背景和音乐。3、程序运行良好。 4、课程设计任务书格式符合要求。 指导教师签字: 日期: 指导教师评语成绩: 指导教师签字: 日期: 课程设计所需软件、硬件等所需软件: Eclipse 、EclipseME 、JDK 等所需硬件: 计算机 等课程设计进度计划起至日期工作内容备注2012.05.03-2012.05.152012.05.16-2012.05.302012.05.31-2012.06.152012.06.16-2012.06.202012.06.21-2012.06.26收集相关资料进行总体规划编写程序与调试程序程序测试撰写课程设计任务书参考文献、资料索引序号文献、资料名称编著者出版单位1 基于Eclipse环境的J2ME应用程序开发 万辉 王军 清华大学出版社2 J2ME应用教程 陈旭东 徐保民 清华大学出版社3 J2ME移动设备程序设计 胡虚怀 李换 清华大学出版社4 J2ME开发精讲 詹建飞 电子工业出版社5 J2ME技术开发与应用 李研 刘晶晶 机械工业出版社目 录1 摘要.42 设计内容43 设计过程.5 3.1 设计方案的论证.53.2 概要设计.53.3 界面设计图 .63.4 代码实现.104 设计总结.11附录:程序源代码.111 、摘要本文给出了一个基于MIDP的俄罗斯方块游戏的设计方案,并给出全部实现源代码。利用J2ME语言编程的思想来完成系统的设计,然后编写出程序设计代码进行界面设计,实现友好的界面交互,具有清晰的程序流程图,最后编程实现了全过程。该游戏的最大特色是屏幕自适应,无论各种手机,PDA的屏幕大小如何,该游戏总是能获得最佳的显示效果。2 、设计内容俄罗斯方块是个老幼皆宜的小游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键的消息函数实现)。然后程序根据这七种方块堆叠成各种不同的模型。3 、设计过程3.1 设计方案的论证J2ME语言继承了JAVA语言易学易用的特点,特别适合于初学者学系统编程。随着21世纪信息社会的到来,计算机在人们的工作和生活中的深入,要求我们越来越多地与计算机打交道,为了使用户在繁忙的日程工作中得到放松,于是出现了各种各样的休闲软件,如聊天工具,游戏等等。通过这学期来J2ME课程的学习,我初步掌握了J2ME语言的最基本的知识,于是老师的指导下动手用J2ME编写俄罗斯方块游戏。游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,激发大家的娱乐激情。从本游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,设计中在一个图片框中构造了一个4*4的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此总共设计了7中造型,每种造型又可以通过旋转而变化出2到4种形状,利用随机函数在一个预览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动。3.2 概要设计本游戏的操作流程非常简单,用户启动MIDlet启动后,即进入游戏主画面,屏幕开始显示为欢迎画面。用户按下开始按钮后,就可以开始玩游戏了,当用户想暂停时,再次按一下开始按钮,游戏就暂停了,在暂停的情况下再按开始按钮,游戏继续运行。任何时候按退出按钮,游戏MIDlet都会终止.游戏画面流程图如下:启动按钮MIDlet选择画面 退出按钮欢迎画面退出按钮开始按钮游戏运行画面游戏暂停画面GAME OVER游戏在结束状态本程序共有4个java源文件:KetrisBlock.java:该文件负责封装下坠物对象及其操作。.KetrisCanvas.java:该文件是游戏画布。KetrisGame.java:该文件负责创建主界面。KetrisMap.java:该文件负责游戏地图的绘制。3.3界面设计图paint方法的流程图如下所示:游戏处于欢迎画面状态 游戏处于Game Over状态 游戏处于暂停状态 执行空操作绘制Game Over画面 游戏处于运行状态绘制欢迎画面坠物能否下坠 是 是否需删除行 在下坠物的当前位置绘制下坠物下坠物下坠一格 否固定下坠物 是 重绘游戏地图初始化一个新的下坠物 否Game Over 是 设置游戏状态为 Game Over 否结 束在游戏容器的旁边绘制下一个下坠物绘制新下坠物(1) 初始化欢迎界面(如图所示)初始欢迎界面显示了程序初始的一个屏幕,一般用于显示作者及版权信息等内容。(2) 游戏主界面(如图所示)进入游戏界面后,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,右边窗口能够预览下一个方块的形状。(3) 游戏结束画面(如图所示) 当下坠物小方块充满整个屏幕时,游戏结束。3.4代码实现MIDP的游戏设计,本质上就是用一个线程或者定时器产生重绘事件,用线程和用户输入改变游戏状态。这个游戏也不例外,启动MIDlet后,就立即生成一个重绘线程,该线程每隔50ms绘制一次屏幕。当然,重绘时有一些优化措施,并不是屏幕上所有的像素都需要重绘,而是有所选择。游戏区域游戏区域为手机或者PDA屏幕的一部分,该区域为正方形,边长一定能被16整除(因为俄罗斯游戏区域刚好为16个小砖块长,16个小砖块宽的方形)。无论在水平方向还是垂直方向,该区域都要处于屏幕的居中位置。游戏区域在水平方向上分为2部分,一部分为12个小砖块宽,用来显示游戏容器,另一部分为4个小砖块宽,用来显示下一个下坠物和分数。 游戏地图游戏地图是用来存储游戏容器上的固定砖块的。游戏容器为一个宽为12个小砖块单位,高为16个小砖块单位,包括左右2堵墙和下边的容器底在内。所以用一个16X12的二维数组(程序里叫mapdata)来存储固定砖块。小砖块小砖块是下坠物和游戏容器的组成部分。表现为一个正方形,边长为游戏区域边长的1/16。每个小砖块在绘制的时候,4边会留出1个象素宽,绘制成白色或者灰色,这样砖块之间才有间隙。每种小砖块也有id,分别为1到8。我们可以用一个颜色数组(程序里叫BRICK_COLORS)存储这8种颜色。若某种小砖块的id为3,那么该小砖的颜色为BRICK_COLORS3-1.4 、设计总结由于课程设计时间较短,所以该游戏还有许多不尽如人意的地方,比如方块类型太少,退出游戏不能存储进度等多方面问题。这些都有待进一步改善,如在游戏中还可以更换背景音乐,以适合不同的玩家,在每通过一关可以给玩家播放一段flash,吸引玩家去挑战极限,不断提高玩家的兴趣。课程设计已经结束了,但在课程设计的这些体会要应用到今后的日常学习中去。在新的学期,我觉得自己要在以下几个方面加以注意:首先,在学习专业课的时候要注意理论联系实际。注意将课本上的知识应用到日常的操作中,真正做到学以致用。只有这样,才能做到目的明确,才能有足够的学习动力。其次,在学习过程中要经常与同学进行交流,讨论所遇到的问题,并一起解决。在讨论中解决问题,会节约很多时间,并且在交流的过程中,我们也可以学到更多的东西。课程设计已经结束了,这次课程设计带给自己很多体会,在以后的学习中要不断总结,不断改进,使自己的成绩有新的提高。附录:程序源代码TetrisBlock.javapackage Tetris;import javax.microedition.lcdui.*;import java.util.Random;/* * * Description: 该类为封装下坠物对象及其操作 * */public class TetrisBlock / 各种砖块,1-7为活动砖块颜色,8为墙砖颜色public static final int BRICK_COLORS = 0x00FF0000, 0x0000FF00,0x00FFFF00, 0x000000FF, 0x00FF00FF, 0x0000FFFF, 0x00C0DCC0,0x00808080 ;/* * blockpattern的编码规则:blockpattern表示一个下坠物体的形状,一种下坠物的颜色是固定的。 * 对于一个下坠物,用一个三维数祖表示,第一维用rot表示(旋转值),第二维用x(也就是行),第三维用y表示(也就是列)。 所以 * blockpattern1:田字及四种旋转形状 blockpattern2:反L字及四种旋转形状 blockpattern3:L字及四种旋转形状 * blockpattern4:1字及四种旋转形状 . */protected int blockpattern1 = 0, 0, 0, 0 , 0, 1, 1, 0 , 0, 1, 1, 0 , 0, 0, 0, 0 , 0, 0, 0, 0 , 0, 1, 1, 0 , 0, 1, 1, 0 , 0, 0, 0, 0 , 0, 0, 0, 0 , 0, 1, 1, 0 , 0, 1, 1, 0 , 0, 0, 0, 0 , 0, 0, 0, 0 , 0, 1, 1, 0 , 0, 1, 1, 0 , 0, 0, 0, 0 ;protected int blockpattern2 = 0, 0, 1, 0 , 0, 0, 1, 0 , 0, 1, 1, 0 , 0, 0, 0, 0 , 0, 0, 0, 0 , 0, 1, 0, 0 , 0, 1, 1, 1 , 0, 0, 0, 0 , 0, 0, 0, 0 , 0, 1, 1, 0 , 0, 1, 0, 0 , 0, 1, 0, 0 , 0, 0, 0, 0 , 1, 1, 1, 0 , 0, 0, 1, 0 , 0, 0, 0, 0 ;protected int blockpattern3 = 0, 1, 0, 0 , 0, 1, 0, 0 , 0, 1, 1, 0 , 0, 0, 0, 0 , 0, 0, 0, 0 , 0, 1, 1, 1 , 0, 1, 0, 0 , 0, 0, 0, 0 , 0, 0, 0, 0 , 0, 1, 1, 0 , 0, 0, 1, 0 , 0, 0, 1, 0 , 0, 0, 0, 0 , 0, 0, 1, 0 , 1, 1, 1, 0 , 0, 0, 0, 0 ;protected int blockpattern4 = 0, 0, 1, 0 , 0, 0, 1, 0 , 0, 0, 1, 0 , 0, 0, 1, 0 , 0, 0, 0, 0 , 0, 0, 0, 0 , 1, 1, 1, 1 , 0, 0, 0, 0 , 0, 0, 1, 0 , 0, 0, 1, 0 , 0, 0, 1, 0 , 0, 0, 1, 0 , 0, 0, 0, 0 , 0, 0, 0, 0 , 1, 1, 1, 1 , 0, 0, 0, 0 ;protected int blockpattern5 = 0, 0, 0, 0 , 1, 1, 0, 0 , 0, 1, 1, 0 , 0, 0, 0, 0 , 0, 0, 1, 0 , 0, 1, 1, 0 , 0, 1, 0, 0 , 0, 0, 0, 0 , 0, 0, 0, 0 , 1, 1, 0, 0 , 0, 1, 1, 0 , 0, 0, 0, 0 , 0, 0, 1, 0 , 0, 1, 1, 0 , 0, 1, 0, 0 , 0, 0, 0, 0 ;protected int blockpattern6 = 0, 0, 0, 0 , 0, 1, 1, 0 , 1, 1, 0, 0 , 0, 0, 0, 0 , 0, 1, 0, 0 , 0, 1, 1, 0 , 0, 0, 1, 0 , 0, 0, 0, 0 , 0, 0, 0, 0 , 0, 1, 1, 0 , 1, 1, 0, 0 , 0, 0, 0, 0 , 0, 1, 0, 0 , 0, 1, 1, 0 , 0, 0, 1, 0 , 0, 0, 0, 0 ;protected int blockpattern7 = 0, 0, 0, 0 , 1, 1, 1, 0 , 0, 1, 0, 0 , 0, 0, 0, 0 , 0, 1, 0, 0 , 1, 1, 0, 0 , 0, 1, 0, 0 , 0, 0, 0, 0 , 0, 1, 0, 0 , 1, 1, 1, 0 , 0, 0, 0, 0 , 0, 0, 0, 0 , 0, 1, 0, 0 , 0, 1, 1, 0 , 0, 1, 0, 0 , 0, 0, 0, 0 ;private int blockpattern; /* 当前坠物形状,为以上定义的七个下坠物之一 */private int blockNextpattern; /* 下一个坠物形状,显示在游戏容器的右边 */private int x; / blockpattern左上角x坐标,x=i表示左上角距离游戏容器左上角x轴上i个小砖块单位private int y; / blockpattern左上角y坐标,y=i表示左上角距离游戏容器左上角y轴上i个小砖块单位private int oldx; / x的旧值private int oldy; / y的旧值private int rot; / 旋转值,0-3private int oldrot; / 旋转旧值private int pattern; /* 组成当前坠物所用小砖块id(1-7),同时也表示一种下坠物形状 */private int next; /* 组成下一个坠物所用小砖块id(1-7),同时也表示一种下坠物形状 */private TetrisMap map;protected Random rand;/* 构造,保存map,初始化blockimage,rand,next */public TetrisBlock(TetrisMap map) this.map = map;rand = new Random();next = Math.abs(rand.nextInt() % 7 + 1;/* 初始化 */protected void init() pattern = next;next = Math.abs(rand.nextInt() % 7 + 1;/* 得到当前下坠物 */switch (pattern) case 1:readPattern(blockpattern1);break;case 2:readPattern(blockpattern2);break;case 3:readPattern(blockpattern3);break;case 4:readPattern(blockpattern4);break;case 5:readPattern(blockpattern5);break;case 6:readPattern(blockpattern6);break;case 7:readPattern(blockpattern7);break;/* 得到下一个下坠物 */switch (next) case 1:readNextPattern(blockpattern1);break;case 2:readNextPattern(blockpattern2);break;case 3:readNextPattern(blockpattern3);break;case 4:readNextPattern(blockpattern4);break;case 5:readNextPattern(blockpattern5);break;case 6:readNextPattern(blockpattern6);break;case 7:readNextPattern(blockpattern7);break;x = 5; /* 游戏容器内径的一半 */y = 0; /* y坐标 */rot = 0;/ 判断map数据,决定y的真正值,之所以这么处理,是因为当game over的时候,最后一个下坠物,可能只能画出一部分/ 为了达到这个效果,必须让y成为一个恰当的负值while (isCrashAtBegin() y-;if (y -4) break;oldx = x;oldy = y;oldrot = rot;/* * 设置当前下坠物变量的内容 * int 7种下坠物常量之一 */private void readPattern(int nowblock) blockpattern = new int444;for (int i = 0; i 4; i+) for (int j = 0; j 4; j+) for (int k = 0; k 4; k+) blockpatternijk = nowblockijk;/* * 设置下一个下坠物变量的内容。只需要包存4中旋转变化中的第一种即可,所以rot维值=0 * int 7种下坠物常量之一 */private void readNextPattern(int nowblock) blockNextpattern = new int44;for (int i = 0; i 4; i+) for (int j = 0; j 4; j+) blockNextpatternij = nowblock0ij;/* 旋转下坠物 */protected void rotBlock() rot+;if (rot = 4) rot = 0;/* * 绘制下坠物,包括清除下坠物的旧图像,调用绘制下坠物新图像的函数 */public synchronized void paint(Graphics g) / 如果3维都没有变化,则无需重画if (oldrot != rot) | (oldx != x) | (oldy != y) / 清除旧图形g.setColor(TetrisCanvas.BACKGROUD);for (int i = 0; i 4; i+) for (int j = 0; j 4; j+) if (blockpatternoldrotij = 1) g.fillRect(TetrisCanvas.GAMEAREA_X + (oldx + j)* TetrisCanvas.BRICK_WIDTH,TetrisCanvas.GAMEAREA_Y + (oldy + i)* TetrisCanvas.BRICK_WIDTH,TetrisCanvas.BRICK_WIDTH,TetrisCanvas.BRICK_WIDTH);drawBlock(g);oldrot = rot;oldx = x;oldy = y;/* * 绘制下坠物 */public void drawBlock(Graphics g) for (int i = 0; i 4; i+) for (int j = 0; j = 0; i-) / 列for (int j = 0; j 4; j+) int mx = x + j;int my = y + i;if (my 0) my = 0;if (blockpatternrotij = 1 & map.get(mx, my) != 8& map.get(mx, my) != 0) return true;return false;/* * 画小砖块 * param px * x坐标 * param py * y坐标 * param g * Graphics * param colorIndex * 颜色索引值 */public static void drawBrick(int px, int py, Graphics g, int colorIndex) / 画白边g.setColor(255, 255, 255);g.fillRect(px, py, 1, TetrisCanvas.BRICK_WIDTH);g.fillRect(px, py, TetrisCanvas.BRICK_WIDTH, 1);/ 画中心int color = BRICK_COLORScolorIndex;g.setColor(color);g.fillRect(px + 1, py + 1, TetrisCanvas.BRICK_WIDTH - 1,TetrisCanvas.BRICK_WIDTH - 1);/ 画灰边g.setColor(0x00c0c0c0);g.fillRect(px + TetrisCanvas.BRICK_WIDTH - 1, py + 1, 1,TetrisCanvas.BRICK_WIDTH - 1);g.fillRect(px + 1, py + TetrisCanvas.BRICK_WIDTH - 1,TetrisCanvas.BRICK_WIDTH - 2, 1);/* * 在游戏容器的右边绘出下一个下坠物 */public void drawNextBlock(Graphics g) / 清除绘制区域g.setColor(TetrisCanvas.BACKGROUD);int px = TetrisCanvas.GAMEAREA_X + 12 * TetrisCanvas.BRICK_WIDTH;int py = TetrisCanvas.GAMEAREA_Y + 2 * TetrisCanvas.BRICK_WIDTH;int width = TetrisCanvas.BRICK_WIDTH * 4;g.fillRect(px, py, width, width);for (int i = 0; i 4; i+) for (int j = 0; j 4; j+) if (blockNextpatternij = 1) drawBrick(px + j * TetrisCanvas.BRICK_WIDTH, py + i* TetrisCanvas.BRICK_WIDTH, g, next - 1);/* * 判断下坠物是否能下移 * boolean true:自动下移 false:人工按键下移 */public boolean checkDown(boolean kyouseiflag) boolean check = true;/* 分别扫描下坠物的4行,从最下面的那行开始 */for (int i = 0; i = 0) if (blockpatternrotrowi = 1) if (map.get(x + i, y + row + 1) != 0) check = false;row = -1; /* 终止循环 */ else row-;return check;/* 下坠物下移1行 */public void down() y = y + 1;/* 判断是否能旋转 */public boolean checkRot() boolean check = true;int tmpRot = rot + 1;if (tmpRot = 4) tmpRot = 0;for (int i = 0; i 4; i+) for (int j = 0; j 4; j+) if (blockpatterntmpRotij = 1) if (map.get(x + j, y + i) != 0) check = false;return check;/* 判断下坠物是否可以移动 */public boolean checkMove(int direct) boolean check = true;/* 分别扫描下坠物的4行 */for (int i = 0; i 4; i+) if (direct = 1) /* 左移 */int row = 0;while (row = 0) if (blockpatternrotirow = 1) if (map.get(x + row + 1, y + i) != 0) check = false;row = -1; /* 终止循环 */ else row-;return check;/* 左右移动 */public void move(int direct) if (direct = 1) x = x - 1; else x = x + 1;public int getY() return y;/* 根据下坠物的当前位置设置地图数据 */public void fixBlock() for (int i = 0; i 4; i+) for (int j = 0; j 4; j+) if (blockpatternrotij = 1) map.set(x + j, y + i, pattern);TetrisCanvas.javapackage Tetris;import javax.microedition.lcdui.*;/* * Description: 该类为游戏画布 */public class TetrisCanvas extends Canvas implements CommandListener, Runnable / Midletprotected TetrisGame Tetris;protected Command exitCmd;protected Command startCmd;protected int game; /* 游戏运行状态 */protected TetrisBlock block; /* 当前下坠物 */protected TetrisMap map; /* 游戏地图 */protected Thread thread; /* 重画线程,该线程实现游戏画布重画机制 */* counter,maxCount这2个变量是用来控制游戏速度 */protected int counter;protected int maxCount;protected final int GAME_INIT = 0; /* 游戏初始状态 */protected final int GAME_RUN = 1; /* 游戏运行状态 */protected final int GAME_OVER = 4; /* 游戏结束状态 */protected final int GAME_START_DEMO = 9; /* demo状态,显示demo的画面 */protected final int GAME_SUSPEND = 9; /* 挂起状态,值与demo状态同 */protected boolean startDemoFlag; /* 是否已经显示过开始画面 */private static int mainWidth; /* 屏幕宽度,在sun gray emulator上=180 */private static int mainHeight; /* 屏幕高度,在sun gray emulator上=177 */public static int GAMEAREA_X; / 游戏区域左上角x坐标,游戏区域为左边的游戏容器区域和右边的下一个下坠物显示区域组成public static int GAMEAREA_Y; / 游戏区域左上角y坐标public static int BRICK_WIDTH; / 小砖块的边长public static final int BACKGROUD = 0x00000000; / 背景颜色public TetrisCanvas(TetrisGame Tetris) this.Tetris = Tetris;init();map = new TetrisMap();block = new TetrisBlock(map);startCmd = new Command(开始, Command.OK, 0);exitCmd = new Command(退出, Command.EXIT, 0);addCommand(startCmd);addCommand(exitCmd);setCommandListener(this);thread = new Thread(this);thread.start();/* 初始化,显示demo画面所需的设置 */protected void init() this.mainHeight = getHeight();this.mainWidth = getWidth();/ 计算小砖块宽度int min = mainWidth;if (mainHeight = 0; min-) if (min % 16 = 0) break;/ 游戏区域为min的方形,且min为16的倍数BRICK_WIDTH = min / 16; / 砖块厚度GAMEAREA_X = (mainWidth - min) / 2;GAMEAREA_Y = (mainHeight - min) / 2;startDemoFlag = false; / 还没有显示开始画面game = GAME_START_DEMO; / 游戏处于demo画面状态public void run() while (true) try thread.sleep(50); catch (InterruptedException e) break;repaint();public void commandAction(Command c, Displayable d) if (c =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度专业保洁公司保洁用品及清洁剂采购合同
- 二零二五年度建筑工程资料审核与承包服务合同
- 2025版货车租车及驾驶员职业规划与晋升服务合同
- 2025版旅游产业人民币担保书
- 二零二五年度电商园区品牌推广与宣传服务合同
- 2025版楼梯口拆除改造与社区安全防范体系建设合同
- 二零二五版跨境电子商务支付安全协议及信用保障合同
- 2025至2030年中国智能服饰行业市场全景评估及发展战略规划报告
- 早期股骨头坏死课件
- 二零二五年度电梯销售与售后服务合同范本
- 纺织品运输供货方案
- GB/T 1171-2006一般传动用普通V带
- GB/T 11334-2005产品几何量技术规范(GPS)圆锥公差
- FZ/T 07013-2021绿色设计产品评价技术规范色纺纱
- 催产引产-课件
- 【社会层面】社会主义核心价值观
- 充电桩安装施工方案
- 人工挖孔桩施工危险源辨识与评价及应对措施
- 癫痫病人的护理查房ppt课件(PPT 24页)
- 品管圈成果汇报——提高导管固定正确率PPT课件
- 红金简约风教师退休欢送会PPT通用模板
评论
0/150
提交评论