CS 111
Fall 2016
Introduction to Computer Science
Final Project
- Choice #1: A game
- Choice #2: A graphical simulation
- Choice #3: Your own idea
- Proposal
- Grading criteria
- Logistics
Choice #1: A game
Write a game program (that is enjoyable to play).Complexity
Your project should be suitably complicated. There are lots of ways to satisfy this. For example:- A simple game that requires a smart computer as a second player. For example, making the computer play 3D tic-tac-toe, Bagels, or dots-and-boxes intelligently is an interesting problem.
- A more complicated asymmetric (two-player) game. For example, in a tower defense game, the computer doesn't have to be too bright, but the game is still fun for the person playing it.
- A (one-player) game that requires a smart computer. For example, a puzzle game, where the complexity of the project comes from making the computer intelligently generate a game board that is playable.
- A game that is quite complicated to implement. For example, Tetris.
User Interface
You have a choice:- Graphical interface. Given the experiences you have had this term with graphics, you may want the challenge of implementing interactive graphics. You'll probably need to give the user a way to use the keyboard and the mouse to interact with a graphics window. The sample programs clickablewindow.py, typeablewindow.py, and twowindows.py should help you get started.
- Textual interface. Graphics are not necessary to make a fun game. If you would rather put more effort in to the logic of a game, you may want to use a text-based interface. The module colour.py allow you to output text in colour, if desired.
Scope
In the end, the approaches can be: make the game fun, make the computer smart, or both.You only have two weeks, and you have an exam in the meantime, so pick a game that's simple enough that you can get the job done in time. Tic-tac-toe is simple enough, but is most likely quite boring. Poker is way too complex if you are going to consider any kind of computer intelligence, yet ends up somewhat simplistic as just a game without it. Go Fish is feasible. Chess is not.
I asked a previous CS111 instructor for a list of games that worked well and some that did not. When in doubt, please feel free to chat with me before sinking too much time in your project.
Choice #2: A graphical simulation
One of the things computers are good at is simulation of systems that evolve over time. Consider, for example, a computer model of the solar system. You can give the computer the initial positions, masses, and velocities of the largest objects in the solar system, plus a computational mechanism for simulating the effects of Newton's law of gravitation. Then you can set the system running, and your solar system will go through its motions. You could then try adding a comet with a mouse click or two, and watch how the comet's orbit is perturbed by close encounters with planets or asteroids. If the simulation takes relevant physical laws into account, the evolution of the system will be a good representation of the workings of the real solar system.
If you choose this project, you will simulate some time-dependent system that can be represented effectively in a rectangular display. You could show a top view of the solar system, or a side view of an aquarium, or a landscape with rain, clouds, plants, and birds. Your system will need to be animated, and there will need to be a diverse enough collection of elements to your system that the objects will have interactions of some kind. Planets, for example, interact gravitationally, big fish eat little fish, and raindrops cause plants to grow.
Your simulation may include pretty much any features you can cook up, but its minimal features must include:
- Objects. Specifically, each moving item on your screen should be implemented as an object via object-oriented programming.
- Interactions between objects. It isn't sufficient to pre-program in advance what your objects will do, or have them only update themselves via some sort of loop. (That's boring.) The objects must interact with each other. Two objects can collide, for example, and change direction.
- User interaction. Some feature that allows either mouse-clicks or keystrokes to affect the simulation in some way (click to create a plant, or hit the "+" key to speed up the simulation, or click on a fish to see a window pop up containing the fish's vital statistics, etc.) This must work while the simulation is running; it isn't enough to ask the user a question at the beginning, and run the simulation autonomously from there.
Choice #3: Your own idea
Would you like to apply what you're learning about computing to something in another discipline? Perhaps you want to do some kind of modeling or analysis of data; perhaps you want to do something artistic. Talk to me about it.Proposal
In past CS111 final projects, the biggest trap that students have fallen into is picking something too complex and not having the time to finish it. That's why I'm asking you to submit a design document describing what your project will do:- Describe your project: what game you will implement, what you will simulate, etc.
- A careful description of the more complicated aspects: algorithms you hope to implement in your game, interactions between objects in your simulation, etc.
- An incremental development plan: your plan of attack so that, if you were to run out of time, you will have some kind of minimal viable project to turn in that can run error-free and do something.
We will not be grading this for correctness, but rather to help you do a better job at getting your project done. The more info you provide, the better we can do at helping to steer you in the right direction. The design document should be at least a page in length, and should be as detailed as you can make it at this stage.
Grading criteria
I will grade the projects based on the following factors, in the following order:- Correctness.
- Does it run? If it doesn't, I can't test it, and thus I can't grade it.
- Does it work correctly? Correctness is the most important thing, though by no means the only thing. Your program should work. If it doesn't do exactly what it was intended to do, you should provide a discussion of that fact in your documentation.
- Style.
How cleanly the program is written and how easy it is to read.
- Is it well organized? We have talked about principles to use when designing a class, splitting problems into functions, etc. Think about those ideas as you develop your code.
- Is it well documented? Your code is a piece of writing directed to two audiences—human readers and the Python interpreter. You need to make the code readable to both of them, and clear commenting is an essential part of what you do for your human readers.
- Is it written with good style? Descriptive variable/function/parameter names, consistent indentation and placement of braces, and appropriate comments are the fundamentals of good coding style.
- Complexity and ambition. A project that involves complex ideas or implementations is clearly cooler than a simple one. If two projects are functional, well-documented, and exhibit good style, the one that does a more interesting or ambitious thing is likely to get the better grade. A good version of Battleship will probably get a better grade than a good version of tic-tac-toe. On the other hand, a really outstanding tic-tac-toe program can certainly get an A.
To reiterate: It is most important to submit something that works. Follow an incremental development plan. Set modest goals and achieve them first, then enhance your program later.
On academic dishonesty:
You must submit a program that you write yourself. You may obtain help from
other students in getting ideas, but you must write your own program. If you
choose to utilize libraries (such as graphics.py
), you must
clearly acknowledge them. Make sure to re-read the section of the course
syllabus regarding "academic honesty and collaboration policy."
Logistics
Pairing
- You may work solo or with one other person from the class.
- You may request any partner, regardless of whether you worked together before.
- If two people mutually request each other as the desired partner, I will almost certainly pair you up.
- For the remaining students, I will avoid pairing one taking this class for grades with one taking this class S/Cr/NC.
Timeline
Task | Date | Time | Notes |
---|---|---|---|
Pairing request due | Monday, 2016-10-31 | 23:55 | Moodle survey. |
Proposal due | Friday, 2016-11-04 | 23:55 | If you need more time, ask. |
Demo session | Sunday, 2016-11-20 | 15:30–18:00 | Attendance required. |
Project due | Monday, 2016-11-21 | 17:00 | Submit on Moodle. |
Demo Session
As stated in the syllabus, you will demo your project during our scheduled final exam block. Your attendance is required.Final Submission
In addition to submitting your Python file(s) and any other files your
program needs, you should submit the following items of documentation in a
readme.txt
file. You may be brief.
- A description of your program and its features.
- A brief description and justification of how it is constructed: classes, functions, etc.
- A discussion of the current status of your program, what works and what doesn't, etc.
- How to use your program, if it is not obvious.
- Anything else you want me to know about your program should be written in this file.
Submit the files to Moodle, either individually or in a zip
or tar
archive.
The project is due at the end of the final exam period. I CANNOT GRANT AN EXTENSION BEYOND THE END OF FINAL EXAMS UNDER ANY CIRCUMSTANCES. The College has strict policies that forbid faculty from taking assignments any later than the end of final exams without an extension granted by the Dean of Students office.