JSD-2204-面向对象-多态-潜艇游戏--Day15

1.多态

   - 意义:

     - 同一个对象被造型为不同的类型时,有不同的功能

       ----对象的多态:我、你、水......-------------所有对象都是多态的(明天总结时详细讨论)

     - 同一类型的引用在指向不同的对象时,有不同的实现

       ----行为的多态:cut()、getImage()、move()......-----所有抽象方法都是多态的

   - 向上造型/自动类型转换:

     - 超类型的引用指向派生类的对象
     - 能点出来什么,看引用的类型
     - 能造型成为的类型有:超类+所实现的接口

   - 强制类型转换,成功的条件只有如下两种:

     - 引用所指向的对象,就是该类型
     - 引用所指向的对象,实现了该接口或继承了该类

   - 强转时若不符合如上两个条件,则发生ClassCastException类型转换异常

     建议:在强转之前先通过instanceof判断引用的对象是否是该类型

     > 何时强转:当你想访问的东西超类中没有,就需要强转(哪个类中有就转成哪个类型)

   public class MultiTypeDemo {
       public static void main(String[] args) {
           Aoo o = new Boo();
           Boo o1 = (Boo)o; //引用o所指向的对象就是Boo类型
           Inter o2 = (Inter)o; //引用o所指向的对象实现了Inter接口
           //Coo o3 = (Coo)o; //运行时发生ClassCastException类型转换异常
           if(o instanceof Coo){ //false
               Coo o4 = (Coo)o;
           }else{
               System.out.println("o不是Coo类型");
           }
       }
   }
   
   interface Inter{
   }
   class Aoo{
   }
   class Boo extends Aoo implements Inter{
   }
   class Coo extends Aoo{
   }

2. 潜艇游戏第九天:

1. 水雷入场:-------后半段

   - 水雷对象是由水雷潜艇发射出来的,所以在MineSubmarine中设计shootMine()生成水雷对象

   - 水雷入场为定时发生的,所以在run中调用mineEnterAction()实现水雷入场

     在mineEnterAction()中:

     ​    每1000毫秒,遍历潜艇数组,判断若是水雷潜艇,则强转为水雷潜艇类型,

     ​    获取水雷对象obj,mines扩容,将obj添加到mines最后一个元素上

2. 炸弹与潜艇的碰撞:

   - 在SeaObject中设计isHit()检测碰撞、goDead()去死

     在Battleship中设计addLife()增命

   - 炸弹与潜艇的碰撞为定时发生的,所以在run中调用bombBangAction()实现炸弹与潜艇的碰撞

     在bombBangAction()中:

     ​    遍历所有炸弹得炸弹,遍历所有潜艇得潜艇,判断若都活着并且还撞上了:

     ​        潜艇去死、炸弹去死

     ​        判断若潜艇能得分,则强转为得分接口,增分

     ​                若潜艇能得命,则强转为得命接口,获取命数,战舰增命

3. 画分和画命:
   - 在Battleship中设计getLife()获取命数
   - 在World类的paint中: 画分和画命

2.1目录

2.1.1Battleship类

package cn.tedu.submarine;

import javax.swing.*;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

/**
 * 整个游戏世界
 */
public class World extends JPanel {
    public static final int WIDTH = 641;//窗口的宽
    public static final int HEIGHT = 479;//窗口的高



    private Battleship ship = new Battleship();//战舰
    private SeaObject[] submarines = {};//潜艇数组(侦察潜艇,鱼雷潜艇,水雷潜艇)
    private Mine[] mines = {};//水雷数组
    private Bomb[] bombs = {};//炸弹数组

    //玩家得分
    private int score = 0;

    public void action() {
        KeyAdapter k = new KeyAdapter() {
            /**
             * 按键按下事件
             * @param e
             */
            @Override
            public void keyPressed(KeyEvent e) {
                //判断按的是不是空格键


                if (e.getKeyCode() == KeyEvent.VK_LEFT){
                    ship.moveLeft();
                }

                if (e.getKeyCode() == KeyEvent.VK_RIGHT){
                    ship.moveRight();
                }
            }

            /**
             * 重写keyReleased()按键抬起事件
             * @param e
             */
            @Override
          
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值