Java 面向对象之井字棋 |
您所在的位置:网站首页 › 井字棋的规则 › Java 面向对象之井字棋 |
文章目录
基本介绍面向对象井字棋
项目结构接口IGame
IChessmanIMapIUser下棋玩家User(Human/Computer)User implements IUserHuman/Computer
棋子ChessmanTicTacToeChessman implements IChessmanBlackChessman/WhiteChessman
游戏棋盘井字棋主函数后记
基本介绍
面向对象
面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。 井字棋井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜。 项目结构从代码就可以看出,玩家和电脑下棋的不同仅仅是下棋方法不同,玩家从键盘上获取下棋的位置,而电脑仅仅使用随机数从可以落子的地方获取棋子 棋子Chessman TicTacToeChessman implements IChessman abstract class TicTacToeChessman implements IChessman{ public int position = -1; @Override public int getKind(){ return 2; } @Override public int getPosition(){ return position; } static public TicTacToeChessman parse(int order){ return order == 0 ? new BlackChessman(): new WhiteChessman(); } }井字棋子全面化了棋子的位置,并且提供了一个方法,通过order来觉得谁执黑先行 BlackChessman/WhiteChessman class BlackChessman extends TicTacToeChessman{ @Override public int getId(){ return 0; } @Override public void onDraw(){ System.out.print("O"); } } class WhiteChessman extends TicTacToeChessman{ @Override public int getId(){ return 1; } @Override public void onDraw(){ System.out.print("X"); } }二者仅仅是Id的差距和画UI时的onDraw的差距 游戏棋盘 class TicTacToeMap implements IMap{ private IChessman[][] map = new IChessman[3][3]; @Override public int getRank(){ return 2; } @Override public String getSize(){ return "3-3"; } @Override public boolean onPlay(int position, IChessman chessman){ if(position >= 9) return false; int x = position / 3; int y = position % 3; map[x][y] = chessman; return true; } public boolean onPlay(IChessman chessman){ int position = chessman.getPosition(); if(position >= 9) return false; int x = position / 3; int y = position % 3; map[x][y] = chessman; return true; } @Override public void onInitialize() { System.out.println("| | | |"); System.out.println("| | | |"); System.out.println("| | | |"); } @Override public void onDraw() { for(int i = 0; i System.out.print("|"); if(map[i][j] != null){ map[i][j].onDraw(); } else System.out.print(" "); } System.out.print("|"); System.out.print("\n"); } System.out.println(); } @Override public void onClose() { } @Override public IChessman get(int position){ return position = 0 ? map[position/3][position%3] : null; } public IChessman get(int x, int y){return x = 0 && y = 0 ? map[x][y] : null;} }创建了一个3x3存放IChessman的棋盘 井字棋 class TicTacToe implements IGame{ private TicTacToeMap map = new TicTacToeMap(); @Override public boolean verify(IChessman chessman) throws Exception { int lastPosition = chessman.getPosition(); if(lastPosition System.out.println("人机对战"); Random random = new Random(); int first = random.nextInt(2); if(first == 0)System.out.println("您是先手"); else System.out.println("您是后手"); User.initialize(); IUser user = new Human(first); IUser computer = new Computer(1-first); while(true){ if(user.getOrder() System.out.println("您赢了"); return; } var chess1 = computer.playChess(); map.onPlay(chess1); map.onDraw(); if(verify(chess1)){ System.out.println("您输了"); return; } } else{ var chess0 = computer.playChess(); map.onPlay(chess0); map.onDraw(); if(verify(chess0)){ System.out.println("您输了"); return; } var chess1 = user.playChess(); map.onPlay(chess1); map.onDraw(); if(verify(chess1)){ System.out.println("您赢了"); return; } } } } }因为只有9格,所有这里直接进行硬性判断 主函数 public class Game { public static void main(String[] args) throws Exception { TicTacToe ttt = new TicTacToe(); ttt.run(); } } 后记1.如果是电脑对电脑,或者人对人游戏该怎么改 User.initialize(); IUser user = new Computer(first); IUser computer = new Computer(1-first);即可,人对人同理,这就是面向对象的强大! 2.如果是五子棋该怎么改? 直接修改地图和胜利条件即可 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |