题外话:
本人第一次写技术文章,希望寻求鼓励啊,发了四篇了一个评论还都没有,真心凉
/* -------------------------------------------------正文分隔条--------------------------------------------- */
上一节我们已经将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)。...
在本篇博文中,我们将深入探讨“代码重构”的概念,并以经典的贪吃蛇游戏为例,进行实际的重构实践,特别是如何对游戏中的主角——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语言的编程实践,锻炼逻辑思维和问题解决能力。对于初学者,这是一个很好的实践项目,可以帮助他们巩固理论知识,提高编程...
【Android 示例程序 Snake 贪吃蛇代码】是一款经典的Android平台上的游戏开发示例,它基于Java编程语言实现,展示了如何在Android环境中构建一个简单的2D游戏。此项目旨在帮助开发者理解和学习Android游戏开发的基本...
javaweb毕业设计-JAVA贪吃蛇游戏毕业设计(源代码+lw)(可做课程设计).rarjavaweb毕业设计-JAVA贪吃蛇游戏毕业设计(源代码+lw)(可做课程设计).rarjavaweb毕业设计-JAVA贪吃蛇游戏毕业设计(源代码+lw)(可做课程设计)....
- 贪吃蛇游戏主要包括蛇、食物、边界和分数四个主要元素。 - 场景(Scene)是游戏的主要容器,可以包含多个层(Layer)。 - 在这个项目中,我们可能有一个主游戏层来处理游戏逻辑,一个UI层来展示分数和其他信息...
【Cocos2d-x贪吃蛇代码】是一个基于Cocos2d-x 3.14版本和Visual Studio 2013开发的经典游戏项目。Cocos2d-x是一款开源的游戏开发框架,它允许开发者使用C++、Lua或者JavaScript进行游戏编程,并能跨平台运行在iOS、...
本文主要介绍了一个基于51单片机的贪吃蛇游戏项目的实现,包括硬件原理图和源代码。51单片机是一种广泛用于教学和工业控制领域的经典单片机,它的应用可以加深对微控制器编程和硬件接口的理解。本文中的贪吃蛇项目...
C语言作业-C语言贪吃蛇小游戏C语言作业-C语言贪吃蛇小游戏C语言作业-C语言贪吃蛇小游戏C语言作业-C语言贪吃蛇小游戏C语言作业-C语言贪吃蛇小游戏C语言作业-C语言贪吃蛇小游戏C语言作业-C语言贪吃蛇小游戏C语言作业-...
【标题】"Java课程设计--贪吃蛇 东软05-3" 是一个基于Java编程语言实现的经典游戏——贪吃蛇的项目。这个项目可能是大学课程中的一个实践任务,旨在帮助学生掌握Java编程基础,理解面向对象编程的概念,以及增强问题...
得分计算通常是基于蛇吃食物的次数,每次吃食物分数递增,例如初始分数为0,每吃一次食物加10分。开发者需要设置一个变量来记录玩家的分数,并在蛇吃到食物时更新这个变量。 接下来是蛇长计算。蛇的长度会随着它吃...
至于压缩包内的“websnack”文件,可能是一个web版贪吃蛇的示例或者相关资源,可能用于展示如何将cocos2d-x游戏移植到Web平台。这扩展了学习范围,让开发者了解cocos2d-x的跨平台能力,包括HTML5游戏的开发。 总的...