CS 111

Fall 2016

Introduction to Computer Science

Final Project


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:
  1. 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.
  2. 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.
  3. 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.
  4. A game that is quite complicated to implement. For example, Tetris.

User Interface

You have a choice:

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:

  1. Objects. Specifically, each moving item on your screen should be implemented as an object via object-oriented programming.
  2. 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.
  3. 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:

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:
  1. 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.
  2. 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.
  3. 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.
The first factor above is most important. A program that runs correctly, error-free, and achieves the above specifications will earn a better grade than an incredibly smart chess program that crashes and provides unreadable output. Of course, given two programs side-by-side that run perfectly and written with good style, the one that accomplishes more will receive the better grade.

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

Timeline

TaskDateTimeNotes
Pairing request dueMonday, 2016-10-3123:55Moodle survey.
Proposal dueFriday, 2016-11-0423:55If you need more time, ask.
Demo sessionSunday, 2016-11-2015:30–18:00Attendance required.
Project dueMonday, 2016-11-2117:00Submit 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.

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.

Resources

Remember that if you use any material that you have not created yourself (libraries, images, etc.), you need to cite it appropriately, and you need to have permission to use it. In the past, there were problems where students have missed this. You must cite any such items that you use and include the appropriate licensing information indicating that you can do so legally.

This is your chance to show some creativity. Have fun!

And have a great break, too.