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

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

阅读更多

题外话:

本人第一次写技术文章,希望寻求鼓励啊,发了四篇了一个评论还都没有,真心凉


/* -------------------------------------------------正文分隔条--------------------------------------------- */


上一节我们已经将Snake从原来的类中抽离出来,现在我们继续研究庞大的GamePanel类,继续封装其他的内容。

现在有这样一个需求:我需要提供不同大小,不同样式的地图,可能还有一些阻挡物,然后根据需要选择地图。

单单只靠GamePanel是做不到的,我们需要单独的地图类,也就是GameMap。

按照上一节的思路,下面是GameMap接口和一个简单的实现类SimpleGameMap类。


package snakes;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;

/**
 * 贪吃蛇地图
 * 
 * @author Chris
 * 
 */
public interface GameMap
{

	/**
	 * 绘制地图
	 * 
	 * @param g
	 *            画布
	 */
	public void draw(Graphics g);

	/**
	 * 获得地图高度
	 * 
	 * @return
	 */
	public int getHeight();

	/**
	 * 获取一个点在地图上的位置,用作制作无边界地图
	 * 
	 * @param p
	 * @return 返回一个点在地图上的位置,如果没有对应地址则返回 null
	 */
	public Point getPointOnMap(Point p);

	/**
	 * 获得地图尺寸
	 * 
	 * @return
	 */
	public Dimension getSize();

	/**
	 * 获得地图宽度
	 * 
	 * @return
	 */
	public int getWidth();

	/**
	 * 判断输入点是否会装到地图墙壁
	 * 
	 * @param p
	 * @return
	 */
	public boolean isAgainstWall(Point p);

	/**
	 * 从地图上获取一个可行(不撞墙)的点,而且要保证此点沿着<code> direction </code>方向连续
	 * <code> needLength </code>个(算上本身)点也不撞墙
	 * 
	 * @param direction
	 * @param needLength
	 * @return
	 */
	public Point getAvailablePoint(Direction direction, int needLength);

	/**
	 * 从地图上获取一个可行(不撞墙)的点
	 * 
	 * @return
	 */
	public Point getAvailablePoint();
}

 

package snakes;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.util.Random;

public class SimpleGameMap implements GameMap
{
	private static final Random random = new Random();
	private GamePanel panel;

	/**
	 * 地图横向包含的单元格数
	 */
	private int width;

	/**
	 * 地图纵向包含的单元格数
	 */
	private int height;

	public SimpleGameMap (GamePanel panel, int width, int height)
	{
		this.panel = panel;
		this.width = width;
		this.height = height;
	}

	@Override
	public void draw(Graphics g)
	{
		int sellSize = panel.getSellSize();
		g.setColor(new Color(0x555555));
		for (int i = 0; i < width; i++)
		{
			for (int j = 0; j < height; ++j)
			{
				g.drawRect(i * sellSize, j * sellSize, sellSize, sellSize);
			}
		}
	}

	@Override
	public int getHeight()
	{
		return height;
	}

	@Override
	public Point getPointOnMap(Point p)
	{
		if (!isAgainstWall(p))
			return new Point(p);
		return null;
	}

	@Override
	public Dimension getSize()
	{
		return new Dimension(width, height);
	}

	@Override
	public int getWidth()
	{
		return width;
	}

	@Override
	public boolean isAgainstWall(Point p)
	{
		return !(p.x >= 0 && p.x < width && p.y >= 0 && p.y < height);
	}

	@Override
	public Point getAvailablePoint(Direction direction, int needLength)
	{
		int x = 0, y = 0;
		switch (direction)
		{
			case UP:
				x = random.nextInt(width);
				y = random.nextInt(height - needLength) + needLength;
				break;
			case DOWN:
				x = random.nextInt(width);
				y = random.nextInt(height - needLength);
				break;
			case LEFT:
				x = random.nextInt(width - needLength) + needLength;
				y = random.nextInt(height);
				break;
			case RIGHT:
				x = random.nextInt(width - needLength);
				y = random.nextInt(height);
				break;
		}
		return new Point(x, y);
	}

	@Override
	public Point getAvailablePoint()
	{
		return new Point(random.nextInt(width), random.nextInt(height));
	}
}
 

 

另外根据需要,为Direction添加了获取反方向的方法,还修改了Snake的部分逻辑。Direction比较简单,有兴趣的可以查看附件。以下是Snake修改的部分。

 


	/**
	 * 贪吃蛇长度
	 */
	private volatile int length = 3;



	public Snake (GamePanel panel, int length)
	{
		this.length = length;
		this.panel = panel;
		initDirection();
		initList();
	}

	/**
	 * 初始化蛇链表
	 */
	private void initList()
	{
		snakeList = new LinkedList<Point>();

		Point p = panel.getGameMap().getAvailablePoint(direction.getOpposite(), length);
		snakeList.add(p);
		for (int i = 0; i < length - 1; ++i)
		{
			p = getDirection().getPreviousPoint(p);
			snakeList.add(p);
		}
	}

	
	/**
	 * 移动贪吃蛇,包括吃虫
	 */
	public void move()
	{
		snakeList.addFirst(getDirection().getNextPoint(snakeList.getFirst()));
		if (isAgainstTarget())
		{
			++length;
			panel.resetTarget();
			panel.increaseScore();
			panel.increaseSpeed();
		}
		else
		{
			snakeList.removeLast();
		}
	}

	



下节预告:分数管理ScoreManager和速度管理SpeedManager

 

分享到:
评论

相关推荐

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

    在本篇博客“代码重构-以贪吃蛇为示例(五)-封装Scoring和SpeedManager”中,作者通过重构一个贪吃蛇游戏的代码,深入探讨了软件开发中的两个重要概念:分数管理(Scoring)和速度管理(SpeedManager)。...

    代码重构-以贪吃蛇为示例(三)-封装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语言的编程实践,锻炼逻辑思维和问题解决能力。对于初学者,这是一个很好的实践项目,可以帮助他们巩固理论知识,提高编程...

    Android示例程序Snake贪吃蛇代码

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

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

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

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

    - 贪吃蛇游戏主要包括蛇、食物、边界和分数四个主要元素。 - 场景(Scene)是游戏的主要容器,可以包含多个层(Layer)。 - 在这个项目中,我们可能有一个主游戏层来处理游戏逻辑,一个UI层来展示分数和其他信息...

    Cocos2d-x贪吃蛇代码

    【Cocos2d-x贪吃蛇代码】是一个基于Cocos2d-x 3.14版本和Visual Studio 2013开发的经典游戏项目。Cocos2d-x是一款开源的游戏开发框架,它允许开发者使用C++、Lua或者JavaScript进行游戏编程,并能跨平台运行在iOS、...

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

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

    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编程基础,理解面向对象编程的概念,以及增强问题...

    微信小程序---贪吃蛇

    得分计算通常是基于蛇吃食物的次数,每次吃食物分数递增,例如初始分数为0,每吃一次食物加10分。开发者需要设置一个变量来记录玩家的分数,并在蛇吃到食物时更新这个变量。 接下来是蛇长计算。蛇的长度会随着它吃...

    cocos2d-x贪吃蛇win32

    至于压缩包内的“websnack”文件,可能是一个web版贪吃蛇的示例或者相关资源,可能用于展示如何将cocos2d-x游戏移植到Web平台。这扩展了学习范围,让开发者了解cocos2d-x的跨平台能力,包括HTML5游戏的开发。 总的...

Global site tag (gtag.js) - Google Analytics