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