首页
网站开发
桌面应用
管理软件
微信开发
App开发
嵌入式软件
工具软件
数据采集与分析
其他
首页
>
> 详细
代做program、代写Python,Java程序设计
项目预算:
开发周期:
发布时间:
要求地区:
Data Structures: Assignment 3
Pathfinding
SP2, 2017
James Baumeister
May 2017
1 Introduction
As a game designer you want to develop your first 2D real-time strategy game.
You envision a game where a player is in a procedurally generated terrain map,
performing tasks with non-player characters and defending against attacks from
enemies. The type of map you want to use will feature several biomes, ranging
from deserts to lush rainforests. Each of these biomes will have different characteristics and moving through the different biomes will have different difficulty
levels. As this is your first foray into game development, you want to start with
a very simple map—a 10 × 10 square grid where the player can move north,
south, east, west, north-east, south-east, north-west, south-west. With these
criteria in mind, you decide that a graph is the perfect data structure in which
to store all the possible biomes and their connections to each other.
In this assignment we will build an undirected graph structure. A node, or
vertex, in this graph will represent a terrain biome with its position in the graph
being the centre of a 1x1 square. Each node contains information about the
node’s position in the map, as well as its terrain features, including the biome,
elevation and other locale- and weather-based characteristics. Each node can
have up to eight connections, or edges, to other nodes, depending on its position
in the map. These edges are what allow travel from one node to another.
This assignment consists of two parts. In part A you will complete a number
of helper methods that will be useful when implementing search algorithms in
the next part. In part B you will generate all the edges between each of the
nodes to form them into the 10 × 10 grid. You will also implement a number
of different search algorithms. Depth- and breadth-first searches can both find
a path from one node to another, but do it in different ways and can have
very different results. They also do not take into account the weight of the
edge or, in other words, the difficulty of travelling over particular biomes. The
Dijkstra’s and A* search algorithms both take into account the weight and so
1
more accurately provide a path that is both short and least costly, or difficult
to travel.
This assignment provides two means by which you can test your code. Running GraphGUI will provide a graphical user interface (GUI) that visualises the
graph, the terrains, the nodes and the edges. It also animates the player node,
showing the path that your search method calculates. You can use this GUI to
view the outcome of your algorithm implementations and troubleshoot1
. There
are also unit tests that will give you an idea of the accuracy of your implementations. The tests are not exhaustive and the mark should only be viewed
as a guide. Alternative tests will be run by the markers to ensure that your
answers are not hard-coded to the tests. Many exception cases are not tested,
so you should write your own testing methods. It is suggested that you complete the assignment in the order outlined in the following sections. The later
steps rely on the correct implementation of the earlier steps, particularly the
connectNodes method.
Figure 1: Importing the project through File → Import
1See Appendix A to learn how to control the GUI
2
1.1 Importing into eclipse
The assignment has been provided as an eclipse project. You just need to import
the project into an existing workspace. See Figure 1 for a visual guide. Make
sure that your Java JDK has been set, as well as the two jar files that you need
for junit to function. This can be found in Project → Properties → Java Build
Path → Libraries. The jar files have been provided within the project; there
is no need to download any other version and doing so may impact the testing
environment.
2 Part A
In this section you will complete some methods that are necessary for building
and utilising the graph structure that you will build in section 3.
2.1 Edge
The Edge class represents a connection from one node to up to eight others. An
Edge object has three class variables:
private Node node1;
private Node node2;
private double weight;
2.1.1 void calculateWeight()
The weight of an Edge should be calculated using the calculateWeight()
method upon creation of the Edge. The weight is calculated as the Euclidean
distance between the two nodes multiplied by the average biome weight between
the two nodes. This can be represented mathematically as follows:
w(e) = d(p, q) × ((b1 + b2)/2)
where b1 is the biome value of the source node, and b2 is the biome value of the
target node. d is a function that calculates the Euclidean distance between two
2D points, p and q.
2.2 EdgeTest
EdgeTest will assign marks as shown in Table 1.
2.3 Vector2
The Vector2 class represents a 2D point in space and contains an x (horizontal)
and a y (vertical) coordinate. For this assignment we are only concerned with
finding the distance between two 2D points. A Vector2 object has two class
variables:
3
Table 1: EdgeTest mark allocation
Test Marks
constructor 5
calculateWeight 5
Total: 10
public double x;
public double y;
2.3.1 public double distance(Vector2 v2)
This method should calculate the Euclidean distance between two points. The
method should be called on one Vector2 object, and passed the second Vector2
object as the parameter. The distance should be returned as a double. The
algorithm for calculating the Euclidean distance is as follows:
d(p, q) = p
(q1 − p1)2 + (q2 − p2)2
2.4 VectorTest
VectorTest will assign marks as shown in Table 2.
Table 2: VectorTest mark allocation
Test Marks
distance 5
Total: 5
3 Part B
In this section you will implement a number of methods in the Graph class.
First, you will create edges between a given set of vertices. Next, you will
implement some helper methods for navigating the graph. Lastly, you will
implement several graph searching algorithms.
4
3.1 Graph
The graph structure that you must build in this assignment forms a 10×10 grid,
with all edges between the nodes being undirected. Due to the way in which
our graph is built, node pairs have mirrored edges—node 1 has an edge to node
2, node 2 has an edge to node 1. The Graph class has no class variables.
3.1.1 void connectNodes(Node[] nodes)
This method connects all nodes in a given array to form a 10 × 10 grid-shaped
graph. This method must be successfully completed before attempting any other
graph searching methods! The provided GUI can help you visualise how well
your implementation is functioning. Before completing connectNodes, the GUI
should display as shown in Figure 2. Once all of the edges have been correctly
created, the GUI will display as shown in Figure 3. Every node in the graph
can have up to eight edges, depending on its position. Central nodes will use all
eight to connect to all their surrounding neighbours. Think about how many
neighbours corner and edge nodes have and how many edges you need to create.
In order to develop an algorithm there are some simple constants that you may
utilise:
• The top-left corner of the graph has the 2D coordinate (0, 0).
• The bottom-right corner of the graph has the 2D coordinate (9, 9).
• A node’s position is the exact centre of a biome square.
• In the provided Node[], for every node(i) such that
i mod 10 = 0
node(i) is on the left edge.
It is very important to adhere to the order of the mappings shown in Table 3 when populating a node’s edge list. Note that a node does not need
a list containing eight edges if it only requires three, but the order must be
maintained—for example, east before south, north before south-east.
3.1.2 Edge getEdge(Node source, Node destination)
This methods takes as arguments two Node objects. It should search each node’s
list of Edge objects for one that connects the two nodes and return the source
node’s edge. If there is none found, the method should return null.
3.1.3 double calculateCost(Node[] vertices)
This method should calculate the total cost of travelling from one node
(Node[0]) to a target node (Node[length-1]). The total value should be returned. If the starting and target nodes are the same, the method should return
0.
5
Table 3: Edge list index–direction mappings
Edge list index Direction of connected node
0 East
1 West
2 South
3 North
4 North-east
5 South-east
6 North-west
7 South-west
3.1.4 Node[] breadthFirstSearch(Node start, Node target)
The breadthFirstSearch method takes as arguments two Node objects—a
starting node and a target node, respectively. You must implement a breadthfirst search algorithm to find the shortest path from start to target and return that path as a Node array, ordered from start (index 0) to target (index
length−1). This method should not take into account edge weights.
3.1.5 Node[] depthFirstSearch(Node start, Node target)
The depthFirstSearch method takes as arguments two Node objects—a starting node and a target node, respectively. Unlike the breadth-first search, depthfirst searching will likely not find the shortest path, so you should see drastically
different paths being generated. depthFirstSearch should return the path as
a Node array, ordered from start (index 0) to target (index length−1). This
method should not take into account edge weights.
3.1.6 Node[] dijkstrasSearch(Node start, Node target)
The method should use Dijkstra’s algorithm to search the graph for the shortest
path from start to target while taking into account the cost of travel (i.e. edge
weight). Visualising this algorithm should show that sometimes the path may
not be the most direct route. Rather, it should be the least costly. Your
implementation should be a true implementation of the algorithm2
. Your code
will be inspected to ensure that an alternative algorithm has not been used.
2Closely follow the textbook example. Subtle differences in algorithms could impact your
performance against the tests
6
Figure 2: The GUI before completing the connectNodes method
dijkstrasSearch should return the path as a Node array, ordered from start
(index 0) to target (index length−1).
3.1.7 Node[] aStarSearch(Node start, Node target
This method should use the A* algorithm, similar to Dijkstra’s algorithm, to
search the graph for the least costly path. Unlike Dijkstra’s, which searches
in all directions, the A* algorithm uses a heuristic to predict the direction of
search. The heuristic you should use should be shortest distance, using the
distance algorithm you implemented earlier. Your implementation should be
a true implementation of the algorithm3
. Your code will be inspected to ensure
that an alternative algorithm has not been used. aStarSearch should return a
Node array containing the path, ordered from start (index 0) to target (index
length−1).
3.2 GraphTest
GraphTest will assign marks as shown in Table 4.
3This is a research task, but this website should be very helpful: http://www.
redblobgames.com/pathfinding/a-star/introduction.html
7
Figure 3: The GUI after completing the connectNodes method
A Using the GUI
A GUI has been provided to aid understanding how your graph searching algorithm implementations are functioning. The window contains a graphical
representation of the graph on the left, and three buttons on the right (see
Figure 3. The buttons labelled ‘Biomes’ and ‘Polygons’ are essentially toggles
for displaying an outline of the node squares (shown in Figure 4. ‘Biomes’ is
activated by default. The button labelled ‘Nodes’ controls whether or not the
red node circles and pink edge lines are shown—click to toggle between the two.
The blue player node will render at the nominated start node and its position
will update if a path is provided.
As the GUI operates independently to the testing suite, there are some
aspects that you must manually control in order to show the desired information.
The GraphRender class has the following constants:
private final int START_NODE = 0;
private final int TARGET_NODE = 9;
private final int ANIMATION_DELAY = 500;
private final String METHOD = "breadthFirstSearch";
You may modify these values. As an example, if you were testing your Dijkstra’s
algorithm implementation and wanted to match one of the unit tests, you could
change START_NODE to 8, TARGET_NODE to 0 and METHOD to "dijkstrasSearch".
ANIMATION_DELAY represents the delay for the blue player circle to jump along
8
Table 4: GraphTest mark allocation
Test Marks
connectNodes 10
getEdge 5
calculateCost 5
breadthFirstSearch 20
depthFirstSearch 15
dijkstrasSearch 20
aStarSearch 10
Total: 85
nodes in the path, in milliseconds; increase to slow the animation, decrease to
quicken.
9
Figure 4: The GUI when the ‘Polygons’ button has been selected
10
软件开发、广告设计客服
QQ:99515681
邮箱:99515681@qq.com
工作时间:8:00-23:00
微信:codinghelp
热点项目
更多
代做ceng0013 design of a pro...
2024-11-13
代做mech4880 refrigeration a...
2024-11-13
代做mcd1350: media studies a...
2024-11-13
代写fint b338f (autumn 2024)...
2024-11-13
代做engd3000 design of tunab...
2024-11-13
代做n1611 financial economet...
2024-11-13
代做econ 2331: economic and ...
2024-11-13
代做cs770/870 assignment 8代...
2024-11-13
代写amath 481/581 autumn qua...
2024-11-13
代做ccc8013 the process of s...
2024-11-13
代写csit040 – modern comput...
2024-11-13
代写econ 2070: introduc2on t...
2024-11-13
代写cct260, project 2 person...
2024-11-13
热点标签
mktg2509
csci 2600
38170
lng302
csse3010
phas3226
77938
arch1162
engn4536/engn6536
acx5903
comp151101
phl245
cse12
comp9312
stat3016/6016
phas0038
comp2140
6qqmb312
xjco3011
rest0005
ematm0051
5qqmn219
lubs5062m
eee8155
cege0100
eap033
artd1109
mat246
etc3430
ecmm462
mis102
inft6800
ddes9903
comp6521
comp9517
comp3331/9331
comp4337
comp6008
comp9414
bu.231.790.81
man00150m
csb352h
math1041
eengm4100
isys1002
08
6057cem
mktg3504
mthm036
mtrx1701
mth3241
eeee3086
cmp-7038b
cmp-7000a
ints4010
econ2151
infs5710
fins5516
fin3309
fins5510
gsoe9340
math2007
math2036
soee5010
mark3088
infs3605
elec9714
comp2271
ma214
comp2211
infs3604
600426
sit254
acct3091
bbt405
msin0116
com107/com113
mark5826
sit120
comp9021
eco2101
eeen40700
cs253
ece3114
ecmm447
chns3000
math377
itd102
comp9444
comp(2041|9044)
econ0060
econ7230
mgt001371
ecs-323
cs6250
mgdi60012
mdia2012
comm221001
comm5000
ma1008
engl642
econ241
com333
math367
mis201
nbs-7041x
meek16104
econ2003
comm1190
mbas902
comp-1027
dpst1091
comp7315
eppd1033
m06
ee3025
msci231
bb113/bbs1063
fc709
comp3425
comp9417
econ42915
cb9101
math1102e
chme0017
fc307
mkt60104
5522usst
litr1-uc6201.200
ee1102
cosc2803
math39512
omp9727
int2067/int5051
bsb151
mgt253
fc021
babs2202
mis2002s
phya21
18-213
cege0012
mdia1002
math38032
mech5125
07
cisc102
mgx3110
cs240
11175
fin3020s
eco3420
ictten622
comp9727
cpt111
de114102d
mgm320h5s
bafi1019
math21112
efim20036
mn-3503
fins5568
110.807
bcpm000028
info6030
bma0092
bcpm0054
math20212
ce335
cs365
cenv6141
ftec5580
math2010
ec3450
comm1170
ecmt1010
csci-ua.0480-003
econ12-200
ib3960
ectb60h3f
cs247—assignment
tk3163
ics3u
ib3j80
comp20008
comp9334
eppd1063
acct2343
cct109
isys1055/3412
math350-real
math2014
eec180
stat141b
econ2101
msinm014/msing014/msing014b
fit2004
comp643
bu1002
cm2030
联系我们
- QQ: 9951568
© 2021
www.rj363.com
软件定制开发网!