文章目录

  • 基本介绍
    • 面向对象
    • 井字棋
  • 项目结构
  • 接口
    • IGame
  • IChessman
  • IMap
  • IUser
  • 下棋玩家User(Human/Computer)
    • User implements IUser
    • Human/Computer
  • 棋子Chessman
    • TicTacToeChessman implements IChessman
    • BlackChessman/WhiteChessman
  • 游戏棋盘
  • 井字棋
  • 主函数
  • 后记

基本介绍

面向对象

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

井字棋

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

项目结构

接口

IGame

方法 参数 简介
boolean verify IChessman chessman 在下一颗棋子后验证是否获胜
void run() 开始游戏

IChessman

方法 参数 简介
int getKind 获取棋子的所有总数
int getId 获取棋子的类型id
void onDraw 画出棋子
int getPosition 获取棋子的一维坐标

IMap

方法 参数 简介
int getRank 获取棋盘的阶数
String getSize 获取棋盘的大小字符串
boolean onPlay int position, IChessman chessman 将棋子下到指定位置
IChessman get int 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<Integer> used = new ArrayList<>();static public void initialize(){for(int i=0;i<9;++i)used.add(i);}
}

对于井字棋中的User来说,有人类和电脑两种玩家,作为下棋位置的通知,让其共用一个used作为剩余位置参考

Human/Computer

class Human extends User{private static Scanner scanner = new Scanner(System.in);private int order = -1;public Human(int order){this.order = order;}@Overridepublic 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;}}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic int getOrder(){return order;}
}

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

棋子Chessman

TicTacToeChessman implements IChessman

abstract class TicTacToeChessman implements IChessman{public int position = -1;@Overridepublic int getKind(){return 2;}@Overridepublic int getPosition(){return position;}static public TicTacToeChessman parse(int order){return order == 0 ? new BlackChessman(): new WhiteChessman();}
}

井字棋子全面化了棋子的位置,并且提供了一个方法,通过order来觉得谁执黑先行

BlackChessman/WhiteChessman

class BlackChessman extends TicTacToeChessman{@Overridepublic int getId(){return 0;}@Overridepublic void onDraw(){System.out.print("O");}
}class WhiteChessman extends TicTacToeChessman{@Overridepublic int getId(){return 1;}@Overridepublic void onDraw(){System.out.print("X");}
}

二者仅仅是Id的差距和画UI时的onDraw的差距

游戏棋盘

class TicTacToeMap implements IMap{private IChessman[][] map = new IChessman[3][3];@Overridepublic int getRank(){return 2;}@Overridepublic String getSize(){return "3-3";}@Overridepublic 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;}@Overridepublic void onInitialize() {System.out.println("| | | |");System.out.println("| | | |");System.out.println("| | | |");}@Overridepublic void onDraw() {for(int i = 0; i < 3; ++ i){for(int j = 0; j < 3; ++j){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();}@Overridepublic void onClose() {}@Overridepublic IChessman get(int position){return position < 9 && position >= 0 ? map[position/3][position%3] : null;}public IChessman get(int x, int y){return x < 3 && x >= 0 && y < 3 && y >= 0 ? map[x][y] : null;}}

创建了一个3x3存放IChessman的棋盘

井字棋

class TicTacToe implements IGame{private TicTacToeMap map = new TicTacToeMap();@Overridepublic boolean verify(IChessman chessman) throws Exception {int lastPosition = chessman.getPosition();if(lastPosition < 0)return false;//获取上次下棋的位置int x = lastPosition / 3;int y = lastPosition % 3;//行判断if(map.get(x,0) != null && map.get(x, 1) != null && map.get(x, 2) != null)if(map.get(x, 0).getId() == map.get(x, 1).getId() && map.get(x, 1).getId() == map.get(x, 2).getId())return true;//列判断if(map.get(0,y) != null && map.get(1, y) != null && map.get(2, y) != null)if(map.get(0, y).getId() == map.get(1, y).getId() && map.get(1, y).getId() == map.get(2, y).getId())return true;//对角判断if(x == 2 || y == 2)return false;else{if(map.get(0,0) != null && map.get(1,1) != null && map.get(2, 2) != null)if(map.get(0,0).getId() == map.get(1,1).getId() && map.get(1,1).getId() == map.get(2, 2).getId())return true;if(map.get(2,0) != null && map.get(1,1) != null && map.get(0, 2) != null)if(map.get(2,0).getId() == map.get(1,1).getId() && map.get(1,1).getId() == map.get(0, 2).getId())return true;}for(int i=0;i<3;++i)for(int j=0;j<3;++j)if(map.get(i,j) == null)return false;System.out.println("已和局");throw new Exception();}@Overridepublic void run() throws Exception {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() < computer.getOrder()){var chess0 = user.playChess();map.onPlay(chess0);map.onDraw();if(verify(chess0)){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.如果是五子棋该怎么改?
直接修改地图和胜利条件即可

Java 面向对象之井字棋相关推荐

  1. 还在动手画棋盘 ?20分钟带你用Java写一个井字棋!

    还在动手画棋盘 ?20分钟带你用Java写一个井字棋! 文章目录 还在动手画棋盘 ?20分钟带你用Java写一个井字棋! 前言 设计过程 1.创建窗体类MyGameWindow 2.创建窗体的构造器 ...

  2. java井字游戏_java井字棋源代码(双人对战版)

    [实例简介] [实例截图] [核心代码] package com.pan.ttt; import java.awt.*; import java.awt.event.*; import javax.s ...

  3. 井字棋java代码_JAVA 井字棋

    有时候我们可以用java编写一些小游戏,比如井字棋,这是一个很简单的程序,如图效果: 我们可以将它分为棋子,棋盘,框架启动类表示: 首先我们来编写棋子类,棋子类里有棋子的坐标和形状的表示, 用1表示圆 ...

  4. Java实现简单井字棋小游戏代码实例

    Java第一次实验,老师让做一个井字棋,电脑随机下棋. 然后就想能不能聪明一点,可以判断出走哪一步棋:然后只能做到不会输,还是不够聪明,只能呆板地堵住用户,smartRobot的第三个判断逻辑找不到最 ...

  5. Java编程题--井字棋

    解题思路: 根据题目要求, 当前玩家想要获胜的话, 必须在横竖斜方向有连成排的即获胜 根据测试样例可知, 连成排的那一排和为3 那么当某一排的和为3时则输出true import java.util. ...

  6. Java实现简单井字棋(OX游戏)V2.0

    简介 还是承接着上次的OX游戏,这次老师提的要求奇奇怪怪的,说实话真的挺费解的,但多读几遍以后要抓住几个关键点,"左上角"."绘制".看刚好学了paint嘛,所 ...

  7. java 井字棋 人机_一个井字棋tictactoe游戏的java实现 | Soo Smart!

    这是一个井字棋游戏的java实现.摘录于stackoverflow. 游戏规则很简单,只要一方棋子在水平线,垂直线或者对角线任意一条线上排列成功即为获胜. 作者原先的代码存在着一些问题: 代码如下: ...

  8. 用Java实现简单的井字棋程序(α-β剪枝)

    利用α-β剪枝实现井字棋程序 剪枝思路如下: α可以认为是你的收益>=α,β可以认为是你的收益<=β,当α>β的时候,收益比α要大,比β要小,显然是一个空集.所以进行剪枝. α的初始 ...

  9. java——博弈算法实现井字棋游戏

    通过java语言开发了一个简单的井字棋游戏.主要有6个类,其中有一个是主类(Main.java),一个是抽象类(PiecesMove.java)组成. 下面对各个类简单介绍一下: TicTicToe. ...

最新文章

  1. C++smallest circle 获取外接给定点集的最小圆的中心和半径算法(附完整源码)
  2. mysql cstmt_MySQL
  3. Cairngorm初学者入门教程 第六节--Cairngorm中Command利用Delegate与Service连接
  4. NAPI 技术在 Linux 网络驱动上的应用和完善
  5. 单片机学校实训老师上课需要的工具以及源码分享
  6. jmx监控java进程_用VisualVM远程监控Java进程
  7. 常量指针(指向常量的指针)和指针常量
  8. msp430项目编程31
  9. 谈谈CSMA/CD,TCP中的二进制指数退避算法
  10. 全球与中国高效无气油漆喷涂机市场深度研究分析报告
  11. UCloud宗泽:区块链安全现状堪忧,泡沫与价值并存
  12. Html5 canvas 简单画布画板涂鸦例子
  13. 吾爱破解python就业班_“吾”字是什么意思?
  14. hangfire使用笔记
  15. C#实现自动更新之(程序升级包制作)
  16. DAU ARPU 美术
  17. ydisk安卓版本_DiskInfo下载-DiskInfo(手机磁盘使用情况)下载v4.9.9 (build 10) 安卓版-西西软件下载...
  18. 外企工作邮件100句~很实用
  19. 石油化工设备维护检修规程_2020年(第六届)全国石油化工企业设备维护与检修高端研讨会组委会全体成员祝大家国庆、中秋双节愉快!...
  20. VEGAS Pro 20发布-剪辑师们,是时候更换了吗?

热门文章

  1. (六)立创EDA之原理图设计示例
  2. 怎么翻译截图里面的文字?快来看看截图翻译怎么弄
  3. Google 出了款小程序:原来你们都是神笔马良!
  4. iphone显示信号强弱(field test)
  5. ios 界面开发_iOS开发新手指南:界面-第一部分
  6. 【江苏三新】电气类就业如何跳出“内卷”实现“躺平”?
  7. 【数学 进阶】初等数论 学习笔记
  8. 瞬间把自己家里的ipad或华为平板、手机变成电脑副屏
  9. 掌握Ajax 第五部分 参考资料
  10. java基础综合练习(嗖嗖移动)