【原创】纯OO:从设计到编码写一个FlappyBird (二)

第一部分请点这里

续结前文,本文将实现Game类。

首先是实例变量。由上次的类图可以看出,Game类首先得具有如下实例变量:

0、Judge judge;
1、SimpleDraw draw; // 为什么不是接口类型?因为需要addMouseListener,而DrawBoard接口没有这个方法。。期待下一个版本的改进
2、Bing fang;
3、Obstacle obs;

我们需要控制游戏中帧变换的速度,因此,需要加入一个变量来标示速度:(帧变换的速度是什么?参见这篇文章

0、private static final int TIME = 10;

最后,我们还需要一个变量来标示得分:

0、private int score;

由于DrawBoard的实现类需要在发生鼠标事件时通知Game类,因此,Game类还应该实现MouseListener接口。

我们也需要一个setup方法,来初始化全部的变量。同时需要一个start方法来开始游戏,最后需要一个end方法来打印游戏结束后的得分。

接下来讲讲start方法和MousePressed方法的实现。

start方法:

    public void start()
    {
        int flag = 1;
        while (flag > 0)
        {
            fang.action();
            obs.move();
            flag = judge.isGameOver(fang,obs);
            if (flag == 2)
                score ++;
            draw.draw();
            try
            {
                Thread.sleep(TIME);
            } catch (Exception e)
            {}
        }
    }

很简单,典型的游戏逻辑。judge接口实现的类提供一个判断游戏是否结束的方法,当其返回1时,没死,也没得分;当其返回2时,得分;当其返回0时,方sir就。。了

fang.action();让小鸟开始自己往下掉(摁一下就上升了)。obs.move();让障碍自己动起来,draw.draw();则是将更新后的图像重新画出来。那个try其实就是暂停下程序的运行而已。

然后是mousePressed方法:

    public void mousePressed(MouseEvent e)
    {
        fang.beginUp();
    }

更加简单,也好理解。点一下方sir就飞啦

Game类的全部代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Game implements MouseListener {
    Judge judge;
    SimpleDraw draw;
    Bing fang;
    Obstacle obs;

    private static final int TIME = 10;
    private int score;

    public Game()
    {
        score = 0;
    }

    public static void main(String [] args)
    {
        Game game = new Game();
        game.setup();
        game.start();
        game.end();
    }

    public void setup()
    {
        JFrame frame = new JFrame();

        fang = new SimpleBing(200,200);
        obs  = new SimpleObstacle(600);
        judge = new SimpleJudge(fang,obs);
        draw = new SimpleDraw(fang,obs);

        frame.getContentPane().add(draw);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        draw.addMouseListener(this);
        frame.setSize(600,600);
        frame.setVisible(true);
    }

    public void start()
    {
        int flag = 1;
        while (flag > 0)
        {
            fang.action();
            obs.move();
            flag = judge.isGameOver(fang,obs);
            if (flag == 2)
                score ++;
            draw.draw();
            try
            {
                Thread.sleep(TIME);
            } catch (Exception e)
            {}
        }
    }

    public void end()
    {
        System.out.println("Your score is " + score);
    }

    public void mouseClicked(MouseEvent e)
    {

    }

    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mousePressed(MouseEvent e)
    {
        fang.beginUp();
    }
    public void mouseReleased(MouseEvent e) {}
}
时间: 2024-10-25 17:09:18

【原创】纯OO:从设计到编码写一个FlappyBird (二)的相关文章

【原创】纯OO:从设计到编码写一个FlappyBird (一)

说起来,自学计算机也有2年多的时间了,自己还没有从设计到编码,完完整整的设计一个基于面向对象的软件的经历..囧 于是,就有了这个系列.首先选用的语言是Java,没别的原因,HeadFirst设计模式是Java写的,而且Java的包管理比较简单,适合小工程.其次选用的题材自然是游戏啦,最近wikioi在等结果的时候就有个FlappyBird的小游戏,当时在想如果小鸟换成墙之父方老师,说不定别有一番趣味:) 从画类图到编写完各个模块,一共花了2天时间,做完了后发现解耦的还行,就跟大家分享分享. 第一

【原创】纯OO:从设计到编码写一个FlappyBird (六)

第五部分请看这里 终于到了最后一个部分了! 这里使用SimpleJudge类来实现Judge接口. 首先是SimpleJudge需要的实例变量: 0.final LinkedList<Pillar> tmp; // 记录Obstacle返回的柱子列表1.Pillar now; // 标记当前柱子2.private int bottom; // 标记底部 SimpleJudge有一个比较重要的方法,就是isGameOver(Bing bing,Obstacle obs),该方法返回0时,游戏结束

【原创】纯OO:从设计到编码写一个FlappyBird (五)

第四部分请点这里 本文将实现DrawBoard. 如前文所述,Obstacle类和Bing类仅仅提供给DrawBoard必要的信息,如何绘制则完全委托给了DrawBoard,也就是说游戏关键类的细节和它的绘制实现了完全解耦.也就是说,虽然这个版本是个黑柱子白背景小蓝球,但是你完全可以在不修改其他类的情况下,将背景换成北邮,柱子换成大宝剑,小篮球换成方X..(开门!快递) ... 也许不能算完全解耦,DrawBoard需要访问Obstacle提供的LinkedList,来获取所需要绘制的柱子障碍物

【原创】纯OO:从设计到编码写一个FlappyBird (四)

第三部分请点这里 这里来实现Obstacle类.其实flappybird的本质就是小鸟原地掉,然后几根柱子在走.这也是在Game类里,用obs.move()来实现游戏逻辑的原因. 我们首先必须确定几个数据. 0.柱子之间的间隙 1.柱子的最小值和最大值 2.柱子之间的间距 3.柱子的宽度 在屏幕高度确定的情况下,只要我们确定了上半部分的柱子的高度,那么根据间隙,就能画出两个柱子.(tip:做个减法而已) 因此,一个障碍需要两个数据来标示: 0.x值 1.高度 而move的实现,就是x的递减. 还

iOS开发UI篇—以微博界面为例使用纯代码自定义cell程序编码全过程(一)

iOS开发UI篇-以微博界面为例使用纯代码自定义cell程序编码全过程(一) 一.storyboard的处理 直接让控制器继承uitableview controller,然后在storyboard中把继承自uiviewcontroller的控制器干掉,重新拖一个tableview controller,和主控制器进行连线. 项目结构和plist文件 二.程序逻辑业务的处理 第一步,把配图和plist中拿到项目中,加载plist数据(非png的图片放到spooding files中) 第二步,字

架构设计之如何写架构设计说明书

架构设计是需求分析到软件实现的桥梁,也是决定软件质量的关键.编制架构设计说明书是开发人员向架构师转变必定会经历的过程.在架构师整个的成长过 程中,必定会经历编制架构设计说明书.评审架构设计说明书以及根据业务需求分析设计系统架构的三个过程.作为一个架构师,我想尝试一下根据这三个过程对不 同能力需要,写一次系列文章,包括<架构设计三部曲之如何写架构设计说明书>.<架构设计三部曲之如何评审架构设计说明书>以及<架构设计三部曲之如何做 架构设计>,一来可以帮助自己整理思路,重新

(原创)Android Binder设计与实现 - 实现篇(1)

本文属于原创作品,转载请注明出处并放于明显位置,原文地址:http://www.cnblogs.com/albert1017/p/3849585.html 前言 在学习Android的Binder机制时,看了http://blog.csdn.net/universus/article/details/6211589这篇文章(读本文前最好读一下),觉得写得非常棒,可惜只有设计篇,都几年了还没有实现篇,就想尝试完成这个工作,虽然可能没有universus写得那么好,但也希望能对同在学习Android

Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

#29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类Truck是Car类的子类,其中包含的属性有载重量payload.每个 类都有构造方法和输出相关数据的方法.最后,写一个测试类来测试这些类的功 能. package hanqi; public class Vehicle { private int wheels; private int weight

OO的设计原则

今天同事和我们一起讨论分享了OO的设计原则,讨论使人明晰,有人一起讨论学习是一件幸福的事情. 1.开闭原则 对功能的扩展是开放的,对修改是闭合的. 可以应用于类的设计,框架的设计等. 为什么?开闭原则有利于保护已有的客户端代码,让原有的代码不会因为框架的扩展修改而发生变动,减少维护的成本. 如果你设计的框架经常变动,而且每次变动使使用的人要改很多,那么没人敢用了. 2.单一职责原则 应用于实现类,如果类有变化,那么引起变化的原因仅有一个 为什么?如果你在设计类的时候,没有进行接口拆分设计,直接封