华容道(java版)
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版)相关推荐
- hmcl离线登陆_最好用的Java版启动器HMCL
原标题:最好用的Java版启动器HMCL 推荐的启动器是什么了?就是 Hello Minecraft! Launcher 简称HMCL,这款启动器特色很多.一张图片简单说明!!! 支持离线登录代表了什 ...
- Twitter的分布式雪花算法 SnowFlake 每秒自增生成26个万个可排序的ID (Java版)
分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种简单一 ...
- 分布式主键解决方案----Twitter 雪花算法的原理(Java 版)
SnowFlake 雪花算法 对于分布式系统环境,主键ID的设计很关键,什么自增intID那些是绝对不用的,比较早的时候,大部分系统都用UUID/GUID来作为主键,优点是方便又能解决问题,缺点是插入 ...
- 我的世界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 ...
- 我的世界java版不会玩_我的世界:五张MC趣图,Java版玩家永远不懂基岩版玩家的痛...
<我的世界>1.17版本目前已经更新了8个快照版本,在玩家的期望中,Mojang总算是加入了新的洞穴--噪声洞穴(Noise Caves).虽然这属于洞穴与山崖更新的一大步,Java版玩家 ...
- 我的世界1.7.2 java_我的世界Java版1.7版本种子分享
我的世界Java版的1.7版本中有哪些好的种子呢?下面就给大家带来我的世界Java版1.7版本种子分享,以供玩家参考. 1.seed:-6281771182477298288 x:74 y:68 z: ...
- 我的世界 java开发者_我的世界Java版开发者们畅聊水域更新
▍水域更新展望 Minecraft Java版的玩家们!你知不知道,现在就有一份快照供你试玩,在里面满是即将到来的水域更新特性?是真的!记住,你在快照里发现的所有东西都不是最终版本--你们的反馈永远是 ...
- CSP:CSP认证考试:202012-1(期末预测之安全指数)满分答案,Java版
CSP:CSP认证考试:202012-1(期末预测之安全指数)满分答案,Java版 一.题目: 二.Java满分答案 import java.util.Scanner;public class Mai ...
- CSP:CSP认证考试:202104-1(灰度直方图)满分答案,Java版
CSP:CSP认证考试:202104-1(灰度直方图)满分答案,Java版 一.题目: 二.Java满分答案 import java.util.ArrayList; import java.util. ...
- CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版
CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版 一.题目: 二.Java70分答案 import java.util.ArrayList; import java.uti ...
最新文章
- 如何实现php自动备份数据库,使用php自动备份数据库表的实现方法
- 微软公司部署小型数据中心网络连接产品
- [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例二.
- 启发式算法在最优化问题求解中的应用与实践
- 中国企业深陷「内卷」,原因找到了
- cutterman工具使用 0921
- 操作系统—数组的定义和存储结构
- python+request+Excel做接口自动化测试
- 《编写高质量代码:改善Java程序的151条建议》读书笔记
- 倒车检测线怎么接图解_倒车影像摄像头3根线安装图解 这是倒车影像的电源线...
- python面向对象编程指南pdf_Python面向对象编程指南(pdf+epub+mobi+txt+azw3)
- 关于DXP2004的安装
- QQ浏览器书签栏不见了怎么办 找回QQ浏览器书签栏方法
- 服务器网页上传附件按钮无法使用怎么解决,IE上传附件无法点击确定按钮的具体处理方法...
- 开源组件安全漏洞检测主流工具对比
- 神经网络模型用于数学建模
- 【windows】网络设置了代理,怎么关闭
- 手机桌面计算机显示,手机如何显示在桌面?敬业签电脑手机同步云便签怎么在桌面显示便签?...
- 使用minio进行文件存储
- android模拟器中使用SDCard
热门文章
- Android开发笔记(一百六十六)H5通过WebView录像上传
- Android开发笔记(四十)组件通讯工具Intent
- centos7 编译安装 python3.5
- 解决Lync 2013演示PPT提示证书问题的多种方法
- ASP.NET MVC 控制器激活(三)
- body下的DIV 高度自适应
- Oracle数据库常用操作sql语句
- Windows系统下SSH客户端连接阿里云Linux服务器
- 机器学习实现线性梯度算实现octave
- 今天在webcasts上看sql server 2008的新功能介绍,无意中发现在连接sql server 数据库时,还有一个...