继续题外话:
上一篇忘记发布到博客频道了,都没有人看到,这次一定不要忘记了,上一篇发的牢骚要看哦
/* --------------------------------------------正文分割线------------------------------------- */
记录分数的时候要更新视图(虽然现在还没显示分数,但是先做个准备),另外一半速度也跟它有关,或者会有什么奖励提示之类的东西,所以说分数的更新需要做很多操作,谈到这里,我想有些人已经想到了观察者模式(Observer),没错,就是用观察者模式。
Scoring接口,用来记录分数,在模式中充当Subject角色;
SimpleScoring类,实现Scoring,简单记录分数;
ScoreChengeListener接口,观察者(或者说是监听器),监听分数更改事件做出相应处理;
SpeedManager类,速度管理器,可以设置速度,控制时间(具体看代码中的isTimeUp方法);
ScoreSpeedManager类,继承SpeedManager,监听分数来修改速度。
package snakes;
/**
* 计分器,用来记录分数,可以添加 <code>{@link ScoreChangeListener}</code> 获取分数更新
*
* @author Chris
* @see ScoreChangeListener
*/
public interface Scoring {
/**
* 添加 <code> ScoreChangeListener </code>
*
* @see ScoreChangeListener
*/
public void addScoreChangeListener(ScoreChangeListener listener);
/**
* 获取分数
*
* @return
*/
public int getScore();
/**
* 删除 <code> ScoreChangeListener </code>
*
* @see ScoreChangeListener
*/
public void removeScoreChangeListener(ScoreChangeListener listener);
/**
* 重置分数
*/
public void reset();
/**
* 计分
*
* @return
*/
public void scoring();
/**
* 设置分数值
*
* @param score
* @return
*/
public void setScore(int score);
}
package snakes;
import java.util.HashSet;
import java.util.Set;
public class SimpleScoring implements Scoring {
private int score;
private Set<ScoreChangeListener> listeners;
public SimpleScoring() {
this(0);
}
/**
* 构造函数,设置初始分数
* @param score
*/
public SimpleScoring(int score) {
this.score = score;
listeners = new HashSet<ScoreChangeListener>();
}
@Override
public void addScoreChangeListener(ScoreChangeListener listener) {
listeners.add(listener);
}
@Override
public int getScore() {
return score;
}
private void notifyScoreChange()
{
for(ScoreChangeListener lis:listeners)
{
lis.scoreChanged(score);
}
}
@Override
public void removeScoreChangeListener(ScoreChangeListener listener) {
listeners.remove(listener);
}
@Override
public void reset() {
score = 0;
notifyScoreChange();
}
@Override
public void scoring() {
++score;
notifyScoreChange();
}
@Override
public void setScore(int score) {
this.score = score;
notifyScoreChange();
}
}
package snakes;
/**
* 用来监听分数更改事件的类
*
* @author Chris
* @see Scoring
*/
public interface ScoreChangeListener {
public void scoreChanged(int score);
}
package snakes;
public class SpeedManager {
private volatile int speed;
private long curTime = System.currentTimeMillis();
/**
*
* @param speed
*/
public SpeedManager(int speed) {
if (speed <= 0)
throw new IllegalArgumentException("speed must be positive");
this.speed = speed;
}
/**
* 手动更新时间点
*/
public void frashTime() {
curTime = System.currentTimeMillis();
}
public int getSpeed() {
return speed;
}
/**
* 判断是否到下一个更新时间点,如果是则更新时间点
*
* @return
*/
public synchronized boolean isTime() {
long time = System.currentTimeMillis();
if (time - curTime > (1000 / speed)) {
curTime = time;
return true;
}
return false;
}
public void setSpeed(int speed) {
if (speed <= 0)
throw new IllegalArgumentException("speed must be positive");
this.speed = speed;
}
}
package snakes;
public class ScoreSpeedManager extends SpeedManager implements
ScoreChangeListener {
public ScoreSpeedManager(int speed) {
super(speed);
}
@Override
public void scoreChanged(int score) {
setSpeed(score+1);
}
}
分享到:
相关推荐
在本篇博客“代码重构-以贪吃蛇为示例(四)-继续封装”中,作者通过实现贪吃蛇游戏来阐述代码重构的重要性和具体实践。贪吃蛇游戏是许多程序员学习编程时的入门项目,它包含了基本的逻辑控制、用户输入处理以及游戏...
在本篇博文中,我们将深入探讨“代码重构”的概念,并以经典的贪吃蛇游戏为例,进行实际的重构实践,特别是如何对游戏中的主角——Snake(贪吃蛇)进行封装。这个过程将涉及到软件工程中的模块化、面向对象设计原则...
13--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码13--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码13--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码13...
2--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码2--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码2--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码2--...
41--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码41--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码41--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码41...
54--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码54--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码54--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码54...
1--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码1--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码1--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码1--...
8--[贪吃蛇大作战].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码8--[贪吃蛇大作战].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码8--[贪吃蛇大作战].zip源码scratch2.0 3.0编程项目源文件源码...
在这个资源中,我们拥有了用VC++实现的贪吃蛇游戏的源代码,这为我们深入理解游戏逻辑、掌握C++编程技术提供了一个宝贵的实践平台。 首先,让我们了解VC++。Visual C++是Microsoft公司开发的一款集成开发环境(IDE...
通过研究这个C语言版的贪吃蛇源代码,读者不仅可以学习到基本的游戏开发技巧,还能深入理解C语言的编程实践,锻炼逻辑思维和问题解决能力。对于初学者,这是一个很好的实践项目,可以帮助他们巩固理论知识,提高编程...
javaweb毕业设计-JAVA贪吃蛇游戏毕业设计(源代码+lw)(可做课程设计).rarjavaweb毕业设计-JAVA贪吃蛇游戏毕业设计(源代码+lw)(可做课程设计).rarjavaweb毕业设计-JAVA贪吃蛇游戏毕业设计(源代码+lw)(可做课程设计)....
【Android 示例程序 Snake 贪吃蛇代码】是一款经典的Android平台上的游戏开发示例,它基于Java编程语言实现,展示了如何在Android环境中构建一个简单的2D游戏。此项目旨在帮助开发者理解和学习Android游戏开发的基本...
在本文中,我们将深入探讨如何使用Cocos2d-x框架实现一个简单的“贪吃蛇”游戏。Cocos2d-x是一个流行的开源游戏开发框架,它使用C++编写,支持跨平台开发,适用于iOS、Android、Windows等多个操作系统。下面,我们将...
本文主要介绍了一个基于51单片机的贪吃蛇游戏项目的实现,包括硬件原理图和源代码。51单片机是一种广泛用于教学和工业控制领域的经典单片机,它的应用可以加深对微控制器编程和硬件接口的理解。本文中的贪吃蛇项目...
【Cocos2d-x贪吃蛇代码】是一个基于Cocos2d-x 3.14版本和Visual Studio 2013开发的经典游戏项目。Cocos2d-x是一款开源的游戏开发框架,它允许开发者使用C++、Lua或者JavaScript进行游戏编程,并能跨平台运行在iOS、...
C语言作业-C语言贪吃蛇小游戏C语言作业-C语言贪吃蛇小游戏C语言作业-C语言贪吃蛇小游戏C语言作业-C语言贪吃蛇小游戏C语言作业-C语言贪吃蛇小游戏C语言作业-C语言贪吃蛇小游戏C语言作业-C语言贪吃蛇小游戏C语言作业-...
【标题】"Java课程设计--贪吃蛇 东软05-3" 是一个基于Java编程语言实现的经典游戏——贪吃蛇的项目。这个项目可能是大学课程中的一个实践任务,旨在帮助学生掌握Java编程基础,理解面向对象编程的概念,以及增强问题...
微信小程序是一种轻量级的应用开发平台,主要针对移动端,由腾讯公司推出,它允许开发者通过JavaScript、WXML(微信小程序标记语言)和WXSS(微信小程序样式语言)来构建功能丰富的应用。在这个“微信小程序---...
cocos2d-x引擎以其高效、易用和强大的功能著称,它包含了场景管理、精灵动画、物理引擎、粒子系统、UI设计、音频处理等丰富的游戏开发工具。在这个项目中,你可以深入理解cocos2d-x如何构建游戏逻辑,控制游戏对象...