CSE 231 Spring 2024
Computer Project 05
1. Assignment Overview (learning objectives)
In this assignment, you will practice with files, lists and error-handling using exceptions. You are only allowed
to use Lists and tuples. Any use of other advanced data structures (e.g., Dictionaries, Classes, etc.) will result in
a zero on the project.
2. Important Note about submission
3. Assignment Deliverable
The deliverable for this assignment is the following file:
proj05.py – the source code for your Python program
Be sure to use the specified file name and to submit it for grading via Codio before the project deadline.
4. Assignment Background
Yu-Gi-Oh! Trading Card Game which is based on the manga series of the
same name and anime spin-off series Yu-Gi-Oh! Duel Monsters both
created by Kazuki Takahashi and were released in 1996 and 2000. As the
moment of writing this project, this franchise is currently celebrating its 25th
anniversary. This franchise has developed thousands of iconic cards like:
Dark Magician, Blue-Eyes White Dragon, Elemental Hero Neos, Stardust
Dragon, and much more.
As beloved as this series is with its strategic focus on monster cards, spell,
and trap cards, it is not a hobby for everybody. Collecting some of these
cards can be expensive, especially when they are popular in the competitive
circuit. This project will read a dataset of these cards and show their prices
on the market and how much does it cost to build a deck of these cards when
bought in said market. The files used in this project were adapted from the
following sources:
1) Card data: https://www.kaggle.com/datasets/ioexception/yugioh-cards/code
2) Decklists: https://ygoprodeck.com/
This assignment is worth 50 points (5.0% of course grade), and must be completed before 11:59 PM
EST on Tuesday, March 5th.
After the due date, your score will be deducted by 10% for every 5 hours late or a fraction of it. No
submissions will be accepted after 24 hours from the due date. The penalty will be applied on the
full project score.
The project will be automatically submitted by the due date (03/05). If you want to keep working on it
after the deadline with penalty, you must manually click on “Mark as uncompleted”, acknowledge the
penalty message and manually click on “Mark as completed” when done.
CSE 231 Spring 2024
These files contain the following information of each card:
a) card_id (str): Unique card identifier
b) card_name (str): Card name
c) card_type (str): “Spell”, “Trap”, and various type of “Monster” cards
d) card_description (str): Card summoning requirements and or card effects
e) card_race (str): Card species. For example: “Spellcaster”, “Dragon”, or “Counter Trap”
f) card_archetype (str): Name of group of cards that support specific characters: “Dark
Magician”
g) card_price (float): TCG player price for the card in the second market.
5. Assignment Specifications
1. You must implement the following functions:
a) open_file (prompt_str) ---- file pointer
This function repeatedly prompts the user for a filename (using the prompt string: prompt_str) until
the file is opened successfully. An error message should be shown if the file cannot be opened (check
the starter code or the strings.txt file for the appropriate strings). It returns a file pointer.
Use try-except to determine if the file can be opened. When opening the file, you need to use
encoding=" utf-8".
fp = open(filename, "r", encoding = " utf-8")
b) read_card_data(fp) ---- List of tuples
This function is designed to parse a file containing the dataset of Yu-Gi-Oh trading cards. It takes a file
pointer object (fp) as its parameter, which is returned by the open_file function. The function
returns a list of tuples, where each tuple represents a card in the dataset.
Each tuple consists of the following columns: id, name (limited to the first 45 characters), type,
description, race, archetype, and the card's TCGPlayer price. To understand the dataset's format and
identify the column indices we are interested in, it is recommended to open the CSV files in Excel or
any text editor.
The price is converted to a float within the tuple. After assembling the list of tuples, it is sorted in
ascending order based on price first and then by name.
c) search_cards(card_data, query, category_index) ---- List of tuples
This function returns a list of cards that contain the provided query string in the given category index. It
takes as its parameters: card_data (a list of cards like the list returned by read_card_data
function), query (a string to search in a selected category), and category_index (the index of the
category to search in the CATEGORIES list provided in the starter code). The returned list should be
sorted in ascending order by price first and then by name.
For example:
query = "Dark Magician"
category_index = 1 # Name
result = [(xxxxx, "Dark Magician", ...), (xxxxx, "Dark Magician Girl", ...), ...]
CSE 231 Spring 2024
d) read_decklist(fp, card_data) ---- List of tuples
This function creates a list of cards present in the current deck list (a YDK file). It takes as its
parameters: a file pointer object (fp) to a YDK file and a card_data (a list of cards like the list
returned by read_card_data function). The YDK file contains the ID of cards in a deck where
each line in the file is a card ID. The function reads the IDs from the file and searches for all the cards
by their “id” column.
The returned list should be sorted in ascending order by price first and then by name.
e) compute_stats(card_data) List_tuples,float,List_tuples,float,List_tuples,
float
This function takes as its parameter a card_data (a list of cards like the list returned by
read_card_data function). It finds the minimum price, maximum price, and median price for all
the cards in card_data. It also finds the list of cards that have the same value as the min, max, and
median. Then, it returns the list of cards with the min price, the minimum price, the list of cards with the
max price, the maximum price, the list of cards with the median price, and the median price.
All lists should be sorted by name.
f) display_data(card_data)
This function takes as its parameter a card_data (a list of cards like the list returned by
read_card_data function). It prints the contents of each card tuple in the card_data list. Then,
it prints the total price. The table should be formatted properly. There are 5 columns in the table. First, a
header line should be displayed:
i. the string 'Name': in a field width of 50
ii. the string 'Type': in a field width of 30
iii. the string 'Race': in a field width of 20
iv. the string 'Archetype': in a field width of 40
v. the string 'TCGPlayer': in a field width of 12
Then, the cards are displayed using the following formatting:
i. Name: in a field width of 50
ii. Type: in a field width of 30
iii. Race: in a field width of 20
iv. Archetype: in a field width of 40
v. Price: in a field width of 12 with precision 2 and the comma for the thousand
Finally, a line that shows the total price which is the sum of all the card prices should be displayed using
the following formatting:
i. the string 'Total': in a field width of 50
ii. an empty string '': in a field width of 30
iii. an empty string '': in a field width of 20
iv. an empty string '': in a field width of 40
v. Total: in a field width of 12 with precision 2 and the comma for the thousand
g) display_stats(min_cards, min_price, max_cards, max_price,
median_cards, median_price)
This function prints the output from compute_stats() function. First, the minimum price is
displayed with precision 2 and comma for the thousand. It is followed by all the card names that have a
price the same as the minimum price. The function will do the same for the maximum and median price
and data.
CSE 231 Spring 2024
h) main(): This function is the starting point of the program. The program prompts the user for an option
until the user decides to stop the program:
i. Prompt the card data filename (use the correct prompt from the starter code).
ii. Read the card data file and get the list of categories and the list of card tuples.
iii. Close the file.
iv. Prompt an option
v. Option 1 (Show all cards): This option shows details about each card in the dataset. It
will find and display the number of cards in the data set. Then, use
display_data()to show information of only the cheapest 50 cards in the dataset.
Then, find and print all the cards that have the maximum price, minimum price, and the
median price using the display_stats() function.
vi. Option 2 (Search for cards): Prompt for a query string pertaining to a specific column
in the card dataset. Re-prompt for category until the user enters a valid category (a
category that is in the CATEGORY list). You should convert the input category to
lowercase since the CATEGORY list items are all lowercase strings.
Get all cards that satisfy the provided query. Find the maximum, minimum, and median
values for all resulting cards in the search. If there are any cards that satisfies the query,
display the number of cards in the results, then output the card information and the results
like option 1. Otherwise, print that there are no cards in the category.
vii. Option 3 (Search decklist): Prompt for a decklist filename and build a list of cards that
have the same “card id” in the file. Show the card information; find the maximum,
minimum, and median prices and display them.
viii. Option 4: Stop the program.
ix. If the user does not enter any of these options, the program needs to display an error
message and prompt again until a valid option is selected.
6. Assignment Notes and Hints
1. The coding standard for CSE 231 is posted on the course website:
http://www.cse.msu.edu/~cse231/General/coding.standard.html
Items 1-9 of the Coding Standard will be enforced for this project.
2. The program will produce reasonable and readable output, with appropriate labels for all values
displayed.
3. Be sure to prompt the user for the inputs in the correct order. And, your program cannot prompt the user
for any supplementary inputs.
4. We provide a proj05.py program for you to start with.
5. You are not allowed to use advanced data structures such as dictionaries, classes, etc.
6. If you “hard code” answers, you will receive a grade of zero for the whole project. An example of hard
coding is to simply print the correct highest scores of a file rather than having the program find it in the
file and then print it.
7. Suggested Procedures
• Solve the problem using pencil and paper first. You cannot write a program until you have figured out
how to solve the problem. This first step can be done collaboratively with another student. However,
once the discussion turns to Python specifics and the subsequent writing of Python statements, you must
work on your own.
CSE 231 Spring 2024
• Cycle through the following steps to incrementally develop your program:
o Edit your program to add new capabilities.
o Run the program on Spyder and fix any errors.
o Use the Codio system to submit the current version of your program.
• Be sure to use the Codio system to submit the final version of your program.
• Be sure to log out when you leave the room, if you’re working in a public lab.
The last version of your solution is the program which will be graded by your TA. You should use the Codio
system to back up your partial solutions, especially if you are working close to the project deadline. That is the
easiest way to ensure that you won’t lose significant portions of your work if your machine fails or there are
other last-minute problems.
8. Grading Rubric
Computer Project #05 Scoring Summary
General Requirements
______ (4 pts) Coding Standard 1-8
(descriptive comments, function header, etc...)
Implementation:
____ (2 pts) Pass test1
____ (2 pts) Pass test2
____ (2 pts) Pass test3
____ (2 pts) Pass test4
____ (2 pts) Pass test5
____ (2 pts) Pass test6
____ (12 pts) Pass hidden tests (4 pts each)
____ (14 pts) All functions work as specified.
(2 pt) open_file (Manual Grading)
-1 point if No try/except
-1 point if No while loop
(2 pt) read_card_data
(2 pt) read_decklist
(2 pt) search_cards
(2 pt) compute_stats
(2 pt) display_data (Manual Grading)
(2 pt) display_stats (Manual Grading)
____ (8 pts) Pass All hidden functions tests.
(2 pt) read_card_data
(2 pt) read_decklist
(2 pt) search_cards
(2 pt) compute_stats
Note:
• hard coding an answer earns zero points for the whole project.
• -10 points for not putting all your user interaction in your main().
• Use of any advanced data structures (such as lists, sets, dictionaries, classes,
etc.) earns zero points for the whole project.
CSE 231 Spring 2024
9. Test Cases
9.1 Function Unit Tests
Check the test files in the Project05 starter package. When you run one test file as you normally run a python
file in PyCharm. if an assertion error is generated, it means you failed the test. You can look at the test case .py
files to see the details for the tests.
9.2 Input/Output Tests
We provide the .txt files with all the test files (inputX.txt and output.txt where X is the test number).
If you fail a test, use diffchecker.com to check the difference between your output and the instructor output.
请加QQ:99515681 邮箱:99515681@qq.com WX:codehelp