: 能力拓展训练
能力拓展训练能力拓展训练 能力拓展训练 题 题题 题 目 目目
目 扫雷游戏程序设计
扫雷游戏程序设计扫雷游戏程序设计 扫雷游戏程序设计 学 学学 学 院 院院
院 计算机科学与技术
计算机科学与技术计算机科学与技术 计算机科学与技术 专 专专 专 业 业业 业 班 班班 班 级 级级 级 姓 姓姓 姓 名 名名 名
指导教师
指导教师指导教师 指导教师
日期 日期日期
日期 2010.07.08 目录 1 前言 .............................................................................................................................................. 3 2 问题描述及运行环境 ................................................................................................................... 3 2.1 问题定义 ............................................................................................................................ 3 2.3 运行环境 ............................................................................................................................ 3 3 扫雷游戏设计所涉及的知识 ....................................................................................................... 3 3.1 JAVA的图形界面 .............................................................................................................. 3 3.2 AWT概述 ........................................................................................................................... 3 3.3 AWT基本组件 ................................................................................................................... 4 4 功能描述....................................................................................................................................... 5 5 程序流程图 ................................................................................................................................. 15 6 运行结果..................................................................................................................................... 16 7总结 .............................................................................
................................................................ 18 8 参考文献..................................................................................................................................... 18
扫雷游戏程序设计
扫雷游戏程序设计扫雷游戏程序设计 扫雷游戏程序设计 摘要 摘要摘要
摘要:本文介绍的是扫雷游戏的设计方法,该游戏使用 JAVA语言编写,主要使用了JAVA
的程序界面设计的方法和各种事件监听和处理的方法。 关键字 关键字关键字
关键字:扫雷 界面设计 JAVA 事件监听 事件处理 1 前言 前言前言
前言 扫雷游戏的目标是尽快找到雷区中的所有地雷,而不许踩到地雷。如果挖开的是地雷, 您将输掉游戏。
扫雷游戏在程序运行后自己设置地雷数目,在鼠标左键点击下寻找地雷,点击“开始” 按钮开始游戏,并给出胜利和失败的提示。
在游戏菜单上,单击游戏区中的任何方块,都要启动计时器。通过单击即可挖开方块。 如果挖开的是地雷,则您输掉游戏,并出现提示。如果方块上出现数字,则表示在其周围的 八个方块有多少颗地雷。
游戏区包括雷区、地雷计数器和计时器。 2 问题描述及运行环境
问题描述及运行环境问题描述及运行环境
问题描述及运行环境 2.1 问题定义 本课程设计是用JAVA编写一个扫雷游戏。
程序的功能是生成指定数目的地雷,通过鼠标操作玩游戏。点击屏幕上的“开始”按钮 重新开始游戏;标出所有地雷后胜出;当鼠标左键击中地雷失败。
扫雷游戏是WINDOWS系统自带的一个娱乐性的小游戏,在玩扫雷游戏的过程中 也可
以很好的培养耐心和细心,同时在无聊得时候可以用以休闲娱乐,如果我们自己也能动手做 一个小程序来实现这个功能,自然能乐在其中。 2.3 运行环境
本次课程设计运用Java语言,在Eclipse环境下实现。 3 扫雷游戏设计所涉及的知识
扫雷游戏设计所涉及的知识扫雷游戏设计所涉及的知识
扫雷游戏设计所涉及的知识 3.1 JAVA的图形界面 图形界面简称GUI,是用图形的方式,借助菜单、按纽等标准界面元素和鼠标操作,帮
助用户方便地想计算机系统发出指令、启动操作,并将系统的运行结果同样以图形方式显示 给用户的技术。JAVA的图形界面技术既为使用java.awt包来创建图形界面的方法,包括AWT 组件、窗口和菜单设计、布局管理器以及绘图操作等。 3.2 AWT
概述 AWT既抽象窗口工具集,用于图形用户界面的开发。AWT的功能包括以下方面: (1)丰富的图形界面组件。
(2)强大的事件处理模型图形和图形工具,包括形状、颜色和字体。
(3)布局管理器,可以进行灵活的的窗口布局,设计特定窗口的尺寸和和屏幕分辨率。 (4)无关数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴操作。 (5)打印和无鼠标操作。
Java.awt是java基本包中最大的一个,其中定义了所有的GUI组件类,以及其他用于构造 图形界面的类。 3.3 AWT基本组件 (1)标签组件(Label)
标签组件显示的是静态文本,在通常情况下是不能编辑的,能起到提示的作用 Label组件有三种构造函数: Label(): 创建空的标签
Label(String):创建一个带初始字符串的标签。
Label(String,int):创建一个带初始字符串及指定对齐方式的标签。 (2)文本域
文本域一般用来让用户输入姓名、信用卡号等这样的信息,它是一个能够接收用户的键 盘输入的小块区域。TextField():创建空的文本域 (3)按钮(Button)
几乎所有的交互式程序中都会有按纽,它是一种交互能力强且交互方便的控件,这个控 件提供了“按下并动作”的基本用户界面。 按纽的构造方法有:
Button():建立一个没有标示字符串的新按纽类对象。
Button(String Label):建立一个标示字符串为Label的新按纽类的对象 (4)画板组件(Panel)
我们在界面上安排各种组件时,有时会需要将组件成组放置,这时就可以使用面板组件。 Panel是最简单的容器组件,本身是一个矩形区域,可以在其中放入各种组件。但它仅仅是 安排各种组件的一种结构,需要最后加入到别的容器中才能实现GUI的功能。 面板组件的创建 Panel():用默认的布局管理器创建面板组件。 Panel(LayoutManager layout):用指定的布局管理器创建面板组件。 (5)框架窗口组件(Frame)
Frame是于浏览器的可运行的主窗口,通常用于进行开发桌面应用程序。Frame 拥有边界和标题栏设置,其大小可以进行设置调整。Frame里面需要加入组件,也可以加入 菜单,或在上面绘图。 Frame的创建 Frame():创建一个没有窗口标题的窗口框架。 Frame(String):创建一个指定窗口标题的窗口框架。
(6)布局管理器
FlowLayout布局管理器
FlowLayout布局管理是一种最简单的布局管理方法,是Panel的默认布局。它以流式的方式, 自左向右,自上而下地放置容器中的组件,即组件按每行先后自左向后放置,一行放不下再 换行。
FlowLayout布局管理器的创建 FlowLayout():创建默认的FlowLayout布局管理器 FlowLayout(int):以指定的对齐方式创建FlowLayout布局管理器。其中的参数有 FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER FlowLayout(int,int,int):以指定的对齐方式及间距创建FlowLayout布局管理器。其中第
一个参数为对齐方式,第二个参数为组件间间距,第三个参数为列间距。 (7)事件处理
事件处理是一个接受事件、解释事件并处理用户交互的方法。
事件处理有三个要素: ①事件源 事件源是一个时间的产生者,如按牛、窗口及文本域等。 ②事件类型 JAVA中所有的事件都封装成一个类,这些事件类被集中在java.awt.exent包和 java.swing.event包中,所有的事件类均继承了AWTEvent类和一个方法getSouce()方法, 该方法返回发生事件的对象。
③事件 不同的类型事件发生后,由事件接受事件并调用响应的事件处理方法, 所有的事件实际上都是一个java.awt.exent包中的借口,继承了java.util.EventListener
接口。不同的事件有不同的处理方法, (8)键盘事件处理
该程序使用的是键盘监听事件,键盘事件对应的事件类是KeyEvent类,使用的该类的
方法是getKeyCode()获得按下或释放的键代码getKeyText()获得按下或释放的键的字符串。 键盘事件对应的事件为:KeyListener或KeyAdapter 实现键盘事件的操作步骤是:
第一步,注册KeyListeneraddKeyListener().当事件源所在的类已经实现KeyListener
的接口时,参数可用this,否则需创建或继承一个KeyListener
第二步,实现KeyListener接口的所有方法,即KeyPressed(KeyEvent e)、KeyReleased(KeyEvent
e)、KeyTyped(MouseEvent e)。 4 功能描述
功能描述功能描述
功能描述 本扫雷游戏的实现,共分为以下几个模块,具体实现函数如下示:
package minesweeper;
public class Main {
public static void main(String args[]) {
(new MainBomb()).show(); } }
package minesweeper;
import java.awt.*;
import java.awt.event.*; import javax.swing.*;
/*按扭类*/
class Bomb extends JButton {
public int num_x,num_y; //第几号方块
public int BombRoundCount; //周围雷数 public boolean isBomb; //是否为雷 public boolean isClicked; //是否被点击 public int BombFlag; //探雷标记
public boolean isRight; //是否点击右键 public Bomb(int x,int y) {
BombFlag = 0; num_x = x; num_y = y;
BombRoundCount = 0; isBomb = false; isClicked = false; isRight = false; } }
package minesweeper;
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.Label; import java.awt.Panel;
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.Icon;
import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame;
import javax.swing.JOptionPane; import javax.swing.JTextField; import javax.swing.SwingUtilities;
/*窗口及算法实现类*/
class MainBomb extends JFrame implements ActionListener,MouseListener {
public JTextField text;
public Label nowBomb,setBomb;
public int BlockNum,BombNum; //当前方块数当前雷数 public Icon icon_bomb = new ImageIcon(\"Bomb.gif\"); //踩雷
public Icon icon_bomb_big = new ImageIcon(\"bomb_big.gif\"); //踩雷标记 public Icon icon_flag = new ImageIcon(\"flag.gif\"); //雷标记
public Icon icon_question = new ImageIcon(\"question.gif\"); //疑惑是否有雷 public JButton start = new JButton(\" 开始 \"); public Panel MenuPamel = new Panel(); public Panel mainPanel = new Panel(); public Bomb[][] bombButton; /*界面设计*/
public MainBomb() { super
(\"扫雷游戏--2010.7\"); BlockNum = ; BombNum = 10;
Container c=getContentPane(); c.setBackground(Color.gray); c.setLayout(new BorderLayout()); text=new JTextField(\"10 \
nowBomb = new Label(\"当前雷数\"+\" \"+BombNum+\"\"); setBomb= new Label(\"设置地雷数\");
start.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {
BombNum = Integer.parseInt(text.getText().trim()); if(BombNum >= 10 && BombNum < 50 ) replay(); else {
JOptionPane msg = new JOptionPane();
JOptionPane.showMessageDialog(null,\"您设置的地雷数太多了,请重设!\错误\} } } );
MenuPamel.add(setBomb); MenuPamel.add(text); MenuPamel.add(start); MenuPamel.add(nowBomb); c.add(MenuPamel,\"North\");
mainPanel.setLayout(new GridLayout( (int)Math.sqrt(BlockNum) (int)Math.sqrt(BlockNum)) );
bombButton=new Bomb[ (int)Math.sqrt(BlockNum) ][]; for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++) {
bombButton[ i ]=new Bomb[ (int)Math.sqrt(BlockNum) ]; } for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++ ) for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++ ) {
bombButton[ i ][ j ]=new Bomb(i,j);
bombButton[ i ][ j ].setForeground( Color.gray); bombButton[ i ][ j ].addActionListener(this); bombButton[ i ][ j ].addMouseListener(this); }
for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++ ) for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++ ) mainPanel.add(bombButton[ i ][ j ]); c.add(mainPanel,\"Center\"); startBomb();
setSize(400,400); setLocation(350,200); setResizable(false); }
/*布雷*/
public void startBomb() {
for(int i=0;i if(bombButton[ x ][ y ].isBomb==true) , i--; else bombButton[ x ][ y ].isBomb=true ; } } /*重新开始*/ public void replay() { nowBomb.setText(\"当前雷数\"+\" \"+BombNum+\"\"); for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++) for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++) { bombButton[ i ][ j ].isBomb=false; bombButton[ i ][ j ].isClicked=false; bombButton[ i ][ j ].setEnabled(true); bombButton[ i ][ j ].setText(\"\"); bombButton[ i ][ j ].setIcon(null); } startBomb(); } /*是否挖完了所有的雷*/ public void isWin() { int findBomb=0; //找到的地雷数 for(int i = 0;i < (int)Math.sqrt(BlockNum) ; i++) for(int j = 0;j < (int)Math.sqrt(BlockNum ); j++) { if(bombButton[ i ][ j ].isBomb == true && bombButton[ i ][ j ].isRight == true) findBomb++; } if( findBomb == Integer.parseInt(text.getText().trim()) ) { JOptionPane msg = new JOptionPane(); JOptionPane.showMessageDialog(this,\"您挖完了所有的雷,您胜利了!\您胜利了\} } /*计算方块周围雷数 */ public void CountRoundBomb() { for (int i = 0; i < (int)Math.sqrt(BlockNum); i++) { for (int j = 0; j < (int)Math.sqrt(BlockNum); j++) { int count = 0; //当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数 if (bombButton[ i ][ j ].isBomb != true) { if ( (i - 1 >= 0) && (j - 1 >= 0)) { if (bombButton[i - 1][j - 1].isBomb == true) { count += 1; //检测左上方空格是否是地雷 } } if ( (i - 1 >= 0)) { if (bombButton[i - 1][ j ].isBomb == true) { count += 1; //检测上方空格是否为地雷 } } if ( (i - 1 >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1)) { if (bombButton[i - 1][j + 1] .isBomb == true) { count += 1; //检测右上方是否为地雷 } } if ( (j - 1 >= 0)) { if (bombButton[ i ][j - 1] .isBomb == true) { count += 1; //检测左边是否为地雷 } } if ( (i >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1)) { if (bombButton[ i ][j + 1].isBomb == true) { count += 1; //右边 } } if ( (j - 1 >= 0) && (i + 1 <= (int)Math.sqrt(BlockNum)-1)) { if (bombButton[i + 1][j - 1].isBomb == true) { count += 1; //左下 } } if ( (i + 1 <= (int)Math.sqrt(BlockNum)-1)) { if (bombButton[i + 1][ j ].isBomb == true) { count += 1; //下 } } if ( (j + 1 <= (int)Math.sqrt(BlockNum)-1) && (i + 1 <= Math.sqrt(BlockNum)-1)) { if (bombButton[i + 1][j + 1].isBomb == true) { count += 1; //右下 } } bombButton[ i ][ j ].BombRoundCount = count; } } } } /**当选中的位置为空,则翻开周围的地图**/ public void isNull(Bomb[][] bombButton,Bomb ClickecButton) { int i,j; i=ClickecButton.num_x; j=ClickecButton.num_y; if (ClickecButton.isBomb==true) { } else { if ( (i - 1 >= 0) && (j - 1 >= 0)) { //检测左上方空格是否是空 if (bombButton[i - 1][j - 1].isBomb == false && bombButton[i - 1][j - 1].isClicked == false && bombButton[i - 1][j - 1].isRight == false) { bombButton[i - 1][j - 1].setText((bombButton[i - 1][j - 1].BombRoundCount)+\"\"); bombButton[i - 1][j - 1].setEnabled(false); bombButton[i - 1][j - 1].isClicked=true; } } if ( (i - 1 >= 0)) { //检测上方空格是否为空 if (bombButton[i - 1][ j ] .isBomb == false && bombButton[i - 1][ j ].isClicked == false && bombButton[i - 1][ j ].isRight == false) { bombButton[i - 1][ j ].setText((bombButton[i - 1][ j ].BombRoundCount)+\"\"); bombButton[i - 1][ j ].setEnabled(false); bombButton[i - 1][ j ].isClicked=true; } } if ( (i - 1 >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测右上方是否为空 if (bombButton[i - 1][j + 1] .isBomb == false && bombButton[i - 1][j + 1].isClicked == false && bombButton[i - 1][j + 1].isRight == false) { bombButton[i - 1][j + 1].setText((bombButton[i - 1][j + 1].BombRoundCount)+\"\"); bombButton[i - 1][j + 1].setEnabled(false); bombButton[i - 1][j + 1].isClicked=true; } } if ( (j - 1 >= 0)) { //检测左边是否为空 if (bombButton[ i ][j - 1].isBomb == false && bombButton[ i ][j - 1].isClicked == false && bombButton[ i ][j - 1].isRight == false) { bombButton[ i ][j - 1].setText((bombButton[ i ][j - 1].BombRoundCount)+\"\"); bombButton[ i ][j - 1].setEnabled(false); bombButton[ i ][j - 1].isClicked=true; } } if ( (i >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测右边空格是否是空 if (bombButton[ i ][j + 1].isBomb == false && bombButton[ i ][j + 1].isClicked == false && bombButton[ i ][j + 1].isRight == false) { bombButton[ i ][j + 1].setText((bombButton[ i ][j + 1].BombRoundCount)+\"\"); bombButton[ i ][j + 1].setEnabled(false); bombButton[ i ][j + 1].isClicked=true; } } if ( (j - 1 >= 0) && (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测左下空格是否是空 if (bombButton[i + 1][j - 1].isBomb == false && bombButton[i + 1][j - 1].isClicked == false && bombButton[i + 1][j - 1].isRight == false) { bombButton[i + 1][j - 1].setText((bombButton[i + 1][j - 1].BombRoundCount)+\"\"); bombButton[i + 1][j - 1].setEnabled(false); bombButton[i + 1][j - 1].isClicked=true; } } if ( (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测下边空格是否是空 if (bombButton[i + 1][ j ].isBomb == false && bombButton[i + 1][ j ].isClicked == false && bombButton[i + 1][ j ].isRight == false) { bombButton[i + 1][ j ].setText((bombButton[i + 1][ j ].BombRoundCount)+\"\"); bombButton[i + 1][ j ].setEnabled(false); bombButton[i + 1][ j ].isClicked=true; } } if ( (j + 1 <= ((int)Math.sqrt(BlockNum)-1) ) && (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检 测右下边空格是否是空 if (bombButton[i + 1][j + 1].isBomb == false && bombButton[i + 1][j + 1].isClicked == false && bombButton[i + 1][j + 1].isRight == false) { bombButton[i + 1][j + 1].setText((bombButton[i + 1][j + 1].BombRoundCount)+\"\"); bombButton[i + 1][j + 1].setEnabled(false); bombButton[i + 1][j + 1].isClicked=true; } } if ( (i - 1 >= 0) && (j - 1 >= 0))//检测左上 isNull(bombButton,bombButton[i - 1][j - 1]); if ( (i - 1 >= 0)) isNull( bombButton,bombButton[i - 1][ j ]);//检测上方 if ( (i - 1 >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1)) isNull( bombButton,bombButton[i - 1][j + 1]);//检测右上 if ( (j - 1 >= 0)) isNull(bombButton,bombButton[i][j - 1]);//检测左边 if ( (i >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) isNull(bombButton,bombButton[i][j + 1]);//检测右边 if ( (j - 1 >= 0) && (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) isNull(bombButton,bombButton[i + 1][j - 1]); //检测左下 if ( (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) //检测下 isNull(bombButton,bombButton[i + 1][ j ]); if ( (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) && (i + 1 ((int)Math.sqrt(BlockNum)-1)) ) //检测右下 isNull(bombButton,bombButton[i + 1][j + 1]); } } public void actionPerformed(ActionEvent e) { CountRoundBomb(); if(((Bomb)e.getSource()).isBomb==false && ((Bomb)e.getSource()).isClicked false) { ((Bomb)e.getSource()).setText(( ((Bomb)e.getSource()).BombRoundCount )+\"\"); ((Bomb)e.getSource()).isClicked=true; ((Bomb)e.getSource()).setIcon(null); ((Bomb)e.getSource()).setEnabled(false); if((((Bomb)e.getSource()).BombRoundCount) == 0) isNull(bombButton,(Bomb)e.getSource()); <= == isWin(); } else if(((Bomb)e.getSource()).isBomb == true) { for(int i=0;i<(int)Math.sqrt(BlockNum);i++) for(int j=0;j<(int)Math.sqrt(BlockNum);j++) { if(bombButton[ i ][ j ].isBomb == true) bombButton[ i ][ j ].setIcon(icon_bomb); } ((Bomb)e.getSource()).setIcon(icon_bomb_big); JOptionPane msg = new JOptionPane(); JOptionPane.showMessageDialog(this,\"你踩到地雷了,按确定重来\你踩到地雷了\replay(); } } public void mouseClicked(MouseEvent e) { Bomb bombSource = (Bomb)e.getSource(); boolean right = SwingUtilities.isRightMouseButton(e); if((right == true) && (bombSource.isClicked == false)) { bombSource.BombFlag = (bombSource.BombFlag + 1)%3; if(bombSource.BombFlag == 1) { if(BombNum > 0 && bombSource.isRight == false ){ bombSource.setIcon(icon_flag); bombSource.isRight = true; BombNum--; } isWin(); nowBomb.setText(\"当前雷数\"+\" \"+BombNum+\"\"); } else if(bombSource.BombFlag == 2) { if( (BombNum !=0 ) ||(BombNum ==0 &&(bombSource.getIcon()==icon_flag)) ) BombNum++; bombSource.setIcon(icon_question); nowBomb.setText(\"当前雷数\"+\" \"+BombNum+\"\"); } else if(bombSource.BombFlag == 0) { bombSource.setIcon(null); bombSource.isRight = false; } } } public void mouseEntered(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mousePressed(MouseEvent e) {} } 5 程序流程图 程序流程图程序流程图 程序流程图 开 始 点击左键开始扫雷 有 雷 数字表示周围雷数 右键标记此处为雷 找出所有的雷 胜 利 游戏结束 是 是 否 否 6 运行结果 运行结果运行结果 运行结果 1 运行程序,生成指定行列数的扫雷游戏的图形界面,运行结果如图所示: 2 鼠标左键点击到雷时,失败,游戏结束,运行结果如图所示: 3 改变雷的个数,从10个雷改为15个雷,开始游戏,运行结果如图所示: 4 所有雷都被找出时,游戏胜利,运行结果如图所示: 7总结 总结总结 总结 扫雷游戏对于大家来说都很熟悉,平时也会玩,所以对于做这个扫雷游戏的课程设计我 也很兴奋,虽然这设计过程中遇到很多困难,但通过学习,很好的克服了这些困难。虽然这 个扫雷游戏的基本功能都得以实现,但还存在一些需要改善的地方,它还没有完全做到像 Windows XP系统下扫雷游戏那样完美。通过这个课程设计我学到了很多的东西,把以前所 学的课本知识很好的用到了实践当中,并且通过实践,重新发现了很多问题和很多以前不理 解的没掌握的知识点,并且通过完成这个设计,很好的重新的理解并掌握了各种知识点。 8 参考文献 参考文献参考文献 参考文献 [1]耿祥义.JAVA大学实用教程.电子工业出版社.2005.03 [2]朱战立,沈伟编著.Java程序设计实用指南.电子工业出版社,2005.1 [3][美]Cay S.Horstmann.程峰等译. JAVA2核心技术.机械工业出版社.2003.06 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务