




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java课程设计蜘蛛纸牌游戏1 引言1.1 背景相信很多人都玩过蜘蛛纸牌这款休闲游戏,现在随着生活水平的提高,人们拥有充分的时间来享受休闲游戏带来的快乐,越来越多的人亲睐蜘蛛纸牌游戏。谈起这款游戏,大家并不陌生。从WINDOWS2000系统开始,就嵌入了蜘蛛纸牌游戏,可是随着微软系统的不段升级,蜘蛛纸牌游戏的功能业变得越来越强大,游戏的界面也更加美观。用户的体验感受也更加美好。所以,蜘蛛纸牌游戏的开发对于人类的生活娱乐更加有意义。本游戏通过java语言编写,实现了游戏的难度选择、开局、重新发牌以及可视化的相关操作界面。并通过设计鼠标事件,引入线程,构建游戏程序框架完成了对该游戏的难度选择、开局、发牌、显示可执行操作的各个基本功能。1.2 目标该游戏通过鼠标操作,将电脑多次分发的纸牌,按照相同的花色由大到小排列起来,直到桌面上的纸牌全都消失,即为胜利。包括如下功能:(a)难度选择:包括简单(单色)、中级(双色)、高级(四色)。(b)开局:任何时候可以重新开始一盘新的游戏。(c)发牌。(d)显示可行操作:提示当前可行操作。(e)简单的帮助文档:对软件的简单介绍和编制说明。2 开发工具介绍2.1 java语言概述java是由SunMicrosystems公司于1995年5月推出的java程序设计语言和java平台的总称。用java实现的浏览器显示它的魅力:跨平台的特点使得它越来越受到许多程序员的亲睐。java除了可以开发动态的Web页还可以开发各种系统软件。java平台由java虚拟机和各种java应用编程接口(简称API)构成。java应用编程接口为java提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在操作系统上安装一个java平台就可以运行任何一个java程序啦。现在java平台已经几乎嵌入到所有的操作系统中。这样java程序就可以只编译一次,就可以在各种系统当中运行。2.2 java语言的特点java语言是一种简单的、面向对象的、分布式的、健壮的、安全的、与平台无关的、多线程、高性能的、动态程序设计语言。java语言简单易学的。java语言的语法与C语言和C+语言很接近,使得多数程序员很容易学习和使用java。另一方面,java丢弃了C+中很少使用的,很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地。java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧。平台无关性。平台无关性是指Java能运行于不同的平台。Java引进虚拟机原理,并运行于虚拟机,实现不同平台的Java接口之间。使用Java编写的程序能在世界范围内共享。Java的数据类型与机器无关,Java虚拟机(JavaVirtualMachine)是建立在硬件和操作系统之上,实现Java二进制代码的解释执行功能,提供于不同平台的接口的。安全性。Java的编程类似C+,学习过C+的读者将很快掌握Java的精髓。Java舍弃了C+的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针侵入系统。Java对程序提供了安全管理器,防止程序的非法访问。面向对象。Java吸取了C+面向对象的概念,将数据封装于类中,利用类的优点,实现了程序的简洁性和便于维护性。类的封装性、继承性等有关对象的特性,使程序代码只需一次编译,然后通过上述特性反复利用。程序员只需把主要精力用在类和接口的设计和应用上。Java提供了众多的一般对象的类,通过继承即可使用父类的方法。在Java中,类的继承关系是单一的非多重的,一个子类只有一个父类,子类的父类又有一个父类。Java提供的Object类及其子类的继承关系如同一棵倒立的树形,根类为Object类,Object类功能强大,经常会使用到它及其它派生的子类。分布式。Java建立在扩展TCP/IP网络平台上。库函数提供了用HTTP和FTP协议传送和接受信息的方法。这使得程序员使用网络上的文件和使用本机文件一样容易。健壮性。Java致力于检查程序在编译和运行时的错误。类型检查帮助检查出许多开发早期出现的错误。Java自己操纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能,这些功能特征大大提高了开发Java应用程序的周期。并且Java还提供了Null指针检测、数组边界检测、异常出口、Bytecode校验等功能。解释型。我们知道C,C+等语言,都是针对CPU芯片进行编译,生成机器代码,该代码的运行就和特定的CPU有关。Java不像C或C+,它不针对CPU芯片进行编译,而是把程序编译成称为自字节码的一种“中间代码”。字节码是很接近机器码的文件,可以在提供了java虚拟机(JVM)的任何系统上被解释执行。动态性。java程序的基本组成单元就是类,有些类是自己编写的,有些是从类库中引入的,而类又是运行时动态装载的,这就使得Java可以在分部环境中动态的维护程序及分类,而不像C+那样,没档期类库升级以后,如果想让程序具有新类库提供的功能,就需要修改程序,重新编译。多线程。Java是支持多线程的语言。多线程是一种应用程序设计方法。线程是一大进程里分出来的,小的、独立的进程,使得在一个程序里可同时执行多个小任务。多线程带来的好处是具有更好的交互性能和实时控制性能。但采用传统的程序设计语言(如:C/C+)实现多线程程序并非易事。Java实现了多线程技术,提供了简便的实现多线程的方法,并拥有一组高复杂性的同步机制。可以移植的。这种可移植性来源于体系结构中立性,另外,java还严格规定了各个基本数据类型的长度。java系统本身也具有很强的可移植性,java编译器是用java实现的,java运行环境是用ANSIC实现的。3 总体设计3.1 代码功能模块设计蜘蛛纸牌游戏共由4个部分组成,分别是:Spider.java,SpiderMenuBar.java,PKCard.java,AboutDialog.java,SpiderMenuBar.java包含名为SpiderMenuBar的public类,其主要功能为生成蜘蛛纸牌游戏的菜单栏,实现菜单栏中各个组件的事件侦听。主要包括3个模块:图形用户界面的构建;组件监听接口的实现:显示可执行操作的线程。PKCard.java。包含名为PKCard的public类,其主要功能为:定义纸牌的属性,包括名称,位置等相关信息。并通过相关方法实现纸牌的移动等。AboutDialog.java。包含名为AboutDialog的public类,其主要功能为生成蜘蛛纸牌游戏的帮助栏。Spider.java。包含名为Spider的public类,其主要功能为生成蜘蛛纸牌游戏的框架,实现游戏中的方法,包括:纸牌的随机生成,位置的摆放等。4 程序流程图5 程序使用说明5.1 主要界面以下是主菜单界面的主要代码:JMenu jNewGame = new JMenu(游戏);JMenu jHelp = new JMenu(帮助);JMenuItem jItemAbout = new JMenuItem(关于);JMenuItem jItemOpen = new JMenuItem(开始新游戏);JMenuItem jItemDeal = new JMenuItem(发牌);JMenuItem jItemExit = new JMenuItem(退出);JRadioButtonMenuItem jRMItemEasy = new JRadioButtonMenuItem(初级:单花色);/菜单中的可选项按钮JRadioButtonMenuItem jRMItemNormal = new JRadioButtonMenuItem(中级:双花色);JRadioButtonMenuItem jRMItemHard = new JRadioButtonMenuItem(高级:四花色);public SpiderMenuBar(Spider spider) this.main = spider;jNewGame.add(jItemOpen);jNewGame.add(jItemDeal);jNewGame.addSeparator();/添加划分线jNewGame.add(jRMItemEasy);jNewGame.add(jRMItemNormal);jNewGame.add(jRMItemHard);jNewGame.addSeparator();jNewGame.add(jItemExit);ButtonGroup group = new ButtonGroup();/(用来获取JRadioButtonMenuItem 的值)group.add(jRMItemEasy);group.add(jRMItemNormal);group.add(jRMItemHard);jHelp.add(jItemAbout);this.add(jNewGame);this.add(jHelp);/添加到菜单栏以下是游戏窗口界面初始化的主要代码:pane = this.getContentPane(); / 获得容器pane.setBackground(new Color(0, 112, 26);/ 设置背景颜色clickLabel = new JLabel(); / 发牌区的鼠标点击响应区域clickLabel.setBounds(890, 580, 110, 96); / 设置响应区域大小与坐标clickLabel.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED);pane.add(clickLabel); / 将响应区域添加到容器中this.initCards();/ 纸牌初始化this.randomCards();/ 随机分配纸牌this.setCardsLocation();/ 为纸牌设置坐标位置this.deal(); / 从右下角发出一叠纸牌。游戏刚开始时,需要先发出一叠纸牌。groundLabel = new JLabel10;/ 创建背景框数组,一共有10个背景框。int x = 20;/ 背景框的x坐标,10个背景框是并排放置的,y坐标相等。第一个背景框的x坐标为20。for (int i = 0; i 10; i+) / 循环创建背景框,并设置其坐标大小等属性groundLabeli = new JLabel();/ 创建背景框groundLabeli.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED);/ 为Label设置边框/ ,/ 形成背景框groundLabeli.setBounds(x, 25, 71, 96);/ 设置背景框的大小与坐标x += 101; / 相邻的背景框的x坐标差值为101。this.pane.add(groundLabeli);/ 将背景框添加到容器中this.setVisible(true);/ 显示窗口5.2 初始化纸牌及发牌操作初始化纸牌的主要代码(包括所有纸牌生成及存入数组,右下角发牌区纸牌初始化以及表面显示纸牌初始化): 所有纸牌的生成及存入数组代码:public void initCards() / 如果纸牌已被赋值,即将其从框架的面板中移去if (cards0 != null) for (int i = 0; i 104; i+) pane.remove(cardsi);int n = 0;/ 通过难度等级,为n赋值if (this.grade = Spider.EASY) n = 1; else if (this.grade = Spider.NATURAL) n = 2; else n = 4;/ 为card赋值for (int i = 1; i = 8; i+) for (int j = 1; j = 13; j+) cards(i - 1) * 13 + j - 1 = new PKCard(i % n + 1) + - + j,this);/当n为1时,i%8的值永远是0,所以i%8+1的值永远是1,因此n为1时,创建的card的名称是1/ -1到1-13,全是黑桃。其他等级类似。 /纸牌随机分配public void randomCards() / 将纸牌的顺序打乱,否则牌号的将是从A到K的出现规律PKCard temp = null;/ 随机生成牌号for (int i = 0; i 52; i+) int a = (int) (Math.random() * 104);int b = (int) (Math.random() * 104);temp = cardsa;cardsa = cardsb;cardsb = temp;右下角发牌区纸牌的初始化代码:int x = 883;/ 将坐标定位到右下角发牌区int y = 580;for (int i = 0; i 6; i+) / 初始化右下角发牌区的纸牌,共6叠for (int j = 0; j 5; i-) / 初始化玩牌区的纸牌,共5行for (int j = 0; j = 104) / 如果索引值超出数组下标continue; / 退出本次循环,执行外层循环pane.add(cardsn); / 将索引处的纸牌添加到容器中cardsn.turnRear(); / 将纸牌转向背面cardsn.moveto(new Point(x, y); / 将纸牌放在固定的位置上map.put(new Point(x, y), cardsn); / 将纸牌及其坐标值存入map中x += 101; / 每两列之间的x坐标相距101个像素x = 20; / x坐标回到起点位置y -= 5; / 主坐标向上移5个像素发牌操作功能代码:public void deal() / 发牌,指从右下角的发牌区发牌this.setNA();/ 判断10列中是否有空列for (int i = 0; i 10; i+) if (this.getLastCardLocation(i) = null) JOptionPane.showMessageDialog(this, 有空位不能发牌!, 提示,JOptionPane.WARNING_MESSAGE);return;int x = 20;for (int i = 0; i 10; i+) Point lastPoint = this.getLastCardLocation(i);/ 这张牌应“背面向上”if (c = 0) / 当还没有发过牌时,玩牌区的纸牌列中,每两张纸牌之间的y坐标值相差5,/ 指的是背面牌与背面牌之间以及背面牌与第一张正面牌之间的y距离lastPoint.y += 5;/ 这张牌应“正面向上”else / 两张正面牌之间的y距离lastPoint.y += 20;map.remove(cardsc + i.getLocation();cardsc + i.moveto(lastPoint);map.put(new Point(lastPoint), cardsc + i);cardsc + i.turnFront();cardsc + i.setCanMove(true);/ 将组件card移动到容器中指定的顺序索引。this.pane.setComponentZOrder(cardsc + i, 1);Point point = new Point(lastPoint);if (cardsc + i.getValue() = 1) int n = cardsc + i.whichColumnAvailable(point);point.y -= 240;PKCard card = (PKCard) this.map.get(point);if (card != null & card.isCanMove() this.haveFinish(n);x += 101;c += 10;5.3 纸牌移动操作/用鼠标拖动纸牌public void mouseDragged(MouseEvent arg0) if (canMove) int x = 0;int y = 0;Point p = arg0.getPoint();x = p.x - point.x;y = p.y - point.y;this.moving(x, y);/* * 方法:放置纸牌 */public void setNextCardLocation(Point point) PKCard card = main.getNextCard(this);if (card != null) if (point = null) card.setNextCardLocation(null);main.map.remove(card.getLocation();/ 先从HashMap中删除cardcard.setLocation(card.initPoint); / 为card设置新的坐标main.map.put(card.initPoint, card); / 再将card添加到HashMap中 else point = new Point(point);point.y += 20;card.setNextCardLocation(point);point.y -= 20;main.map.remove(card.getLocation();card.setLocation(point);main.map.put(card.getLocation(), card);card.initPoint = card.getLocation();5.4 纸牌回收操作回收纸牌及过关判定功能主要代码:public void haveFinish(int column) Point point = this.getLastCardLocation(column);PKCard card = (PKCard) this.map.get(point);do this.map.remove(point);card.moveto(new Point(20 + finish * 10, 580);/ 将组件移动到容器中指定的顺序索引。pane.setComponentZOrder(card, 1);/ 将纸牌新的相关信息存入HashMapthis.map.put(card.getLocation(), card);card.setCanMove(false);point = this.getLastCardLocation(column);if (point = null)card = null;elsecard = this.map.get(point); while (card != null & card.isCanMove();finish+;/ 如果8付牌全部组合成功,则显示成功的对话框if (finish = 8) JOptionPane.showMessageDialog(this, 恭喜你,顺利通过!, 成功,JOptionPane.PLAIN_MESSAGE);if (card != null) card.turnFront();card.setCanMove(true);5.5 帮助菜单功能实现主要代码如下:public class AboutDialog extends JDialog JPanel jMainPanel = new JPanel();JTabbedPane jTabbedPane = new JTabbedPane();private JPanel jPanel1 = new JPanel();private JTextArea jt1 = new JTextArea(将电脑多次分发给你的牌按照相同的花色由大至小排列起来。直到桌面上的牌全都消失。);public AboutDialog() setTitle(蜘蛛牌);setSize(300, 200);setResizable(false);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);Container c = this.getContentPane();jt1.setSize(260, 200);jt1.setEditable(false);jt1.setLineWrap(true);jt1.setFont(new Font(楷体_GB2312, java.awt.Font.BOLD, 13);jt1.setForeground(Color.BLUE);jPanel1.add(jt1);jTabbedPane.setSize(300, 200);jTabbedPane.addTab(游戏规则, null, jPanel1, null);jMainPanel.add(jTabbedPane);c.add(jMainPanel);pack();this.setVisible(true);5.6 退出功能的实现主要代码如下:/ “退出”jItemExit.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) main.dispose();System.exit(0););6 蜘蛛纸牌游戏的实现过程图6-1 蜘蛛纸牌的首界面图6-2 蜘蛛纸牌菜单界面图6-3 蜘蛛纸牌的帮助界面图6-4 蜘蛛纸牌的游戏规则图6-5 蜘蛛纸牌的声明图6-6 蜘蛛纸牌的开局界面图6-7 蜘蛛纸牌的简单单一花色界面图6-8 蜘蛛纸牌的中级双花色界面图6-9 蜘蛛纸牌的高级四花色界面图6-10 蜘蛛纸牌的提示界面图6-11 蜘蛛纸牌的发牌及收牌界面图6-12 蜘蛛纸牌的完成界面7 设计体会及今后的改进意见通过这次java课程设计,我发现java是一门强大的语言。以前只是在电脑上面玩玩而已,从来都没有想过自己会亲自动手写出这个游戏,当自己亲手写出之后,感觉很激动。同时,更重要的是通过蜘蛛纸牌这个小游戏,我对java有了更深层次的理解,java是一门面向对象的编程语言,它具有抽象,继承,封装,多态等特性。而对象则具有两个层次的概念,第一个是现实世界中对象指的是客观世界的实体,第二个则是程序中对象就是一组变量和相关方法的集合,其中变量表明对象的状态,方法表名对象所具有的行为。方法和属性则构成了java的类。蜘蛛纸牌游戏主要运用了多线程技术,在java中,创建线程有两种方法,一种是通过创建Thread类的子类来实现,另一中方法是通过实现Runable接口的类来实现。这两中创建线程的方法并没有本质上的区别,但是由于java不允许多继承,所以当一个类要继承另一个非Thred来而实现多线程的话,只能通过实现Runable接口的方式来实现。由于是第一次做这种比较全面的游戏,一开始我的脑中并没有很好的设计的主要思路,因此我去图书馆借了不少有关方面的书籍。并且都大致看了一遍,最后选中了一本我认为最好的也是就发现对这次课设最有帮助的书。回宿舍便开始写起,由于一开始的思路没有布置好,写着写着就发现自己写不下去了,于是我又对着参考书写,写了好久,终于写完了所有的代码,本来以为可以高兴下,没想到问题接二连三的来了,开始是页面运行不出来,图片加载不出来,或者加载出来了部分功能无法实现。无论怎么弄都弄不好,在这个时候,我打算放弃了,但又仔细想了下,都做到这个地步了在放弃,是多么不值得一件事啊。于是我调整了下心情,又重新开始做了起来,最后查了好多资料,在同学的帮助下才完成本次课程设计,在那一刹那间,心情无比的激动。通过这次课程设计我发现自己在对待一件事情的态度上还不够端正,还有许多地方都需要改正。我希望在今后的学习和生活中,自己能像这次的课程设计过程中那样戒骄戒躁,遇到困难的时候,不要轻言放弃,坚持到最后,知道成功。参考文献1 朱庆生,古平等编java程序设计 北京:清华大学出版社.20112 王伟平等编java编程 北京:清华大学出版社.2010.53 黄晓东等编java课程设计案例精编 中国水利水电出版社 附录AboutDialogpackage game;import java.awt.Color;import java.awt.Container;import java.awt.Font;import javax.swing.JDialog;import javax.swing.JPanel;import javax.swing.JTabbedPane;import javax.swing.JTextArea;import javax.swing.WindowConstants;public class AboutDialog extends JDialogJPanel jMainPane = new JPanel();JTabbedPane jTabbedPane = new JTabbedPane();private JPanel jPanel1 = new JPanel();private JPanel jPanel2 = new JPanel();private JTextArea jt1 = new JTextArea(将电脑多次分发给你的牌按照相同的花色由大至小排列起来。直到桌面上的牌全都消失。); private JTextArea jt2 = new JTextArea(该游戏中,纸牌的图片来自于Windows XP的纸牌游戏,图片权属于原作者所有!); /*构造函数*/public AboutDialog()setTitle(蜘蛛牌);setSize(300,200);setResizable(false);setDefaultCloseOperation (WindowConstants.DISPOSE_ON_CLOSE); Container c = this.getContentPane();jt1.setSize(260,200);jt2.setSize(260,200);jt1.setEditable(false);jt2.setEditable(false);jt1.setLineWrap(true); jt2.setLineWrap(true); jt1.setFont(new Font(楷体_GB2312, java.awt.Font.BOLD, 13);jt1.setForeground(Color.blue);jt2.setFont(new Font(楷体_GB2312, java.awt.Font.BOLD, 13);jt2.setForeground(Color.black);jPanel1.add(jt1);jPanel2.add(jt2);jTabbedPane.setSize(300,200);jTabbedPane.addTab(游戏规则, null, jPanel1, null);jTabbedPane.addTab(声明, null, jPanel2, null);jMainPane.add(jTabbedPane);c.add(jMainPane);pack();this.setVisible(true);Spiderpackage game;import java.awt.Color;import java.awt.Container;import java.awt.Point;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.util.Hashtable;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;public class Spider extends JFrame/整型变量,表示难度等级为:简单public static final int EASY = 1; /整型变量,表示难度等级为:普通public static final int NATURAL = 2; /整型变量,表示难度等级为:难public static final int HARD = 3; /设定初始难度等级为简单private int grade = Spider.EASY; private Container pane = null; /生成纸牌数组private PKCard cards = new PKCard104; private JLabel clickLabel = null; private int c = 0; private int n = 0; private int a = 0; private int finish = 0; Hashtable table = null; private JLabel groundLabel = null; public static void main(String args) Spider spider = new Spider();spider.setVisible(true); public Spider()setTitle(蜘蛛牌); setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); /设置框架的大小setSize(1024, 742); /生成SpiderMenuBar对象,并放置在框架之上setJMenuBar(new SpiderMenuBar(this); pane = this.getContentPane(); /设置背景颜色pane.setBackground(new Color(0, 112, 26); /将布局管理器设置成为nullpane.setLayout(null); clickLabel = new JLabel(); clickLabel.setBounds(883, 606, 121, 96); pane.add(clickLabel); clickLabel.addMouseListener(new MouseAdapter() public void mouseReleased(MouseEvent me) if (c 60)Spider.this.deal(); ); this.initCards(); this.randomCards(); this.setCardsLocation(); groundLabel = new JLabel10; int x = 20; for (int i = 0; i 10; i+) groundLabeli = new JLabel(); groundLabeli .setBorder(javax.swing.BorderFactory .createEtchedBorder(javax.swing.border.EtchedBorder.RAISED); groundLabeli.setBounds(x, 25, 71, 96); x += 101; this.pane.add(groundLabeli); this.setVisible(true); this.deal(); this.addKeyListener(new KeyAdapter() class Show extends Thread public void run() Spider.this.showEnableOperator(); public void keyPressed(KeyEvent e) if (finish != 8) if (e.getKeyCode() = KeyEvent
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人力资源管理师专项培训与职业资格认证协议
- 软件开发企业员工入职软件知识产权保护劳动合同
- 跨国汽车维修企业场地租赁及市场拓展合同
- 离婚诉状模板定制与婚姻家庭法律援助合同
- 老字号酒庄酿酒大师傅技艺传承聘用合同
- 研发中心建设资金借款合同范本
- 非全日制定向兼职人员招聘协议
- 高端人才薪酬保密及保密协议
- 文化创意商业街商铺租赁与知识产权保护合同
- 股东企业战略发展规划协议书
- 2025至2030中国牙科手机消耗行业项目调研及市场前景预测评估报告
- NBT 11551-2024 煤矿巷道TBM法施工及验收标准
- 口腔瓷贴面诊疗沟通指南
- 山东安全管理人员大考试题库
- 2025-2030冲牙器行业市场深度调研及发展趋势与投资前景预测研究报告
- 70华诞主题班会课件
- 建筑抗震设计规程(下)DB62T3055-2020
- 商品赠品协议书范本
- 工伤事故赔偿协议书范本
- 2025-2030中国稀土催化材料行业市场发展现状及发展趋势与投资前景研究报告
- 运费补充合同协议
评论
0/150
提交评论