Java 面向对象之井字棋

您所在的位置:网站首页 井字棋的规则 Java 面向对象之井字棋

Java 面向对象之井字棋

2023-10-14 09:19| 来源: 网络整理| 查看: 265

文章目录 基本介绍面向对象井字棋 项目结构接口IGame IChessmanIMapIUser下棋玩家User(Human/Computer)User implements IUserHuman/Computer 棋子ChessmanTicTacToeChessman implements IChessmanBlackChessman/WhiteChessman 游戏棋盘井字棋主函数后记

基本介绍 面向对象

面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。

井字棋

井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜。

项目结构

在这里插入图片描述

接口 IGame 方法参数简介boolean verifyIChessman chessman在下一颗棋子后验证是否获胜void run()开始游戏 IChessman 方法参数简介int getKind获取棋子的所有总数int getId获取棋子的类型idvoid onDraw画出棋子int getPosition获取棋子的一维坐标 IMap 方法参数简介int getRank获取棋盘的阶数String getSize获取棋盘的大小字符串boolean onPlayint position, IChessman chessman将棋子下到指定位置IChessman getint position获取指定位置的棋子void onInitialize初始化时的载入void onDraw下棋时的刷新void onClose关闭时的载出 IUser 方法参数简介IChessman playChess下棋操作int getOrder获取下棋顺序 下棋玩家User(Human/Computer) User implements IUser abstract class User implements IUser{ static protected List used = new ArrayList(); static public void initialize(){ for(int i=0;i this.order = order; } @Override public IChessman playChess(){ while(true) { System.out.println("请输入您要下棋的地方,可以用0-9表示,也可以有m,n表示"); var position = scanner.nextLine(); var chessman = TicTacToeChessman.parse(order); if (position.contains(",")) { var result = position.split(","); int x = Integer.parseInt(result[0]); int y = Integer.parseInt(result[1]); if(!used.contains(x * 3 + y)) { System.out.println("请输入没有下子的地方"); continue; } chessman.position = x * 3 + y; } else { int value = Integer.parseInt(position); chessman.position = value; if(!used.contains(value)){ System.out.println("请输入没有下子的地方"); continue; } } used.remove((Integer)chessman.position); return chessman; } } @Override public int getOrder(){ return order; } } class Computer extends User{ static private Random random = new Random(); private int order = -1; public Computer(int order){ this.order = order; } @Override public IChessman playChess(){ int position = used.get(random.nextInt(used.size())); var chessman = TicTacToeChessman.parse(order); chessman.position = position; used.remove((Integer) chessman.position); return chessman; } @Override public int getOrder(){ return order; } }

从代码就可以看出,玩家和电脑下棋的不同仅仅是下棋方法不同,玩家从键盘上获取下棋的位置,而电脑仅仅使用随机数从可以落子的地方获取棋子

棋子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