华容道(java版)

java面向对象刚学完,用面向对象的思路写一个华容道练手。

  

华容道如上图一共有曹操,横将,竖将,小兵,棋盘五类对象。

首先我们定义一个棋盘类,定义length和wide表示棋盘的固有属性长宽,定义二维数组tate表示当前棋盘的状态,覆写了继承与Obiect的toSting方法来描述打应当前棋盘的状态。

class ChessBoard{
    final int length=4;
    final int wide=5;//棋盘的大小
    String[][] tate={
            {"黄","曹","操","赵"},
            {"忠","曹","操","云"},
            {"张","关","羽","马"},
            {"飞","乙","丙","超"},
            {"甲","  ","  ","丁"},
    };//定义棋盘的初始状态
    @Override
    public String toString(){
        System.out.println("----------");
        for(int i=0;i<wide;i++){
            System.out.print("|");
            for(int j=0;j<length;j++){
                System.out.print(tate[i][j]);
            }
            System.out.println("|");
        }
        System.out.println("----------");
        return "";
    }//覆写Object类中的toString方法
}

下来要定义棋子类,每个棋子都需要定义的长度,宽度,在棋盘上的坐标位置,还有move方法(操作成功返回true,失败返回false),故先定义一个抽象类Chess,让每个棋子继承Chess类。

public abstract class Chess {
    int length;
    int wide;//棋子的长宽
    int x;
    int y;//棋子最左上角的坐标
    public abstract boolean move(ChessBoard cb,String direction);
}

定义曹操类

class King extends Chess{
    public King(){
        this.length=2;
        this.wide=2;
        this.x=1;
        this.y=0;
    }
    @Override
    public boolean move(ChessBoard cb,String direction) {
        boolean flag=false;
        if(direction.equals("上")){
            if(y-1>=0&&cb.tate[y-1][x].equals("  ")&&cb.tate[y-1][x+1].equals("  ")){
                flag=true;
                cb.tate[y-1][x]="曹";
                cb.tate[y-1][x+1]="操";
                cb.tate[y+1][x]="  ";
                cb.tate[y+1][x+1]="  ";
                y=y-1;
            }
        }
        else if(direction.equals("下")){
            if(y+2<=4&&cb.tate[y+2][x].equals("  ")&&cb.tate[y+2][x+1].equals("  ")){
                flag=true;
                cb.tate[y+2][x]="曹";
                cb.tate[y+2][x+1]="操";
                cb.tate[y][x]="  ";
                cb.tate[y][x+1]="  ";
                y=y+1;
            }
        }
        else if(direction.equals("左")){
            if(x-1>=0&&cb.tate[y][x-1].equals("  ")&&cb.tate[y+1][x-1].equals("  ")){
                flag=true;
                cb.tate[y][x-1]="曹";
                cb.tate[y+1][x-1]="曹";
                cb.tate[y][x]="操";
                cb.tate[y+1][x]="操";
                cb.tate[y][x+1]="  ";
                cb.tate[y+1][x+1]="  ";
                x=x-1;
            }
        }
        else if(direction.equals("右")){
            if(x+2<=3&&cb.tate[y][x+2].equals("  ")&&cb.tate[y+1][x+2].equals("  ")){
                flag=true;
                cb.tate[y][x+2]="操";
                cb.tate[y+1][x+2]="操";
                cb.tate[y][x+1]="曹";
                cb.tate[y+1][x+1]="曹";
                cb.tate[y][x]="  ";
                cb.tate[y+1][x]="  ";
                x=x+1;
            }
        }
        return flag;
    }
}//定义曹操的属性和方法

定义竖将类

class General extends Chess{
    protected General(int x,int y){
        this.length=1;
        this.wide=2;
        this.x=x;
        this.y=y;
    }
    @Override
    public boolean move(ChessBoard cb,String direction) {
        boolean flag=false;
        if(direction.equals("上")){
            if(y-1>=0&&cb.tate[y-1][x].equals("  ")){
                flag=true;
                cb.tate[y-1][x]=cb.tate[y][x];
                cb.tate[y][x]=cb.tate[y+1][x];
                cb.tate[y+1][x]="  ";
                y=y-1;
            }
        }
        else if(direction.equals("下")){
            if(y+2<=4&&cb.tate[y+2][x].equals("  ")){
                flag=true;
                cb.tate[y+2][x]=cb.tate[y+1][x];
                cb.tate[y+1][x]=cb.tate[y][x];
                cb.tate[y][x]="  ";
                y=y+1;
            }
        }
        else if(direction.equals("左")){
            if(x-1>=0&&cb.tate[y][x-1].equals("  ")&&cb.tate[y+1][x-1].equals("  ")){
                flag=true;
                cb.tate[y][x-1]=cb.tate[y][x];
                cb.tate[y+1][x-1]=cb.tate[y+1][x];
                cb.tate[y][x]="  ";
                cb.tate[y+1][x]="  ";
                x=x-1;
            }
        }
        else if(direction.equals("右")){
            if(x+1<=3&&cb.tate[y][x+1].equals("  ")&&cb.tate[y+1][x+1].equals("  ")){
                flag=true;
                cb.tate[y][x+1]=cb.tate[y][x];
                cb.tate[y+1][x+1]=cb.tate[y+1][x];
                cb.tate[y][x]="  ";
                cb.tate[y+1][x]="  ";
                x=x+1;
            }
        }
        return flag;
    }
}//定义黄忠,赵云,张飞,马超的属性和方法

定义横将类

class Commander extends Chess{
    public Commander(){
        this.length=2;
        this.wide=1;
        this.x=1;
        this.y=2;
    }
    @Override
    public boolean move(ChessBoard cb,String direction) {
        boolean flag=false;
        if(direction.equals("上")){
            if(y-1>=0&&cb.tate[y-1][x].equals("  ")&&cb.tate[y-1][x+1].equals("  ")){
                flag=true;
                cb.tate[y-1][x]="关";
                cb.tate[y-1][x+1]="羽";
                cb.tate[y][x]="  ";
                cb.tate[y][x+1]="  ";
                y=y-1;
            }
        }
        else if(direction.equals("下")){
            if(y+1<=4&&cb.tate[y+1][x].equals("  ")&&cb.tate[y+1][x+1].equals("  ")){
                flag=true;
                cb.tate[y+1][x]="关";
                cb.tate[y+1][x+1]="羽";
                cb.tate[y][x]="  ";
                cb.tate[y][x+1]="  ";
                y=y+1;
            }
        }
        else if(direction.equals("左")){
            if(x-1>=0&&cb.tate[y][x-1].equals("  ")){
                flag=true;
                cb.tate[y][x-1]="关";
                cb.tate[y][x]="羽";
                cb.tate[y][x+1]="  ";
                x=x-1;
            }
        }
        else if(direction.equals("右")){
            if(x+2<=3&&cb.tate[y][x+2].equals("  ")){
                flag=true;
                cb.tate[y][x+2]="羽";
                cb.tate[y][x+1]="关";
                cb.tate[y][x]="  ";
                x=x+1;
            }
        }
        return flag;
    }
}//定义关羽的属性和方法

定义小兵类

class Soldier extends Chess{
    public Soldier(int x,int y){
        this.length=1;
        this.wide=1;
        this.x=x;
        this.y=y;
    }
    @Override
    public boolean move(ChessBoard cb,String direction) {
        boolean flag=false;
        if(direction.equals("上")){
            if(y-1>=0&&cb.tate[y-1][x].equals("  ")){
                flag=true;
                cb.tate[y-1][x]=cb.tate[y][x];
                cb.tate[y][x]="  ";
                y=y-1;
            }
        }
        else if(direction.equals("下")){
            if(y+1<=4&&cb.tate[y+1][x].equals("  ")){
                flag=true;
                cb.tate[y+1][x]=cb.tate[y][x];
                cb.tate[y][x]="  ";
                y=y+1;
            }
        }
        else if(direction.equals("左")){
            if(x-1>=0&&cb.tate[y][x-1].equals("  ")){
                flag=true;
                cb.tate[y][x-1]=cb.tate[y][x];
                cb.tate[y][x]="  ";
                x=x-1;
            }
        }
        else if(direction.equals("右")){
            if(x+1<=3&&cb.tate[y][x+1].equals("  ")){
                flag=true;
                cb.tate[y][x+1]=cb.tate[y][x];
                cb.tate[y][x]="  ";
                x=x+1;
            }
        }
        return flag;
    }
}//定义士兵的属性和方法

主方法

import java.util.Scanner;

public class Demo01 {
    public static void main(String[] args) {
        ChessBoard cb=new ChessBoard();
        Chess cc=new King();
        Chess hz=new General(0,0);
        Chess zy=new General(3,0);
        Chess zf=new General(0,2);
        Chess mc=new General(3,2);
        Chess gy=new Commander();
        Chess jia=new Soldier(0,4);
        Chess yi=new Soldier(1,3);
        Chess bin=new Soldier(2,3);
        Chess din=new Soldier(3,4);//为每个棋子创建了对象
        Scanner input=new Scanner(System.in);
        String name;
        String direction;
        while(true){
            System.out.print(cb);
            System.out.println("请输入需要移动的棋子:");
            name=input.next();
            System.out.println("请输入移动方向(上,下,左,右):");
            direction=input.next();
            if(name.equals("曹操")){
                if(!cc.move(cb,direction)){
                    System.out.println("无法移动,指令错误");
                }
            }
            else if(name.equals("黄忠")){
                if(!hz.move(cb,direction)){
                    System.out.println("无法移动,指令错误");
                }
            }
            else if(name.equals("赵云")){
                if(!zy.move(cb,direction)){
                    System.out.println("无法移动,指令错误");
                }
            }
            else if(name.equals("张飞")){
                if(!zf.move(cb,direction)){
                    System.out.println("无法移动,指令错误");
                }
            }
            else if(name.equals("马超")){
                if(!mc.move(cb,direction)){
                    System.out.println("无法移动,指令错误");
                }
            }
            else if(name.equals("关羽")){
                if(!gy.move(cb,direction)){
                    System.out.println("无法移动,指令错误");
                }
            }
            else if(name.equals("甲")){
                if(!jia.move(cb,direction)){
                    System.out.println("无法移动,指令错误");
                }
            }
            else if(name.equals("乙")){
                if(!yi.move(cb,direction)){
                    System.out.println("无法移动,指令错误");
                }
            }
            else if(name.equals("丙")){
                if(!bin.move(cb,direction)){
                    System.out.println("无法移动,指令错误");
                }
            }
            else if(name.equals("丁")){
                if(!din.move(cb,direction)){
                    System.out.println("无法移动,指令错误");
                }
            }
            else{
                System.out.println("查无此人");
            }
            if(cb.tate[4][1]=="曹"&&cb.tate[4][2]=="操"){
                System.out.println("你获胜了");
                break;
            }
        }
    }
}

 

  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值