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

   

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

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

class ChessBoard{final int length=4;final int wide=5;//棋盘的大小String[][] tate={{"黄","曹","操","赵"},{"忠","曹","操","云"},{"张","关","羽","马"},{"飞","乙","丙","超"},{"甲","  ","  ","丁"},};//定义棋盘的初始状态@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}}}
}

华容道(java版)相关推荐

  1. hmcl离线登陆_最好用的Java版启动器HMCL

    原标题:最好用的Java版启动器HMCL 推荐的启动器是什么了?就是 Hello Minecraft! Launcher 简称HMCL,这款启动器特色很多.一张图片简单说明!!! 支持离线登录代表了什 ...

  2. Twitter的分布式雪花算法 SnowFlake 每秒自增生成26个万个可排序的ID (Java版)

    分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种简单一 ...

  3. 分布式主键解决方案----Twitter 雪花算法的原理(Java 版)

    SnowFlake 雪花算法 对于分布式系统环境,主键ID的设计很关键,什么自增intID那些是绝对不用的,比较早的时候,大部分系统都用UUID/GUID来作为主键,优点是方便又能解决问题,缺点是插入 ...

  4. 我的世界java下载1.13_Minecraft Java版 1.13.1-pre2 发布

    Minecraft Java 版 1.13.1-pre2 发布 Back from vacation, we're now trying to finalize 1.13.1 and get it t ...

  5. 我的世界java版不会玩_我的世界:五张MC趣图,Java版玩家永远不懂基岩版玩家的痛...

    <我的世界>1.17版本目前已经更新了8个快照版本,在玩家的期望中,Mojang总算是加入了新的洞穴--噪声洞穴(Noise Caves).虽然这属于洞穴与山崖更新的一大步,Java版玩家 ...

  6. 我的世界1.7.2 java_我的世界Java版1.7版本种子分享

    我的世界Java版的1.7版本中有哪些好的种子呢?下面就给大家带来我的世界Java版1.7版本种子分享,以供玩家参考. 1.seed:-6281771182477298288 x:74 y:68 z: ...

  7. 我的世界 java开发者_我的世界Java版开发者们畅聊水域更新

    ▍水域更新展望 Minecraft Java版的玩家们!你知不知道,现在就有一份快照供你试玩,在里面满是即将到来的水域更新特性?是真的!记住,你在快照里发现的所有东西都不是最终版本--你们的反馈永远是 ...

  8. CSP:CSP认证考试:202012-1(期末预测之安全指数)满分答案,Java版

    CSP:CSP认证考试:202012-1(期末预测之安全指数)满分答案,Java版 一.题目: 二.Java满分答案 import java.util.Scanner;public class Mai ...

  9. CSP:CSP认证考试:202104-1(灰度直方图)满分答案,Java版

    CSP:CSP认证考试:202104-1(灰度直方图)满分答案,Java版 一.题目: 二.Java满分答案 import java.util.ArrayList; import java.util. ...

  10. CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版

    CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版 一.题目: 二.Java70分答案 import java.util.ArrayList; import java.uti ...

最新文章

  1. 如何实现php自动备份数据库,使用php自动备份数据库表的实现方法
  2. 微软公司部署小型数据中心网络连接产品
  3. [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例二.
  4. 启发式算法在最优化问题求解中的应用与实践
  5. 中国企业深陷「内卷」,原因找到了
  6. cutterman工具使用 0921
  7. 操作系统—数组的定义和存储结构
  8. python+request+Excel做接口自动化测试
  9. 《编写高质量代码:改善Java程序的151条建议》读书笔记
  10. 倒车检测线怎么接图解_倒车影像摄像头3根线安装图解 这是倒车影像的电源线...
  11. python面向对象编程指南pdf_Python面向对象编程指南(pdf+epub+mobi+txt+azw3)
  12. 关于DXP2004的安装
  13. QQ浏览器书签栏不见了怎么办 找回QQ浏览器书签栏方法
  14. 服务器网页上传附件按钮无法使用怎么解决,IE上传附件无法点击确定按钮的具体处理方法...
  15. 开源组件安全漏洞检测主流工具对比
  16. 神经网络模型用于数学建模
  17. 【windows】网络设置了代理,怎么关闭
  18. 手机桌面计算机显示,手机如何显示在桌面?敬业签电脑手机同步云便签怎么在桌面显示便签?...
  19. 使用minio进行文件存储
  20. android模拟器中使用SDCard

热门文章

  1. Android开发笔记(一百六十六)H5通过WebView录像上传
  2. Android开发笔记(四十)组件通讯工具Intent
  3. centos7 编译安装 python3.5
  4. 解决Lync 2013演示PPT提示证书问题的多种方法
  5. ASP.NET MVC 控制器激活(三)
  6. body下的DIV 高度自适应
  7. Oracle数据库常用操作sql语句
  8. Windows系统下SSH客户端连接阿里云Linux服务器
  9. 机器学习实现线性梯度算实现octave
  10. 今天在webcasts上看sql server 2008的新功能介绍,无意中发现在连接sql server 数据库时,还有一个...