MIPS代写: COMP2611 Programming Project : The Snake Game

COMP2611 : Computer Organization Fall 2017

Programming Project : The Snake Game

D ue Date : 23::555,, 3 0 November 2017

Introduction

In this project , you will complete The Snake Game . A snapshot of the game is shown below.. By controlling a snake , your target is to eat a predefined number of food items , while at the same time,, avoid head colliding with border s or intersecting with snake itself . Note not all food items are edible,, some are poisonous.. Eating edible food items lengthens the snake and leads to a next level,, then eventually,, to a victory.. Eating a poisonous food item shortens the snake and may lead to a game loss..

Figure 1 Screenshot and Coordinate System of the Snake Game

Game O bjects

The game runs on a n 800 pixel x 800 pixel square screen . The x – axis and y – axis of the coordinate system are rightward and down ward (ffrom 0)) respectively,, as shown in Figure 1..

Objects in the game include the snake ( with a head object and a few body box objects ),, food item s and extra boarder (ffor bonus part only)).. Every object is a square image of given size.. Its location in the game screen is determined by the top – left corner’s coordinates..

The sizes of objects are as follows::

Object

Image size (xx – size x y – size in pixels))

Snake Head

40 x 40

Body Box

40 x 40

Food Item

54 x 54

Extra Border

400 x 50

Figure 2 Game Objects

I mages for the game objects are listed below.. To set a game object to use a certain image,, set the object’s “iimage index”” to the corresponding index no.. in your codes.. If the image index is set to negative,, the object will not be drawn on the screen..

Image index

Image

Description

Sam ple

0

horizontal_border..ppng

Sliding border image (ffor bonus part only))

1

snake_head_right..ppng

Snake’s head moving right

2

snake_head_down..ppng

Snake’s head moving down

3

snake_head_left..ppng

Snake’s head moving left

4

snake_head_up..ppng

Snake’s head moving up

5

snake_box..ppng

Snake’s body box

6

flower_food_one..ppng

Edible food image one

7

flower_food_two..ppng

Edible food image two

8

poison_food..ppng

Poisonous food image

Figure 3 Images of the Game Objects

Game Initialization

The game has 2 levels . G ame score is initially 0 at Level 1 and resets when move s to Level 2 . Before the game starts,, p layer is asked to set the stay time of a food item before it moves to a new position (iin terms of millisecond)),, and a random seed for the random n umber generator . In level 2,, the snake’s speed doubles and the stay time of food item halves .

The snake’s head is initially located at (xx,, y)) = ( 200 , 200 ) and is moving at a constant speed of 5 pixels (pper game loop)) towards the right edge of the screen . Snake’s body length is initially set to 4 , which is the minimum length of the snake.. If the body becomes shorter than 4,, the game is lost (mmore on this in the “ Game Winning or Losing ” section)).. The food image is randomly placed at a position that does not overlap with any part of the snake and is fully visible on the screen (aall edges are within the range [00,, 799]])).. The snake will start at (xx,, y)) = (2200,, 200)) with length 4 again when promoted to Level 2..

Snake Structure

The snake head object consists of a group of head – related items :

 Object ID : unique internal identifier for all objects in the game

 x – coordinate : top left position of the snake’s head image in the game screen

 y – coordinate : top left position of the snake’s head image in the game screen

 Image index : index of the image of the snake’s head

 Horizontal speed : > 0 snake moves towards right edge;; < 0 snake moves towards left edge;; =00 no movement in horizontal direction

 Vertical speed : > 0 snake moves towards bottom edge;; < 0 snake moves towards top edge;; =00 no movement in vertical direction

Each head – related item takes 1 word (ii..ee.. 32 bits)) to store.. All items are stored in array snakeHea d as illustrated below . For example , snakeHead [ 3 ] stores the snake head image index .

Starting address Of snakeHead array

+44

+88

+112

+116

+220

Object ID of snake head

x – coordinate of snake head

y – coordinate of snake head

Image index of snake head

Horizental speed of snake head

Vertical speed of snake head

Figure 4 Data Structure of Snake Head

The snake body is a structure of a group of body boxes.. Each body box object consists of its Object ID,, (xx,, y)) coordinates and image index.. Each body – related item also takes 1 word (ii..ee.. 32 bits)) to store.. All body boxes are stored in array snakeBody as illustrated below.. For example,, snakeBody[[44]] is the object ID of the second box (ii..ee.. box 1)) in snake..

Starting address Of snakeBody array

+44

+88

+112

+116

+220

…..

Object ID of box 0

Image index of body box 0

x – coordinate of body box 0

y – coordinate of body box 0

Object ID of body box 1

Image index of body box 1

…….

Figure 5 Data Structure of Snake Body

O bject M ovements

Food Item : T here is only ONE food item in the game,, although yo u do see different foods appears here and there in the game screen.. This is been done by repeating the following steps::

 Places the food ite m in valid random generated location (xx,, y))

 Pick a random food image index (ee..gg.. 6,, 7,, or 8)).. The corresponding food image is chosen .

 M ake the food i tem visible for a user – defined period of time .

When generating random position,, if a (xx,, y)) coordinate lead s to either 1.. Overlap of the food image and any part of the snake,, or 2.. Partial appearance of the food image on the screen (ee..gg.. not all image edge s are within the range [00,, 799]])),, it is not valid location to put food item and will be discarded..

Snake’s Head : m oves e ither horizontally or vertically according to the h orizont al or vertical s peed of the s nakeHead data structure (FFigure 4 ) . As the snake can’t move at both horizontal and vertical direction at the same time,, it’s straightforward that o nly one speed value is non – zero at a time.. The next position of the head is the current position plus//mminus one of the two speed values..

Snake’s Body Box : In general,, the movement of the snake follows its head,, and each body box follows its previous body box.. For example , suppose at time slot T the head is at location (xx_head_T,, y_head_T)),, this location woul d be the location for body box 0 at the next time slo t T++11.. Simi larly,, if body box i is at loca t i on (xx_body_i_T,, y_body_i_T)) at time T,, this would be the location of body box i++11 at the next time slot T++11..

The program uses the snakeTargetPos array for storing the target positions of the body parts.. A target position is a position towards which a snake’s body box moves.. SnakeTargetPos[[ii]] holds the target position of body box i . To be more specific,, for example,,

snakeTargetPos[[00]]

Target coordinates of body box 0 ( i..ee.. head location))

snakeTargetPos[[11]]

Target c oordinates of body box 1

snakeTargetPos[[22]]

Target c oordinates of body box 2

Snake’s movement is regulated by this structure and would be used in two of the procedures you will need to implement ( snakeBodyNewMovement and snakeOldMovement )..

The body box size is big (ii..ee.. 40 pixels as in Figure 2)),, if the snake moves at 40 pixels speed , the game animation looks “bbouncy””.. To create the smooth er movement effect,, t he snake moves at a constant speed of 5 pixels in each main_obj loop iteration,, as show in Figure 6..

However we would enforce the snake body boxes move to its target position be fore responding to any changes.. For example,, the snake body box 0 is moving to the right following the snake head,, when suddenly user press ‘dd own’’ to change the head position (FFigure 7a)) . Body box 0 won’t change its direction to down immediately,, it keeps moving to the right until reaches to the previous location of th e head,, i..ee.. target location ( Figure 7b)).. Then body box 0 will change its dire ction to down to follow the head (FFigure 7c)) .

Figure 7 Movement of Snake’s Body

Object Collision

Object collision can happen in two scenarios . First,, a collision may occur when the snake’s head hits a border and dies.. hitBorderCheck procedure describes the scenario and provides the possible case s.. It describes what parameters have to be pass ed and how the

Iteration i Iteration i++11

Figure 6 Snake’s Movement

border collision logic works..

Figure 7 Object Collision

Second,, the checkObjectCollision procedure should be used for two object – collision checking.. This is a generic procedure used with square objects ( snakeHead,, snakeBody,, and foodState ) . Refer to Figure 7 to see possible object collisions.. Read the source code of the procedure for more information about the object collision logic..

Snake’’ s Length

Snake can grow//sshrink according to the eaten food item.. If the snake eats a poisonous food item,, it becomes shorter – loses the tail ( syscall 100 ).. If t he snake eats a n edible food item,, a new body box should be displayed at the position of the current tail.. You are provided with a customized syscall (rread about in in Syscall100_readme..ddoc ) which allows you to hide//ddisplay objects.. In order to hide an object (bbody box)),, you hav e to use the following values:: $vv0 = 100,, $aa0 = 11,, $aa1 = ID of object,, $aa2 = – 1;; for displaying an object,, you have to use the syscall twice with different values of $aa0 (111 and 12)).. The indexes of images are shown in Figure 3..

For more information about how the snake grows//sshrinks,, refer to the provided skeleton..

Game W inning or L osing

To win the game,, two levels must be passed.. Each level is completed once the snake’s body length reaches a predefined value (cconstant stored in the snakeBoxNo word , currently set to be 6 for easy testing ) . The snake becomes longer for 1 body box every time an edible food item is eaten ( i..ee.. head collides with food ) and becomes shorter once a poisonous one is eaten . If the snake’s length becomes less than the initial l ength (44 body boxes)),, the game is lost..

Other cases when t he game is lost involve the head colliding with an edge of the screen or colliding with a body box of the snake . The collision functions ( hitBorderCheck and checkObjectCollision ) are provided for you,, you will just need to use them and check a few collision cases..

Implementation (GGame Loop))

All the game objects and status (sscore,, level ) are initialized at the beginning of the game . After user inputs , t he game runs with a loop of the following steps::

1.. G et the current time (TT1)) (pprovided for you)) .

2.. C heck for any keyboard input , which is stored usi ng the Memory – m apped I / O scheme . I f an input is available , read it and perform the action for it as follows (pprovided for you)) :

Input

Action

q

Terminate the game

w

Move the head upward

s

Move the head downward

a

Move the head leftward

d

Move the head rightward

3.. Colli sion detection for the snake’s head . Check for any collision with a border,, a body part and the food item . If collision detected,, update the status of involved objects (tto implement one part of it)) .

4.. Check if the current level of the game is over (pprovided for you))..

5.. Move food item if its duration has expired (tto implement)) .

6.. M ove the snake (tthe head and the body boxes)) (tto implement))..

7.. Move the extra//ssliding border ( optional bonus part )..

8.. R edraw the game screen with the updated location and image of the game objects and game state information..

9.. G et the current time (TT2)),, and pause the program execution for (330 milliseconds – (TT2 – T1)))).. Thus,, the interval between two consecutive iterations of the game loop is about 30 milliseconds.. By this way,, we generate the ‘ccartoon animation’’ effect of the game..

Assignment T asks

The game runs under the custom – made Mars program Ma rs_4_1_withSyscall100 .jjar (wwith copyright under COMP2611 teaching team)),, which supports graphical interface and sound effect . A set of custom – made syscalls is provided in custom – made Mars.. User manual of t he set of syscalls is provided in Syscall100_readme..ddoc .

To work with the game objects,, you must use the data structures (MMIPS word arrays)) defined at the beginning of the code::

 Snake movement speed (11 word)),,

 snakeHead (66 words))

 snakeBoxNo (11 word))

 snakeBody (44 words per body box))

 snakeTargetPos (22 words per body box))

 foodState (44 words))..

You can also use snakeHeadSize , snakeBoxSize and foodPicSize structures,, but they are just constant values described in this document..

For bonus part,, there are bonusID (11 word)),, bonusXCoord (11 word)) and bonusDirection (11 word)).. Read the code comments for detailed description..

Read the skeleton code snake_game_skeleton . asm carefully and implement the following procedures . Your code should be in the MIPS assembly language.. You may also use pseudo instructions in your program .

Procedure

Task

placeFoodItem

Placing the food item image on the screen . You have to generate a random number for image index in the range [66,, 8 ].. In addition,, you must place the image at a position that matches food placement requirements specified in the previous sections..

shortenSnakesBody

Make to disappear the last body box of the snake’s body,, update the snake’s length and check if the length is < 4.. If yes,, jump to the lost game state.. To make a body box disappear,, use the provided syscall 100 and set the image index of the body box to a negative value (ee..gg..,, – 1))..

stretchSnakesBody

Place a new body box at the current position of t he snake’s tail and update the

snakeTargetPos structure accordingly . Use the provided syscall 100 for displaying a new body box at the position of the current tail..

snakeNewMovement

Snake has reached its targets (vvalues in snakeTargetPos ) . Update snakeTargetPos and move the snake by th e current speed..

snakeOldMovement

Snake has not reached its targets yet,, so move the snake towards the values stored by the snakeBodyPos structure..

reinitializeSnake

Reset the coordinates of the snake’s head to the initial values (2200,, 200)),, reset the i nitial head image index,, and reset the speed to the initial speed..

check_head_food_hit((llabel))

Implement checking if the head collides//hhits the food image.. If the head collides with the food item,, call one of the above described procedures:: either stretchSnakesBody or shortenSnakesBody . In order to choose the procedure,, use the result of the getFoodPoints procedure..

(BBonus , optional )

addExtraBorder (ddisplay an extra border at level 2 )

checkExtraBorderCollision

checkIfNewFoodItemOverlapSlidin gBorder

moveSlidingBorder

The bonus part involves implementing and using the three procedures shown on the left.. addExtraBorder uses the bonusID value and syscall_100 to place a new border (eextra order or sliding border)) on the screen at level 2.. checkExtraBorderBollision checks if an object collides with the extra border.. checkIfNewFoodItemOverlapSlidin gBorder is specialized procedure for checkin g if the position of the food item on the y – axis is within the range of the sliding border.. The food item must be placed either fully above the sliding border or fully below the border.. moveSlidingBorder procedure moves the border from left edge of the scr een to the right edge and backwards..

An additional task requires you to insert some

extra code in the original code.. The places where to insert are enclosed in the following way::

#######################

# BONUS PART

#############################

###############################################

# BONUS PART ENDS HERE

###############################################

Do not modify the given skeleton code (ee..gg.. change certain registers)).. You should only add your code under the assigned tasks..

Bonus : Adding and Controlling an Extra Border

The bonus part adds a new feature to the game.. It displays an extra sliding border of the size 400 x 50,, which keeps moving from the right edge of the screen to the left and bounces back.. Read the code segments with the “BBONUS PART”” comments for more details..

There is 10 % bonus mark (ii..ee.. , 10 marks if the full project mark is 100)) . Since the project counts for 15%% of COMP2611 score,, if you successfully finish the bonus part,, you will get additional 1.5 points in your total score..

Figure 9 Screenshot of the Bonus Part

Submission

You should submit a single MIPS file with your completed codes for the project using the CASS (

https::////ccourse..ccse..uust..hhk//ccass

).. No late submission is allowed.. Please avoid to upload your file in the last minute.. The submitted file name must be exactly s nake _<<YYour student ID>> . a s m . The CASS user manual is in this link

http::////ccssystem..ccse..uust..hhk//UUGu ides//ccass//iindex..hhtml

. Multiple submissions to CASS are allowed.. However we’ll only mark the latest version before deadline..

At the beginning of the file,, please write down your name,, st udent ID,, email address,, and lab section in the f ollowing format::

#NName::

#IID::

#EEmail::

#LLab Section::

Grading

Your project will be graded on the basis of the functionality listed in the game requirements , rather than the line – by – line implementation of MIPS code.. Therefore,, you should make sure that your submitted codes can be executed properly in the modified Mars program.. 0 points will be given to any submission which fails to execute..

Inline code comments are not graded but are highly recommended . You may be invited to explain your code s in a face – to – face session ( e..gg..,, organized during th is Fall 2017 exam ination period after the project due date )..

Contacts

If you have any questions related to the project,, please send an email to Mr.. Justinas LINGYS at

jlingys@@cconnect..uust..hhk

. Or post the question on COMP2611 Fall 17 Facebook.. Your email’s layout should follow the following pattern::

To::

jlingys@@cconnect..uust..hhk

Subject:: COMP_2611_FALL_17_PA

If your email does not follow the provided pattern,, it may be ignored by the TA and you may never receive a reply to your email or it may take a long period of time to receive one..