C语言辅导 | DPST1091 19T2 Assignment Pokedex

For this assignment, we are asking you to implement a mini Pokedex in C. The task is split into 4 sections; each section is not weighted the same.

Hello there! Welcome to the world of Pokemon! My name is Oak! People call me the Pokemon Prof! This world is inhabited by creatures called Pokemon! For some people, Pokemon are pets. Others use them for fights. Myself … I study Pokemon as a profession.— Professor Oak

Pokemon are fictional creatures from the Pokemon franchise, most famously from the Pokemon games. The game revolves around the (questionably ethical) capturing of these creatures. Within the fiction of this universe, a device called the Pokedex is used to catalogue all the creatures a player finds and captures.

You can play the one of the original Pokemon games here. Quite early in the game you get introduced to the Pokedex.

There’s some more information on the Pokemon Wikia.

In addition, Google will be a great resource, as the topic has been extensively written up about.

This zip file contains the files that you need to get started with the assignment. It contains the following files:

A reference implementation reference_implementation is available to help you understand the assignment.

Your pokedex.c (compiled with the supplied pokemon.c and main.c) should match the behaviour of the reference implementation.

Provision of a reference implementation is a common method to provide an operational specification, and it’s something you will likely need to do outside UNSW.

If you discover what you believe to be a bug in the reference implementation, report it in the class forum. We may fix the bug or indicate that you do not need to match the reference implementation’s behaviour in this case.

When you compile and run the given code, you will get the following message if you try to add a Pokemon:

When you run the a command, this function in pokedex.c is called:

Your first task is to implement add_pokemon. All the functions you have to implement in pokedex.c have descriptions in pokedex.h: NOTE: SHOULD BE JUST add_pokemon prototype

You need to put code in the add_pokemon function to store the pokemon it is given into the pokedex it is given.

You don’t need to know any details about what the Pokemon type is (i.e. the type of the Pokemon pokemon argument passed to add_pokemon) to implement add_pokemon or any other function in pokedex.c.

Pokemon Tip #0: Pokemon IDs

In the Pokemon game franchise, Pokemon IDs start at 1 and go up to 809 (at the time of writing this). The first Pokemon is Bulbasaur, who has a Pokemon ID of 1. This assignment, however, allows any Pokemon ID from 0 upwards (because programmers love counting from 0).

Throughout this spec we’ll be making use of Bulbasaur (as well as some of the other official Pokemon) in our examples, but do note that you can make your own Pokemon with any ID from 0 to the maximum number that can be stored in an integer.

Hint: your code should also operate under the assumption that a pokemon_id of 0 is valid.

If you look in pokedex.h you will discover this definition: typedef struct pokedex *Pokedex

In other words the type Pokedex is the same as struct pokedex *.

struct pokedex is defined at the top of pokedex.c.

It already has one field: a pointer to struct pokenode which can be used to store a linked list.

Put in code in add_pokemon to add the pokemon it is given to the linked list whose head is in the pokedex it is given.

Hint: allocate a struct pokenode with malloc.

When you run your code you should see this:

You’ll need to implement 4 more functions to find out if add_pokemon really works:

See pokedex.h for information on each function.

detail_pokemon and print_pokemon need to call functions defined in pokemon.h to get the information about a Pokemon they need to print.

Note the information detail_pokemon and print_pokemon print about a Pokemon depends on whether it has been found.

Hint: add a field to struct pokenode to indicate if a Pokemon has been found.

Pokemon Tip #1: finding Pokemon.

Your Pokedex is like an encyclopedia that stores information about Pokemon.

But unlike a normal encyclopaedia, some of the information in your Pokedex is hidden until you’ve discovered a Pokemon of that kind.

Once you have “found” a certain kind of Pokemon, its details will become visible to you in your Pokedex.

You will need to keep track of whether a Pokemon has been found in your Pokedex implementation.

Hint: add a field to struct pokenode to indicate if a Pokemon has been found.

Pokemon Tip #2: the currently selected Pokemon.

Your Pokedex allows you to scroll through the Pokemon stored within, allowing you to see the details of a specific Pokemon of your choice. This means that there will always be one Pokemon that is currently selected by the Pokedex.

When you add the first Pokemon to the Pokedex, that Pokemon becomes the currently selected Pokemon. When you add additional Pokemon, the currently selected Pokemon does not change.

In Stage 2, you will implement functions to allow you to scroll back and forth between Pokemon. But for now, you won’t need to change the currently selected Pokemon.

Hint: your currently selected Pokemon won’t change in Stage 1, and so will always be the first Pokemon added to your Pokedex (for now).

Pokemon Tip #3: adding Pokemon to the Pokedex.

The Pokemon in your Pokedex are stored in the order that they were added (which is not necessarily by order of pokemon_id!).

For example, if you have an empty Pokedex and then add Pikachu (#025) to your Pokedex, your Pokedex now contains:

#025: Pikachu

If you next added Squirtle (#007), your Pokedex now contains:

#025: Pikachu -> #007: Squirtle

If you then added Diglett (#050), your Pokedex now contains:

#025: Pikachu -> #007: Squirtle -> #050: Diglett

Hint: every time you add a Pokemon to your Pokedex, add it to the end of your linked list.

When all four functions are working you should see something like this:

For this stage, you are providing the ability to move a cursor through a Pokedex, either stepping through or jumping to a specific pokemon_id. You will also implement the ability to remove a Pokemon from the Pokedex.

Pokemon Tip #4: scrolling through your Pokedex.

You can change the currently selected Pokemon in your Pokedex (see Pokemon Tip #2) to view the details or information about a specific Pokemon.

You can do this by either scrolling to the next and previous Pokemon in your Pokedex (using the next_pokemon and prev_pokemon functions).

You can also select a Pokemon of your choice by passing its pokemon_id to the change_current_pokemon function.

Using the example from Pokemon Top #3: if your Pokedex contains the following three Pokemon in the following order, with Pikachu currently selected:

#025: Pikachu <–
#007: Squirtle
#050: Diglett

Calling next_pokemon would lead to Squirtle becoming the currently selected Pokemon:

#025: Pikachu
#007: Squirtle <–
#050: Diglett

Calling prev_pokemon would lead to Pikachu becoming the currently selected Pokemon again:

#025: Pikachu <–
#007: Squirtle
#050: Diglett

And calling change_current_pokemon with the pokemon_id 50 would lead to Diglett becoming the currently selected Pokemon:

#025: Pikachu
#007: Squirtle
#050: Diglett <–

You must implement these functions in pokedex.c:

Again, see pokedex.h for information on what each function should do, and use reference_implementation to see what the correct behaviour is.

Note that as time goes on, you may need to update destroy_pokedex to make sure it’s cleaning up all the memory in a Pokedex instance. Keep this in mind.

What’s this? Your Pokedex code is evolving? To finish this evolution of your Pokedex, implement these functions in pokedex.c:

Again, see pokedex.h for information on what each function should do, and use reference_implementation to see what the correct behaviour is.

Set up your Pokedex to do some nice searching!

Again, see pokedex.h for information on what each function should do, and use reference_implementation to see what the correct behaviour is.

As you implement functions in pokedex.c, you should add tests to test_pokedex.c .

It already has some basic tests.

As usual autotest is available with some simple tests – but your own tests in test_pokedex will be more useful. Details about testing and the autotest will be provided shortly.

This is an individual assignment. The work you submit must be your own work and only your work apart from exceptions below. Joint work is not permitted.

You may use small amounts (< 10 lines) of general purpose code (not specific to the assignment) obtained from site such as Stack Overflow or other publically available resources. You should attribute clearly the source of this code in a comment with it.

You are not permitted to request help with the assignment apart from in the course forum, help sessions or from course lecturers or tutors.

Do not provide or show your assignment work to any other person (including by posting it on the forum) apart from the teaching staff of CP1511.

The work you submit must otherwise be entirely your own work. Submission of work partially or completely derived from any other person or jointly written with any other person is not permitted. The penalties for such an offence may include negative marks, automatic failure of the course and possibly other academic discipline. Assignment submissions will be examined both automatically and manually for such submissions.

Relevant scholarship authorities will be informed if students holding scholarships are involved in an incident of plagiarism or other misconduct. If you knowingly provide or show your assignment work to another person for any reason, and work derived from it is submitted you may be penalized, even if the work was submitted without your knowledge or consent. This may apply even if your work is submitted by a third party unknown to you.

Note, you will not be penalized if your work is taken without your consent or knowledge.

You are required to submit intermediate versions of your assignment.

Every time you work on the assignment and make some progress you should copy your work to your CSE account and submit it using the give command below.

It is fine if intermediate versions do not compile or otherwise fail submission tests.

Only the final submitted version of your assignment will be marked. Details about the assignment submission will be provided shortly

This assignment will contribute 15% to your final mark.

80% of the marks for this assignment will be based on the performance of the functions you write in pokedex.c.

20% of the marks for assignment 2 will come from hand marking of the readability of the C you have written. These marks will be awarded on the basis of clarity, commenting, elegance and style. In other words, your tutor will assess how easy it is for a human to read and understand your program.

Tutors will also examine the tests you add to test_pokedex.c function. Here is an indicative marking scheme.

The lecturer may vary the assessment scheme after inspecting the assignment submissions but it will remain broadly similar to the description above.

This assignment is due

If your assignment is submitted after this date, each hour it is late reduces the maximum mark it can achieve by 3%. For example if an assignment worth 74% was submitted 5 hours late, the late submission would have no effect. If the same assignment was submitted 15 hours late it would be awarded 55%, the maximum mark it can achieve at that time.

Originally created by Sim Mautner. Updated by Zain Afzal & Andrew Bennett.