当前位置:文档之家› 中国象棋源代码Java程序

中国象棋源代码Java程序

中国象棋源代码Java程序
中国象棋源代码Java程序

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.*;

import java.io.*;

public class Chess{

public static void main(String args[]){

new ChessMainFrame("中国象棋:观棋不语真君子,棋死无悔大丈夫");

}

}

class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable{

//玩家

JLabel play[] = new JLabel[32];

//棋盘

JLabel image;

//窗格

Container con;

//工具栏

JToolBar jmain;

//重新开始

JButton anew;

//悔棋

JButton repent;

//退出

JButton exit;

//当前信息

JLabel text;

//保存当前操作

Vector Var;

//规则类对象(使于调用方法)

ChessRule rule;

/**

** 单击棋子

** chessManClick = true 闪烁棋子并给线程响应

** chessManClick = false 吃棋子停止闪烁并给线程响应

*/

boolean chessManClick;

/**

** 控制玩家走棋

** chessPlayClick=1 黑棋走棋

** chessPlayClick=2 红棋走棋默认红棋

** chessPlayClick=3 双方都不能走棋

*/

int chessPlayClick=2;

//控制棋子闪烁的线程

Thread tmain;

//把第一次的单击棋子给线程响应

static int Man,i;

ChessMainFrame(){

new ChessMainFrame("中国象棋");

}

/**

** 构造函数

** 初始化图形用户界面

*/

ChessMainFrame(String Title){

//获行客格引用

con = this.getContentPane();

con.setLayout(null);

//实例化规则类

rule = new ChessRule();

Var = new Vector();

//创建工具栏

jmain = new JToolBar();

text = new JLabel("欢迎使用象棋对弈系统");

//当鼠标放上显示信息

text.setToolTipText("信息提示");

anew = new JButton(" 新游戏");

anew.setToolTipText("重新开始新的一局");

exit = new JButton(" 退出");

exit.setToolTipText("退出象棋程序程序");

repent = new JButton(" 悔棋");

repent.setToolTipText("返回到上次走棋的位置");

//把组件添加到工具栏

jmain.setLayout(new GridLayout(0,4));

jmain.add(anew);

jmain.add(repent);

jmain.add(exit);

jmain.add(text);

jmain.setBounds(0,0,558,30);

con.add(jmain);

//添加棋子标签

drawChessMan();

//注册按扭监听

anew.addActionListener(this);

repent.addActionListener(this);

exit.addActionListener(this);

//注册棋子移动监听

for (int i=0;i<32;i++){

con.add(play[i]);

play[i].addMouseListener(this);

}

//添加棋盘标签

con.add(image = new JLabel(new ImageIcon("image\\Main.GIF"))); image.setBounds(0,30,558,620);

image.addMouseListener(this);

//注册窗体关闭监听

this.addWindowListener(

new WindowAdapter() {

public void windowClosing(WindowEvent we){

System.exit(0);

}

}

);

//窗体居中

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = this.getSize();

if (frameSize.height > screenSize.height){

frameSize.height = screenSize.height;

}

if (frameSize.width > screenSize.width){

frameSize.width = screenSize.width;

}

this.setLocation((screenSize.width - frameSize.width) / 2 - 280 ,(screenSize.height - frameSize.height ) / 2 - 350);

//设置

this.setIconImage(new ImageIcon("image\\红将.GIF").getImage());

this.setResizable(false);

this.setTitle(Title);

this.setSize(558,670);

this.show();

}

/**

** 添加棋子方法

*/

public void drawChessMan(){

//流程控制

int i,k;

//图标

Icon in;

//黑色棋子

//车

in = new ImageIcon("image\\黑车.GIF");

for (i=0,k=24;i<2;i++,k+=456){

play[i] = new JLabel(in);

play[i].setBounds(k,56,55,55);

play[i].setName("车1");

}

//马

in = new ImageIcon("image\\黑马.GIF");

for (i=4,k=81;i<6;i++,k+=342){

play[i] = new JLabel(in);

play[i].setBounds(k,56,55,55);

play[i].setName("马1");

}

//相

in = new ImageIcon("image\\黑象.GIF");

for (i=8,k=138;i<10;i++,k+=228){

play[i] = new JLabel(in);

play[i].setBounds(k,56,55,55);

play[i].setName("象1");

}

//士

in = new ImageIcon("image\\黑士.GIF"); for (i=12,k=195;i<14;i++,k+=114){ play[i] = new JLabel(in);

play[i].setBounds(k,56,55,55);

play[i].setName("士1");

}

//卒

in = new ImageIcon("image\\黑卒.GIF"); for (i=16,k=24;i<21;i++,k+=114){

play[i] = new JLabel(in);

play[i].setBounds(k,227,55,55);

play[i].setName("卒1" + i);

}

//炮

in = new ImageIcon("image\\黑炮.GIF"); for (i=26,k=81;i<28;i++,k+=342){

play[i] = new JLabel(in);

play[i].setBounds(k,170,55,55);

play[i].setName("炮1" + i);

}

//将

in = new ImageIcon("image\\黑将.GIF"); play[30] = new JLabel(in);

play[30].setBounds(252,56,55,55);

play[30].setName("将1");

//红色棋子

//车

in = new ImageIcon("image\\红车.GIF"); for (i=2,k=24;i<4;i++,k+=456){

play[i] = new JLabel(in);

play[i].setBounds(k,569,55,55);

play[i].setName("车2");

}

//马

in = new ImageIcon("image\\红马.GIF");

for (i=6,k=81;i<8;i++,k+=342){

play[i] = new JLabel(in);

play[i].setBounds(k,569,55,55);

play[i].setName("马2");

}

//相

in = new ImageIcon("image\\红象.GIF");

for (i=10,k=138;i<12;i++,k+=228){

play[i] = new JLabel(in);

play[i].setBounds(k,569,55,55);

play[i].setName("象2");

}

//士

in = new ImageIcon("image\\红士.GIF");

for (i=14,k=195;i<16;i++,k+=114){

play[i] = new JLabel(in);

play[i].setBounds(k,569,55,55);

play[i].setName("士2");

}

//兵

in = new ImageIcon("image\\红卒.GIF");

for (i=21,k=24;i<26;i++,k+=114){

play[i] = new JLabel(in);

play[i].setBounds(k,398,55,55);

play[i].setName("卒2" + i);

}

//炮

in = new ImageIcon("image\\红炮.GIF");

for (i=28,k=81;i<30;i++,k+=342){

play[i] = new JLabel(in);

play[i].setBounds(k,455,55,55);

play[i].setName("炮2" + i);

}

//帅

in = new ImageIcon("image\\红将.GIF");

play[31] = new JLabel(in);

play[31].setBounds(252,569,55,55);

play[31].setName("帅2");

}

/**

** 线程方法控制棋子闪烁

*/

public void run(){

while (true){

//单击棋子第一下开始闪烁

if (chessManClick){

play[Man].setVisible(false);

//时间控制

try{

tmain.sleep(200);

}

catch(Exception e){

}

play[Man].setVisible(true);

}

//闪烁当前提示信息以免用户看不见

else {

text.setVisible(false);

//时间控制

try{

tmain.sleep(250);

}

catch(Exception e){

}

text.setVisible(true);

}

try{

tmain.sleep(350);

}

catch (Exception e){

}

}

}

/**

** 单击棋子方法

public void mouseClicked(MouseEvent me){

System.out.println("Mouse");

//当前坐标

int Ex=0,Ey=0;

//启动线程

if (tmain == null){

tmain = new Thread(this);

tmain.start();

}

//单击棋盘(移动棋子)

if (me.getSource().equals(image)){

//该红棋走棋的时候

if (chessPlayClick == 2 && play[Man].getName().charAt(1) == '2'){ Ex = play[Man].getX();

Ey = play[Man].getY();

//移动卒、兵

if (Man > 15 && Man < 26){

rule.armsRule(Man,play[Man],me);

}

//移动炮

else if (Man > 25 && Man < 30){

rule.cannonRule(play[Man],play,me);

}

//移动车

else if (Man >=0 && Man < 4){

rule.cannonRule(play[Man],play,me);

}

//移动马

else if (Man > 3 && Man < 8){

rule.horseRule(play[Man],play,me);

}

//移动相、象

else if (Man > 7 && Man < 12){

rule.elephantRule(Man,play[Man],play,me);

}

//移动仕、士

else if (Man > 11 && Man < 16){

rule.chapRule(Man,play[Man],play,me);

}

//移动将、帅

else if (Man == 30 || Man == 31){

rule.willRule(Man,play[Man],play,me);

}

//是否走棋错误(是否在原地没有动)

if (Ex == play[Man].getX() && Ey == play[Man].getY()){

text.setText(" 红棋走棋");

chessPlayClick=2;

}

else {

text.setText(" 黑棋走棋");

chessPlayClick=1;

}

}//if

//该黑棋走棋的时候

else if (chessPlayClick == 1 && play[Man].getName().charAt(1) == '1'){

Ex = play[Man].getX();

Ey = play[Man].getY();

//移动卒、兵

if (Man > 15 && Man < 26){

rule.armsRule(Man,play[Man],me);

}

//移动炮

else if (Man > 25 && Man < 30){

rule.cannonRule(play[Man],play,me);

}

//移动车

else if (Man >=0 && Man < 4){

rule.cannonRule(play[Man],play,me);

}

//移动马

else if (Man > 3 && Man < 8){

rule.horseRule(play[Man],play,me);

}

//移动相、象

else if (Man > 7 && Man < 12){

rule.elephantRule(Man,play[Man],play,me);

}

//移动仕、士

else if (Man > 11 && Man < 16){

rule.chapRule(Man,play[Man],play,me);

}

//移动将、帅

else if (Man == 30 || Man == 31){

rule.willRule(Man,play[Man],play,me);

}

//是否走棋错误(是否在原地没有动)

if (Ex == play[Man].getX() && Ey == play[Man].getY()){ text.setText(" 黑棋走棋");

chessPlayClick=1;

}

else {

text.setText(" 红棋走棋");

chessPlayClick=2;

}

}//else if

//当前没有操作(停止闪烁)

chessManClick=false;

}//if

//单击棋子

else{

//第一次单击棋子(闪烁棋子)

if (!chessManClick){

for (int i=0;i<32;i++){

//被单击的棋子

if (me.getSource().equals(play[i])){

//告诉线程让该棋子闪烁

Man=i;

//开始闪烁

chessManClick=true;

break;

}

}//for

}//if

//第二次单击棋子(吃棋子)

else if (chessManClick){

//当前没有操作(停止闪烁)

chessManClick=false;

for (i=0;i<32;i++){

//找到被吃的棋子

if (me.getSource().equals(play[i])){

//该红棋吃棋的时候

if (chessPlayClick == 2 && play[Man].getName().charAt(1) == '2'){

Ex = play[Man].getX();

Ey = play[Man].getY();

//卒、兵吃规则

if (Man > 15 && Man < 26){

rule.armsRule(play[Man],play[i]);

}

//炮吃规则

else if (Man > 25 && Man < 30){

rule.cannonRule(0,play[Man],play[i],play,me);

}

//车吃规则

else if (Man >=0 && Man < 4){

rule.cannonRule(1,play[Man],play[i],play,me);

}

//马吃规则

else if (Man > 3 && Man < 8){

rule.horseRule(play[Man],play[i],play,me);

}

//相、象吃规则

else if (Man > 7 && Man < 12){

rule.elephantRule(play[Man],play[i],play);

}

//士、仕吃棋规则

else if (Man > 11 && Man < 16){

rule.chapRule(Man,play[Man],play[i],play);

}

//将、帅吃棋规则

else if (Man == 30 || Man == 31){

rule.willRule(Man,play[Man],play[i],play);

play[Man].setVisible(true);

}

//是否走棋错误(是否在原地没有动)

if (Ex == play[Man].getX() && Ey == play[Man].getY()){

text.setText(" 红棋走棋");

chessPlayClick=2;

break;

}

else{

text.setText(" 黑棋走棋");

chessPlayClick=1;

break;

}

}//if

//该黑棋吃棋的时候

else if (chessPlayClick == 1 && play[Man].getName().charAt(1) == '1'){

Ex = play[Man].getX();

Ey = play[Man].getY();

//卒吃规则

if (Man > 15 && Man < 26){

rule.armsRule(play[Man],play[i]);

}

//炮吃规则

else if (Man > 25 && Man < 30){

rule.cannonRule(0,play[Man],play[i],play,me);

}

//车吃规则

else if (Man >=0 && Man < 4){

rule.cannonRule(1,play[Man],play[i],play,me);

}

//马吃规则

else if (Man > 3 && Man < 8){

rule.horseRule(play[Man],play[i],play,me);

}

//相、象吃规则

else if (Man > 7 && Man < 12){

rule.elephantRule(play[Man],play[i],play);

}

//士、仕吃棋规则

else if (Man > 11 && Man < 16){

rule.chapRule(Man,play[Man],play[i],play);

}

//将、帅吃棋规则

else if (Man == 30 || Man == 31){

rule.willRule(Man,play[Man],play[i],play);

play[Man].setVisible(true);

}

//是否走棋错误(是否在原地没有动)

if (Ex == play[Man].getX() && Ey == play[Man].getY()){

text.setText(" 黑棋走棋");

chessPlayClick=1;

break;

}

else {

text.setText(" 红棋走棋");

chessPlayClick=2;

break;

}

}//else if

}//if

}//for

//是否胜利

if (!play[31].isVisible()){

JOptionPane.showConfirmDialog(

this,"黑棋胜利","玩家一胜利",

JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);

//双方都不可以在走棋了

chessPlayClick=3;

text.setText(" 黑棋胜利");

}//if

else if (!play[30].isVisible()){

JOptionPane.showConfirmDialog(

this,"红棋胜利","玩家二胜利",

JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);

chessPlayClick=3;

text.setText(" 红棋胜利");

}//else if

}//else

}//else

}

public void mousePressed(MouseEvent me){

}

public void mouseReleased(MouseEvent me){

}

public void mouseEntered(MouseEvent me){

}

public void mouseExited(MouseEvent me){

}

/**

** 定义按钮的事件响应

*/

public void actionPerformed(ActionEvent ae) { //重新开始按钮

if (ae.getSource().equals(anew)){

int i,k;

//重新排列每个棋子的位置

//黑色棋子

//车

for (i=0,k=24;i<2;i++,k+=456){

play[i].setBounds(k,56,55,55);

}

//马

for (i=4,k=81;i<6;i++,k+=342){

play[i].setBounds(k,56,55,55);

}

//相

for (i=8,k=138;i<10;i++,k+=228){

play[i].setBounds(k,56,55,55);

}

//士

for (i=12,k=195;i<14;i++,k+=114){

play[i].setBounds(k,56,55,55);

}

//卒

for (i=16,k=24;i<21;i++,k+=114){

play[i].setBounds(k,227,55,55);

}

//炮

for (i=26,k=81;i<28;i++,k+=342){

play[i].setBounds(k,170,55,55);

}

//将

play[30].setBounds(252,56,55,55);

//红色棋子

//车

for (i=2,k=24;i<4;i++,k+=456){

play[i].setBounds(k,569,55,55);

}

//马

for (i=6,k=81;i<8;i++,k+=342){

play[i].setBounds(k,569,55,55);

}

//相

for (i=10,k=138;i<12;i++,k+=228){

play[i].setBounds(k,569,55,55);

}

//士

for (i=14,k=195;i<16;i++,k+=114){

play[i].setBounds(k,569,55,55);

}

//兵

for (i=21,k=24;i<26;i++,k+=114){

play[i].setBounds(k,398,55,55);

}

//炮

for (i=28,k=81;i<30;i++,k+=342){

play[i].setBounds(k,455,55,55);

}

//帅

play[31].setBounds(252,569,55,55);

chessPlayClick = 2;

text.setText(" 红棋走棋");

for (i=0;i<32;i++){

play[i].setVisible(true);

}

//清除Vector中的内容

Var.clear();

}

//悔棋按钮

else if (ae.getSource().equals(repent)){

try{

//获得setVisible属性值

String S = (String)Var.get(Var.size()-4);

//获得X坐标

int x = Integer.parseInt((String)Var.get(Var.size()-3));

//获得Y坐标

int y = Integer.parseInt((String)Var.get(Var.size()-2));

//获得索引

int M = Integer.parseInt((String)Var.get(Var.size()-1));

//赋给棋子

play[M].setVisible(true);

play[M].setBounds(x,y,55,55);

if (play[M].getName().charAt(1) == '1'){

text.setText(" 黑棋走棋");

chessPlayClick = 1;

}

else{

text.setText(" 红棋走棋");

chessPlayClick = 2;

}

//删除用过的坐标

Var.remove(Var.size()-4);

Var.remove(Var.size()-3);

Var.remove(Var.size()-2);

Var.remove(Var.size()-1);

//停止旗子闪烁

chessManClick=false;

}

catch(Exception e){

}

}

//退出

else if (ae.getSource().equals(exit)){

int j=JOptionPane.showConfirmDialog(

this,"真的要退出吗?","退出",

JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);

if (j == JOptionPane.YES_OPTION){

System.exit(0);

}

}

}

/*定义中国象棋规则的类*/

class ChessRule {

/**卒子的移动规则*/

public void armsRule(int Man,JLabel play,MouseEvent me){

//黑卒向下

if (Man < 21){

//向下移动、得到终点的坐标模糊成合法的坐标

if ((me.getY()-play.getY()) > 27 && (me.getY()-play.getY()) < 86 && (me.getX()-play.getX()) < 55 && (me.getX()-play.getX()) > 0){

//当前记录添加到集合(用于悔棋)

Var.add(String.valueOf(play.isVisible()));

Var.add(String.valueOf(play.getX()));

Var.add(String.valueOf(play.getY()));

Var.add(String.valueOf(Man));

play.setBounds(play.getX(),play.getY()+57,55,55);

}

//向右移动、得到终点的坐标模糊成合法的坐标、必须过河

else if (play.getY() > 284 && (me.getX() - play.getX()) >= 57 && (me.getX() - play.getX()) <= 112){

play.setBounds(play.getX()+57,play.getY(),55,55);

}

//向左移动、得到终点的坐标模糊成合法的坐标、必须过河

else if (play.getY() > 284 && (play.getX() - me.getX()) >= 2 && (play.getX() - me.getX()) <=58){

//模糊坐标

play.setBounds(play.getX()-57,play.getY(),55,55);

}

}

//红卒向上

else{

//当前记录添加到集合(用于悔棋)

Var.add(String.valueOf(play.isVisible()));

Var.add(String.valueOf(play.getX()));

Var.add(String.valueOf(play.getY()));

Var.add(String.valueOf(Man));

//向上移动、得到终点的坐标模糊成合法的坐标

if ((me.getX()-play.getX()) >= 0 && (me.getX()-play.getX()) <= 55 && (play.getY()-me.getY()) >27 && play.getY()-me.getY() < 86){

play.setBounds(play.getX(),play.getY()-57,55,55);

}

//向右移动、得到终点的坐标模糊成合法的坐标、必须过河

else if (play.getY() <= 341 && (me.getX() - play.getX()) >= 57 && (me.getX() - play.getX()) <= 112){

play.setBounds(play.getX()+57,play.getY(),55,55);

}

//向左移动、得到终点的坐标模糊成合法的坐标、必须过河

else if (play.getY() <= 341 && (play.getX() - me.getX()) >= 3 && (play.getX() - me.getX()) <=58){

play.setBounds(play.getX()-57,play.getY(),55,55);

}

}

}//卒移动结束

/**卒吃棋规则*/

public void armsRule(JLabel play1,JLabel play2){

//向右走

if ((play2.getX() - play1.getX()) <= 112 && (play2.getX() - play1.getX()) >= 57 && (play1.getY() - play2.getY()) < 22 && (play1.getY() - play2.getY()) > -22 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){

//黑棋要过河才能右吃棋

if (play1.getName().charAt(1) == '1' && play1.getY() > 284 && play1.getName().charAt(1) != play2.getName().charAt(1)){

play2.setVisible(false);

//把对方的位置给自己

play1.setBounds(play2.getX(),play2.getY(),55,55);

}

//红棋要过河才左能吃棋

else if (play1.getName().charAt(1) == '2' && play1.getY() < 341

&& play1.getName().charAt(1) != play2.getName().charAt(1)){

play2.setVisible(false);

//把对方的位置给自己

play1.setBounds(play2.getX(),play2.getY(),55,55);

}

}

//向左走

else if ((play1.getX() - play2.getX()) <= 112 && (play1.getX() - play2.getX()) >= 57 && (play1.getY() - play2.getY()) < 22 && (play1.getY() - play2.getY()) > -22 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){

//黑棋要过河才能左吃棋

if (play1.getName().charAt(1) == '1' && play1.getY() > 284 && play1.getName().charAt(1) != play2.getName().charAt(1)){

play2.setVisible(false);

//把对方的位置给自己

play1.setBounds(play2.getX(),play2.getY(),55,55);

}

//红棋要过河才能右吃棋

else if (play1.getName().charAt(1) == '2' && play1.getY() < 341 && play1.getName().charAt(1) != play2.getName().charAt(1)){

play2.setVisible(false);

//把对方的位置给自己

play1.setBounds(play2.getX(),play2.getY(),55,55);

}

}

//向上走

else if (play1.getX() - play2.getX() >= -22 && play1.getX() - play2.getX() <= 22 && play1.getY() - play2.getY() >= -112 && play1.getY() - play2.getY() <= 112){

//黑棋不能向上吃棋

if (play1.getName().charAt(1) == '1' && play1.getY() < play2.getY() && play1.getName().charAt(1) != play2.getName().charAt(1)){

play2.setVisible(false);

//把对方的位置给自己

play1.setBounds(play2.getX(),play2.getY(),55,55);

}

//红棋不能向下吃棋

15个经典JAVA小程序集

import java.util.Scanner; public class Example1 { public static void main(String[] args) { Scanner sc=new Scanner(System.in);//输入一个数字 int score=sc.nextInt();//将数字放入整型score中 if(score>0)//if语句进行判断 { if(score>=90) { System.out.println("你很棒!"); } else if(score>=60&&score<90) { System.out.println("你很不错!"); } else System.out.println("你得加油!"); } else System.out.println("你输入的数字不正确!"); } } import java.util.Scanner; public class Example2 { public static void main(String[] args) { Scanner sc=new Scanner(System.in);//动态输入任意两个数int a=sc.nextInt();

int b=sc.nextInt(); if(a>b)//if语句比较大小 { System.out.println("你所输入的最大值:"+a); System.out.println("你所输入的最小值:"+b); } else if(a

中国象棋源代码Java程序

import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.io.*; public class Chess{ public static void main(String args[]){ new ChessMainFrame("中国象棋:观棋不语真君子,棋死无悔大丈夫"); } } class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable{ //玩家 JLabel play[] = new JLabel[32]; //棋盘 JLabel image; //窗格 Container con; //工具栏 JToolBar jmain; //重新开始 JButton anew; //悔棋 JButton repent; //退出 JButton exit; //当前信息 JLabel text; //保存当前操作 Vector Var; //规则类对象(使于调用方法) ChessRule rule; /** ** 单击棋子 ** chessManClick = true 闪烁棋子并给线程响应 ** chessManClick = false 吃棋子停止闪烁并给线程响应 */ boolean chessManClick;

/** ** 控制玩家走棋 ** chessPlayClick=1 黑棋走棋 ** chessPlayClick=2 红棋走棋默认红棋 ** chessPlayClick=3 双方都不能走棋 */ int chessPlayClick=2; //控制棋子闪烁的线程 Thread tmain; //把第一次的单击棋子给线程响应 static int Man,i; ChessMainFrame(){ new ChessMainFrame("中国象棋"); } /** ** 构造函数 ** 初始化图形用户界面 */ ChessMainFrame(String Title){ //获行客格引用 con = this.getContentPane(); con.setLayout(null); //实例化规则类 rule = new ChessRule(); Var = new Vector(); //创建工具栏 jmain = new JToolBar(); text = new JLabel("欢迎使用象棋对弈系统"); //当鼠标放上显示信息 text.setToolTipText("信息提示"); anew = new JButton(" 新游戏 "); anew.setToolTipText("重新开始新的一局"); exit = new JButton(" 退出 "); exit.setToolTipText("退出象棋程序程序"); repent = new JButton(" 悔棋 "); repent.setToolTipText("返回到上次走棋的位置"); //把组件添加到工具栏 jmain.setLayout(new GridLayout(0,4)); jmain.add(anew);

中国象棋(代码)

中国象棋(web版源代码) 程序: using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Data.SqlClient; namespace WebApplication1 {

public partial class WebForm1 : System.Web.UI.Page { int tru = 20; int fals = 40; public ImageButton[,] _Image=new ImageButton[11,10]; //将上一次点击点的坐标保存到数据库中的lastx和lasty public void SaveToLast() { if (Session["user"].ToString() == "red" && _GetUserState(Session["user"].ToString()) == 20) { int x, y, lastx, lasty; x = Getpointx(); y = Getpointy(); lastx = x; lasty = y; Updatalastx(lastx); Updatalasty(lasty); } if (Session["user"].ToString() == "black" && _GetUserState(Session["user"].ToString()) == 20) { int x, y, lastx, lasty; x = Getpointx(); y = Getpointy(); lastx = x; lasty = y; Updatalastx(lastx); Updatalasty(lasty); } } //将棋盘上所有棋子图片显示到棋盘上 private void _Drawqizi() { //_Init(); int i,j,k; if (_GetUserState("red") != 0 && _GetUserState("black") != 0)

一个简单的java窗体下载小程序(完整代码)

首先,这只是一个很简单的程序,所以大神请绕道。 心血来潮,用java编写了一个能访问http链接,并能下载文件的窗体小程序。实测能够正确下载17M的压缩包,图片,文档,html等。但是因为程序效率低下,于是没有继续测试更大的压缩文件(问题可能在于保存输入流到缓冲区的数组)。 程序已打包jar可执行文件,并将代码一齐打包到jar中。为方便使用jar,使用word 文档对象包装了它,将下面的对象(显示为一个图标)拖到桌面或者其他文件夹,即可得到该程序: java下载小程序.jar 也可以右击,激活内容,直接运行。 程序运行效果如图: 该测试链接来自pc6,下载结果为:

文件顺利打开。 程序主要使用了url访问http地址,并获取输入流,创建本地文件,输出读取的数据到本地文件中。其他部分则是窗体。 以下是全部代码: 同样是word对象,直接拖到桌面即可。 显示窗体的ui包: DownloadWin.java MainWin.java 分割字符串的util包: SplitString.java 监听事件的listener包: DownloadListener.java

其中,ui包: MainWin.java package 下载.ui; public class MainWin { public static void main(String[] args) { DownloadWin win = new DownloadWin("下载"); } } DownloadWin.java package 下载.ui; import java.awt.FlowLayout; import java.awt.GridLayout; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import 下载.listener.DownloadListener; public class DownloadWin extends JFrame{ /** * */ private static final long serialVersionUID = -7226361346020458023L; private JTextField httpLine; private JTextField savePath; private JButton btnDownload; private JLabel lineLabel; private JLabel saveLabel; private static JLabel infoLabel; public DownloadWin(String title) { init();

中国象棋源代码-C语言小程序

*--------------------chess.c----------------------*/ #include "dos.h" #include "stdio.h" /*----------------------------------------------------*/ #define RED 7 #define BLACK 14 #define true 1 #define false 0 #define SELECT 0 #define MOVE 1 #define RED_UP 0x1100 #define RED_DOWN 0x1f00 #define RED_LEFT 0x1e00 #define RED_RIGHT 0x2000 #define RED_DO 0x3900 #define RED_UNDO 0x1000 #define BLACK_UP 0x4800 #define BLACK_DOWN 0x5000 #define BLACK_LEFT 0x4b00 #define BLACK_RIGHT 0x4d00 #define BLACK_DO 0x1c00 #define BLACK_UNDO 0x2b00 #define ESCAPE 0x0100 #define RED_JU 1 #define RED_MA 2 #define RED_XIANG 3 #define RED_SHI 4 #define RED_JIANG 5 #define RED_PAO 6 #define RED_BIN 7 #define BLACK_JU 8 #define BLACK_MA 9 #define BLACK_XIANG 10 #define BLACK_SHI 11 #define BLACK_JIANG 12 #define BLACK_PAO 13 #define BLACK_BIN 14 /*----------------------------------------------------*/ int firsttime=1; int savemode;

中国象棋算法

解剖大象的眼睛——中国象棋程序设计探索 黄晨*2005年6月 ( * 联系地址:复旦大学化学系表面化学实验室,eMail:morning_yellow@elephantbas https://www.doczj.com/doc/405414596.html,) (一) 引言 我在今年2月写出了象棋程序ElephantEye的第一个版本(0.90),本来它只是象棋界面ElephantBoard的调试引擎。在设计程序的过程中,我尝试性地加入了很多算法,发现每次改进都能让程序的棋力有大幅度的提高,因此便对象棋程序的算法产生了浓厚的兴趣。到现在我已经陆续对ElephantEye作了几十次加工(目前版本为0.94),使得它的棋力接近了中等商业软件的水平,在公开源代码的象棋程序中,ElephantEye是最强的一个。 我希望能通过公开源代码的方式,推动中国象棋程序水平的整体发展,然而根据很 多网友的反馈意见,发现源代码中的很多部分并不是那么容易理解的。因此我才打算以《中国象棋程序设计探索》为题,写几篇详细介绍ElephantEye算法的连载,希望能让的源代码充分发挥它的作用。 下面我先简要谈一下我自己对ElephantEye的体会。 1.1 ElephantEye用到了哪些算法? 在我写本次连载以前,我已经完成了《象棋百科全书》网站上《对弈程序基本技术 》专题中所有文章的翻译,ElephantEye的大部分算法都参考了这些文章,这些算法我会在连载中一笔带过,详细的内容希望读者参考这些译文,那里还有我加的很多译注,希 望它们能够加深读者对这些算法的体会。 当然,仅根据这些文章所提供的算法,是写不出很好的程序的,我参考了王小春的《PC游戏编程——人机博弈》一书,也参考了一些国际象棋的源程序,并通过自己的探索,在ElephantEye中加入了另外的非常重要的算法,尤其是启发算法,我认为它们在程序中发挥了关键性的作用,而且很多细节在绝大多数文字资料中没有详细给出,我会在 我的连载中重点介绍。 我猜读者最感兴趣的内容是ElephantEye的着法生成器,这应该算是象棋程序的核心部分,同时也是各个程序差异最大的部分。在写ElephantEye以前,我在《象棋百科全书》网站上刊登了大量介绍“位棋盘”的文章,这是个非常有吸引力的思想,但是我试验 下来觉得它的速度并不快,在ElephantEye的程序里我只把位棋盘运用在将军判断上。尽管如此,ElephantEye短短10行的将军判断也许是程序的一个亮点吧,那么这部分内容我将尽量介绍得详细一点。 此外,一些看似和棋力关系不大的技术,诸如开局库、长将检测、后台思考、时间 策略、引擎协议等等,其实也直接影响着象棋程序的稳定性,因此也有必要逐一讲解。 总之,每个技术都很重要,我的连载虽然不能面面俱到,但我会尽我所能来作详细 阐述的。 1.2 如何正确评价ElephantEye目前的棋力?

java经典的小程序详尽代码

1,编写程序,判断给定的某个年份是否是闰年。 闰年的判断规则如下: (1)若某个年份能被4整除但不能被100整除,则是闰年。 (2)若某个年份能被400整除,则也是闰年。 import Bissextile{ public static void main(String[] arge){ "请输入年份"); int year; .....+aaaaaaaaa=? 其中a为1至9之中的一个数,项数也要可以指定。 import Multinomial{ public static void main(String[] args){ int a; ...前20项之和? class Sum{ public static void main(Sting[] args){ double sum=0; double fenZi=, fenMu=; ..... 打印出第一个大于小于的值 class Pi { public static void main(String[] args){ double pi =0; .. fenMu += ; .. 每项递加2 } } } 输出结果为pi = ,应该不精确 12、输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值 1 1 2 3 5 8 13 21 34 规律:一个数等于前两个数之和 ....的值。 a,求出前50项和值。 b,求出最后一项绝对值小于1e-5的和值。 15、在屏幕上打印出n行的金字塔图案,如,若n=5,则图案如下: * ***

***** ******* ********* 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,平均值,和值,并输出出来。 class ArrayNumber{ public static void main(String[] args){ int[] arrayNumber; arrayNumber = new int[10]; "以下是随机的10个整数:"); 义一个int型的一维数组,包含10个元素,分别赋值为1~10,然后将数组中的元素都向前移一个位置, 即,a[0]=a[1],a[1]=a[2],…最后一个元素的值是原来第一个元素的值,然后输出这个数组。 3. 定义一个int型的一维数组,包含40个元素,用来存储每个学员的成绩,循环产生40个0~100之间的随机整数, 将它们存储到一维数组中,然后统计成绩低于平均分的学员的人数,并输出出来。 4. (选做)承上题,将这40个成绩按照从高到低的顺序输出出来。 5,(选做)编写程序,将一个数组中的元素倒排过来。例如原数组为1,2,3,4,5;则倒排后数组中的值 为5,4,3,2,1。 6,要求定义一个int型数组a,包含100个元素,保存100个随机的4位数。再定义一个 int型数组b,包含10个元素。统计a数组中的元素对10求余等于0的个数,保存到b[0]中;对10求余等于1的个数,保存到b[1]中,……依此类推。 class Remain{ public static void main( String[] args){ int[] a = new int[100]; 约梭芬杀人法 把犯人围成一圈,每次从固定位置开始算起,杀掉第7个人,直到剩下最后一个。 11_2、用数组实现约瑟夫出圈问题。 n个人排成一圈,从第一个人开始报数,从1开始报,报到m 的人出圈,剩下的人继续开始从1报数,直到所有的人都出圈为止。对于给定的n,m,求出所有人的出圈顺序。 12. 判断随机整数是否是素数 产生100个0-999之间的随机整数,然后判断这100个随机整数哪些是素数,哪些不是? public class PrimeTest{ public static void main(String args[]){ for(int i=0;i<100;i++){

象棋游戏的设计与实现

象棋游戏的设计与实现

目录 1引言 (1) 1.1象棋设计背景和研究意义 (1) 1.2象棋设计研究方法 (1) 2人工智能算法设计 (2) 2.1棋局表示 (3) 2.2着法生成 (4) 2.3搜索算法 (5) 2.4历史启发及着法排序 (9) 2.5局面评估 (9) 2.6程序组装 (11) 3界面及程序辅助设计 (12) 3.1界面基本框架 (12) 3.2多线程 (13) 3.3着法名称显示 (14) 3.4悔棋和还原 (15) 4系统实现 (16) 结论 (19) 参考文献 (20)

1引言 1.1 象棋设计背景和研究意义 电脑游戏行业经过二十年的发展,已经成为与影视、音乐等并驾齐驱的全球最重要的娱乐产业之一,其年销售额超过好莱坞的全年收入。游戏,作为一种娱乐活动。早期的人类社会由于生产力及科技的制约,只能进行一些户外的游戏。随着生产力的发展和科技进步,一种新的游戏方式——电子游戏也随之诞生。 当计算机发明以后,电子游戏又多了一个新的载体。电子游戏在整个计算机产业的带动下不断地创新、发展着。自从计算机发明,向各个领域发展,到成为我们现在每天工作和生活必不可少的一部分的这个过程中,电子游戏也逐步渗入我们每个人的娱乐活动中。而计算机已经普及的今天,对于可以用计算机进行程序编辑的人来说,开发属于自己的游戏,已经不再是梦想。事实上,个人计算机软件市场的大约80%销售份额是来自游戏软件。棋牌游戏属于休闲类游戏,相对于角色扮演类游戏和即时战略类游戏等其它游戏,具有上手快、游戏时间短的特点,更利于用户进行放松休闲,为人们所喜爱,特别是棋类游戏,方便、快捷、操作简单,在休闲娱乐中占主要位置。作为中华民族悠久文化的代表之一,中国象棋不仅源远流长,而且基础广泛,作为一项智力运动,中国象棋开始走向世界。 随着计算机处理速度的飞速提高,人们很早就提出了疑问:计算机是否会超越人类?世界国际象棋大师已被计算机打败,计算机已经超过了人类?而人工智能是综合性很强的一门边缘学科,它的中心任务是研究如何使计算机去做那些过去只能靠人的智力才能做的工作。因此,对游戏开发过程中的人工智能技术的研究自然也就成了业界的一个热门研究方向。 1.2 象棋设计研究方法 对于象棋来说,核心设计主要包括人工智能算法的以及整个游戏中界面及程序辅助部分的实现,主要用 Visual C++ 进行开发,里面的MFC类库,使游戏开发更加方便,并利用人工智能相关搜索算法实现人工智能的着法生成,从而完善整个游戏的功能。 本文的目标是实现一款有着一定下棋水平且交互友好的中国象棋人机对弈程序。 该程序功能包括: *人机对弈; *搜索深度设定; (电脑棋力选择)

java简单聊天小程序

网络编程java简单聊天小程序[下次修改成多线程的,这个必须等待对方输入结束,有机会修改成可视化窗口] By 刘汪洋 写入正确的ip地址即可正常用当然目前只停留在命令行界面 还没有写成可视化窗口界面 运行时请带上参数 如java TransServer 张三 Java TransClient 李四 ( 和刘正南在局域网试验的截图成功 这是修改后的 加上了姓名! ) (修改前的截图)

代码: 客户端: package com.baidu.chat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import https://www.doczj.com/doc/405414596.html,.Socket; import https://www.doczj.com/doc/405414596.html,.UnknownHostException; // 简单聊天小程序客户端 public class TransClient { public static void main(String[] args)

{ if(args[0]==null) args[0] = "他"; startClient(args[0]); } private static void startClient(String name) { Socket sk = null; BufferedReader bufr = null; try { sk = new Socket("127.0.0.1",10000);// 1 创建 socket服务 bufr = new BufferedReader(new InputStreamReader(System.in));// 2 获取录入键盘 PrintWriter out = new PrintWriter(sk.getOutputStream(),true);// 3 获取输出流true表示自动刷新 BufferedReader bufIn = new BufferedReader(new InputStreamReader(sk.getInputStream()));// 4 获取输入流 // 5 发送获取 String text_send = ""; String text_get = ""; String ServerName = ""; System.out.print("聊天已开启..."+"\r\n"+"我说:");

java经典小程序模板

JA V A经典小程序1,编写程序,判断给定的某个年份是否是闰年。 闰年的判断规则如下: (1)若某个年份能被4整除但不能被100整除,则是闰年。 (2)若某个年份能被400整除,则也是闰年。 import java.util.Scanner; class Bissextile{ public static void main(String[] arge){ System.out.print("请输入年份"); int year; //定义输入的年份名字为“year” Scanner scanner = new Scanner(System.in); year = scanner.nextInt(); if (year<0||year>3000){ System.out.println("年份有误,程序退出!"); System.exit(0); } if ((year%4==0)&&(year%100!=0)||(year%400==0)) System.out.println(year+" is bissextile"); else System.out.println(year+" is not bissextile "); } } 2,给定一个百分制的分数,输出相应的等级。 90分以上A级 80~89 B级 70~79 C级 60~69 D级 60分以下E级 import java.util.Scanner; class Mark{ public static void main(String[] args){ System.out.println("请输入一个分数"); //定义输入的分数为“mark”,且分数会有小数 double mark; Scanner scanner = new Scanner(System.in); mark = scanner.nextDouble(); //判断是否有输入错误。

中国象棋源代码及文档

摘要 象棋程序可以分为两大部分:人工智能和界面程序辅助。人工智能的主要部分,反 映了计算机下象棋的想法,电脑怎么想,最好的方法去完成下一步,优先搜索算法进行 搜索,和各种可能的行动,评估,选择胜利面最大的一步;界面和程序协助部分主要是界 面友好,以更好地适应用户下象棋的想法。 本文研究了中国象棋在电脑中如何表示,然后讨论如何产生走法的一系列相关技术。使用MFC架构和Visual C + +开发工具,实现一定技能的中国象棋人机对弈功能。 关键词:中国象棋;人工智能;下棋

Title The Design And Realize of human-computer Chess Game Abstract Chess program can be divided into two major auxiliary artificial intelligence and interface program. The AI part of the main reflected computer chess ideas, computer how to think and go to the best method to complete the next step, first search algorithm to search, and a variety of possible moves, valuations, choose victory surface step; the interface and the program assisted some of the major user-friendly game of chess by the previous step, to better adjust the chess ideas. This paper studies the Chinese chess computer, and then discuss how to generate a series of related moves. MFC architecture and Visual C development tools, to achieve a certain chess skills, Chinese chess, human-computer chess program. Keywords: Chess; artificial intelligence; chess

围棋(改进版)源代码-Java Applet小程序

/*一个Java围棋程序源代码改进版(2010-05-12 09:55:19)转载标签:杂谈*/ import java.awt.*; import java.awt.event.*; import javax.swing.JOptionPane; public class Chess extends Frame { ChessPad chesspad= new ChessPad(); Chess() { add(chesspad); chesspad.setBounds(70,90,440,440); Label label=new Label("click to point,doubled_click to remove,right click to back",Label.CENTER); add(label); label.setBounds(70,55,440,24); label.setBackground(Color.orange); addWindowListener ( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); setLayout(null); setVisible(true); setSize(600,550); } public static void main(String args[]) { Chess chess=new Chess(); } } class ChessPad extends Panel implements MouseListener, ActionListener,FocusListener {

java中国象棋报告

贵州航天职业技术学院Java课程设计报告 专业:计算机软件技术 班级:09软件二 学号:A093GZ053020152 姓名:韦治成 指导老师:肖宏启 时间:

目录 摘要 ------------------------------------------------------------------- 3【摘要】 ------------------------------------------------------------ 3【关键字】 --------------------------------------------------------- 4系统概述 ---------------------------------------------------------------- 4 1.棋盘表示 ---------------------------------------------------------- 4 3.人人对弈 ---------------------------------------------------------- 4系统分析 ---------------------------------------------------------------- 4 1. 设计内容--------------------------------------------------------- 4 2. 设计要求--------------------------------------------------------- 5 3.中国象棋软件-------------------------------------------------- 6 4.运行效果-------------------------------------------------------- 8系统设计 ---------------------------------------------------------------- 8 1.总体设计 ---------------------------------------------------------- 8 运行界面: ------------------------------------------------------- 10 2.运行输出结果 -------------------------------------------------- 10 3.总结与说明 ----------------------------------------------------- 11 4.象棋界面实现: ----------------------------------------------- 11 5.对弈功能的实现: -------------------------------------------- 15 参考文献 -------------------------------------------------------------- 16

java小程序设计

课程设计报告 设计题目:用Java编的计算器 院系 班级 设计者 学号 指导教师 设计时间

前言: 通过上课学习了java程序设计的基本原理和模式,这次又以java语言为基本结合其图形应用界面来设计一个包括加、减、乘、除。还有带括号以及带负号、小数运算的计算程序。 系统功能和使用说明: 一.硬件环境: 本系统适用于现应用各种类型的计算机,内存容量为128MB以上,不必配备的外部附加设备。二.软件环境: 本系统的设计采用的是JAVA语言,应在JDK 5.0或者其更高版软件环境下本使用。 三.系统流程图: 1.下图是本程序的运行后的界面,其标注是此组件在程序中的名字 2.系统流程图中各个模块的功能说明: 本程序一共包括:构造方法A5i13w(),setup(), windowClosing(), actionPerformed(), appendchar(), countall(), counting(), Iscountnum()和一个windowcloser类。 (1). A5i13w()是构造方法,在程序创建其对象时就调用,初始化次程序的事件的监听机制。 (2). setup()是我定义的方法,是用来初始化程序的图形应用界面,由A5i13w()来调用。 (3). windowClosing()是用来响应用户的关闭功能。 (4). actionPerformed()是用来处理每个事件的响应的方法 (5). appendchar()方法的作用是在用户产生事件后向Textshow追加产生此事件的字符串 (6).countall()的意义是在用户按“=”号后,从最里层括号向最外层逐层把括号里的内容传递给counting()方法,并负责对括号本身是否符合数学语法要求进行检验。 (7).counting()方法的作用是首先对无括号的数学表达式有关的数学计算符号进行调整,并检验所有的数学符号,如发现错误的数学符号立即在Labelnow中显示出来。

Java扫雷游戏源代码

import java.awt.BorderLayout; import java.awt.Container; import java.awt.Font; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.Timer; public class ScanLei1 extends JFrame implements ActionListener{ private static final long serialVersionUID = 1L; private Container contentPane; private JButton btn; private JButton[] btns; private JLabel b1; private JLabel b2; private JLabel b3; private Timer timer; private int row=9; private int col=9; private int bon=10; private int[][] a; private int b; private int[] a1; private JPanel p,p1,p2,p3; public ScanLei1(String title){ super(title); contentPane=getContentPane(); setSize(297,377); this.setBounds(400, 100, 400, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); timer =new Timer(1000,(ActionListener) this); a = new int[row+2][col+2];

Java应用程序和小程序的编写

Java应用程序和小程序的编写 学生姓名:学号:专业班级: 实验类型:□验证□综合□设计□创新实验日期:实验成绩: 一、实验项目名称 Java应用程序和小程序的编写 二、实验目的 熟练掌握JDK常用命令:javac、java、appletviewer; 熟悉Java编辑器jcreate或eclipse等 熟练掌握简单Java应用程序和小程序的编辑和运行的过程。 掌握java的输入输出方法 三、实验基本原理 根据结构组成和运行环境的不同,java程序可以分为两类:Java Application和Java Applet。Java Application是完整的程序,需要独立的解释器来解释运行;而Java Applet则是嵌在HTML编写的Web页面中的非独立程序,由Web浏览器内部包含的Java解释器来解释运行。 输入输出是程序的基本功能,图形用户界面简称“GUI”,是目前大多数应用程序使用的输入输出界面。它在图形模式下工作,具有操作简便、美观易懂的优点具有图形界面输入输出功能的应用程序需要工作在支持图形界面的操作系统中,Java Applet程序和Java Application程序都可以在图形界面中工作。 四、主要仪器设备及耗材 计算机一台、JDK和Eclipse软件包。 五、实验步骤 (1)将下载好的jdk软件包解压,进行安装。安装之后配置系统环境变量classpath。 (2)编写简单的java程序,使用javac命令进行编译,使用java命令进行运行。 (3)安装Eclipse软件并在Eclipse中编写java Application程序和Java Applet程序。 (4)图形界面输入输出代码: 习题2-2 实验程序: package student; public class ExerciseOne { public static void main(String[] args) { System.out.println("Welcome to Java World!"); } }

C语言知识学习程序源代码-中国象棋

#include #include #include #include #include #include"c:\tc\LIB\1.c" #define W 119 #define S 115 #define A 97 #define D 100 #define space 32 #define UP 72 #define DOWN 80 #define LEFT 75 #define RIGHT 77 #define ENTER 13 void qipan(); void jiemian(int); void guangbiao1(int,int); void guangbiao2(int,int);

void xuanzhong(int,int); void gaizi(int,int); char array(int,int); void xiazi(int,int,int,int); /*int panding(char,int,int,int,int);*/ main() { int gdriver,gmode,i=0,c=0,x=190,y=190,m,n; char p; FILE *fp; gdriver=DETECT; gmode=0; if((fp=fopen("file.txt","at")) == NULL) { printf("Cannot open file!"); system("pause"); exit(0); } printf("%d,%d",gdriver,gmode); registerbgidriver(EGAVGA_driver);

相关主题
文本预览
相关文档 最新文档