java的中国象棋小游戏的代码

本文实例为大家分享了java实现象棋小游戏的具体代码具体内容如下

用Eclipse编写 java环境1.8jdk

代码如下

package xiangqi象棋;

/**

*中国象棋Java版V3.0

*源文件:Chess.java

*添加功能:实现了当前棋局的保存

**/

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.*;

import java.io.*;

//主类

public class Chess{

public static void main{

new ChessMainFrame(楚汉两界);

}

}

//主框架类

class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable{

//玩家

JLabel play new JLabel;

//棋盘

JLabel image;

//窗格

Container con;

//工具栏

JToolBar jmain;

//重新开始

JButton anew;

//悔棋

JButton repent;

//退出

JButton exit;

//当前信息

JLabel text;

//保存当前操作

Vector Var;

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

ChessRule rule;

/**

** 单击棋子

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

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

*/

boolean chessManClick;

/**

** 控制玩家走棋

** chessPlayClick1 黑棋走棋

** chessPlayClick2 红棋走棋 默认红棋

** chessPlayClick3 双方都不能走棋

*/

int chessPlayClick2;

//控制棋子闪烁的线程

Thread tmain;

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

static int Man,i;

ChessMainFrame(){

new ChessMainFrame();

}

/**

** 构造函数

** 初始化图形用户界面

*/

ChessMainFrame{

//改变系统默认字体

Font font Dialog, Font.PLAIN, 12);

java.util.Enumeration keys UIManager.getDefaults().keys();

while ) {

Object key keys.nextElement();

Object value UIManager.get(key);

if {

UIManager.put;

}

}

//获行客格引用

con this.getContentPane();

con.setLayout(null);

//实例化规则类

rule new ChessRule();

Var new Vector();

//创建工具栏

jmain new JToolBar();

text 欢迎使用象棋对弈系统);

//当鼠标放上显示信息

text.setToolTipText();

anew 新 游 戏 );

anew.setToolTipText();

exit 退 出 );

exit.setToolTipText();

repent 悔 棋 );

repent.setToolTipText();

//把组件添加到工具栏

jmain.setLayout);

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 {

con.add(play[i]);

play[i].addMouseListener(this);

}

//添加棋盘标签

con.add));

image.setBounds(0,30,558,620);

image.addMouseListener(this);

//注册窗体关闭监听

this.addWindowListener(

new WindowAdapter {

public void windowClosing{

System.exit(0);

}

}

);

//窗体居中

Dimension screenSize Toolkit.getDefaultToolkit().getScreenSize();

Dimension frameSize this.getSize();

if {

frameSize.height screenSize.height;

}

if {

frameSize.width screenSize.width;

}

this.setLocation / 2 - 280 , / 2 - 350);

//设置

this.setIconImage.getImage());

this.setResizable(false);

this.setTitle(Title);

this.setSize(558,670);

this.show();

}

/**

** 添加棋子方法

*/

public void drawChessMan(){

//流程控制

int i,k;

Icon in;

//黑色棋子

//车

in image 黑车.GIF);

for (i24;i2;i,k456){

play new JLabel;

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

play[i].setName();

}

//马

in image 黑马.GIF);

for (i81;i6;i,k342){

play new JLabel;

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

play[i].setName();

}

//相

in image 黑象.GIF);

for (i138;i10;i,k228){

play new JLabel;

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

play[i].setName();

}

//士

in image 黑士.GIF);

for (i195;i14;i,k114){

play new JLabel;

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

play[i].setName();

}

//卒

in image 黑卒.GIF);

for (i24;i21;i,k114){

play new JLabel;

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

play.setName;

}

//炮

in image 黑炮.GIF);

for (i81;i28;i,k342){

play new JLabel;

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

play.setName;

}

//将

in image 黑将.GIF);

play new JLabel;

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

play[30].setName();

//红色棋子

//车

in image 红车.GIF);

for (i24;i4;i,k456){

play new JLabel;

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

play[i].setName();

}

//马

in image 红马.GIF);

for (i81;i8;i,k342){

play new JLabel;

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

play[i].setName();

}

//相

in image 红象.GIF);

for (i138;i12;i,k228){

play new JLabel;

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

play[i].setName();

}

//士

in image 红士.GIF);

for (i195;i16;i,k114){

play new JLabel;

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

play[i].setName();

}

//兵

in image 红卒.GIF);

for (i24;i26;i,k114){

play new JLabel;

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

play.setName;

}

//炮

in image 红炮.GIF);

for (i81;i30;i,k342){

play new JLabel;

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

play.setName;

}

//帅

in image 红将.GIF);

play new JLabel;

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

play[31].setName();

}

/**

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

*/

public void run(){

while (true){

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

if (chessManClick){

play[Man].setVisible(false);

//时间控制

try{

tmain.sleep(200);

}

catch{

}

play[Man].setVisible(true);

}

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

else {

text.setVisible(false);

//时间控制

try{

tmain.sleep(250);

}

catch{

}

text.setVisible(true);

}

try{

tmain.sleep(350);

}

catch {

}

}

}

/**

** 单击棋子方法

*/

public void mouseClicked{

System.out.println();

//当前坐标

int Ex0;

//启动线程

if {

tmain new Thread(this);

tmain.start();

}

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

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

//该红棋走棋的时候

if {

Ex play[Man].getX();

Ey play[Man].getY();

//移动卒、兵

if {

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

}

//移动炮

else if {

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

}

//移动车

else if {

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

}

//移动马

else if {

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

}

//移动相、象

else if {

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

}

//移动仕、士

else if {

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

}

//移动将、帅

else if {

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

}

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

if && Ey play.getY){

text.setText();

chessPlayClick2;

}

else {

text.setText();

chessPlayClick1;

}

}//if

//该黑棋走棋的时候

else if {

Ex play[Man].getX();

Ey play[Man].getY();

//移动卒、兵

if {

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

}

//移动炮

else if {

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

}

//移动车

else if {

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

}

//移动马

else if {

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

}

//移动相、象

else if {

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

}

//移动仕、士

else if {

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

}

//移动将、帅

else if {

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

}

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

if && Ey play.getY){

text.setText();

chessPlayClick1;

}

else {

text.setText();

chessPlayClick2;

}

}//else if

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

chessManClickfalse;

}//if

//单击棋子

else{

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

if (!chessManClick){

for {

//被单击的棋子

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

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

Mani;

//开始闪烁

chessManClicktrue;

break;

}

}//for

}//if

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

else if (chessManClick){

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

chessManClickfalse;

for (i){

//找到被吃的棋子

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

//该红棋吃棋的时候

if {

Ex play[Man].getX();

Ey play[Man].getY();

//卒、兵吃规则

if {

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

}

//炮吃规则

else if {

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

}

//车吃规则

else if {

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

}

//马吃规则

else if {

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

}

//相、象吃规则

else if {

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

}

//士、仕吃棋规则

else if {

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

}

//将、帅吃棋规则

else if {

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

play[Man].setVisible(true);

}

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

if && Ey play.getY){

text.setText();

chessPlayClick2;

break;

}

else{

text.setText();

chessPlayClick1;

break;

}

}//if

//该黑棋吃棋的时候

else if {

Ex play[Man].getX();

Ey play[Man].getY();

//卒吃规则

if {

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

}

//炮吃规则

else if {

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

}

//车吃规则

else if {

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

}

//马吃规则

else if {

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

}

//相、象吃规则

else if {

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

}

//士、仕吃棋规则

else if {

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

}

//将、帅吃棋规则

else if {

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

play[Man].setVisible(true);

}

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

if && Ey play.getY){

text.setText();

chessPlayClick1;

break;

}

else {

text.setText();

chessPlayClick2;

break;

}

}//else if

}//if

}//for

//是否胜利

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

JOptionPane.showConfirmDialog(

this,,。

JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);

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

chessPlayClick3;

text.setText();

}//if

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

JOptionPane.showConfirmDialog(

this,,。

JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);

chessPlayClick3;

text.setText();

}//else if

}//else

}//else

}

public void mousePressed{

}

public void mouseReleased{

}

public void mouseEntered{

}

public void mouseExited{

}

/**

** 定义按钮的事件响应

*/

public void actionPerformed {

//重新开始按钮

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

int i,k;

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

//黑色棋子

//车

for (i24;i2;i,k456){

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

}

//马

for (i81;i6;i,k342){

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

}

//相

for (i138;i10;i,k228){

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

}

//士

for (i195;i14;i,k114){

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

}

//卒

for (i24;i21;i,k114){

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

}

//炮

for (i81;i28;i,k342){

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

}

//将

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

//红色棋子

//车

for (i24;i4;i,k456){

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

}

//马

for (i81;i8;i,k342){

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

}

//相

for (i138;i12;i,k228){

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

}

//士

for (i195;i16;i,k114){

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

}

//兵

for (i24;i26;i,k114){

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

}

//炮

for (i81;i30;i,k342){

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

}

//帅

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

chessPlayClick 2;

text.setText();

for (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 .charAt ){

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);

//停止旗子闪烁

chessManClickfalse;

}

catch{

}

}

//退出

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

int jJOptionPane.showConfirmDialog(

this,,。

JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);

if {

System.exit(0);

}

}

}

/**

*定义中国象棋规则的类

**/

class ChessRule {

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

public void armsRule{

//黑卒向下

if {

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

if -play.getY) 27 86 55 && 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 284 112){

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

}

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

else if 284 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 -play.getX) 55 86){

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

}

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

else if 57 112){

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

}

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

else if 3 58){

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

}

}

}//卒移动结束

/**卒吃棋规则*/

public void armsRule{

//向右走

if - play1.getX) 57 -22 play2.getName.charAt){

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

if .charAt 284 play2.getName.charAt){

play2.setVisible(false);

//把对方的位置给自己

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

}

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

else if .charAt 341 play2.getName.charAt){

play2.setVisible(false);

//把对方的位置给自己

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

}

}

//向左走

else if - play2.getX) 57 -22 play2.getName.charAt){

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

if .charAt 284 play2.getName.charAt){

play2.setVisible(false);

//把对方的位置给自己

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

}

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

else if .charAt 341 play2.getName.charAt){

play2.setVisible(false);

//把对方的位置给自己

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

}

}

//向上走

else if - play2.getX 22 && play1.getY - play2.getY 112){

//黑棋不能向上吃棋

if .charAt play2.getY play2.getName.charAt){

play2.setVisible(false);

//把对方的位置给自己

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

}

//红棋不能向下吃棋

else if .charAt play2.getY play2.getName.charAt){

play2.setVisible(false);

//把对方的位置给自己

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

}

}

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

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

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

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

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

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

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

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

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

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

}//卒吃结束

/**炮、车移动规则*/

public void cannonRule{

//起点和终点之间是否有棋子

int Count 0;

//上、下移动

if - me.getX -55){

//指定所有模糊Y坐标

for {

//移动的Y坐标是否有指定坐标相近的

if 27){

//所有的棋子

for {

//找出在同一条竖线的所有棋子、并不包括自己

if - play.getX 27 play.getName && playQ.isVisible){

//从起点到终点(从左到右)

for (int k57;k

//大于起点、小于终点的坐标就可以知道中间是否有棋子

if i play.getY){

//中间有一个棋子就不可以从这条竖线过去

Count;

break;

}

}//for

//从起点到终点(从右到左)

for (int k57;k

//找起点和终点的棋子

if play.getY i){

Count;

break;

}

}//for

}//if

}//for

//起点和终点没有棋子就可以移动了

if {

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

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(),i,55,55);

break;

}

}//if

}//for

}//if

//左、右移动

else if - me.getY 27){

//指定所有模糊X坐标

for {

//移动的X坐标是否有指定坐标相近的

if 0){

//所有的棋子

for {

//找出在同一条横线的所有棋子、并不包括自己

if - play.getY 27 play.getName && playQ.isVisible){

//从起点到终点(从上到下)

for (int k57;k

//大于起点、小于终点的坐标就可以知道中间是否有棋子

if i play.getX){

//中间有一个棋子就不可以从这条横线过去

Count;

break;

}

}//for

//从起点到终点(从下到上)

for (int k57;k

//找起点和终点的棋子

if play.getX i){

Count;

break;

}

}//for

}//if

}//for

//起点和终点没有棋子

if {

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

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(i,play.getY(),55,55);

break;

}

}//if

}//for

}//else

}//炮、车移动方法结束

/**炮、车吃棋规则*/

public void cannonRule{

//起点和终点之间是否有棋子

int Count 0;

//所有的棋子

for {

//找出在同一条竖线的所有棋子、并不包括自己

if - play.getX 27 play.getName && playQ.isVisible){

//自己是起点被吃的是终点(从上到下)

for (int k57;k

//大于起点、小于终点的坐标就可以知道中间是否有棋子

if playTake.getY play.getY){

//计算起点和终点的棋子个数

Count;

break;

}

}//for

//自己是起点被吃的是终点(从下到上)

for ;k

//找起点和终点的棋子

if play.getY playTake.getY){

Count;

break;

}

}//for

}//if

//找出在同一条竖线的所有棋子、并不包括自己

else if - play.getY 10 play.getName && playQ.isVisible){

//自己是起点被吃的是终点(从左到右)

for (int k50;k

//大于起点、小于终点的坐标就可以知道中间是否有棋子

if playTake.getX play.getX){

Count;

break;

}

}//for

//自己是起点被吃的是终点(从右到左)

for ;k

//找起点和终点的棋子

if play.getX playTake.getX){

Count;

break;

}

}//for

}//if

}//for

//起点和终点之间要一个棋子是炮的规则、并不能吃自己的棋子

if .charAt(1)){

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

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

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

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

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

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

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

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

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

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

playTake.setVisible(false);

play.setBounds(playTake.getX(),playTake.getY(),55,55);

}

//起点和终点之间没有棋子是车的规则、并不能吃自己的棋子

else if .charAt(1)){

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

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

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

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

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

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

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

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

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

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

playTake.setVisible(false);

play.setBounds(playTake.getX(),playTake.getY(),55,55);

}

}//炮、车吃棋方法结束

/**马移动规则*/

public void horseRule{

//保存坐标和障碍

int Ex0,Move0;

//上移、左边

if - me.getX 57 && play.getY - me.getY 141){

//合法的Y坐标

for {

//移动的Y坐标是否有指定坐标相近的

if 27){

Ey i;

break;

}

}

//合法的X坐标

for {

//移动的X坐标是否有指定坐标相近的

if 0){

Ex i;

break;

}

}

//正前方是否有别的棋子

for {

if 0 57 ){

Move 1;

break;

}

}

//可以移动该棋子

if {

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

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(Ex,Ey,55,55);

}

}//if

//左移、上边

else if - me.getY 86 && play.getX - me.getX 130){

//Y

for {

if 27){

Ey i;

}

}

//X

for {

if 0){

Ex i;

}

}

//正左方是否有别的棋子

for {

if 0 57 ){

Move 1;

break;

}

}

if {

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

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(Ex,Ey,55,55);

}

}//else

//下移、右边

else if - play.getY 141 2 ){

//Y

for {

if 27){

Ey i;

}

}

//X

for {

if 0){

Ex i;

}

}

//正下方是否有别的棋子

for {

if 0 57 ){

Move 1;

break;

}

}

if {

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

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(Ex,Ey,55,55);

}

}//else

//上移、右边

else if - me.getY 141 30 ){

//合法的Y坐标

for {

if 27){

Ey i;

break;

}

}

//合法的X坐标

for {

if 0){

Ex i;

break;

}

}

//正前方是否有别的棋子

for {

System.out.println(iplayQ[i].getX()playQ[i].getX());

//System.out.println(play.getX());

if 0 57 ){

Move 1;

//System.out.println(play.getY());

//System.out.println(playQ[i].getY());

break;

}

}

//可以移动该棋子

if {

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

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(Ex,Ey,55,55);

}

}//else

//下移、左边

else if - play.getY 141 10 ){

//合法的Y坐标

for {

if 27){

Ey i;

break;

}

}

//合法的X坐标

for {

if 0){

Ex i;

break;

}

}

//正下方是否有别的棋子

for {

if 0 57 ){

Move 1;

break;

}

}

//可以移动该棋子

if {

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

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(Ex,Ey,55,55);

}

}//else

//右移、上边

else if - me.getY 87 87 ){

//Y

for {

if 27){

Ey i;

}

}

//X

for {

if 0){

Ex i;

}

}

//正右方是否有别的棋子

for {

if 0 57 ){

Move 1;

break;

}

}

if {

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

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(Ex,Ey,55,55);

}

}//else

//右移、下边

else if - play.getY 87 87 ){

//Y

for {

if 27){

Ey i;

}

}

//X

for {

if 0){

Ex i;

}

}

//正右方是否有别的棋子

for {

if 0 57 ){

Move 1;

break;

}

}

if {

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

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(Ex,Ey,55,55);

}

}//else

//左移、下边

else if - play.getY 87 87 ){

//Y

for {

if 27){

Ey i;

}

}

//X

for {

if 0){

Ex i;

}

}

//正左方是否有别的棋子

for {

if 0 57 ){

Move 1;

break;

}

}

if {

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

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(Ex,Ey,55,55);

}

}//else

}//马移动结束

/**马吃棋规则*/

public void horseRule{

//障碍

int Move0;

boolean Chessfalse;

//上移、左吃

if .charAt! 57 && play.getY - playTake.getY 114 ){

//正前方是否有别的棋子

for {

if 0 57){

Move 1;

break;

}

}//for

Chess true;

}//if

//上移、右吃

else if - playTake.getY 114 && playTake.getX - play.getX 57 ){

//正前方是否有别的棋子

for {

if 0 57){

Move 1;

break;

}

}//for

Chess true;

}//else

//左移、上吃

else if - playTake.getY 57 && play.getX - playTake.getX 114 ){

//正左方是否有别的棋子

for {

if 0 57){

Move 1;

break;

}

}//for

Chess true;

}//else

//左移、下吃

else if - play.getY 57 && play.getX - playTake.getX 114 ){

//正左方是否有别的棋子

for {

if 0 57){

Move 1;

break;

}

}//for

Chess true;

}//else

//右移、上吃

else if - playTake.getY 57 && playTake.getX - play.getX 114 ){

//正右方是否有别的棋子

for {

if 0 57){

Move 1;

break;

}

}//for

Chess true;

}//else

//右移、下吃

else if - play.getY 57 && playTake.getX - play.getX 114 ){

//正右方是否有别的棋子

for {

if 0 57){

Move 1;

break;

}

}//for

Chess true;

}//else

//下移、左吃

else if - play.getY 114 && play.getX - playTake.getX 57 ){

//正下方是否有别的棋子

for {

if 0 -57 ){

Move 1;

break;

}

}//for

Chess true;

}//else

//下移、右吃

else if - play.getY 114 && playTake.getX - play.getX 57){

//正下方是否有别的棋子

for {

if 0 -57 ){

Move 1;

break;

}

}//for

Chess true;

}//else

//没有障碍、并可以吃棋、不能吃自己颜色

if .charAt(1)){

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

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

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

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

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

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

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

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

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

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

playTake.setVisible(false);

play.setBounds(playTake.getX(),playTake.getY(),55,55);

}

}

/**相移动规则*/

public void elephantRule{

//坐标和障碍

int Ex0,Move0;

//上左

if - me.getX 87 && play.getY - me.getY 87){

//合法的Y坐标

for {

if 27){

Ey i;

break;

}

}

//合法的X坐标

for {

if 27){

Ex i;

break;

}

}

//左上方是否有棋子

for {

if 57 57){

Move;

break;

}

}

//红旗不能过楚河

if {

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

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

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

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

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

System.out.println(Ex);

System.out.println(Ey);

play.setBounds(Ex,Ey,55,55);

}

//黑旗不能过汉界

else if {

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

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(Ex,Ey,55,55);

}

}//if

//上右

else if - me.getY 87 141){

//合法的Y坐标

for {

if 27){

Ey i;

break;

}

}

//合法的X坐标

for {

if 27){

Ex i;

break;

}

}

//右上方是否有棋子

for {

if 57 57){

Move;

break;

}

}

//相、象规则

if {

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

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(Ex,Ey,55,55);

}

else if {

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

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(Ex,Ey,55,55);

}

}// else if

//下左

else if - me.getX 87 && me.getY - play.getY 87){

//合法的Y坐标

for {

if 27){

Ey i;

break;

}

}

//合法的X坐标

for {

if 27){

Ex i;

break;

}

}

//下左方是否有棋子

for {

if 57 -57){

Move;

break;

}

}

//相、象规则

if {

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

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(Ex,Ey,55,55);

}

else if

{

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

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(Ex,Ey,55,55);

}

}//else if

//下右

else if - play.getX 141 && me.getY - play.getY 141){

//Y

for {

if 27){

Ey i;

}

}

//X

for {

if 27){

Ex i;

}

}

//下右方是否有棋子

for {

if 57 57){

Move 1;

break;

}

}

//相、象规则

if {

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

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(Ex,Ey,55,55);

}

else if {

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

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(Ex,Ey,55,55);

}

}//else

}//相移动规则吉束

/**相、象吃棋规则*/

public void elephantRule{

//障碍

int Move0;

boolean Chessfalse;

//吃左上方的棋子

if - playTake.getX 141 && play.getY - playTake.getY 141){

//左上方是否有棋子

for {

if 57 57){

Move;

break;

}

}//for

Chesstrue;

}//if

//吃右上方的棋子

else if - play.getX 141 && play.getY - playTake.getY 141 ){

//右上方是否有棋子

for {

if 57 57 ){

Move;

break;

}

}//for

Chesstrue;

}//else

//吃下左方的棋子

else if - playTake.getX 141 && playTake.getY - play.getY 141){

//下左方是否有棋子

for {

if 57 -57 ){

Move;

break;

}

}//for

Chesstrue;

}//else

//吃下右放的棋子

else if - play.getX 141 && playTake.getY - play.getY 141){

//下右方是否有棋子

for {

if 57 57 ){

Move 1;

break;

}

}//for

Chesstrue;

}//else

//没有障碍、并不能吃自己的棋子

if .charAt(1)){

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

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

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

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

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

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

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

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

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

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

playTake.setVisible(false);

play.setBounds(playTake.getX(),playTake.getY(),55,55);

}

}//相、象吃棋规则结束

/**士、仕移动方法*/

public void chapRule{

//上、右

if - play.getX 114 && play.getY - me.getY 90){

//士不能超过自己的界限

if {

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

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()57,play.getY()-57,55,55);

}

//仕不能超过自己的界限

else if 57) 309){

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

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()57,play.getY()-57,55,55);

}

}// else if

//上、左

else if - me.getX 25 95){

//士不能超过自己的界限

if {

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

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()-57,play.getY()-57,55,55);

}

//仕不能超过自己的界限

else if {

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

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()-57,play.getY()-57,55,55);

}

}// else if

//下、左

else if - me.getX 20 87){

//士不能超过自己的界限

if 170 ){

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

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()-57,play.getY()57,55,55);

}

//仕不能超过自己的界限

else if {

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

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()-57,play.getY()57,55,55);

}

}// else if

//下、右

else if - play.getX 114 && me.getY - play.getY 87){

//士不能超过自己的界限

if {

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

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()57,55,55);

}

//仕不能超过自己的界限

else if {

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

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()57,55,55);

}

}//else if

}//士、仕移动规则结束

/**士、仕吃棋规则*/

public void chapRule{

//当前状态

boolean Chap false;

//上、右

if - play.getX 114 && play.getY - playTake.getY 87){

//被吃的棋子是否和当前士相近

if ){

Chap true;

}

//被吃的棋子是否和当前仕相近

else if ){

Chap true;

}

}//if

//上、左

else if - playTake.getX 25 87){

//被吃的棋子是否和当前士相近

if ){

Chap true;

}

//被吃的棋子是否和当前仕相近

else if ){

Chap true;

}

}// else if

//下、左

else if - playTake.getX 25 87){

//被吃的棋子是否和当前士相近

if ){

Chap true;

}

//被吃的棋子是否和当前仕相近

else if ){

Chap true;

}

}// else if

//下、右

else if - play.getX 114 && playTake.getY - play.getY 87){

//被吃的棋子是否和当前士相近

if ){

Chap true;

}

//被吃的棋子是否和当前仕相近

else if ){

Chap true;

}

}//else if

//可移动、并不能吃自己的棋子

if .charAt(1)){

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

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

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

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

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

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

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

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

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

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

playTake.setVisible(false);

play.setBounds(playTake.getX(),playTake.getY(),55,55);

}

}//士、仕吃棋规则结束

/**将移动规则*/

public void willRule{

//向上

if -play.getX) 55 && 87){

//将是否超过自己的界限

if {

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

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 {

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

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);

}

}//if

//向左

else if - me.getX 57 -27){

//将是否超过自己的界限

if {

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

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()-57,play.getY(),55,55);

}

//帅是否超过自己的界限

else if {

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

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()-57,play.getY(),55,55);

}

}//else if

//向右

else if - play.getX 112 -27){

//将、帅规则

if {

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

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()57,play.getY(),55,55);

}

else if {

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

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()57,play.getY(),55,55);

}

}//else if

//向下

else if - play.getX 55 27){

//将、帅规则

if {

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

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 {

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

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

}//将、帅移动规则结束

public void willRule{

//当前状态

boolean will false;

//向上吃

if - playTake.getX 55 && play.getY - playTake.getY 87 && playTake.isVisible){

//被吃的棋子是否和当前将相近

if {

will true;

}

//被吃的棋子是否和当前帅相近

else if {

will true;

}

}

//向左吃

else if - playTake.getX 57 -27 && playTake.isVisible){

//被吃的棋子是否和当前将相近

if {

will true;

}

//被吃的棋子是否和当前帅相近

else if {

will true;

}

}

//向右吃

else if - play.getX 57 -27 && playTake.isVisible){

//被吃的棋子是否和当前将相近

if {

will true;

}

//被吃的棋子是否和当前帅相近

else if {

will true;

}

}

//向下

else if - play.getX 87 40 && playTake.isVisible){

//被吃的棋子是否和当前将相近

if {

will true;

}

//被吃的棋子是否和当前帅相近

else if {

will true;

}

}

//不能吃自己的棋子、符合当前要求

if .charAt ! play.getName.charAt && will){

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

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

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

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

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

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

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

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

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

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

playTake.setVisible(false);

play.setBounds(playTake.getX(),playTake.getY(),55,55);

}

}//将、帅吃规则结束

【温馨提示】如果文章内容有帮助到您,别忘动动小手指分享给好友哦!

相关文章

  • 如何评价中国象棋第一人别名外星人王天一?.

    如何评价中国象棋第一人别名外星人王天一?

    王天一,男,1989年4月23日出生于北京,北京人,中国象棋特级大师,2013年毕业于北京大学,曾效力于北京威凯建设队,现就职于中国棋院杭州分院。2012年10月,王天一获得全国象棋个人赛冠军,成为中国第十六位男子全国象棋冠军棋手并晋升为象棋特级大师。

    2023-04-26 阅读 (993)
  • 至目前为止,王天一算不算中国象棋史上的第一人?.

    至目前为止,王天一算不算中国象棋史上的第一人?

    车马炮声隆隆响,九宫格内摆战场。千古象棋第一人,外星美名新流芳。扯个象棋界可能有争议的话题,中国象棋历史发展至今为止,外星人王天一是不是中国象棋天下第一人。图片来...

    2023-04-26 阅读 (788)
  • 中国象棋入门第一课——心算练习.

    中国象棋入门第一课——心算练习

    想提高象棋的水平吗?对局中想给对方设下陷阱吗?想瞬间识破对方的骗招吗?象棋的心算是实现这些想法的基础。如何提高心算?第一步就是练习连将杀,而练习连将杀不应该只是简...

    2023-04-15 阅读 (440)
  • 答辩java中国象棋答辩记录怎么写的.

    答辩java中国象棋答辩记录怎么写的

    通过此次的《中国象棋》游戏实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。《中国象棋》游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。, 人机对弈基于极大极小值搜索算法。中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史。

    2024-05-06 阅读 (207)
  • java联机版中国象棋的uml图.

    java联机版中国象棋的uml图

    《中国象棋》游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。, 人机对弈基于极大极小值搜索算法。通过此次的《中国象棋》游戏实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。中国象棋是一款具有浓郁中国特色的益智游戏,新增的联网对战,趣味多多,聚会可以约小朋友一起来挑战。

    2024-09-28 阅读 (171)
  • java中国象棋源码(探寻 Java 编程下的中国象棋奥秘,实现棋盘上的智慧对决).

    java中国象棋源码(探寻 Java 编程下的中国象棋奥秘,实现棋盘上的智慧对决)

    c语言实现——《中国象棋项目》游戏介绍:每种棋子的行棋规则大家如果有不懂的地方,可以去了解一下,都很简单。你想要做出本项目,了解规则是必不可少的。插件:图形库插件easyx,涉及图片素材可以自行百度找也可以关注文末领取;配套讲解教程:「链接」include<stdio.h>define interval 50

    2023-11-07 阅读 (170)
  • 象棋代码Java炮的走法.

    象棋代码Java炮的走法

    但是我选择背道而行,不是因为别的,是为了更好的去让初学者理解,我们把原本的x坐标看成数组的列(col),把y坐标看成我们数组的行(row),这样是不是更好理解一点呢,当然了我就是这么理解的,哈哈,接下来的游戏代码编程我们会把横坐标用y*width,纵坐标用x*height你们应该就能理解为什么了,因为x是数组的行,也就是坐标纵坐标(y)的体现,同理数组中的y也是如此。

    2025-02-07 阅读 (166)
  • java象棋算法思路(探寻 Java 象棋算法背后的迷人逻辑).

    java象棋算法思路(探寻 Java 象棋算法背后的迷人逻辑)

    象棋软件编程的过程通常分为以下几个步骤:1. 确定游戏规则和棋盘状态表示方法:在象棋软件中,需要确定棋子的移动规则、胜利条件等游戏规则,并且需要设计一种表示棋盘状态的数据结构来存储当前的游戏状态。2. 实现搜索算法:象棋软件中的核心算法是搜索算法,通常使用的是极小化极大算法(minimax)和alpha-beta剪枝算法,这些算法可以在棋盘上搜索出最优解。

    2023-11-09 阅读 (165)
  • 基于java中国象棋有什么问题和建议.

    基于java中国象棋有什么问题和建议

    《中国象棋》游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。, 人机对弈基于极大极小值搜索算法。通过此次的《中国象棋》游戏实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。

    2025-06-25 阅读 (151)
  • java象棋游戏源代码(是否想探索 Java 编程的迷人世界,从象棋游戏开始).

    java象棋游戏源代码(是否想探索 Java 编程的迷人世界,从象棋游戏开始)

    c语言实现——《中国象棋项目》游戏介绍:每种棋子的行棋规则大家如果有不懂的地方,可以去了解一下,都很简单。你想要做出本项目,了解规则是必不可少的。插件:图形库插件easyx,涉及图片素材可以自行百度找也可以关注文末领取;配套讲解教程:「链接」include<stdio.h>define interval 50

    2023-11-18 阅读 (105)