已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
华东交通大学课程设计目录1绪论11.1课程设计意义11.2课设目的11.3课设要求12网络五子棋介绍22.1网络五子棋介绍22.2游戏玩法23系统整体设计33.1整体设计33.2系统流程图44原理分析54.1服务器和客户端通信机制54.2多线程机制75服务器的设计与实现85.1服务器监听85.2传递信息96客户端设计与实现106.1客户端界面设计116.1.1GUI图形界面设计126.1.2注册监听者136.2连接服务器146.3传递信息146.4棋盘数据结构156.5判断输赢算法166.6背景音乐177设计实现188总结20谢辞21参考文献211 绪论1.1 课程设计意义五子棋是起源于中国古代的传统黑白棋种之一。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。经过一个学期的学习,使我对Java有了一定的了解。但要深入理解Java语言,单靠上课是不够的。必须通过课程设计,设计一个比较大的程序,才能更深一步地理解Java语言。在这次课程中,我选择了网络五子棋作为课题。编写网络五子棋游戏要利用到Socket网络编程技术和多线程。通过这次课程设计,熟悉Java的GUI图形界面设计,网络Socket 编程和多线程编程。1.2 课设目的通过课程设计,使学生理论联系实际,在程序设计实践中进一步了解JAVA程序设计方法掌握类和对象的基本编程方法,熟悉GUI图形界面编程技术,初步了解Socket编程方法。1.3 课设要求通过课程设计完成一个网络五子棋游戏。由服务器和客户端组成。在Internet中不同用户使用客户端通过服务器与其它玩家连接。进行五子棋网络对战或聊天。程序中要实现GUI图形界面的棋盘、黑子、白子功能,设计棋局存储数据结构, 实现开始、重来、退出等基本功能, 实现输赢自动判别算法, 实现网络对战功能, 背景音乐播放功能等。2 网络五子棋介绍2.1 网络五子棋介绍五子棋是起源于中国古代的传统黑白棋种之一。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源远流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。网络五子棋是一般五子棋的网络版,没有加入人机对战功能。本软件使两个不同计算机的使用者通过一定的网络连接,达到两人对战的功能。首先运行服务器监听客户端连接请求。运行客户端与服务器相连,若连接成功,则进入游戏。选择房间,一个房间最多两个人,人满后,双方可以开始游戏。2.2 游戏玩法网络五子棋规则:棋盘采用15条横线15条坚线组成交叉的每个点都可以放棋。本游戏至少需要二个客户端才能进行游戏。客户端与服务器连接成功后,进入游戏大厅(房间号为0),选择一个大于0的房间号,如果该房间未满,即小于两个人,则可进入。点“游戏开始”,处于等待状态。如果对方也点击了“游戏开始”。双方就可以在网上进行对战了。在对战的同时还可以聊天,可以在同一房间内私聊,也可以发送消息给所有在线的用户。游戏分黑白两方,每局由规定黑方先行。黑方玩家移动鼠标在棋盘中点击行棋。当黑方行棋完毕,转由白方行棋。同色棋子在棋盘上形成横、竖、斜形成 “五子相连”则获胜。如果弃权,则判为输。3 系统整体设计3.1 整体设计网络五子棋是采用网络协议为TCP/IP的网上对弈游戏,运用“客户端服务器“(c/s)网络架构模式。实现用户通过Internt连接在任何地方与不同玩家进行对战。服务器可以创建任意多局游戏。通过使用多线程和网络套接字SOCKET来实现游戏之间的通讯,它是基于点对点的通讯。开始让服务器初始化建立服务器套接字SOCKET,基于某个端口PORT,服务器始终处于监听状态。客户端是动作的发起者,何时发出申请由客户端决定。客户端向服务器发出申请,服务器给予响应。打开客户端套接字SOCKET,连接到服务器端的地址ADDRESS和端口PORT。连接建立后,创建一个SOCKET实例,并开始一个线程,监听该客户端请求。服务器继续监听其它用户的连接。服务器通过数据输入流从客户端接收信息,并且通过数据输出流把相应的信息发送给客户端。客户端发送请求和响应接收到的各种信息。在服务器和客户端之间传递的消息格式是采用“消息类别+内容“组成的,服务器和客户端在传递消息的过程,根据消息的类别来进行相关的操作。比如要发送聊天信息,则在客户端发送的过程中,自动加上MSG在要发送的消息前面,服务器接收到客户端发来的消息,用startsWith()的方法来读取消息头部,如果等于”MSG“,进行一步判定是为群聊还是私聊,分别调用不同的方法向客户端发送聊天内容。 图313.2 系统流程图服务器流程图:图12图32客户端流程图:图33 图334 原理分析4.1 服务器和客户端通信机制Socket是面向客户/服务器模型设计的,网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。 Socket通常用来实现客户方和服务方的连接。客户程序可以向Socket写请求,服务器将处理此请求,然后通过Socket将结果返回给用户 。在java中使用套接字相当简单,Java API为处理套接字的通信提供了一个类.Socket。使得编写网络应用程序相对容易。JAVA支持流套接字(stream socket)和数据报套接字(datagram socket)。流套接字使用TCP(Transmission Control Protocol,传输控制协议)进行数据传输,而数据报套接字使用UDP(User Datagram Protocol,用户数据报协议)。 图41在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。客户端启动以后,与服务器连接,服务器会启动一个线程来与客户进行文字交流。要完成这个工作,需要完成三个部分的工作:Java中有一个专门用来建立Socket服务器的类,名叫ServerSocket,可以用服务器需要使用的端口号作为参数来创建服务器对象。ServerSocket server=new ServerSocket(8888);这条语句创建了一个服务器对象,这个服务器使用8888号端口。当一个客户端程序建立一个Socket连接,所连接的端口号为8888时,服务器对象server便响应这个连接,并且server.accept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。Socket socket=server.accept();进而得到输入流和输出流,并进行封装。reader=newBufferedReader(newInputStreamReader (socket.getInputStream();writer = new PrintWriter(socket.getOutputStream(), true);随后,就可以使用reader.readLine()方法得到客户端的输入,也可以使用writer.println()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。在所有通讯结束以后应该关闭这两个数据流,关闭的顺序是先关闭输出流,再关闭输入流,即使用 reader.close(); writer.close();相比服务器端,客户端要简单一些,客户端只需用服务器所在机器的ip以及服务器的端口作为参数创建一个Socket对象。得到这个对象后,就可以用建立服务器部分介绍的方法实现数据的输入和输出。socket=new Socket(, 8888);reader=newBufferedReader(new InputStreamReader(socket.getInputStream();writer=new PrintWriter(socket.getOutputStream(), true);以上的程序代码建立了一个socket对象,这个对象连接到ip地址为(本机IP地址,为了验证方便)的主机、端口为8888的服务器对象。并且建立了输入流和输出流,分别对应服务器的输出和客户端的写入。4.2 多线程机制多线程机制是指单个程序可以运行多个不同的线程,执行不同的任务。因为线程只能在单个进程的作用域内活动,所以创建线程比创建进程要廉价得多,同一类线程共享代码和数据空间,每个线程有独立的运行桟和程序计数器(PC),线程切换的开销小。因此多线程编程在现代软件设计中在量采用。创建新线程必须编写一个线程类,用Java编写多线程代码有两种方式l 直接继承Java的线程类Thread;l 实现Runnable接口无论采用哪种方式均需要在程序中编写Run()方法,线程在运行时要完成的任务在该方法实现。Thread 类封装了线程的行为。继承Thread类须重写run()方法实现各自的任务。程序中不要直接调用线程的run()方法,而是调用start()方法启动线程,让其进入可调度的状态,线程获得调度时将自动执行run()方法。由于Java的单重继承的限制,有些类必须继承其它个类时又要实现线程的特性。这时可通过实现Runnable接口的方式来满足两方面的要求。Runnable 接口只有一个方法 run(),它就是线程运行时要执行的方法,只要将具体代码写入其中即可。线程在调度时将自动调用Runnable 接口对象的run方法。多线程是Java的一个特点,多线程可以使程序反应更快、交互性更强,并能提高执行效率。在网络五子中如果服务器是单线程的,则只能与一个客户端相连,就失去了网络对战的意义了。所以应该采用多线程方式。当服务器与一个客户端建立连接,就开启一个线程与之相连,同时监听其它用户的连接。5 服务器的设计与实现网络五子棋游戏服务器端主要由以下几部分组成:图51图51网络五子棋游戏服务器端主要有三个类: Server类、five_ Thread类(线程类)和BManager类(消息广播者)。服务器端主要通过建立流连接来连接客户端。服务器建立与一个客户端连接,就开始一个线程,并同时监听其它客户端的连接。服务器接收一客户端的信息,接收信息后按照此客户端的要求将信息发送到相应的客户端,端起到了中介服务器的作用。为了更清楚地了解客户端的登陆情况,将服务器设计成图形界面。创建成一个可以显示游戏信息的框架。在框架中创建一个包含文本区的滚动窗格,并在文本区显示游戏信息。 图525.1 服务器监听首先创建一个服务器对象,并把它附加到8888号端口上,服务通过这个端口来监听客户端的连接请求。通过服务器对象的accept方法来创建一个Socket对象并使其与客户机连接,就开启一个线程处理客户之间数据,同时继续监听其它客户端的连接请求。并将线程添加至BManager对象bMan中。ServerSocket server=new ServerSocket(8888);Socket socket=server.accept();five_Thread thread=new five_Thread(socket);/建立一线程thread.start();/启动线程bMan.add(thread);/线程添加至BManager对象5.2 传递信息当于客户端建立连接后,就建立输入输出流,由于消息的发送和接收。reader=newBufferedReader(newInputStreamReader (socket.getInputStream();writer = new PrintWriter(socket.getOutputStream(), true);five_Thread对象不仅可以获取套接字、输入输出流,而且它还提供了有关客户机的消息。例如客户机的姓名、房间号、游戏开始与否等。这是因为我们需要确定消息的来源及主要在某个房间传播的消息。并且,消息广播者也需要参照线程对象的房间号,以便将消息发送至某个房间中。BManager类继承了Vector类,它的元素为five_ Thread线程对象,这样可以更容易用BManager 的对象来管理线程对象,如添加、删除、返回线程对象。BManager可以自由地参照five_Thread对象的房间号和玩家的名字,这样能向指定的房间发送消息和用户名字。需要比较Bmanager各元素的房间号和给定的房间号,若两者相同,则向此房间发送消息。服务器和客户端之间的交流主要是相同的房间号之间的用户进行。如发送聊天消息,棋子信息,赢输消息的传送。sendToAll(String msg)方法向所有用户发送消息,主要是发送群聊消息。因为消息的发送主要在相同的房间号中时行,要发送群聊消息,即所有房间的用户都能招收到。在输入聊天信息前加a。表示向所有人发送。SendToRoom(five_Thread thread, String msg)方法用于向指定的房间(roomnum)发送消息(msg)。房间内的两个用户都能接收到消息。主要用于发送发私聊信息。sendTothreadhers(five_Thread thread, String msg)方法用于向与消息发送者处于同一房间的用户发送各种命令。比如发送在1号房间的一个用户发来“WIN“,服务器向1号房间的另一个用户发送LOSE。实现原理:使用for循环检查元素(线程)的房间号。用getRoomNumber()得到发送信息的线程的房间号,当房间号相等时,则调用sendTo(i, msg)方法向第i个房间发送消息。但并不向thread连接的客户机发送消息。服务器在five_Thread类中重写run()方法,由于处理在与客户端连接过程中的数据传输,处理和控制。消息传递格式“消息类别+内容“。“ROOM2“表示客户端请求进入第二号房间。服务器判断2号房间是否为满,如果不为满,则向客户端发送“ROOM2”,表示可以进入,并发送ROOM2中的其它用户名字。如果人数已满,则发送FULL。表示房间已满,无法进入。“NAME“表示进入游戏大厅的用户名字。“START“表示客户端要求开始游戏,如果对方也要求游戏,则游戏开始。服务器发送COLORWRITE和COLORBLACK表示棋子颜色分别给两个客户端。“DROPGAME”表示放弃正在进行中的游戏。服务器发送“DROPGAME“给相同房间中的另一用户。6 客户端设计与实现客户端负责与用户之间的交互。包括棋盘类OmokBoard类和Client类。OmokBoard类继承了JPanel类,它主要用于棋盘的绘制和监听鼠标事件,获得棋子坐标和绘制棋子。它必须拥有输出流,用以向对手传递棋手的下棋信息。主要的方法有:putOpponent ()在客户端显示对方棋子,保持双方棋子的一致性。check()判断一方向上同色棋子个数。drawStones()绘制棋子。drawBoard()调用不同的方法,分析实现棋盘、棋子、提示信息的显示。isRunning()标记游戏运行状态。reset()清空棋盘,在游戏结果后运行。Client类,继承JFrame类和实现Runnable接口。主要由于界面初始化和注册事件监听者。主要方法:Run()方法覆盖Runnable接口里的run ()方法,用以对游戏过程中的数据传输,处理,控制。actionPerformed(ActionEvent ae)实现点击菜单、按钮、文本框回车事件的具体代码。Connect()与服务器连接。endgame()结束游戏。playersInfo()显示用户位置信息,是在游戏大厅中,还是在房间里。goToWaitRoom()从房间里退出,进入游戏大厅。网络五子棋客户端主要由以下几部分组成:图61 图616.1 客户端界面设计图626.1.1 GUI图形界面设计五子棋客户端界面本软件的的客户端的界面如图6-2所示,主要应用SWING的组件来实现。界面由菜单、按钮、文本框、各种对话框、棋盘和黑白棋子等组成。客户端中的按钮、文本框、标签等GUI部件都是布置在面板JPanel上的,其中还包括将一块面板入在另一块面板中。这样能实现比较复杂的布局。多个不同的GUI部件放在面板上时,还要设置它们的布局方式。这里采用了网络布局(GridLayout)和方位布局(BorderLayout)。最后将各个面板JPanel添加到窗体JFrame中。菜单包括游戏、音乐、和帮助菜单项。首先创建一个菜单条(MenuBar) jmb,然后创建不同的菜单项(Menu)加入到菜单条中。JMenu sound = new JMenu(音乐); jmb.add(sound);最后创建菜单子项(MenuItem)加入菜单项,比如给“音乐”菜单项添加“播放”菜单子项:JMenuItem play = new JMenuItem(播放);Sound.add(play);棋盘的绘制。五子棋盘(OmokBoard类),五子棋盘继承了JPanel,它内嵌于框架窗口中棋盘的大小采用15*15个方格。每个交叉点处可放置棋子。private void drawLine() gbuff.setColor(Color.BLACK); for(int i=1; i=size;i+) gbuff.drawLine(cell, i*cell, cell*size, i*cell); gbuff.drawLine(i*cell, cell, i*cell , cell*size); 当一个用户放下一个棋子后,同一房间里的两个用户的棋盘都要重画,以显示自己和对方下的棋子等信息。棋子的绘制。用白色绘制一个圆形的边框,将填充黑色,这样就画好了一个黑色棋。位置要根据获得的鼠标点击的坐标和棋盘的大小来定。private void drawBlack(int x, int y)/绘制黑棋 Graphics2D gbuff=(Graphics2D)this.gbuff; gbuff.setColor(Color.black); gbuff.fillOval(x*cell-cell/2, y*cell-cell/2, cell, cell); gbuff.setColor(Color.red); gbuff.drawOval(x*cell-cell/2, y*cell-cell/2, cell, cell);/边框6.1.2 注册监听者图形用户界面的每个可能产生事件的组件称为事件源, 希望事件源上发生的事件被程序处理, 就要把事件源注册给能够处理该事件源上事件的监听者。 图63 在这里按钮,菜单,和发送消息的文本框都是事件源。要想按钮或菜单发生事件时,程序能处理,必须注册监听者。按钮动作事件ActionEvent的监听者接口为ActionListener,给按钮注册监听者的方法为addActionListener()。sendBox.addActionListener(this);/文本框按回车键enterButton.addActionListener(this);exitButton.addActionListener(this);在actionPerformed(ActionEvent ae)中编写上体的事件处理代码。在发生事件时事件源将给其注册的所有监听者对象的发送消息,实际上就是调用监听者对象的actionPerformed()方法,从而完成事件的处理。通过getSource()方法:用来获取事件源对象。处理不同的事件。如处理单击“音乐播放”菜单和“游戏开始”引起的事件的actionPerfrmed()方法。public void actionPerformed(ActionEvent ae) /播放音乐 if(ae.getSource()=play) Object selection = fi.MID,five.mid; Object set = JOptionPane.showInputDialog(null, 选择音乐.,播放., JOptionPane.QUESTION_MESSAGE,null,selection,selecton0); music=new Sound(set.toString();music.play(); else if(ae.getSource()=startButton) try writer.println(START);/发送开始信息 infoView.setText(等待对方决定.); startButton.setEnabled(false); catch(Exception e)进行五子棋游戏的一个重要的内容是获取鼠标点击时在棋盘中的坐标,即落下棋子的位置。addMouseListener(new MouseAdapter() public void mousePressed(MouseEvent me) if(!enable)return;/是否轮到下棋 int x=(int)Math.round(me.getX()/(double)cell);/得到鼠标坐标 int y=(int)Math.round(me.getY()/(double)cell); /坐标要求不超过棋盘大小,在坐标上不存在棋子 if(x=0 | y=0 | x=size+1 | y=size+1)return; if(mapxy=BLACK | mapxy=WHITE)return; writer.println(STONE+x+ +y);/向服务器发送棋子信息 6.2 连接服务器客户端连接服务器,首先用服务器所在机器的ip以及服务器的端口作为参数创建一个Socket对象。客户端调用connect()方法进行连接。Socketsocket=new Socket(, 8888);这里以本机地址为IP地址,是为了方便服务器和客户端运行在同一台机器上做实验。客户端一开始运行,便连接IP主机的8888号端口如果连接成功,则在TextArea对象msgViewk中显示成功消息。否则显示连接错误的消息。6.3 传递信息客户端之间的信息传递,比如发送开始游戏,聊天都要通过先经过服务器发送。服务器接收到客户端发送的各种消息,识别不同消息的类别,采用不同的方法进行处理。当建立与服务器的连接后,客户端通过数据输出流发送相应的请求给服务器,并且通过数据输入流从服务器端接收信息。客户端通过开启一个线程,处理与服务器之间的数据。reader=new BufferedReader(new InputStreamReader(socket.getInputStream(); writer=new PrintWriter(socket.getOutputStream(), true);new Thread(this).start();/开始一个将调用这个runnable的run()方法的线程Java运行系统调用这个方法run()来执行线程。在Client类中,继承了JFrame类,由于Java的单继承性,Client类就不能再继承Thread,但可以实现runnable接口,通过覆盖Runnable接口里的run ()方法,用以对游戏过程中的数据传输,处理,控制。客户端与服务器之间传递的信息,都是由“消息种类+内容“组成的,服务器接收到来客户端的消息,分析”消息种类“中的内容,进行相关的操作。下面对各种消息的种类作一个介绍。NAME当用户在客户登陆时,发送给服务器,用于显示登陆用户名字。ROOM当用户登陆上时,ROOM号为0,记为“游戏大厅”,选择房间的用户在“游戏大厅“,房间号为大于0的整数,一个房间最多容纳2人,即对战的双方。当服务器端接收到查看ROOM房间号人数是否为满。不为满,则发送”ROOM+n”,给客户端,表示可以进入。否则发送“FULL”。PLAYERS在客户端显示相同房间用户列表。DISCONNECT表示对方断线。COLOR得到棋子颜色。COLORBLACK表示黑棋。WIN表示获胜。LOSE表示失败。EXIT表示对方离开房间。ENTER显示相同房间中登陆的用户。STONE表示对方下棋棋子的坐标。MSG表示聊天的信息,只在相同的房间内可见。如果要想让所有的登陆的用户都能收到聊天信息,则消息种类为”MSGa”6.4 棋盘数据结构棋盘设置成有15*15个方格。定义了一个二维数组Map用于保存棋子在棋盘中的位置。在程序中用常数1表BLACK(黑棋),用1表示WRITE(白棋),用0表示在此位置上无棋子。如在(3,3)位置上有一个黑棋。则Map33的值为1。public static final int BLACK=1, WHITE=-1;/颜色标识值private int map;/Map是一个二元数组,用于保存棋子的位置6.5 判断输赢算法输赢的判断是网络五子棋游戏中一个很重要的部分。当双方每放下一个棋子的时候,程序都要进行判断是否已经产生了输赢。如果是,则停止游戏,并发送结果给服务器,服务器再发送结果给对方。横,竖或者对角线方向上拥有五颗同样的棋子时,即为胜利。当在棋盘中放入一个棋子时,比如白色。程序要计算它左边连在一起的白色棋子的个数,然后计算右边与它相连在一起的白色棋子的个数。再将两数相加,如果为四,与自己加起来刚好为五。则白棋获胜。用同样的方法在垂直和对角线方向进行判断同色棋子个数。如果获胜,则客户端发送WIN给服务器,否则由对方下棋,并重复进行相同的运算。count()方法用来查找并计算连在一起的棋子的个数。P为基准坐标,dx、dy分别为表示横向于竖向的变量。col代表棋子颜色。弱dx为-1,dy为0,则计算左边连续棋子的个数;若dx为1,dy为1,则计算左下到右上连续棋子的个数。dx与dy只取-1、0、1三个值之一。下面是count()方法的代码。private int count(Point p, int dx, int dy, int col) int i=0; for(; mapp.x+(i+1)*dxp.y+(i+1)*dy=col ;i+); return i;用check()方法调用count()方法,分别在横、竖和对角线方向上计算相连同色棋子的个数。private boolean check(Point p, int col)if(count(p, 1, 0, col)+count(p, -1, 0, col)=4)/横向检查 return true;if(count(p, 0, 1, col)+count(p, 0, -1, col)=4)/竖向检查 return true;if(count(p, -1, -1, col)+count(p, 1, 1, col)=4)/对角线方向检查 return true;if(count(p, 1, -1, col)+count(p, -1, 1, col)=4)/对角线方向检查 return true; return false; 6.6 背景音乐 图64通过下拉框,选择要播放的音乐,点击确定开始播放。停止播放,在菜单栏中单击停止播放。如图64所示。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年抚州职业技术学院单招职业技能考试必刷测试卷带答案解析
- 2026年上海财经大学浙江学院单招职业技能测试必刷测试卷及答案解析(名师系列)
- 2026年上海政法学院单招职业倾向性测试题库及答案解析(夺冠系列)
- 2026年安徽工贸职业技术学院单招职业倾向性测试必刷测试卷附答案解析
- 2026年泰州职业技术学院单招职业技能考试题库带答案解析
- 房屋建设使用协议书
- 房屋拆卸改造协议书
- 房屋按揭还款协议书
- 房屋机关合同协议书
- 房屋渣土清运协议书
- 土地买卖合同参考模板
- 大学语文知到智慧树章节测试课后答案2024年秋南昌大学
- 中国中学生心理健康量表及评分标准
- 2024危重症患儿管饲喂养护理-中华护理学会团体标准课件
- 2024-2030年中国磷苯妥英钠行业市场发展规模及投资可行性分析报告
- UL982标准中文版-2019电动家用食品制备机第七版
- 精癃(前列腺增生)中医临床路径及入院标准2020版
- 化工厂冬季四防安全知识培训
- 部编版六年级语文上册《语文园地二》精美课件
- 容貌焦虑课件教学课件
- GA 2139-2024警用防暴臂盾
评论
0/150
提交评论