Montana Tech of The University of Montana
Computer Science & Software Engineering

CSCI 135
Fundamentals of Computer Science I
Fall 2016



ASSIGNMENT #8 - Wumpus World: Part 2

In this assignment, you will continue to write the graphical program to implement the Wumpus World game. In the first part you gained experience in multidimensional arrays and in object oriented design and programming. In the second part, you will learn more about object oriented design, and how it all works together. The assignment posted today is for Part 2. The image at the right is from my coded solution, using Charlie Hand and Zachariah Valenzuela's images from last year. Each of these images for the rooms is 100x100 pixels rather than the 64x64 images we used in Part 1. They have graciously allowed us to use their images for this assignment (see bottom of assignment).

Here's my solution to Part 1 of this assignment: Cave.java and Room.java. If you were unable to get your Cave and Room classes to work, you might want to use mine as a model. However, I used enumerations, which makes it a little more complicated. You might just want to use my logic as a model for your code. My original Wumpus World Client to test Cave and Room are here: wumpusClient.java
  Wumpus World

Recall the description of the game from last time. This has not changed. What has changed is that now you must implement the additional classes that make the game actually run. These are WumpusWorld (the game controller, or the program with the main method in it), and Player, the class that represents the player on the screen. The instructions for Part 1 are included below, but additional instructions and hints for Part 2 are below that.


The Game. The Wumpus World game takes place in a cave with different rooms in it. You can think of the cave as an NxM rectangular grid. The player always starts in position 0,0, which is guaranteed to be safe (but it may still be smelly or breezy or glittery). The image above is one implementation of the game for Android. Yours does not have to look like that.

The objective of the game is to find the gold. The player will know when he/she is in a room with the gold because there will be a "glitter" in that room. If the player detects a glitter, he/she can pick up the gold and the game is won.

Bottomless pits are present in some of the rooms. There is a 20% chance that any given room will have a pit. All rooms adjacent to a pit are breezy, that is, a player entering a room adjacent to a pit will detect a breeze. If the player moves into the room with a pit, he/she falls in and dies a horrible death.

There is only one wumpus in the cave, and he is also placed at random. Rooms adjacent to the wumpus are smelly, that is, a player will detect a stench in a room adjacent to a wumpus. The wumpus cannot move. If the player enters a room with the wumpus, he/she will be eaten, and, once again, die a horrible death.

There is also only one room in the cave that contains the gold. Unlike the other objects, the player has to be in the same room as the gold in order to detect a glitter. Like the wumpus, the gold is placed at random.

The player can move up, down, left, or right. The player also has one arrow. Once it's used up, it's gone. It can be used to shoot a wumpus, and can be shot in any direction the player can move in. If the player is successful in shooting the wumpus, the wumpus will emit a blood-curdling scream, and will no longer be a threat. The only other action the player can perform is to "grab gold".

When the player first starts the game, he/she does not know (and cannot see) where the location of pits, gold and the wumpus are. The only clues are whether the current room is breezy, smelly, or glittery.

The Assignment: The overall assignment is to produce this game with a graphical interface. You are strongly encouraged to work in pairs, though if you absolutely don't want to do this, you are not required to. The assignment is divided into two parts, which have separate due dates.

Part 1: The first part of this assignment is to develop the code for the Cave and Room classes. As you recall from lecture, even though these are not the classes that will run the eventual game, you can still put main methods in them to test that they are working correctly. You will have to put some thought into what goes into each of these classes, both their instance variables and their methods. You will have completed this part of the assignment if your Cave class can take two integer input parameters and create and draw a valid wumpus world cave. Images have been provided for you that depict 64x64 tiles for rooms in the cave. You will need to populate your cave with a wumpus, gold and pits, and also determine which rooms are smelly, glittery and/or breezy (they can be all three, and more). When you draw the cave in your test main, you can draw each room according to what it contains. In the eventual game, these will not show up until the player moves into that room. Because you will all potentially be producing different solutions it is particularly important that you document your code well. In particular, there should be comments for every method that describe what it does, what it expects for input parameters, and what it returns, if anything.

Some temporary 64x64 images that may help you are below. These images are all a single color to represent a particular characteristic, and in your code, if one square has more than characteristic, with this set of images, the last one used will overwrite any others. You will have a new set of images before we get to part 2 so that the game will actually be playable.
blank.png (nothing is in this room)
wumpus.png
glitter.png
stench.png
breeze.png
pit.png

Some things that may help you in drawing the cave:
1. Since the images are 64x64 pixels, you probably want to set your canvas size so that it has rows*PIXELS and columns*PIXELS as its dimensions.
2. Similarly, you will want to set the X and Y scale of your canvas to run from 0 to rows*PIXELS and from 0 to columns*PIXELS to make it easier to place images.
3. When placing an image, remember that the x and y coordinates that you give are where the image will be centered. If you place the image at, say map location 0,0 only the upper right quadrant of the image will show on the canvas.
4. You will want to use StdDraw.java for the image drawing routines.

Part 2: The second part of this assignment is to write the rest of the code to implement the Wumpus World game. Don't be surprised if, as you write code for the second part, you find places where you need to change the previous code. It's often difficult to think through the problem in enough detail to think of everything as you design the solution.

The player always starts in position 0,0 (the lower right corner) of the cave. This space is guaranteed to be safe (no pits and no wumpus) but there may be a breeze or stench in that room. If you're really lucky, the gold could be there also. The only rooms that are actually displayed are those that the player has visited - the rooms not yet explored must show up as blank spaces.

The player moves by using the 'w', 'a', 's', and 'd' keys for up, left, down and right respectively. Your program should redraw the player on the screen if it makes a legal move, and it should check to make sure that the player does not move off the screen. If the player wishes to shoot the arrow, the 'i', 'j', 'k', and 'l' keys are used to shoot up, left, down and right respectively. If the wumpus is in line with the direction the arrow is shot, even if he is several squares away, he will die. Your program needs to handle removing the wumpus and stench from the cave if that happens. Finally, the key 'g' is used to grab the gold if the player is in the same room with it.

Your program should react appropriately if the player falls into a pit, is eaten by the wumpus, or grabs the gold. Any one of these signals the end of the game.

New Images!! Careful - these are 100x100 pixel images.

NotVisitedMapTile.png
VisitedMapTile.png
WumpusTile.png
GoldTile.png
StenchTile.png
BreezeTile.png
PitTile.png
HeroTile.png

Some Sounds Below! (if you choose to add sounds - you can also find and use your own sounds if you like)
scream_male.wav
crash_x.wav
cheering.wav
burp2.wav
arrow2.wav
applause2_x.wav


Submission.
Part 2. Submit your Java files for WumpusWorld.java, Player.java, Cave.java and Room.java to Moodle, under Assignment 7, Part 2. If you are working as a pair, only submit one set of files, but make sure both names are on the files.


Extra Credit.
A couple of ideas for extra credit on this assignment are to add sound (using StdAudio.java) to some of the events in the game. Another idea is to add multiple wumpuses (wumpii?) to the game. Or to add "bats" that randomly pick up the wumpus, the player or the gold and move them to random locations. Or, you could allow the wumpus to move also. If you choose to do any of these, submit your regular assignment to the normal Moodle dropbox, but submit your extra credit version, with all necessary files, to the Extra Credit dropbox at the top of the Moodle page. Have fun!!



Page last updated: November 18, 2016