Java 中国象棋day1-4 大汇总
00 分钟
2024-9-12
2024-9-18
tags
date
type
status
slug
summary
category
password
icon

day1

  • 包名以域名开头 tech.gaoqilan.main 例如百度: com.baidu.main
  • 创建的类每一个单词以大写开头,后面接上_名称缩写 比如你是张三,要创建一个框架类 MainFrame_ZS
    • 类的定义格式权限修饰符 类的关键字 类名{} 最常见的 publish class Main{}publish static void main(String[] args){},这里的class static 都是关键字,要遵守命名规则和规范
    • main方法 格式固定,是java程序的入口,表示类可被执行
    • 一个项目中可以存在多个类有main方法,一个类对应一个main方法
  • 窗口类 JFrame 创建方法:继承 、 直接创建 JFrame
  • 面向对象编程指的是 如何定义类和如何去使用类中的方法和属性,直接使用属性的方法很少见(属性就是我们常说的变量,而方法就是我们常说的函数
    • 方法后面必须跟(),属性不用,在定义和调用的时候如此
    • public class Person { String name; // 定义属性  public void printName() { System.out.println(name); }}​Person person = new Person();person.name = "Alice"; // 访问属性,不需要 ()person.printName(); // 调用方法,必须加上 ()​
    • 核心思想:如何定义和使用更好的类
  • 为什么关闭了窗口之后,任务管理器进程也停止了,但是IDEA并没有停止程序
    • 每个Java程序都是一个虚拟机(JVM)
  • 在swing编程中面板是指 Jpanel 这个类,在 JFrame 中自带有一个面板,但那个面板有bug,使用要注意导入 import javax.swing.JPanel; import javax.swing.JFrame;
  • 子类 —— 父类 ==超类 —— 基类
  • java 继承 格式: public class 子类名 extends 父类名 注意: 1.父类必须先存在 2.子类只能继承父类非私有的属性和方法 3.同一个包下除了不能继承私有属性和方法,其他都可以 4.不同包下只能继承公共部分和被保护
  • 方法重写: 当子类继承了父类的某个方法时,子类可以根据自身的需求对父类的这个方法进行重新定义。这种重新定义称为方法重写 1.子类只能重新定义父类中的方法,尽可能的一摸一样(保证不会报错) 2.重写方法不能比父类的方法更严格 3.形参列表必须相同 4.返回值相同 5.只能抛出相同或更少的异常 6.子类使用的方法和父类得一样才能重写(静态和静态分别得一致) 7.如果一个方法不能被继承,则不能重写(你都不能继承,重写个屁) 8.最好加上@Override 注解:
  • 在实际开发过程中,要看类的官方文档

day2

  1. 属性:默认会被赋值
    1. 写在类的{}中,方法和代码块的{}之外
    2. 实例属性: 权限修改符 数据类型 属性名 [= 初始值]
    3. 类属性: 权限修改符 static 数据类型 属性名[ = 初始值 ]
  1. 变量
    1. 四种类型
      1. 整型:四个
        1. byte:一个字节 8位 -128~127
        2. short 两个字节 16位
        3. int 四个字节 32位
        4. long 八个字节 64位,数值后面带L或l
      2. 浮点型
        1. float 单精度 四个字节 数值后面带F或f
        2. double:双精度 八个字节
      3. 字符型,有且只有一个,默认位“”
        1. char只能用''包裹,只有一个符号(字母、数字、中文)
      4. 布尔型
        1. boolean 只有false和true
    2. 引用数据类型:三大类,无数个,默认值都为null
      1. 类:使用class关键字定义的,例如String
      2. 数组:使用[]标识
      3. 接口:使用interface 关键字定义

P7

  • 将棋子再全部放进数组中
  • 要将所有的x和y坐标放在同一个数组中
  • 另一种思路,将棋盘看成一个个坐标组合,将坐标单元设置成一个固定值,然后每个的位置就是1234递增
  • 关于第一个棋子的位置,实际上是棋子大小减去棋子边距
  • 先解决一次性画全部的办法,不要又复制一遍上面的代码,设置一个反转坐标的办法
    • 反转完,没必要再又复制上面的循环,个人觉得可以创建个方法或者再加一个循环,当内层的走完,说明画完了,接着player变1,同时的话还得修改下面的反转函数,先判断player是不是0,是的话之后内层的for循环用原始x坐标
    • 但是问题来了,如果每次都要传进去判断player是不是1再决定用不用反转后的坐标,好像也很麻烦
  • 我们这个有些问题,只能画,不能实时更新,因为这是全局变量

P8

  • 面向对象就是提取类
  • 新建的类都得有什么方法呢? —— 参考上个代码想想要定义什么
    • 先提取变量
  • 哪些变量用什么权限
    • 定义的常量,只能定义时或代码块中修改值,其他不允许修改
  • 类创建好之后,要创建类的对象
  • 对于想要获取类中的内容的变量,但是为了安全性,要将其中的变量设置为private,并且设置 set 和 get函数
  • 有些问题,数组会打印两次,同时功能都放在一起太杂了(又是创建,绘制,又是保存到数组中),要将功能分开写
  • 想要一开始运行打印棋盘,就是使用构造方法
  • 构造方法的作用:在创建对象的时候就做一些必须做的事情
    • 构造方法可以让我们自定义创建对象时,做一些必要的操作

P10

  • 如何操作棋子
    • 点击棋盘
    • 如何获取棋子对象
    • 如何判断点击的地方是否有棋子
    • 如何区分选择、重新选择、移动、吃子
  • 添加点击事件
  • 点击之后显示点击在哪里
  • 但是点击很难精确,所以需要有个范围约束
    • 根据xy坐标计算网格对象转换思维,不是看xy的范围,站在更高的角度去看问题,通过将棋盘分成一个一个区,并且以坐标-棋子间距+棋子大小 去除以棋子间距 实现棋盘的分区
    • 不能直接修改 + 要返回Point值
      • 所以创建一个Point对象,而不直接修改
    • 定义坐标范围不能超过棋盘
  • 如何找棋子,利用网格坐标p对象查找棋子对象,然后判断和数组中的棋子位置一不一样,为空,说明点击的不是棋子对象

p11

  • super的作用:调用父类中的方法或属性
  • 为什么还是没有清除原来的痕迹呢?
    • 因为共用的是同一套坐标,改其中一个棋子的坐标,那么这个也会造成另一个被改变
    • 栈:保存局部变量对对象的引用(就是我们常说的定义类变量等)
      • 定义对象的引用 类 变量名
    • 堆:new 出来的对象
    • 方法区:
      • 常量池
    • 静态域:

p12

  • 如何判断是不是第一次点击
    • 设置一个成员变量,如果它有值存在的话,说明不是第一次
    • 如何判断选中完第n次之后是吃子还是移动,还是重新选择

p13

  • 如何给选中的象棋加个框框
  • 难点,如何制作移动规则

p14 提取移动范围内

  • 判断上边还是下边

day3

p15马走日字

  • 个人觉得有个问题应该先被优化,就是路径上是否有其他棋子,
  • 找蹩脚点真的很牛逼

p16车

  • 实际上应该包括目标点,起点可以不用包括原点,看路径上有没有棋子,没有返回0,有判断是不是在目标点(即吃子)返回2,否则返回1(即路径上非终点有棋子挡住了)
  • 一定得注意局部变量的名字和属性的方法的问题
  • up主这里的问题是将循环统一化,没有分开,也就是不区分起始点和目标点谁小,默认将小的点当作起始点,实际上这可能是终点
  • 同时又引用start和end表示起点,终点,这个在循环当中就有问题

p17炮和吃子

  • 得知道棋子的位置,再将它从数组中删除被吃掉的棋子
  • 一开始不知道它的位置,得知道,这里使用索引解决每次的遍历搜索问题
  • 空指针异常

18兵规则

  • 能不能过河,看的是它的位置点,而不是目标点
  • up主想的太复杂了,应该牺牲掉代码复用性,直接选择分两种情况,过河可以左右前进一格没过河只能进去1格即可,没必要考虑能不能后退
  • tp是目标 p 是当前
  • 直接在兵的判断能不能走那里,使用两个if判断能不能
  • 现在up主更新后的代码又好了

p21 棋盘规则的实现

  • 红方不可以操作黑方棋子
  • 轮流走棋
  • 记住当前得到阵营

p22 Java方法总结

  1. 存在一个情况,并没有用到太多的面向对象中太多的知识点(后面改用类,接口等了)
  1. 面向对象与面向过程
  1. 类和类的成员
    1. 类的定义格式
    2. 类与对象
      1. 引用
        1. 多个引用可以指向同一个对象,修改一个引用的对象,其他指向同一个对象的引用也会看到修改的结果。
      2. 匿名对象
    3. 以图形为例
      1. 直线-Line
      2. 矩形-Rect
      3. 圆-Circle
      4. 使用swing绘制图形
    4. 类的成员
      1. 属性
        1. 实例方法
          1. 权限修饰符 返回值类型 方法名(形参列表){方法体}
          2. 调用:必须通过 实例.方法(有参传参 )
          3. 返回值类型
            1. void 方法不需要强制写return语句
            2. 数据类型 —— 必须有关系的值或对象,可能是基本数据类型,保持一致,如果是引用数据类型,可以返回的是子类对象或相同类型的值
        2. 类方法
          1. 权限修饰符 static 返回值类型 方法名(形参列表){方法体}
          2. 调用:通过 实例.方法(有参传参 ) 或 类名.方法名(实参)
          3. 构造方法
            1. 权限修饰符 返回值类型 方法名(形参列表){方法体}
            2. 方法体内一定是默认第一行super(实参);//调用父类中的构造方法
            3. 作用:当构造对象的时候,必须要做的事情,可以写在构造方法中
            4. 每个类都有一个无参的构造方法,如果显式定义了一个有参的构造方法,则不再默认的构造方法,需要显示的定义
      2. 方法
        1. 定义
          1. 实例方法
          2. 类方法
          3. 形参
        2. 调用
          1. 实例方法
          2. 类方法
          3. 实参
        3. 重载
          1. 方法名称相同,形参列表列表不同
          2. 与返回值类型无关
          3. 与形参名无关,但是和顺序有关
        4. 可变参数
        5. 传参
          1. 值传递
          2. 地址传递
        6. 构造方法
        7. 重写
      3. 构造方法
        1. 作用
        2. 重载
        3. this
      4. 代码块
        1. 普通代码块
        2. 静态代码块
      5. 内部类
        1. 实例内部类
        2. 静态内部类
  1. 三大特征
    1. 封装
      1. get set方法
      2. toString方法
    2. 继承
      1. 权限修饰符
      2. 继承方式
      3. super
        1. 属性
        2. 方法
      4. 方法的重写
      5. 子类对象的创建过程
      6. 类型转换
        1. 转换异常
    3. 多态 —— 一个子类对象有多种形态,可以是父类对象形态,也可以是子类本身对象形态
      1. 格式:父类 实例名 = new 子类构造方法(参数列表)
      2. 条件
        1. 继承
        2. 实现
      3. 理解
      4. 使用
    4. 对象的比较
      1. ==操作符
      2. equals方法
      3. equalslgnore方法
    5. 抽象 —— 一个不具体的类(大杂烩hhh)
      1. 关键字: abstract
        1. 作用:修饰类(抽象)、方法(抽象)
          1. 用来设计一个没有具体功能的类
        2. 注意:
          1. 不可以被实例化(类名 实例名 = new 构造方法()
          2. 抽象类可以有构造方法,其构造方法主要是被子类来使用的
          3. 抽象类可以有抽象方法、也可以有实例方法和静态方法
          4. 抽象方法和抽象类,不可以被 static final private等关键字修饰
            1. 抽象类方法的格式: 权限修饰符 abstract 返回值类型 方法名(形参列表);
            2. 一般使用public
            3. 方便多人开发合作,一般抽象类由组长定义,具体的功能由子类来实现
            4. 团队主管主导项目
          5. 抽象方法,必须通过子类重写来使用
          6. 抽象方法只存在于抽象类和接口中
      2. 方法
      3. 构造方法的作用
      4. 相关冲突的关键字
    6. 接口
      1. 关键字 && 特性
        1. interface 关键字定义,其他的与类没有太大差异
        2. 接口中只能存 public abstract 修饰方法
        3. 所以接口比抽象类更抽象
        4. 继承只能单一继承,但是抽象可以多实现
        5. 接口中只能有常量,不能有其他属性
        6. 在JDK开始,其接口支持使用default实现,
      2. 实现
      3. default修饰符
      4. 匿名内部类对象
    7. final关键字
      1. 属性
      2. 方法
匿名对象只能被使用一次

p23 使用抽象类改版程序

  • 抽象类了,不能被初始化了
  • 虽然创建对象变麻烦了,但是为了多元同时合作
  • 解耦合,解决上面的问题,使用多态和开发模式降耦合度

    Day4

    p24游戏界面的设计

    • 这些都保存在窗口类内
      • 右上角设置一个提示框,提示谁走棋和不能选择对方的程序
        • 绝杀
        • 将军
      • 悔棋
        • 就是撤销按钮
      • 保存棋谱
      • 导入棋谱
    • javaFx是新的,jdk11比较友好,java swing太丑了

    p25按钮点击事件

    • 得给按钮加标记,方便区分点击了哪个按钮

    p26类与类的实现

    p27集合介绍与悔棋功能实现

    • 用数组特别麻烦
    • Java的数组在创建的时候必须指定长度,所以没办法记录走了多少步
    • 自定义实现链表的数据结构
    • 使用给定的Java集合
      • 集合
        • Collection
          • Set接口
            • HashSet
            • SortedSet
            • iterator
              • hasNext()
              • next()
          • List接口
            • ArrayList
            • LinkedList
            • Vector
            • 遍历
              • 循环遍历
              • Iterator
                • hasNext()
                • next()
      • 悔棋列表里面删除,然后同时数组里面得更改
      • 其实还有个简单方法就是把新的数组赋值给原来的数组

      p28IO流介绍

      • IO流
      • 一种保存到数据库中
        • mysql
        • oracle
        • sqlserver
      • 一种保存到文本文件中
      • IO流
          1. File
            1. 表示一个文件或文件夹类,不具备文件读取能力
            2. 构造方法
              1. File(String path)
            3. 常用方法
              1. createNewFile():创建新文件
              2. delete():删除文件
              3. exists():判断文件是否存在
              4. getName():获取名称
              5. getPath():获取路径
              6. isDirectory():是否为文件夹
              7. Length():文件内容的长度
              8. List():列举文件夹中的所有文件或文件夹
              9. getParent():获取当前文件的目录String类型
              10. getParentFile():获取当前文件的目录File类型
          1. 输入流
            1. 将文件内容读取到电脑中
            2. 字节流 —— InputStream 只能操作文本文件,不能操作多媒体文件
              1. FileInputStream
              2. BufferStream
              3. ObjectInputStream
            3. 字符流 —— Reader 什么都能读取,但是读取文件时,对中文的处理要特别注意
              1. FileReader
              2. BufferedReader
          1. 输出流
            1. 写入内容到文件中
            2. 字节流 —— OutputStream
              1. FileOutputStream
              2. BufferedOutputStream
              3. ObjectOutputStream
            3. 字符流 —— Writer
              1. FileWriter
              2. BufferedWriter
            4. 转换流
              1. InputStreamReader
              2. OutputStreamWriter
      • 如何选择棋谱保存的路径
      • 保存需要一个接口,不加序列化会报错
      上一篇
      常用语法知识模糊点
      下一篇
      Java 中国象棋 day3

      评论
      Loading...