`
Chris_bing
  • 浏览: 6803 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

代码重构-以贪吃蛇为示例(五)-封装Scoring和SpeedManager

阅读更多

继续题外话:

上一篇忘记发布到博客频道了,都没有人看到,这次一定不要忘记了,上一篇发的牢骚要看哦

 

/* --------------------------------------------正文分割线------------------------------------- */

 

 

记录分数的时候要更新视图(虽然现在还没显示分数,但是先做个准备),另外一半速度也跟它有关,或者会有什么奖励提示之类的东西,所以说分数的更新需要做很多操作,谈到这里,我想有些人已经想到了观察者模式(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);
	}

}
 

 

1
1
分享到:
评论
1 楼 yanhuadesan 2012-12-14  
写的相当不错,正好今天我也在写这个来着,学习了

相关推荐

    代码重构-以贪吃蛇为示例(四)-继续封装

    在本篇博客“代码重构-以贪吃蛇为示例(四)-继续封装”中,作者通过实现贪吃蛇游戏来阐述代码重构的重要性和具体实践。贪吃蛇游戏是许多程序员学习编程时的入门项目,它包含了基本的逻辑控制、用户输入处理以及游戏...

    代码重构-以贪吃蛇为示例(三)-封装Snake

    在本篇博文中,我们将深入探讨“代码重构”的概念,并以经典的贪吃蛇游戏为例,进行实际的重构实践,特别是如何对游戏中的主角——Snake(贪吃蛇)进行封装。这个过程将涉及到软件工程中的模块化、面向对象设计原则...

    13--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码

    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--[贪吃蛇].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--[贪吃蛇].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--[贪吃蛇].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--[贪吃蛇].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码1--...

    8--[贪吃蛇大作战].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码

    8--[贪吃蛇大作战].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码8--[贪吃蛇大作战].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码8--[贪吃蛇大作战].zip源码scratch2.0 3.0编程项目源文件源码...

    经典游戏--贪吃蛇的VC源代码

    在这个资源中,我们拥有了用VC++实现的贪吃蛇游戏的源代码,这为我们深入理解游戏逻辑、掌握C++编程技术提供了一个宝贵的实践平台。 首先,让我们了解VC++。Visual C++是Microsoft公司开发的一款集成开发环境(IDE...

    C语言版源代码---贪吃蛇.rar

    通过研究这个C语言版的贪吃蛇源代码,读者不仅可以学习到基本的游戏开发技巧,还能深入理解C语言的编程实践,锻炼逻辑思维和问题解决能力。对于初学者,这是一个很好的实践项目,可以帮助他们巩固理论知识,提高编程...

    javaweb毕业设计-JAVA贪吃蛇游戏毕业设计(源代码+lw)(可做课程设计).rar

    javaweb毕业设计-JAVA贪吃蛇游戏毕业设计(源代码+lw)(可做课程设计).rarjavaweb毕业设计-JAVA贪吃蛇游戏毕业设计(源代码+lw)(可做课程设计).rarjavaweb毕业设计-JAVA贪吃蛇游戏毕业设计(源代码+lw)(可做课程设计)....

    Android示例程序Snake贪吃蛇代码

    【Android 示例程序 Snake 贪吃蛇代码】是一款经典的Android平台上的游戏开发示例,它基于Java编程语言实现,展示了如何在Android环境中构建一个简单的2D游戏。此项目旨在帮助开发者理解和学习Android游戏开发的基本...

    简单思路实现游戏----贪吃蛇源码

    在本文中,我们将深入探讨如何使用Cocos2d-x框架实现一个简单的“贪吃蛇”游戏。Cocos2d-x是一个流行的开源游戏开发框架,它使用C++编写,支持跨平台开发,适用于iOS、Android、Windows等多个操作系统。下面,我们将...

    51单片机项目实战---贪吃蛇(测试版)

    本文主要介绍了一个基于51单片机的贪吃蛇游戏项目的实现,包括硬件原理图和源代码。51单片机是一种广泛用于教学和工业控制领域的经典单片机,它的应用可以加深对微控制器编程和硬件接口的理解。本文中的贪吃蛇项目...

    Cocos2d-x贪吃蛇代码

    【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语言作业-C语言贪吃蛇小游戏C语言作业-...

    Java课程设计--贪吃蛇 东软05-3

    【标题】"Java课程设计--贪吃蛇 东软05-3" 是一个基于Java编程语言实现的经典游戏——贪吃蛇的项目。这个项目可能是大学课程中的一个实践任务,旨在帮助学生掌握Java编程基础,理解面向对象编程的概念,以及增强问题...

    微信小程序---贪吃蛇

    微信小程序是一种轻量级的应用开发平台,主要针对移动端,由腾讯公司推出,它允许开发者通过JavaScript、WXML(微信小程序标记语言)和WXSS(微信小程序样式语言)来构建功能丰富的应用。在这个“微信小程序---...

    cocos2d-x贪吃蛇win32

    cocos2d-x引擎以其高效、易用和强大的功能著称,它包含了场景管理、精灵动画、物理引擎、粒子系统、UI设计、音频处理等丰富的游戏开发工具。在这个项目中,你可以深入理解cocos2d-x如何构建游戏逻辑,控制游戏对象...

Global site tag (gtag.js) - Google Analytics