diff --git a/_pages/2019/ap/honesty.adoc b/_pages/2019/ap/honesty.adoc index 058d27d68..f79ff13a5 100644 --- a/_pages/2019/ap/honesty.adoc +++ b/_pages/2019/ap/honesty.adoc @@ -1,7 +1,3 @@ ---- -published: false ---- - == Academic Honesty This course's philosophy on academic honesty is best stated as "be reasonable." The course recognizes that interactions with classmates and others can facilitate mastery of the course's material. However, there remains a line between enlisting the help of another and submitting the work of another. This policy characterizes both sides of that line. diff --git a/_pages/2019/ap/problems/hello/hello.adoc b/_pages/2019/ap/problems/hello/hello.adoc index 9cbeea92c..10d362455 100644 --- a/_pages/2019/ap/problems/hello/hello.adoc +++ b/_pages/2019/ap/problems/hello/hello.adoc @@ -49,7 +49,7 @@ Okay, let's create a folder (otherwise known as a *directory*) in which your cod Front and center in the CS50 IDE workspace is a window wherein you'll be able to write your code. Right now, assuming you haven't played around with the tabs, that window is blank. -Let's create a new file to play around with. Right-click on your newly-created `hello` folder and choose *New File* from the context menu. Then, double-click on this new file (which should hopefully be called `Untitled` and which should be nested beneath `hello` in the file tree), and a blank window should open up in Ace with the tab for `Untitled` as the active one. +Let's create a new file to play around with. Right-click on your newly-created `hello` folder and choose *New File* from the context menu. Then, double-click on this new file (which should hopefully be called `Untitled` and which should be nested beneath `hello` in the file tree), and a blank window should open up a tab for `Untitled` as the active one. Go ahead and type `hello` (or the ever-popular `asdf`) on line 1 of the document, and then notice how the tab's name now contains a red dot, indicating that you've made changes since the file was first opened. Select *File > Save*, and that red dot should turn green and then disappear, indicating all of our changes are saved. diff --git a/_pages/2019/ap/problems/mario/less/mario.adoc b/_pages/2019/ap/problems/mario/less/mario.adoc index bad252346..3337ad2f9 100644 --- a/_pages/2019/ap/problems/mario/less/mario.adoc +++ b/_pages/2019/ap/problems/mario/less/mario.adoc @@ -36,8 +36,8 @@ image:pyramid.png[Super Mario Brothers, width="50%"] == Specification * Write, in a file called `mario.c` in your `~/chapter1/mario/` directory, a program that recreates this half-pyramid using hashes (`#`) for blocks. -* To make things more interesting, first prompt the user for the half-pyramid's height, a non-negative integer no greater than `23`. (The height of the half-pyramid pictured above happens to be `8`.) -* If the user fails to provide a non-negative integer no greater than `23`, you should re-prompt for the same again. +* To make things more interesting, first prompt the user for the half-pyramid's height, a non-negative integer no greater than `8`. (The height of the half-pyramid pictured above is indeed `8`.) +* If the user fails to provide a non-negative integer no greater than `8`, you should re-prompt for the same again. * Then, generate (with the help of `printf` and one or more loops) the desired half-pyramid. * Take care to align the bottom-left corner of your half-pyramid with the left-hand edge of your terminal window. diff --git a/_pages/2019/x/project/project.adoc b/_pages/2019/x/project/project.adoc index b06d1f291..5cce29bb3 100644 --- a/_pages/2019/x/project/project.adoc +++ b/_pages/2019/x/project/project.adoc @@ -27,7 +27,7 @@ submit50 cs50/problems/2019/x/project === Step 2 of 2 -Submit a short video (that's no more than 2 minutes in length) in which you present your project to the world, as with slides, screenshots, voiceover, and/or live action. Your video should somehow include your project's title, your name, your city and country, and any other details that you'd like to convey to viewers. See http://www.cs171.org/2015/screencast/ for tips from another class at Harvard on how to make a "screencast," though you're welcome to use an actual camera. Upload your video to YouTube (or, if blocked in your country, a similar site) and take note of its URL; it's fine to flag it as "unlisted," but don't flag it as "private." +Submit a short video (that's no more than 2 minutes in length) in which you present your project to the world, as with slides, screenshots, voiceover, and/or live action. Your video should somehow include your project's title, your name, your city and country, and any other details that you'd like to convey to viewers. See https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/ for tips on how to make a "screencast," though you're welcome to use an actual camera. Upload your video to YouTube (or, if blocked in your country, a similar site) and take note of its URL; it's fine to flag it as "unlisted," but don't flag it as "private." When ready to submit your video, submit https://forms.cs50.net/2019/x/project[this form]! diff --git a/_pages/2019/x/psets/0/scratch.md b/_pages/2019/x/psets/0/scratch.md index c0c68d52b..78f548bcc 100644 --- a/_pages/2019/x/psets/0/scratch.md +++ b/_pages/2019/x/psets/0/scratch.md @@ -52,15 +52,9 @@ This step assumes that you've downloaded your [Scratch](scratch.md) project as a 1. Visit [this link](https://submit.cs50.io/invites/9770b67479384c4d8c37790779e466d9) to enroll in CS50x on submit.cs50.io. Log in with your GitHub account, and click **Authorize cs50**. 1. Check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. -1. Go to `https://github.com/me50/USERNAME`, replacing `USERNAME` in the URL with your own GitHub username. -1. If you see the sentence "We recommend every repository include a README, LICENSE, and .gitignore.", click the blue README link in that sentence. On the next page, scroll down and click the Green "**Commit**" button. -1. On the left side of the screen, click on **Branch: master**. -1. In the field that says **Find or create a branch...**, copy and paste precisely this value, `cs50/problems/2019/x/scratch`, then click **Create branch**. That value is just a unique identifier for this problem. -1. Click the button that says **Upload files**. -1. Drag your `.sb3` file into the box that says **Drag files here**. -1. Click the green **Commit changes** button. +1. Go to [https://submit.cs50.io/upload/cs50/problems/2019/x/scratch](https://submit.cs50.io/upload/cs50/problems/2019/x/scratch). +1. Click "Choose File" and choose your `.sb3` file. Click **Submit**. -That's it! If you visit the course gradebook at [cs50.me/cs50x](https://cs50.me/cs50x), you should see your score within a few minutes. From that page, you can also click on the "View Submissions" link to see deatils about your submission. If you click on the **check50** link next to the submission, you should see which requirements your project met. You are welcome to resubmit as many times as you'd like! - -If you don't see any results in [your gradebook](https://cs50.me/cs50x) after a few minutes, make sure that your branch is named `cs50/problems/2019/x/scratch`. If you mistyped it the first time, you should create a new branch (repeating steps 6 and 7), making sure to name it `cs50/problems/2019/x/scratch`! +That's it! Once your submission uploads, you should be redirected to your submission page. After your submission is graded, you can click on the **check50** link next to the submission to see which requirements your project met. You are welcome to resubmit as many times as you'd like! +To view your current progress in the course, visit the course gradebook at [cs50.me/cs50x](https://cs50.me/cs50x)! diff --git a/_pages/2019/x/psets/4/speller/hashtable/speller.adoc b/_pages/2019/x/psets/4/speller/hashtable/speller.adoc index 754a54973..3bff89b65 100644 --- a/_pages/2019/x/psets/4/speller/hashtable/speller.adoc +++ b/_pages/2019/x/psets/4/speller/hashtable/speller.adoc @@ -319,18 +319,16 @@ How to assess just how fast (and correct) your code is? Well, as always, feel fr ~cs50/2019/x/pset4/speller dictionaries/large texts/lalaland.txt ---- -///// == Big Board And if you'd like to put your code to the test against classmates' code (just for fun), execute the command below to challenge the Big Board before or after you submit. [source] ---- -check50 cs50/problems/2019/x/challenges/speller +submit50 cs50/problems/2019/x/challenges/speller ---- -Then visit the URL that `check50` outputs to see where you rank! -///// +Then visit the URL that `submit50` outputs (after a few minutes!) to see where you rank! == How to Submit diff --git a/_pages/2019/x/psets/4/speller/trie/speller.adoc b/_pages/2019/x/psets/4/speller/trie/speller.adoc index f276a050c..7bf69ff43 100644 --- a/_pages/2019/x/psets/4/speller/trie/speller.adoc +++ b/_pages/2019/x/psets/4/speller/trie/speller.adoc @@ -317,18 +317,16 @@ How to assess just how fast (and correct) your code is? Well, as always, feel fr ~cs50/2019/x/pset4/speller dictionaries/large texts/lalaland.txt ---- -///// == Big Board And if you'd like to put your code to the test against classmates' code (just for fun), execute the command below to challenge the Big Board before or after you submit. [source] ---- -check50 cs50/problems/2019/x/challenges/speller +submit50 cs50/problems/2019/x/challenges/speller ---- -Then visit the URL that `check50` outputs to see where you rank! -///// +Then visit the URL that `check50` outputs (after a few minutes!) to see where you rank! == How to Submit diff --git a/_pages/2019/x/psets/8/finance/finance.adoc b/_pages/2019/x/psets/8/finance/finance.adoc index 5f2e4bc36..82e7ce33b 100644 --- a/_pages/2019/x/psets/8/finance/finance.adoc +++ b/_pages/2019/x/psets/8/finance/finance.adoc @@ -17,7 +17,57 @@ If you're not quite sure what it means to buy and sell stocks (i.e., shares of a You're about to implement C$50 Finance, a web app via which you can manage portfolios of stocks. Not only will this tool allow you to check real stocks' actual prices and portfolios' values, it will also let you buy (okay, "buy") and sell (okay, "sell") stocks by querying https://iextrading.com/developer/[IEX] for stocks' prices. -Indeed, IEX lets you download stock quotes via their API (application programming interface) using URLs like https://api.iextrading.com/1.0/stock/NFLX/quote. Notice how Netflix's symbol (NFLX) is embedded in this URL; that's how IEX knows whose data to return. If you follow that link, you'll see a reponse in JSON (JavaScript Object Notation) format. It's a bit messy, but notice how, between the curly braces, there's a comma-separated list of key-value pairs, with a colon separating each key from its value. +Indeed, IEX lets you download stock quotes via their API (application programming interface) using URLs like `https://cloud-sse.iexapis.com/stable/stock/nflx/quote?token=API_KEY`. Notice how Netflix's symbol (NFLX) is embedded in this URL; that's how IEX knows whose data to return. That link won't actually return any data because IEX requires you to use an API key (more about that in a bit), but if it did, you'd see a response in JSON (JavaScript Object Notation) format like this: + +[source,json] +---- +{ + "symbol": "NFLX", + "companyName": "Netflix, Inc.", + "primaryExchange": "NASDAQ", + "calculationPrice": "close", + "open": 317.49, + "openTime": 1564752600327, + "close": 318.83, + "closeTime": 1564776000616, + "high": 319.41, + "low": 311.8, + "latestPrice": 318.83, + "latestSource": "Close", + "latestTime": "August 2, 2019", + "latestUpdate": 1564776000616, + "latestVolume": 6232279, + "iexRealtimePrice": null, + "iexRealtimeSize": null, + "iexLastUpdated": null, + "delayedPrice": 318.83, + "delayedPriceTime": 1564776000616, + "extendedPrice": 319.37, + "extendedChange": 0.54, + "extendedChangePercent": 0.00169, + "extendedPriceTime": 1564876784244, + "previousClose": 319.5, + "previousVolume": 6563156, + "change": -0.67, + "changePercent": -0.0021, + "volume": 6232279, + "iexMarketPercent": null, + "iexVolume": null, + "avgTotalVolume": 7998833, + "iexBidPrice": null, + "iexBidSize": null, + "iexAskPrice": null, + "iexAskSize": null, + "marketCap": 139594933050, + "peRatio": 120.77, + "week52High": 386.79, + "week52Low": 231.23, + "ytdChange": 0.18907500000000002, + "lastTradeTime": 1564776000616 +} +---- + +Notice how, between the curly braces, there's a comma-separated list of key-value pairs, with a colon separating each key from its value. Let's turn our attention now to this problem's distribution code! diff --git a/_pages/games/2019/x/assignments/0/assignment0.md b/_pages/games/2019/x/assignments/0/assignment0.md index 99ecebb0a..d81b4ad82 100644 --- a/_pages/games/2019/x/assignments/0/assignment0.md +++ b/_pages/games/2019/x/assignments/0/assignment0.md @@ -58,7 +58,7 @@ paddle (or both, if desired) try to deflect the paddle on their own, you've done ## How to Submit -1. Visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. Visit [this link](https://submit.cs50.io/invites/46e6f2ea29954ce9bb1bdc478a440055), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. [Install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). 1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/0` or, if you've installed `submit50`, execute @@ -69,3 +69,5 @@ paddle (or both, if desired) try to deflect the paddle on their own, you've done instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/3f2958dd-e506-4232-970c-c51c62b94ae1). + +You can then go to [https://cs50.me/cs50g](https://cs50.me/cs50g) to view your current progress! diff --git a/_pages/games/2019/x/assignments/1/assignment1.md b/_pages/games/2019/x/assignments/1/assignment1.md index 60f24e5b6..e488f3b92 100644 --- a/_pages/games/2019/x/assignments/1/assignment1.md +++ b/_pages/games/2019/x/assignments/1/assignment1.md @@ -58,7 +58,7 @@ cap it off, display a pause icon in the middle of the screen, nice and large, so ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/46e6f2ea29954ce9bb1bdc478a440055), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/1` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -68,3 +68,5 @@ cap it off, display a pause icon in the middle of the screen, nice and large, so instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/3f2958dd-e506-4232-970c-c51c62b94ae1). + +You can then go to [https://cs50.me/cs50g](https://cs50.me/cs50g) to view your current progress! diff --git a/_pages/games/2019/x/assignments/10/assignment10.md b/_pages/games/2019/x/assignments/10/assignment10.md index 602c45cb4..bd40d9df1 100644 --- a/_pages/games/2019/x/assignments/10/assignment10.md +++ b/_pages/games/2019/x/assignments/10/assignment10.md @@ -37,7 +37,7 @@ Your goal this assignment: ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/46e6f2ea29954ce9bb1bdc478a440055), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/10` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -47,3 +47,5 @@ Your goal this assignment: instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/3f2958dd-e506-4232-970c-c51c62b94ae1). + +You can then go to [https://cs50.me/cs50g](https://cs50.me/cs50g) to view your current progress! diff --git a/_pages/games/2019/x/assignments/2/assignment2.md b/_pages/games/2019/x/assignments/2/assignment2.md index 0ca38cf1f..20e9d3104 100644 --- a/_pages/games/2019/x/assignments/2/assignment2.md +++ b/_pages/games/2019/x/assignments/2/assignment2.md @@ -35,7 +35,7 @@ Your goals this assignment: ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/46e6f2ea29954ce9bb1bdc478a440055), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/2` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -45,3 +45,5 @@ Your goals this assignment: instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/3f2958dd-e506-4232-970c-c51c62b94ae1). + +You can then go to [https://cs50.me/cs50g](https://cs50.me/cs50g) to view your current progress! diff --git a/_pages/games/2019/x/assignments/3/assignment3.md b/_pages/games/2019/x/assignments/3/assignment3.md index 24a13612c..dd3dc817f 100644 --- a/_pages/games/2019/x/assignments/3/assignment3.md +++ b/_pages/games/2019/x/assignments/3/assignment3.md @@ -40,7 +40,7 @@ Your goals this assignment: ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/46e6f2ea29954ce9bb1bdc478a440055), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/3` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -50,3 +50,5 @@ Your goals this assignment: instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/3f2958dd-e506-4232-970c-c51c62b94ae1). + +You can then go to [https://cs50.me/cs50g](https://cs50.me/cs50g) to view your current progress! diff --git a/_pages/games/2019/x/assignments/4/assignment4.md b/_pages/games/2019/x/assignments/4/assignment4.md index db2154d7f..f5c470a9a 100644 --- a/_pages/games/2019/x/assignments/4/assignment4.md +++ b/_pages/games/2019/x/assignments/4/assignment4.md @@ -38,7 +38,7 @@ Your goals this assignment: ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/46e6f2ea29954ce9bb1bdc478a440055), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/4` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -48,3 +48,5 @@ Your goals this assignment: instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/3f2958dd-e506-4232-970c-c51c62b94ae1). + +You can then go to [https://cs50.me/cs50g](https://cs50.me/cs50g) to view your current progress! diff --git a/_pages/games/2019/x/assignments/5/assignment5.md b/_pages/games/2019/x/assignments/5/assignment5.md index b4f4130c5..d9a461cf4 100644 --- a/_pages/games/2019/x/assignments/5/assignment5.md +++ b/_pages/games/2019/x/assignments/5/assignment5.md @@ -35,7 +35,7 @@ Your goals this assignment: ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/46e6f2ea29954ce9bb1bdc478a440055), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/5` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -45,3 +45,5 @@ Your goals this assignment: instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/3f2958dd-e506-4232-970c-c51c62b94ae1). + +You can then go to [https://cs50.me/cs50g](https://cs50.me/cs50g) to view your current progress! diff --git a/_pages/games/2019/x/assignments/6/assignment6.md b/_pages/games/2019/x/assignments/6/assignment6.md index a36555cc8..dc2ca4399 100644 --- a/_pages/games/2019/x/assignments/6/assignment6.md +++ b/_pages/games/2019/x/assignments/6/assignment6.md @@ -31,7 +31,7 @@ Your goal this assignment: ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/46e6f2ea29954ce9bb1bdc478a440055), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/6` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -41,3 +41,5 @@ Your goal this assignment: instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/3f2958dd-e506-4232-970c-c51c62b94ae1). + +You can then go to [https://cs50.me/cs50g](https://cs50.me/cs50g) to view your current progress! diff --git a/_pages/games/2019/x/assignments/7/assignment7.md b/_pages/games/2019/x/assignments/7/assignment7.md index c505a1a8a..5b2d6340c 100644 --- a/_pages/games/2019/x/assignments/7/assignment7.md +++ b/_pages/games/2019/x/assignments/7/assignment7.md @@ -31,7 +31,7 @@ Your goal this assignment: ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/46e6f2ea29954ce9bb1bdc478a440055), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/7` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -41,3 +41,5 @@ Your goal this assignment: instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/3f2958dd-e506-4232-970c-c51c62b94ae1). + +You can then go to [https://cs50.me/cs50g](https://cs50.me/cs50g) to view your current progress! diff --git a/_pages/games/2019/x/assignments/8/assignment8.md b/_pages/games/2019/x/assignments/8/assignment8.md index bdaf3ff0c..0baee12d6 100644 --- a/_pages/games/2019/x/assignments/8/assignment8.md +++ b/_pages/games/2019/x/assignments/8/assignment8.md @@ -48,7 +48,7 @@ Your goal this assignment: ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/46e6f2ea29954ce9bb1bdc478a440055), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/8` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -58,3 +58,5 @@ Your goal this assignment: instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/3f2958dd-e506-4232-970c-c51c62b94ae1). + +You can then go to [https://cs50.me/cs50g](https://cs50.me/cs50g) to view your current progress! diff --git a/_pages/games/2019/x/assignments/9/assignment9.md b/_pages/games/2019/x/assignments/9/assignment9.md index 3f56ef6e5..e65185786 100644 --- a/_pages/games/2019/x/assignments/9/assignment9.md +++ b/_pages/games/2019/x/assignments/9/assignment9.md @@ -35,7 +35,7 @@ Your goal this assignment: ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/46e6f2ea29954ce9bb1bdc478a440055), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/9` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -45,3 +45,5 @@ Your goal this assignment: instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/3f2958dd-e506-4232-970c-c51c62b94ae1). + +You can then go to [https://cs50.me/cs50g](https://cs50.me/cs50g) to view your current progress! diff --git a/_pages/games/2019/x/project/project.md b/_pages/games/2019/x/project/project.md index 62c25fca9..3a9ce7168 100644 --- a/_pages/games/2019/x/project/project.md +++ b/_pages/games/2019/x/project/project.md @@ -20,7 +20,7 @@ It's time to begin the course's culmination: your final project! While most of t ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/46e6f2ea29954ce9bb1bdc478a440055), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/final` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -30,3 +30,5 @@ It's time to begin the course's culmination: your final project! While most of t instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/3f2958dd-e506-4232-970c-c51c62b94ae1). + +You can then go to [https://cs50.me/cs50g](https://cs50.me/cs50g) to view your current progress! diff --git a/_pages/mobile/2019/x/projects/0/project0.md b/_pages/mobile/2019/x/projects/0/project0.md index ae2dd3507..f6435962f 100644 --- a/_pages/mobile/2019/x/projects/0/project0.md +++ b/_pages/mobile/2019/x/projects/0/project0.md @@ -35,7 +35,7 @@ To get started, follow the directions in your project README. ## How to Submit -1. Visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. Visit [this link](https://submit.cs50.io/invites/107c19b133014e90b0c379f4107794e8), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. [Install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). 1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `mobile50/projects/2019/x/0` or, if you've installed `submit50`, execute @@ -46,3 +46,5 @@ To get started, follow the directions in your project README. instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/b92d65c7-6dd0-40d3-93a8-75cc12cf2aed). + +You can then go to [https://cs50.me/cs50m](https://cs50.me/cs50m) to view your current progress! diff --git a/_pages/mobile/2019/x/projects/1/project1.md b/_pages/mobile/2019/x/projects/1/project1.md index 6fb88b7b2..505ced64a 100644 --- a/_pages/mobile/2019/x/projects/1/project1.md +++ b/_pages/mobile/2019/x/projects/1/project1.md @@ -34,7 +34,7 @@ To get started, follow the directions in your project README. ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/107c19b133014e90b0c379f4107794e8), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `mobile50/projects/2019/x/1` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -44,3 +44,5 @@ To get started, follow the directions in your project README. instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/b92d65c7-6dd0-40d3-93a8-75cc12cf2aed). + +You can then go to [https://cs50.me/cs50m](https://cs50.me/cs50m) to view your current progress! diff --git a/_pages/mobile/2019/x/projects/2/project2.md b/_pages/mobile/2019/x/projects/2/project2.md index bfb785bdf..91bc2cb61 100644 --- a/_pages/mobile/2019/x/projects/2/project2.md +++ b/_pages/mobile/2019/x/projects/2/project2.md @@ -39,7 +39,7 @@ To get started, follow the directions in your project README. ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/107c19b133014e90b0c379f4107794e8), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `mobile50/projects/2019/x/2` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -49,3 +49,5 @@ To get started, follow the directions in your project README. instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/b92d65c7-6dd0-40d3-93a8-75cc12cf2aed). + +You can then go to [https://cs50.me/cs50m](https://cs50.me/cs50m) to view your current progress! diff --git a/_pages/mobile/2019/x/projects/final/final.md b/_pages/mobile/2019/x/projects/final/final.md index f2c30a12f..daf5084ff 100644 --- a/_pages/mobile/2019/x/projects/final/final.md +++ b/_pages/mobile/2019/x/projects/final/final.md @@ -19,7 +19,7 @@ layout: mobile/2019/m ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't done so already, visit [this link](https://submit.cs50.io/invites/107c19b133014e90b0c379f4107794e8), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `mobile50/projects/2019/x/final` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -29,3 +29,5 @@ layout: mobile/2019/m instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/b92d65c7-6dd0-40d3-93a8-75cc12cf2aed). + +You can then go to [https://cs50.me/cs50m](https://cs50.me/cs50m) to view your current progress! diff --git a/_pages/ocw/games/assignments/0/assignment0.md b/_pages/ocw/games/assignments/0/assignment0.md new file mode 100644 index 000000000..36c9df444 --- /dev/null +++ b/_pages/ocw/games/assignments/0/assignment0.md @@ -0,0 +1,70 @@ +--- +layout: games/2019/g +--- + +# Assignment 0: "Pong, The AI Update" + +## Objectives + +* Read and understand all of the Pong source code from Lecture 0. +* Implement a basic AI for either Player 1 or 2 (or both!). + +### Your First Game + +Download the distribution code for your first game from and unzip `assignment0.zip`, which should yield a directory called `assignment0`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `assignment0` +(recall that the `cd` command can change your current directory), and run + +``` +cd assignment0 +``` + +## It's Game Time + +Your first assignment in the course will be a fairly easy one, +since the dive into game programming can be deep enough as it is without having to implement an +entire code base from scratch! Instead, we'll take the Pong example we covered in class and +extend it in a small but fun way by giving one of the paddles (or perhaps both) logic for playing +the game so that you don't always need a buddy to play the game with you! We'll approach problem +sets in the course this way generally, taking the full code bases we've used in lecture and extending +them so that you'll get plenty of experience interacting with fully implemented games. You can even +use these projects as templates and jumping boards for your own games! + +Of course, the code won't run if you don't have LÖVE2D installed, so we'll have to tackle that in addition to +grabbing the code; the course uses version 0.10.2 for its source code, so do just choose the appropriate distribution of that version for your system here: + +[https://bitbucket.org/rude/love/downloads/](https://bitbucket.org/rude/love/downloads/) + +For further information on how to actually run games, do just visit the following page: + +[https://love2d.org/wiki/Getting_Started](https://love2d.org/wiki/Getting_Started) + +Once the code and LÖVE2D have been downloaded and installed, the actual change you'll be making to the code base is +small, but it will require you to understand what many of the pieces do, so be sure to watch Lecture 0 and read +through the code so you have a firm understanding of how it works before diving in! In particular, take note of how +paddle movement works, reading both the `Paddle` class as well as the code in `main.lua` that actually drives the +movement, located in the `update` function (currently done using keyboard input for each). If our agent's goal is +just to deflect the ball back toward the player, what needs to drive its movement? + +Your goal: + +* Implement an AI-controlled paddle (either the left or the right will do) such that it will try to deflect +the ball at all times. Since the paddle can move on only one axis (the Y axis), you will need to determine how to +keep the paddle moving in relation to the ball. Currently, each paddle has its own chunk of code where input is +detected by the keyboard; this feels like an excellent place to put the code we need! Once either the left or right +paddle (or both, if desired) try to deflect the paddle on their own, you've done it! + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/0` or, if you've installed `submit50`, execute + + ``` + submit50 games50/assignments/2019/x/0 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/6d2b0089-06f9-4072-9598-6c4e85730aa5). diff --git a/_pages/ocw/games/assignments/1/assignment1.md b/_pages/ocw/games/assignments/1/assignment1.md new file mode 100644 index 000000000..7b1a4a26e --- /dev/null +++ b/_pages/ocw/games/assignments/1/assignment1.md @@ -0,0 +1,70 @@ +--- +layout: games/2019/g +--- + +# Assignment 1: "Flappy Bird, The Reward Update" + +## Objectives + +* Read and understand all of the Flappy (Fifty!) Bird source code from Lecture 1. +* Influence the generation of pipes so as to bring about more complicated level generation. +* Give the player a medal for their performance, along with their score. +* Implement a pause feature, just in case life gets in the way of jumping through pipes! + +## Getting Started + +Download the distro code for your first game from and unzip `assignment1.zip`, which should yield a directory called `assignment1`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `assignment1` +(recall that the `cd` command can change your current directory), and run + +``` +cd assignment1 +``` + +## Flapping Your Wings + +Your second assignment won't be quite as easy as last week's, but don't worry! The pieces, taken one at a time, +are still quite bite-sized and manageable and will mainly be a recap of what we've covered thoroughly in lecture +leading up to this point :) For a refresher on LÖVE2D, as well as some helpful links for getting started, do just +visit the following: + +[https://love2d.org/](https://love2d.org/) + +[https://love2d.org/wiki/Getting_Started](https://love2d.org/wiki/Getting_Started) + +Be sure to watch Lecture 1 and read through the code so you have a firm understanding of how it works before diving in! +In particular, take note of where the logic is for spawning pipes and the parameters that drive both the gap between pipes +and the interval at which pipes spawn, as those will be two primary components of this update! You'll be making some notable +changes to the ScoreState, so be sure to read through that as well and get a sense for how images are stored, since you'll be +incorporating your own! Lastly, think about what you need in order to incorporate a pause feature (a simple version of which +we saw in lecture!). And if we want to pause the music, we'll probably need a method to do this that belongs to the audio object +LÖVE gives us when we call `love.audio.newSource`; try browsing the documentation on the LÖVE2D wiki to find out what it is! + +Your goals this assignment: + +* Randomize the gap between pipes (vertical space), such that they're no longer hardcoded to 90 pixels. +* Randomize the interval at which pairs of pipes spawn, such that they're no longer always 2 seconds apart. +* When a player enters the ScoreState, award them a "medal" via an image displayed along with the score; this can be any image or +any type of medal you choose (e.g., ribbons, actual medals, trophies, etc.), so long as each is different and based on the points they +scored that life. Choose 3 different ones, as well as the minimum score needed for each one (though make it fair and not too hard to +test :)). +* Implement a pause feature, such that the user can simply press "P" (or some other key) and pause the state of the game. This pause +effect will be slightly fancier than the pause feature we showed in class, though not ultimately that much different. When they pause +the game, a simple sound effect should play (I recommend testing out bfxr for this, as seen in Lecture 0!). At the same time this sound +effect plays, the music should pause, and once the user presses P again, the gameplay and the music should resume just as they were! To +cap it off, display a pause icon in the middle of the screen, nice and large, so as to make it clear the game is paused. + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/1` or, if you've installed `submit50`, execute + + ``` + submit50 games50/assignments/2019/x/1 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/6d2b0089-06f9-4072-9598-6c4e85730aa5). diff --git a/_pages/ocw/games/assignments/10/assignment10.md b/_pages/ocw/games/assignments/10/assignment10.md new file mode 100644 index 000000000..0c0bec7e8 --- /dev/null +++ b/_pages/ocw/games/assignments/10/assignment10.md @@ -0,0 +1,49 @@ +--- +layout: games/2019/g +--- + +# Assignment 10: "Portal, The ProBuilder Update" + +## Objectives + +* Create your own level in a new scene using ProBuilder and ProGrids! +* Ensure that the level has an `FPSController` to navigate with in the scene. +* Ensure that there is an object or region with a trigger at the very end that will trigger the end of the level (some zone with an invisible `BoxCollider` will work). +* When the level ends, display "You Won!" on the screen with a `Text` object. + +## Getting Started + +Download the distro code for your first game from and unzip `assignment10.zip`, which should yield a directory called `assignment10`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `assignment10` +(recall that the `cd` command can change your current directory), and run + +``` +cd assignment10 +``` + +## Becoming a Pro + +Welcome to your tenth and final assignment! This assignment is going to be a fun conclusion to what's been a challenging but hopefully exciting term! Rather than build upon Portal in this example, and to afford you some extra time for your final project (and hopefully save a little stress!), we're going to leverage some of Unity's brand-new tools to create a level! ProBuilder and ProGrids are a key feature that's changed the game for Unity, and having them makes creating game worlds (and more!) all the easier. + +Your goal this assignment: + +* *Create your own level in a new scene using ProBuilder and ProGrids!* The distro should already have ProBuilder and ProGrids imported and ready for use, but just in case they aren't, you can easily find them by searching in the Asset Store (where they are now free, thanks to Unity having acquired them!). There are many resources for learning how to use ProGrids effectively, but two resources in particular that are worth checking out are [here](https://www.youtube.com/watch?v=PUSOg5YEflM) and [here](https://procore3d.github.io/probuilder2/), which should more than prepare you for creating a simple level. +* *Ensure that the level has an `FPSController` to navigate with in the scene.* This part's probably the easiest; just import an FPSController from the Standard Assets! It should already be imported into the project in the distro, where you can find the prefabs under `Assets > Standard Assets > Characters > FirstPersonCharacter > Prefabs`! +* *Ensure that there is an object or region with a trigger at the very end that will trigger the end of the level (some zone with an invisible `BoxCollider` will work).* This one should be easy as well, just relying on the creation of an empty GameObject and giving it a `BoxCollider` component, which you can then resize via its resize button in the component inspector! +* *When the level ends, display "You Won!" on the screen with a `Text` object.* Recall that `OnTriggerEnter` is the function you'll need to write in a script you also associate with the `BoxCollider` trigger, and ensure that the `BoxCollider` is set to a trigger in the inspector as well! Then simply program the appropriate logic to toggle on the display of a `Text` object that you also include in your scene (for an example on how to do this, just see the Helicopter Game 3D project, specifically the `GameOverText` script)! + + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/10` or, if you've installed `submit50`, execute + + ``` + submit50 games50/assignments/2019/x/10 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/6d2b0089-06f9-4072-9598-6c4e85730aa5). diff --git a/_pages/ocw/games/assignments/2/assignment2.md b/_pages/ocw/games/assignments/2/assignment2.md new file mode 100644 index 000000000..1b1267021 --- /dev/null +++ b/_pages/ocw/games/assignments/2/assignment2.md @@ -0,0 +1,47 @@ +--- +layout: games/2019/g +--- + +# Assignment 2: "Breakout, The Powerup Update" + +## Objectives + +* Read and understand all of the Breakout source code from Lecture 1. +* Add a powerup to the game that spawns two extra `Ball`s. +* Grow and shrink the Paddle when the player gains enough points or loses a life. +* Add a locked `Brick` that will only open when the player collects a second new powerup, a key, which should only spawn when such a `Brick` exists and randomly as per the `Ball` powerup. + +## Getting Started + +Download the distro code for your first game from and unzip `assignment2.zip`, which should yield a directory called `assignment2`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `assignment2` +(recall that the `cd` command can change your current directory), and run + +``` +cd assignment2 +``` + +## Break(out) a Leg! + +Welcome to your third assignment! By now, we've gotten our feet wet with states, randomization, and much more; this time, we'll be diving in a little bit more and adding some new features entirely! + +Your goals this assignment: + +* Add a `Powerup` class to the game that spawns a powerup (images located at the bottom of the sprite sheet in the distribution code). This `Powerup` should spawn randomly, be it on a timer or when the Ball hits a `Block` enough times, and gradually descend toward the player. Once collided with the `Paddle`, two more `Ball`s should spawn and behave identically to the original, including all collision and scoring points for the player. Once the player wins and proceeds to the `VictoryState` for their current level, the `Ball`s should reset so that there is only one active again. +* Grow and shrink the `Paddle` such that it's no longer just one fixed size forever. In particular, the `Paddle` should shrink if the player loses a heart (but no smaller of course than the smallest paddle size) and should grow if the player exceeds a certain amount of score (but no larger than the largest `Paddle`). This may not make the game completely balanced once the `Paddle` is sufficiently large, but it will be a great way to get comfortable interacting with `Quad`s and all of the tables we have allocated for them in `main.lua`! +* Add a locked `Brick` (located in the sprite sheet) to the level spawning, as well as a key powerup (also in the sprite sheet). The locked `Brick` should not be breakable by the ball normally, unless they of course have the key `Powerup`! The key `Powerup` should spawn randomly just like the `Ball` `Powerup` and descend toward the bottom of the screen just the same, where the `Paddle` has the chance to collide with it and pick it up. You'll need to take a closer look at the `LevelMaker` class to see how we could implement the locked `Brick` into the level generation. Not every level needs to have locked `Brick`s; just include them occasionally! Perhaps make them worth a lot more points as well in order to compel their design. Note that this feature will require changes to several parts of the code, including even splitting up the sprite sheet into `Brick`s! + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/2` or, if you've installed `submit50`, execute + + ``` + submit50 games50/assignments/2019/x/2 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/6d2b0089-06f9-4072-9598-6c4e85730aa5). diff --git a/_pages/ocw/games/assignments/3/assignment3.md b/_pages/ocw/games/assignments/3/assignment3.md new file mode 100644 index 000000000..2376d8e84 --- /dev/null +++ b/_pages/ocw/games/assignments/3/assignment3.md @@ -0,0 +1,52 @@ +--- +layout: games/2019/g +--- + +# Assignment 3: "Match-3, The Shiny Update" + +## Objectives + +* Read and understand all of the Match-3 source code from Lecture 3. +* Implement time addition on matches, such that scoring a match extends the timer by 1 second per tile in a match. +* Ensure Level 1 starts just with simple flat blocks (the first of each color in the sprite sheet), with later levels generating the blocks with patterns on them (like the triangle, cross, etc.). These should be worth more points, at your discretion. +* Creat random shiny versions of blocks that will destroy an entire row on match, granting points for each block in the row. +* Only allow swapping when it results in a match. If there are no matches available to perform, reset the board. +* (*Optional*) Implement matching using the mouse. (Hint: you'll need `push:toGame(x,y)`; see the `push` library's documentation [here](https://github.com/Ulydev/push) for details! + +## Getting Started + +Download the distro code for your first game from and unzip `assignment3.zip`, which should yield a directory called `assignment3`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `assignment3` +(recall that the `cd` command can change your current directory), and run + +``` +cd assignment3 +``` + +## A Match (3) Made in Heaven + +Welcome to your fourth assignment! There was a lot to learn with timers, tweens, and more in this lecture, but unfortunately, our game is still lacking in a few areas. By extending its functionality, we'll have something even closer to famous titles such as *Bejeweled* and *Candy Crush Saga*! + +Your goals this assignment: + +* *Implement time addition on matches, such that scoring a match extends the timer by 1 second per tile in a match.* This one will probably be the easiest! Currently, there's code that calculates the amount of points you'll want to award the player when it calculates any matches in `PlayState:calculateMatches`, so start there! +* *Ensure Level 1 starts just with simple flat blocks (the first of each color in the sprite sheet), with later levels generating the blocks with patterns on them (like the triangle, cross, etc.). These should be worth more points, at your discretion.* This one will be a little trickier than the last step (but only slightly); right now, random colors and varieties are chosen in `Board:initializeTiles`, but perhaps we could pass in the `level` variable from the `PlayState` when a `Board` is created (specifically in `PlayState:enter`), and then let that influence what `variety` is chosen? +* *Create random shiny versions of blocks that will destroy an entire row on match, granting points for each block in the row.* This one will require a little more work! We'll need to modify the `Tile` class most likely to hold some kind of flag to let us know whether it's shiny and then test for its presence in `Board:calculateMatches`! +* *Only allow swapping when it results in a match. If there are no matches available to perform, reset the board.* There are multiple ways to try and tackle this problem; choose whatever way you think is best! The simplest is probably just to try and test for `Board:calculateMatches` after a swap and just revert back if there is no match! The harder part is ensuring that potential matches exist; for this, the simplest way is most likely to pretend swap everything left, right, up, and down, using essentially the same reverting code as just above! However, be mindful that the current implementation uses all of the blocks in the sprite sheet, which mathematically makes it highly unlikely we'll get a board with any viable matches in the first place; in order to fix this, be sure to instead only choose a subset of tile colors to spawn in the `Board` (8 seems like a good number, though tweak to taste!) before implementing this algorithm! +* *(*Optional*) Implement matching using the mouse. (Hint: you'll need `push:toGame(x,y)`; see the `push` library's documentation [here](https://github.com/Ulydev/push) for details!* This one's fairly self-explanatory; feel free to implement click-based, drag-based, or both for your application! This one's only if you're feeling up for a bonus challenge :) Have fun! + + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/3` or, if you've installed `submit50`, execute + + ``` + submit50 games50/assignments/2019/x/3 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/6d2b0089-06f9-4072-9598-6c4e85730aa5). diff --git a/_pages/ocw/games/assignments/4/assignment4.md b/_pages/ocw/games/assignments/4/assignment4.md new file mode 100644 index 000000000..1f30a827c --- /dev/null +++ b/_pages/ocw/games/assignments/4/assignment4.md @@ -0,0 +1,50 @@ +--- +layout: games/2019/g +--- + +# Assignment 4: "Super Mario Bros., The Key and Lock Update" + +## Objectives + +* Read and understand all of the Super Mario Bros. source code from Lecture 4. +* Program it such that when the player is dropped into the level, they're always done so above solid ground. +* In `LevelMaker.lua`, generate a random-colored key and lock block (taken from `keys_and_locks.png` in the `graphics` folder of the distro). The key should unlock the block when the player collides with it, triggering the block to disappear. +* Once the lock has disappeared, trigger a goal post to spawn at the end of the level. Goal posts can be found in `flags.png`; feel free to use whichever one you'd like! Note that the flag and the pole are separated, so you'll have to spawn a `GameObject` for each segment of the flag and one for the flag itself. +* When the player touches this goal post, we should regenerate the level, spawn the player at the beginning of it again (this can all be done via just reloading `PlayState`), and make it a little longer than it was before. You'll need to introduce `params` to the `PlayState:enter` function that keeps track of the current level and persists the player's score for this to work properly. + +## Getting Started + +Download the distro code for your first game from and unzip `assignment4.zip`, which should yield a directory called `assignment4`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `assignment4` +(recall that the `cd` command can change your current directory), and run + +``` +cd assignment4 +``` + +## It's-a Key! + +Welcome to your fifth assignment! So far, we have a fair foundation for a platforming game present in the distro, + +Your goals this assignment: + +* *Program it such that when the player is dropped into the level, they're always done so above solid ground.* Just like we generate the level column by column (as can be seen in `LevelMaker.lua`), we can check the game's map column by column and simply ensure that the player isn't placed above a column that just spawned a chasm by looking at all of the tiles along the Y-axis, going from left to right, until we've come across a column where we encounter a solid tile (as by checking whether the id is equal to `TILE_ID_GROUND`). +* *In `LevelMaker.lua`, generate a random-colored key and lock block (taken from `keys_and_locks.png` in the `graphics` folder of the distro). The key should unlock the block when the player collides with it, triggering the block to disappear.* This is something you'll introduce into `LevelMaker.generate` while it's actively generating the level; simply maintaining a flag for whether the key and lock have been spawned and placed and randomly choosing to place them down could do (or you could simply do it after the whole rest of the level is generated). The former will likely be easier so you can conditionally do it when you're not already spawning a block, since otherwise you'll have to iterate over all of the blocks you've already generated throughout the level and compare their positions with that of where you'd potentially like to generate a key or lock. See how the code for spawning gems works (particularly with the `onConsume` callback) for how you might implement picking up the key, and see the code for spawning blocks and the `onCollide` function for how you might implement the key blocks! +* *Once the lock has disappeared, trigger a goal post to spawn at the end of the level. Goal posts can be found in `flags.png`; feel free to use whichever one you'd like! Note that the flag and the pole are separated, so you'll have to spawn a `GameObject` for each segment of the flag and one for the flag itself.* This is code we can likely add to the `onCollide` function of our lock blocks, once we've collided with them and have the key they need to unlock. Just like gems spawn when we collide with some overhead blocks, you'll simply need to add new `GameObject`s to the scene that comprise a flag pole. Note that the pole and flag are separate objects, but they should be placed in such a way that makes them look like one unit! (See the scene mockup in `full_sheet.png` for some inspiration). +* *When the player touches this goal post, we should regenerate the level, spawn the player at the beginning of it again (this can all be done via just reloading `PlayState`), and make it a little longer than it was before. You'll need to introduce `params` to the `PlayState:enter` function that keeps track of the current level and persists the player's score for this to work properly.* The easiest way to do this is to just add an `onConsume` callback to each flag piece when we instantiate them in the last goal; this `onConsume` method should then just restart our `PlayState`, only now we'll need to ensure we pass in our `score` and `width` of our game map so that we can generate a map larger than the one before it. For this, you'll need to implement a `PlayState:enter` method accordingly; see prior assignments for plenty of examples on how we can achieve this! And don't forget to edit the default `gStateMachine:change('play')` call to take in some default score and level width! + + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/4` or, if you've installed `submit50`, execute + + ``` + submit50 games50/assignments/2019/x/4 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/6d2b0089-06f9-4072-9598-6c4e85730aa5). diff --git a/_pages/ocw/games/assignments/5/assignment5.md b/_pages/ocw/games/assignments/5/assignment5.md new file mode 100644 index 000000000..4188717c0 --- /dev/null +++ b/_pages/ocw/games/assignments/5/assignment5.md @@ -0,0 +1,47 @@ +--- +layout: games/2019/g +--- + +# Assignment 5: "Legend of Zelda, The Pot Update" + +## Objectives + +* Read and understand all of the Legend of Zelda source code from Lecture 5. +* Implement hearts that sometimes drop from enemies at random, which will heal the player for a full heart when picked up (consumed). +* Add pots to the game world (from the tile sheet) at random that the player can pick up, at which point their animation will change to reflect them carrying the pot (shown in the character sprite sheets). The player should not be able to swing their sword when in this state. +* When carrying a pot, the player should be able to throw the pot. When thrown, the pot will travel in a straight line based on where the player is looking. When it collides with a wall, travels more than four tiles, or collides with an enemy, it should disappear. When it collides with an enemy, it should do 1 point of damage to that enemy as well. + +## Getting Started + +Download the distro code for your first game from and unzip `assignment5.zip`, which should yield a directory called `assignment5`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `assignment5` +(recall that the `cd` command can change your current directory), and run + +``` +cd assignment5 +``` + +## A "Pot"ent Weapon + +Welcome to your sixth assignment! We've explored the workings of a top-down adventure game in the style of Legend of Zelda and have a fair foundation for anything resembling it, be it a dungeon crawler or a vast 2D game featuring an overworld or the like. Let's add a few pieces to this sample in order to pay homage to some of the classic Zelda titles and to give our character a shot at actually surviving his trek through the dungeon! + +Your goals this assignment: + +* *Implement hearts that sometimes drop from enemies at random, which will heal the player for a full heart when picked up (consumed).* Much of this we've already done in Super Mario Bros., so feel free to reuse some of the code in there! Recall that all `Entities` have a `health` field, including the `Player`. The `Player`'s health is measured numerically but represented via hearts; note that he can have half-hearts, which means that each individual heart should be worth 2 points of damage. Therefore, when we want to heal the `Player` for a full heart, be sure to increment health by 2, but be careful it doesn't go above the visual cap of 6, lest we appear to have a bug! Defining a `GameObject` that has an `onConsume` callback is probably of interest here, which you can refer back to Super Mario Bros. to get a sense of, though feel free to implement however best you see fit! +* *Add pots to the game world (from the tile sheet) at random that the player can pick up, at which point their animation will change to reflect them carrying the pot (shown in the character sprite sheets). The player should not be able to swing their sword when in this state.* In most of the Zelda titles, the hero is able to lift pots over his head, which he can then walk around with and throw at walls or enemies as he chooses. Implement this same functionality; you'll need to incorporate pot `GameObject`s, which should be collidable such that the `Player` can't walk through them. When he presses a key in front of them, perhaps `enter` or `return`, he should lift the pot above his head with an animation and then transition into a state where he walks around with the pot above his head. This will entail not only adding some new states for the `Player` but also ensuring a link exists (pun intended) between a pot and the character such that the pot always tracks the player's position so it can be rendered above his head. Be sure the `Player` cannot swing his sword while in this state, as his hands are full! +* *When carrying a pot, the player should be able to throw the pot. When thrown, the pot will travel in a straight line based on where the player is looking. When it collides with a wall, travels more than four tiles, or collides with an enemy, it should disappear. When it collides with an enemy, it should do 1 point of damage to that enemy as well.* Carrying the pot is one thing; the next step would be to be able to use the pot as a weapon! Allow the `Player` to throw the pot, effectively turning it into a projectile, and ensure it travels in a straight line depending on where the `Player` is facing when they throw it. When it collides with a wall, an enemy, or if it travels farther than four tiles in that direction, the pot should shatter, disappearing (although an actual shatter animation is optional). If it collides with an enemy, ensure the pot does 1 point of damage. There are many ways you can achieve this; think about how you can extend `GameObject` to fit this use case, perhaps adding a `projectile` field and therefore a `dx` or `dy` to the `GameObject` to allow it to have traveling functionality. Perhaps include a `:fire` method as part of `GameObject` that will trigger this behavior as by passing in said `dx` and `dy` instead. The choice is yours, but `GameObject` is flexible enough to make it work! + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/5` or, if you've installed `submit50`, execute + + ``` + submit50 games50/assignments/2019/x/5 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/6d2b0089-06f9-4072-9598-6c4e85730aa5). diff --git a/_pages/ocw/games/assignments/6/assignment6.md b/_pages/ocw/games/assignments/6/assignment6.md new file mode 100644 index 000000000..1a25e1d24 --- /dev/null +++ b/_pages/ocw/games/assignments/6/assignment6.md @@ -0,0 +1,43 @@ +--- +layout: games/2019/g +--- + +# Assignment 6: "Angry Birds, The Tri-Shot Update" + +## Objectives + +* Read and understand all of the Angry Birds source code from Lecture 6. +* Implement it such that when the player presses the space bar after they've launched an `Alien` (and it hasn't hit anything yet), split the `Alien` into three `Aliens` that all behave just like the base `Alien`. + +## Getting Started + +Download the distro code for your first game from and unzip `assignment6.zip`, which should yield a directory called `assignment6`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `assignment6` +(recall that the `cd` command can change your current directory), and run + +``` +cd assignment6 +``` + +## Three's Company + +Welcome to your sixth assignment! This week, we took a look at the fundamentals of Box2D, one of the most widely-used 2D physics engines, and how it ties into LÖVE, with its built-in wrappers for it. This assignment will be a little simpler than some of the previous ones (indeed, there's only one core objective, albeit a reasonably complex one) but will still require knowledge of Box2D and the distro before we can dive in too quickly. + +Your goal this assignment: + +* *Implement it such that when the player presses the space bar after they've launched an `Alien` (and it hasn't hit anything yet), split the `Alien` into three `Aliens` that all behave just like the base `Alien`.* The code for actually launching the `Alien` exists in `AlienLaunchMarker`, and we could naively implement most, if not all, of this code in the same class, since the `Alien` in question we want to split off is a field of this class. However, because we want to only allow splitting before we've hit anything, we need a flag that will get triggered whenever this `Alien` collides with anything else, so we'll likely want the logic for this in the `Level` itself here, since that is where we pass in the collision callbacks via `World:setCallbacks()`. The center `Alien` doesn't really need to be modified for the splitting process; really, all we need to do is spawn two new `Alien`s at the right angle and velocity so that it *appears* we've turned the single `Alien` into three, one above and one below. For this, you'll need to take linear velocity into consideration. Additionally, be aware that the `Alien` we want to launch has the `userData` of the string "Player", as opposed to the `Alien` we want to kill, which has just the `userData` of "Alien". Lastly, be sure that the launch marker doesn't reset until *all* of the `Alien`s we fling have slowed to nearly being still, not just the one `Alien` we normally check. In all, you should have all of the pieces at this point you need in order to make this happen; best of luck! + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/6` or, if you've installed `submit50`, execute + + ``` + submit50 games50/assignments/2019/x/6 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/6d2b0089-06f9-4072-9598-6c4e85730aa5). diff --git a/_pages/ocw/games/assignments/7/assignment7.md b/_pages/ocw/games/assignments/7/assignment7.md new file mode 100644 index 000000000..c84ac1026 --- /dev/null +++ b/_pages/ocw/games/assignments/7/assignment7.md @@ -0,0 +1,43 @@ +--- +layout: games/2019/g +--- + +# Assignment 7: "Pokémon, The Level-Up Update" + +## Objectives + +* Read and understand all of the Pokémon source code from Lecture 7. +* Implement a `Menu` that appears during the player Pokémon's level up that shows, for each stat, 'X + Y = Z', where X is the starting stat, Y is the amount it's increased for this level, and Z is the resultant sum. This `Menu` should appear right after the "Level Up" dialogue that appears at the end of a victory where the player has indeed leveled up. + +## Getting Started + +Download the distro code for your first game from and unzip `assignment7.zip`, which should yield a directory called `assignment7`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `assignment7` +(recall that the `cd` command can change your current directory), and run + +``` +cd assignment7 +``` + +## Next-Level + +Welcome to your seventh assignment! This week's code will probably be the most complicated we'll look at during the semester, but the assignment itself is fairly small in comparison; you will, however, need to know how many of the pieces work and fit together in order to accomplish the task ahead. + +Your goal this assignment: + +* *Implement a `Menu` that appears during the player Pokémon's level up that shows, for each stat, 'X + Y = Z', where X is the starting stat, Y is the amount it's increased for this level, and Z is the resultant sum. This `Menu` should appear right after the "Level Up" dialogue that appears at the end of a victory where the player has indeed leveled up.* The area where most of this will take place is the `TakeTurnState`, specifically in the `:victory()` function, where the actual detection of a level up takes place. Ordinarily, just a `BattleMessageState` gets pushed onto the `StateStack`, but we'll need to go a step further and push an additional `Menu` in order to accomplish what we're after. This `Menu` should not have a cursor like the other `Menu` we're used to seeing (in the `BattleMenuState`!), so you'll need to customize the `Selection` class a little bit in order to take a boolean value to turn the cursor on or off as needed (defaulting to `true` if needed to preserve the behavior of the `Menu` in the `BattleMenuState`). Note that the `:levelUp()` function in the `Pokemon` class returns all of the stat increases we need in order to display things properly, so be sure to use those returned values when creating the `Menu`! As long as you get a proper grasp on the `Selection`, `Menu`, and `StateStack` classes, this assignment should be relatively straightforward in comparison to the complexity of this week's code as a whole! + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/7` or, if you've installed `submit50`, execute + + ``` + submit50 games50/assignments/2019/x/7 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/6d2b0089-06f9-4072-9598-6c4e85730aa5). diff --git a/_pages/ocw/games/assignments/8/assignment8.md b/_pages/ocw/games/assignments/8/assignment8.md new file mode 100644 index 000000000..706704a81 --- /dev/null +++ b/_pages/ocw/games/assignments/8/assignment8.md @@ -0,0 +1,60 @@ +--- +layout: games/2019/g +--- + +# Assignment 8: "Helicopter Game 3D, The Gem Update" + +## Objectives + +* Download Unity and get familiar with its interface. +* Read and understand all of the Helicopter Game 3D source code from Lecture 8. +* Add Gems to the game that spawn in much the same way as Coins, though more rarely so. Gems should be worth 5 coins when collected and despawn when off the left edge of the screen. +* Fix the bug whereby the scroll speed of planes, coins, and buildings doesn't reset when the game is restarted via the space bar. + +## Getting Started + +Download the distro code for your first game from and unzip `assignment8.zip`, which should yield a directory called `assignment8`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `assignment8` +(recall that the `cd` command can change your current directory), and run + +``` +cd assignment8 +``` + +## Downloading Blender + +First, in order to be able to import some models into our scene appropriately (and to hopefully give you a taste of what 3D modeling is all about, should you be interested), head [here](https://www.blender.org/download/) to download the latest version of Blender, a free and open-source 3D modeling toolkit that rivals most commercial equivalents. Using and mastering Blender is in and of itself a tremendous skill and art form and not required of this class, but do experiment if you feel so inclined! You can find some fantastic learning resources [here](https://docs.blender.org/manual/en/dev/) and [here](https://www.blender.org/support/tutorials/)! Should you wish to tinker with the models used in this project, you can find the helicopter, skyscrapers, and airplane (which I so crudely modeled) in the `Assets/Resources/Models` folder of the Unity project you've downloaded! + +## Downloading Unity + +You will of course need to download Unity before you can run the distro code and see your project, so do just follow the link [here](https://unity3d.com/unity/beta) to download Unity's open beta. The setup is very straightforward, but you will need a Unity ID in order to use the software (which is free!), so do visit [this link](https://id.unity.com) to create one; you should also be prompted to create a new Unity ID via the software's launcher once it's downloaded onto your computer. + +Once you've downloaded and logged in to Unity, just click the "Open" button on the launcher and browse to the folder of the cloned code from the distro, and the project will open up! + +But wait... nothing seems to load into the scene once you've opened it! With the project open in Unity, navigate to `Assets/Resources/Scenes`, and then select `Main` in the file browser at the bottom of the screen, double-clicking to open, and all should be loaded into the scene view! + +Note: If you find that some of the models in your scene are not showing up, it's likely because you either don't have Blender installed yet (see instructions above), or you opened the project prior to the Blender installation. If you already have Blender installed and still don't see anything, do just right-click, in the Unity editor, any of the models located in `Assets/Resources/Models` and select the `Reimport All` option, which should fix missing models after a few moments of loading! + +## Next-Level + +Welcome to your eighth assignment! Unity is a lot to take in at once, but beneath all of the details, we'll find that this set of tools will allow us to be our most flexible and productive yet, even when coding in C#! As such, this assignment is meant less to be intensive and more just to get a grasp on navigating Unity and understanding how things work. + +Your goal this assignment: + +* *Add Gems to the game that spawn in much the same way as Coins, though more rarely so. Gems should be worth 5 coins when collected and despawn when off the left edge of the screen.* We have all of the pieces for this already implemented in the `Coin` and `CoinSpawner` classes, so it should suffice simply to make some new classes for the `Gem` and `GemSpawner` behaviors! In the Proto resource pack included in the `Assets` folder, you'll find a model for a gem you can use, but feel free to import your own! You'll need to make a prefab, recall, that you can attach to the `GemSpawner` component, should you choose to implement it similarly to what's in the distro. There are of course other ways to implement this behavior, so feel free to experiment with the software as a chance to learn it all the more thoroughly if curious! Do remember to make `Gems` worth 5 coins instead of just 1, and ensure they're more rare than `Coins` as well! Aside from that, they should behave identically to `Coins`, including moving automatically from right to left and despawning when past the left edge of the screen! +* *Fix the bug whereby the scroll speed of planes, coins, and buildings doesn't reset when the game is restarted via the space bar.* This one's a one-liner; note that static variables aren't actually reset upon loading a scene, so a place to check would be the `SkyscraperSpawner`, as the `speed` field therein is what actually drives the speed for `Skyscrapers`, `Airplanes`, and `Coins`! However, we won't find that this is the place where the game is reset upon pressing the space bar, and thus changing `speed` here doesn't make much sense; any guesses as to where the code for resetting the game could be located? + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/8` or, if you've installed `submit50`, execute + + ``` + submit50 games50/assignments/2019/x/8 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/6d2b0089-06f9-4072-9598-6c4e85730aa5). diff --git a/_pages/ocw/games/assignments/9/assignment9.md b/_pages/ocw/games/assignments/9/assignment9.md new file mode 100644 index 000000000..357a2d67c --- /dev/null +++ b/_pages/ocw/games/assignments/9/assignment9.md @@ -0,0 +1,47 @@ +--- +layout: games/2019/g +--- + +# Assignment 9: "Dreadhalls, The Tumble Update" + +## Objectives + +* Read and understand all of the Dreadhalls source code from Lecture 9. +* Spawn holes in the floor of the maze that the player can fall through (but not too many; just three or four per maze is probably sufficient, depending on maze size). +* When the player falls through any holes, transition to a "Game Over" screen similar to the Title Screen, implemented as a separate scene. When the player presses "Enter" in the "Game Over" scene, they should be brought back to the title. +* Add a Text label to the Play scene that keeps track of which maze they're in, incrementing each time they progress to the next maze. This can be implemented as a static variable, but it should be reset to 0 if they get a Game Over. + +## Getting Started + +Download the distro code for your first game from and unzip `assignment9.zip`, which should yield a directory called `assignment9`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `assignment9` +(recall that the `cd` command can change your current directory), and run + +``` +cd assignment9 +``` + +## Falls in the Halls + +Welcome to your ninth assignment! Though Unity may seem daunting at first, you're probably finding your way around the software more easily this time around. This week's assignment is fairly simple, but it will require you to get involved with scenes, part of the dungeon generation, and more; however, this and next week's assignment will be rather light compared to prior assignments so that you have more time to focus on your final project. + +Your goal this assignment: + +* *Spawn holes in the floor of the maze that the player can fall through (but not too many; just three or four per maze is probably sufficient, depending on maze size).* This should be very easy and only a few lines of code. The `LevelGenerator` script will be the place to look here; we aren't keeping track of floors or ceilings in the actual maze data being generated, so best to take a look at where the blocks are being insantiated (using the comments to help find!). +* *When the player falls through any holes, transition to a "Game Over" screen similar to the Title Screen, implemented as a separate scene. When the player presses "Enter" in the "Game Over" scene, they should be brought back to the title.* Recall which part of a Unity GameObject maintains control over its position, rotation, and scale? This will be the key to testing for a game over; identify which axis in Unity is up and down in our game world, and then simply check whether our character controller has gone below some given amount (lower than the ceiling block, presumably). Another fairly easy piece to put together, though you should probably create a `MonoBehaviour` for this one (something like `DespawnOnHeight`)! The "Game Over" scene that you should transition to can effectively be a copy of the Title scene, just with different wording for the `Text` labels. Do note that transitioning from the Play to the Game Over and then to the Title will result in the Play scene's music overlapping with the Title scene's music, since the Play scene's music is set to never destroy on load; therefore, how can we go about destroying the audio source object (named `WhisperSource`) at the right time to avoid the overlap? +* *Add a Text label to the Play scene that keeps track of which maze they're in, incrementing each time they progress to the next maze. This can be implemented as a static variable, but it should be reset to 0 if they get a Game Over.* This one should be fairly easy and can be accomplished using static variables; recall that they don't reset on scene reload. Where might be a good place to store it? + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/9` or, if you've installed `submit50`, execute + + ``` + submit50 games50/assignments/2019/x/9 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/6d2b0089-06f9-4072-9598-6c4e85730aa5). diff --git a/_pages/ocw/games/project/project.md b/_pages/ocw/games/project/project.md new file mode 100644 index 000000000..e7e7a1474 --- /dev/null +++ b/_pages/ocw/games/project/project.md @@ -0,0 +1,32 @@ +--- +layout: games/2019/g +--- + +# Final Project + +## Objectives + +* Create a full game from scratch using either LÖVE or Unity. + +## From Start to Finish + +It's time to begin the course's culmination: your final project! While most of the course thus far has been a series of assignments centered around adding features to existing code bases, this project will take place from the first line of code to the last, a true end-to-end experience to help tie everything we've learned together thus far. The following considerations should be met while designing and implementing your project: + +* 1) Your game must be in either LÖVE or Unity. +* 2) Your game must be a cohesive start-to-finish experience for the user; the game should boot up, allow the user to play toward some end goal, and feature a means of quitting the game. +* 3) Your game should have at least three `GameState`s to separate the flow of your game's user experience, even if it's as simple as a `StartState`, a `PlayState`, and an `EndState`, though you're encouraged to implement more as needed to suit a more robust game experience (e.g., a fantasy game with a `MenuState` or even a separate `CombatState`). +* 4) Your game can be most any genre you'd like, though there needs to be a definitive way of winning (or at least scoring indefinitely) and losing the game, be it against the computer or another player. This can take many forms; some loss conditions could be running out of time in a puzzle game, being slain by monsters in an RPG, and so on, while some winning conditions may be defeating a final boss in an RPG, making it to the end of a series of levels in a platformer, and tallying score in a puzzle game until it becomes impossible to do more. +* 5) You are allowed to use libraries and assets in either game development environment, but the bulk of your game's logic must be handwritten (i.e., putting together an RPG in Unity while using a UI library would be considered valid, assuming the bulk of the game logic is also not implemented in a library, but recycling a near-complete game prototype from Unity's asset store with slightly changed labels, materials, etc. would not be acceptable). + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `games50/assignments/2019/x/final` or, if you've installed `submit50`, execute + + ``` + submit50 games50/assignments/2019/x/final + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/6d2b0089-06f9-4072-9598-6c4e85730aa5). diff --git a/_pages/ocw/mobile/projects/0/project0.md b/_pages/ocw/mobile/projects/0/project0.md new file mode 100644 index 000000000..cf0071205 --- /dev/null +++ b/_pages/ocw/mobile/projects/0/project0.md @@ -0,0 +1,47 @@ +--- +layout: mobile/2019/m +--- + +# Project 0: TODO App + +## Objectives + +* Become more comfortable with JS and DOM manipulation. +* Gain experience reading and adding to source code. + +## Getting Started + +Download the distro code for your first game from and unzip `project0.zip`, which should yield a directory called `project0`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `project0` +(recall that the `cd` command can change your current directory), and run + +``` +cd project0 +``` + +To get started, follow the directions in your project README. + +## FAQs + +- Will I be penalized for editing files other than `script.js`? + - Nope, feel free to edit the HTML or CSS if you feel like it adds to your app! +- Do I have to worry about browser compatibility? + - Not at all. As long as your app works on Chrome (or any other browser that you + specify), that's all we'll be using to test your app. +- Can I use an external library? + - Please stick to just vanilla JS for this project. + +## How to Submit + +1. If you haven't done so already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `mobile50/projects/2019/x/0` or, if you've installed `submit50`, execute + + ``` + submit50 mobile50/projects/2019/x/0 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/3f0e502f-ba0e-4beb-b0ff-ef6582be3745). diff --git a/_pages/ocw/mobile/projects/1/project1.md b/_pages/ocw/mobile/projects/1/project1.md new file mode 100644 index 000000000..6da043bca --- /dev/null +++ b/_pages/ocw/mobile/projects/1/project1.md @@ -0,0 +1,46 @@ +--- +layout: mobile/2019/m +--- + +# Project 1: Pomodoro Timer + +## Objectives + +* Become more comfortable with JS and React Native. +* Develop workflow for developing mobile apps. +* Gain experience reading and adding to source code. +* Create your first app! + +## Getting Started + +Download the distro code for your first game from and unzip `project1.zip`, which should yield a directory called `project1`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `project1` +(recall that the `cd` command can change your current directory), and run + +``` +cd project1 +``` + +To get started, follow the directions in your project README. + +## FAQs + +- Is there extra credit for completing the challenge? + - Nope, the challenge is just a fun feature that I recommend adding if you finish early! +- Do we need to test on both iOS and Android? + - Nope, as long as it works on at least one of the platforms, you're all set. We'll assume iOS unless specified otherwise. + +## How to Submit + +1. If you haven't done so already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `mobile50/projects/2019/x/1` or, if you've installed `submit50`, execute + + ``` + submit50 mobile50/projects/2019/x/1 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/3f0e502f-ba0e-4beb-b0ff-ef6582be3745). diff --git a/_pages/ocw/mobile/projects/2/project2.md b/_pages/ocw/mobile/projects/2/project2.md new file mode 100644 index 000000000..0983482a7 --- /dev/null +++ b/_pages/ocw/mobile/projects/2/project2.md @@ -0,0 +1,51 @@ +--- +layout: mobile/2019/m +--- + +# Project 2: Movie Browser + +## Objectives + +* Become more comfortable with JS and React Native. +* Develop workflow for developing mobile apps. +* Use live APIs for fetching data. +* Use external libraries for additional functionality. +* Create a multi-page application. + +## Getting Started + +Download the distro code for your first game from and unzip `project2.zip`, which should yield a directory called `project2`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `project2` +(recall that the `cd` command can change your current directory), and run + +``` +cd project2 +``` + +To get started, follow the directions in your project README. + +## FAQs + +- Do I need to use the API? + - Yes. The goal of this assignment is to learn how to use live APIs for fetching data. The mock data in the repo was only for testing if you wanted to start the project before the lecture on data. +- What is the challenge for this project? + - The challenge for this project is to add a settings screen (accessed via a tab navigator) that allows you to configure your results from the API. +- Is there extra credit for completing the challenge? + - Nope, the challenge is just a fun feature that I recommend adding if you finish early! +- Do we need to test on both iOS and Android? + - Nope, as long as it works on at least one of the platforms, you're all set. We'll assume iOS unless specified otherwise. + +## How to Submit + +1. If you haven't done so already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `mobile50/projects/2019/x/2` or, if you've installed `submit50`, execute + + ``` + submit50 mobile50/projects/2019/x/2 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/3f0e502f-ba0e-4beb-b0ff-ef6582be3745). diff --git a/_pages/ocw/mobile/projects/final/final.md b/_pages/ocw/mobile/projects/final/final.md new file mode 100644 index 000000000..a2bc43bd4 --- /dev/null +++ b/_pages/ocw/mobile/projects/final/final.md @@ -0,0 +1,31 @@ +--- +layout: mobile/2019/m +--- + +# Final Project: Self-Designed App + +## Objectives + +* Implement a project with JavaScript and React Native from scratch. +* Develop a workflow for developing mobile apps. +* Design your own interfaces. + +## Requirements +- Must use `redux` +- Must make at least one network call +- Must have at least one stack navigator +- Must have at least one tab navigator +- Must be at least as large in scope as the previous projects + +## How to Submit + +1. If you haven't done so already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `mobile50/projects/2019/x/final` or, if you've installed `submit50`, execute + + ``` + submit50 mobile50/projects/2019/x/final + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/3f0e502f-ba0e-4beb-b0ff-ef6582be3745). diff --git a/_pages/ocw/web/projects/0/project0.md b/_pages/ocw/web/projects/0/project0.md new file mode 100644 index 000000000..598be6f9d --- /dev/null +++ b/_pages/ocw/web/projects/0/project0.md @@ -0,0 +1,93 @@ +--- +layout: web/2019/w +--- + +# Project 0: Homepage + +## Objectives + +* Become more comfortable with HTML and CSS to design and style webpages. +* Learn to use SCSS to write more complex stylesheets for your webpages. + +## Getting Started + +### Your First Webpage + +Download the distro code for this project from and unzip `project0.zip`, which should yield a directory called `project0`. + +Then, in a terminal window (located in `/Applications/Utilities` on Mac or by typing +`cmd` in the Windows task bar), move to the directory where you extracted `project0` +(recall that the `cd` command can change your current directory), and run + +``` +cd project0 +``` + +to enter the project directory. Now, run + +``` +touch index.html +``` + +to create a new `index.html` file in your repository. Open the file with your +favorite text editor: popular choices include [Atom](https://atom.io/), +[Sublime Text](https://www.sublimetext.com/), and [VS +Code](https://code.visualstudio.com/). Then, paste in the following contents: + +```html + + + + My Webpage + + + Hello, world! + + +``` + +Then, save your `index.html` file. + +## Requirements + +Alright, now it's time to make your website your own. Design a personal webpage +about yourself, one of your interests, or any other topic of your choice. The +subject matter, look and feel, and design of the site are entirely up to you, +subject to the following requirements: + +* Your website must contain at least four different `.html` pages, and it + should be possible to get from any page on your website to any other page by + following one or more hyperlinks. +* Your website must include at least one list (ordered or unordered), at least + one table, and at least one image. +* Your website must have at least one stylesheet file. +* Your stylesheet(s) must use at least five different CSS properties, and at + least five different types of CSS selectors. You must use the `#id` selector + at least once, and the `.class` selector at least once. +* Your stylesheet(s) must include at least one mobile-responsive `@media` query, + such that something about the styling changes for smaller screens. +* You must use Bootstrap 4 on your website, taking advantage of at least one + Bootstrap [component](https://getbootstrap.com/docs/4.3/components/), + and using at least two Bootstrap columns for layout purposes using + Bootstrap's [grid model](https://getbootstrap.com/docs/4.3/layout/grid/). +* Your stylesheets must use at least one SCSS variable, at least one example of + SCSS nesting, and at least one use of SCSS inheritance. +* In `README.md`, include a short writeup describing your project, what's + contained in each file, and (optionally) any other additional information the + staff should know about your project. + +Note that not all of the above requirements are covered in Lecture 0, some will +be introduced in Lecture 1. + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `web50/projects/2019/x/0` or, if you've installed `submit50`, execute + + ``` + submit50 web50/projects/2019/x/0 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/e980a817-6269-413c-9415-289907147cea). diff --git a/_pages/ocw/web/projects/1/project1.md b/_pages/ocw/web/projects/1/project1.md new file mode 100644 index 000000000..64b59fa3d --- /dev/null +++ b/_pages/ocw/web/projects/1/project1.md @@ -0,0 +1,236 @@ +--- +layout: web/2019/w +--- + +# Project 1: Books + +## Objectives + +* Become more comfortable with Python. +* Gain experience with Flask. +* Learn to use SQL to interact with databases. + +## Overview + +In this project, you'll build a book review website. Users will be able to +register for your website and then log in using their username and password. +Once they log in, they will be able to search for books, leave reviews for +individual books, and see the reviews made by other people. +You'll also use the a third-party API by Goodreads, another book review website, +to pull in ratings from a broader audience. +Finally, users will be able to query for book details and book reviews +programmatically via your website's API. + +## Getting Started + +### PostgreSQL + +For this project, you'll need to set up a PostgreSQL database to use with our +application. It's possible to set up PostgreSQL locally on your own computer, +but for this project, we'll use a database hosted by +[Heroku](https://www.heroku.com/), an online web hosting service. + +1. Navigate to [https://www.heroku.com/](https://www.heroku.com/), and create + an account if you don't already have one. +2. On Heroku's Dashboard, click "New" and choose "Create new app." +3. Give your app a name, and click "Create app." +4. On your app's "Overview" page, click the "Configure Add-ons" button. +5. In the "Add-ons" section of the page, type in and select "Heroku Postgres." +6. Choose the "Hobby Dev - Free" plan, which will give you access to a free + PostgreSQL database that will support up to 10,000 rows of data. Click + "Provision." +7. Now, click the "Heroku Postgres :: Database" link. +8. You should now be on your database's overview page. Click on "Settings", and + then "View Credentials." This is the information you'll need to log into your + database. You can access the database via + [Adminer](https://adminer.cs50.net/), filling in the server (the "Host" in + the credentials list), your username (the "User"), your password, and the + name of the database, all of which you can find on the Heroku credentials + page. + +Alternatively, if you install +[PostgreSQL](https://www.postgresql.org/download/) on your own computer, you +should be able to run `psql URI` on the command line, where the `URI` is +the link provided in the Heroku credentials list. + +### Python and Flask + +1. First, make sure you install a copy of + [Python](https://www.python.org/downloads/). For this course, you should be using + Python version 3.6 or higher. +2. You'll also need to install `pip`. If you downloaded Python from Python's + website, you likely already have `pip` installed (you can check by running + `pip` in a terminal window). If you don't have it installed, be sure to + [install it](https://pip.pypa.io/en/stable/installing/) before moving on! + +To try running your first Flask +application: + +1. Download the `project1` distribution directory from [https://cdn.cs50.net/web/2019/x/projects/1/project1.zip](https://cdn.cs50.net/web/2019/x/projects/1/project1.zip) and unzip it. +2. In a terminal window, navigate into your `project1` directory. +3. Run `pip3 install -r requirements.txt` in your terminal window to make sure + that all of the necessary Python packages (Flask and SQLAlchemy, for + instance) are installed. +4. Set the environment variable `FLASK_APP` to be `application.py`. On a Mac or + on Linux, the command to do this is `export FLASK_APP=application.py`. On + Windows, the command is instead `set FLASK_APP=application.py`. You may + optionally want to set the environment variable `FLASK_DEBUG` to `1`, which + will activate Flask's debugger and will automatically reload your web + application whenever you save a change to a file. +5. Set the environment variable `DATABASE_URL` to be the URI of your database, + which you should be able to see from the credentials page on Heroku. +6. Run `flask run` to start up your Flask application. +7. If you navigate to the URL provided by `flask`, you should see the text + `"Project 1: TODO"`! + +### Goodreads API + +Goodreads is a popular book review website, and we'll be using their API in this +project to get access to their review data for individual books. + +1. Go to [https://www.goodreads.com/api](https://www.goodreads.com/api) and sign + up for a Goodreads account if you don't already have one. +2. Navigate to + [https://www.goodreads.com/api/keys](https://www.goodreads.com/api/keys) and + apply for an API key. For "Application name" and "Company name" feel free to + just write "project1," and no need to include an application URL, callback + URL, or support URL. +3. You should then see your API key. (For this project, we'll care only about the + "key", not the "secret".) +4. You can now use that API key to make requests to the Goodreads API, + documented [here](https://www.goodreads.com/api/index). In particular, Python + code like the below + +```py +import requests +res = requests.get("https://www.goodreads.com/book/review_counts.json", params={"key": "KEY", "isbns": "9781632168146"}) +print(res.json()) +``` + +where `KEY` is your API key, will give you the review and rating data for the +book with the provided ISBN number. In particular, you might see something like +this dictionary: + +```py +{'books': [{ + 'id': 29207858, + 'isbn': '1632168146', + 'isbn13': '9781632168146', + 'ratings_count': 0, + 'reviews_count': 1, + 'text_reviews_count': 0, + 'work_ratings_count': 26, + 'work_reviews_count': 113, + 'work_text_reviews_count': 10, + 'average_rating': '4.04' + }] +} +``` + +Note that `work_ratings_count` here is the number of ratings that this +particular book has received, and `average_rating` is the book's average score +out of 5. + +## Requirements + +Alright, it's time to actually build your web application! Here are the +requirements: + +* **Registration**: Users should be able to register for your website, providing + (at minimum) a username and password. +* **Login**: Users, once registered, should be able to log in to your website + with their username and password. +* **Logout**: Logged in users should be able to log out of the site. +* **Import**: Provided for you in this project is a file called `books.csv`, + which is a spreadsheet in CSV format of 5000 different books. + Each one has an ISBN number, a title, an author, and a publication year. + In a Python file called `import.py` separate from your web application, + write a program that will + take the books and import them into your PostgreSQL database. You will first need to + decide what table(s) to create, what columns those tables should have, and how + they should relate to one another. Run this program by running + `python3 import.py` to import the books into + your database, and submit this program with the rest of your project code. +* **Search**: Once a user has logged in, they should be taken to a page where + they can search for a book. Users should be able to type in the ISBN number of + a book, the title of a book, or the author of a book. After performing the + search, your website should display a list of possible matching results, or + some sort of message if there were no matches. If the user typed in only part + of a title, ISBN, or author name, your search page should find matches for + those as well! +* **Book Page**: When users click on a book from the results of the search page, + they should be taken to a book page, with details about the book: its title, + author, publication year, ISBN number, and any reviews that users have left + for the book on your website. +* **Review Submission**: On the book page, users should be able to submit a + review: consisting of a rating on a scale of 1 to 5, as well as a text + component to the review where the user can write their opinion about a book. + Users should not be able to submit multiple reviews for the same book. +* **Goodreads Review Data**: On your book page, you should also display (if + available) the average rating and number of ratings the work has received from + Goodreads. +* **API Access**: If users make a GET request to your website's `/api/` + route, where `` is an ISBN number, your website should return a JSON + response containing the book's title, author, publication date, ISBN number, + review count, and average score. The resulting JSON should follow the format: + +```python +{ + "title": "Memory", + "author": "Doug Lloyd", + "year": 2015, + "isbn": "1632168146", + "review_count": 28, + "average_score": 5.0 +} +``` + + If the requested ISBN number isn't in your + database, your website should return a 404 error. +* You should be using raw SQL commands (as via SQLAlchemy's `execute` method) in + order to make database queries. You should not use the SQLAlchemy ORM (if + familiar with it) for this project. +* In `README.md`, include a short writeup describing your project, what's + contained in each file, and (optionally) any other additional information the + staff should know about your project. +* If you've added any Python packages that need to be installed in order to run + your web application, be sure to add them to `requirements.txt`! + +Beyond these requirements, the design, look, and feel of the website are up to +you! You're also welcome to add additional features to your website, so long as +you meet the requirements laid out in the above specification! + +## Hints + +* At minimum, you'll probably want at least one table to keep track of users, + one table to keep track of books, and one table to keep track of reviews. But + you're not limited to just these tables, if you think others would be helpful! +* In terms of how to "log a user in," recall that you can store information + inside of the `session`, which can store different values for different users. + In particular, if each user has an `id`, then you could store that `id` in the + session (e.g., in `session["user_id"]`) to keep track of which user is + currently logged in. + +## FAQs + +### For the API, do the JSON keys need to be in order? + +Any order is fine! + +### `AttributeError: 'NoneType' object has no attribute '_instantiate_plugins'` + +Make sure that you've set your `DATABASE_URL` environment variable before running +`flask run`! + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `web50/projects/2019/x/1` or, if you've installed `submit50`, execute + + ``` + submit50 web50/projects/2019/x/1 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/e980a817-6269-413c-9415-289907147cea). diff --git a/_pages/ocw/web/projects/2/project2.md b/_pages/ocw/web/projects/2/project2.md new file mode 100644 index 000000000..b02b8bc82 --- /dev/null +++ b/_pages/ocw/web/projects/2/project2.md @@ -0,0 +1,120 @@ +--- +layout: web/2019/w +--- + +# Project 2: Flack + +## Objectives + +* Learn to use JavaScript to run code server-side. +* Become more comfortable with building web user interfaces. +* Gain experience with Socket.IO to communicate between clients and servers. + +## Overview + +In this project, you'll build an online messaging service using Flask, similar +in spirit to [Slack](https://slack.com/). Users will be able to sign into your +site with a display name, create channels (i.e. chatrooms) to communicate in, +as well as see and join existing channels. Once a channel is selected, users +will be able to send and receive messages with one another in real time. +Finally, you'll add a personal touch to your chat application of your choosing! + +## Milestones + +We recommend that you try to meet the following milestones: + +* Complete the Display Name, Channel Creation, and Channel List steps. +* Complete the Messages View and Sending Messages steps. +* Complete the Remembering the Channel and Personal Touch steps. + +## Getting Started + +### Python and Flask + +As with Project 1, make sure that you have a copy of [Python +3.6](https://www.python.org/downloads/) or higher installed on your machine. +You'll also need to install `pip`. If you downloaded Python from Python's +website, you likely already have `pip` installed (you can check by running +`pip` in a terminal window). If you don't have it installed, be sure to +[install it](https://pip.pypa.io/en/stable/installing/) before moving on! + +To run this Flask application: + +1. Download the `project2` distribution code from https://cdn.cs50.net/web/2019/x/projects/2/project2.zip and unzip it. +2. In a terminal window, navigate into your `project2` directory. +3. Run `pip3 install -r requirements.txt` in your terminal window to make sure + that all of the necessary Python packages (Flask and Flask-SocketIO, for + instance) are installed. +4. Set the environment variable `FLASK_APP` to be `application.py`. On a Mac or + on Linux, the command to do this is `export FLASK_APP=application.py`. On + Windows, the command is instead `set FLASK_APP=application.py`. +5. Run `flask run` to start up your Flask application. +6. If you navigate to the URL provided by `flask`, you should see the text + `"Project 2: TODO"`! + +## Requirements + +Alright, it's time to actually build your web application! Here are the +requirements: + +* **Display Name**: When a user visits your web application for the first time, + they should be prompted to type in a display name that will eventually be + associated with every message the user sends. If a user closes the page and + returns to your app later, the display name should still be remembered. +* **Channel Creation**: Any user should be able to create a new channel, so long + as its name doesn't conflict with the name of an existing channel. +* **Channel List**: Users should be able to see a list of all current channels, + and selecting one should allow the user to view the channel. We leave it to + you to decide how to display such a list. +* **Messages View**: Once a channel is selected, the user should see any + messages that have already been sent in that channel, up to a maximum of 100 + messages. Your app should only store the 100 most recent messages per channel + in server-side memory. +* **Sending Messages**: Once in a channel, users should be able to send text + messages to others the channel. When a user sends a message, their display + name and the timestamp of the message should be associated with the message. + All users in the channel should then see the new message (with display name + and timestamp) appear on their channel page. Sending and receiving messages + should NOT require reloading the page. +* **Remembering the Channel**: If a user is on a channel page, closes the web + browser window, and goes back to your web application, your application should + remember what channel the user was on previously and take the user back to + that channel. +* **Personal Touch**: Add at least one additional feature to your chat application + of your choosing! Feel free to be creative, but if you're looking for ideas, + possibilities include: supporting deleting one's own messages, supporting use + attachments (file uploads) as messages, or supporting private messaging + between two users. +* In `README.md`, include a short writeup describing your project, what's + contained in each file, and (optionally) any other additional information the + staff should know about your project. Also, include a description of your + personal touch and what you chose to add to the project. +* If you've added any Python packages that need to be installed in order to run + your web application, be sure to add them to `requirements.txt`! + +Beyond these requirements, the design, look, and feel of the website are up to +you! You're also welcome to add additional features to your website, so long as +you meet the requirements laid out in the above specification! + +## Hints + +* You shouldn't need to use a database for this assignment. However, you should + feel free to store any data you need in memory in your Flask application, as + via using one or more global variables defined in `application.py`. +* You will likely find that [local + storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) + will prove helpful for storing data client-side that will be saved across + browser sessions. + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `web50/projects/2019/x/2` or, if you've installed `submit50`, execute + + ``` + submit50 web50/projects/2019/x/2 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/e980a817-6269-413c-9415-289907147cea). diff --git a/_pages/ocw/web/projects/3/project3.md b/_pages/ocw/web/projects/3/project3.md new file mode 100644 index 000000000..9681c5749 --- /dev/null +++ b/_pages/ocw/web/projects/3/project3.md @@ -0,0 +1,135 @@ +--- +layout: web/2019/w +--- + +# Project 3: Pizza + +## Objectives + +* Become more comfortable with Django. +* Gain experience with relational database design. + +## Overview + +In this project, you'll build an web application for handling a pizza +restaurant's online orders. Users will be able to browse the restaurant's menu, +add items to their cart, and submit their orders. Meanwhile, the restaurant +owners will be able to add and update menu items, and view orders that have +been placed. + +## Milestones + +We recommend that you try to meet the following milestones in order: + +* Complete the Menu, Adding Items, and Registration/Login/Logout steps. +* Complete the Shopping Cart and Placing an Order steps. +* Complete the Viewing Orders and Personal Touch steps. + +## Getting Started + +### Python and Django + +As with Projects 1 and 2, make sure that you have a copy of [Python +3.6](https://www.python.org/downloads/) or higher installed on your machine. +You'll also need to install `pip`. If you downloaded Python from Python's +website, you likely already have `pip` installed (you can check by running +`pip` in a terminal window). If you don't have it installed, be sure to +[install it](https://pip.pypa.io/en/stable/installing/) before moving on! + +To run this Django application: + +1. Download the `project3` distribution code from https://cdn.cs50.net/web/2019/x/projects/3/project3.zip and unzip it. +2. In a terminal window, navigate into your `project3` directory. Note that this + is the directory for a Django project called `pizza`, inside of which is an + app already created for you called `orders`. +3. Run `pip3 install -r requirements.txt` in your terminal window to make sure + that all of the necessary Python packages (Django, in this instance) are + installed. +4. Run `python manage.py runserver` to start up your Django application. +5. If you navigate to the URL provided by Django, you should see the text + `"Project 3: TODO"`! + +## Requirements + +Alright, it's time to actually build your web application! Here are the +requirements: + +* **Menu**: Your web application should support all of the available menu items + for [Pinnochio's Pizza & Subs](http://www.pinocchiospizza.net/menu.html) (a + popular pizza place in Cambridge). It's up to you, based on analyzing the menu + and the various types of possible ordered items (small vs. large, toppings, + additions, etc.) to decide how to construct your models to best represent the + information. Add your models to `orders/models.py`, make the necessary + migration files, and apply those migrations. +* **Adding Items**: Using Django Admin, site administrators (restaurant owners) + should be able to add, update, and remove items on the menu. Add all of the + items from the Pinnochio's menu into your database using either the Admin UI + or by running Python commands in Django's shell. +* **Registration, Login, Logout**: Site users (customers) should be able to + register for your web application with a username, password, first name, last + name, and email address. Customers should then be able to log in and log out + of your website. +* **Shopping Cart**: Once logged in, users should see a representation of the + restaurant's menu, where they can add items (along with toppings or extras, if + appropriate) to their virtual "shopping cart." The contents of the shopping + should be saved even if a user closes the window, or logs out and logs back in + again. +* **Placing an Order**: Once there is at least one item in a user's shopping + cart, they should be able to place an order, whereby the user is asked to + confirm the items in the shopping cart, and the total (no need to worry about + tax!) before placing an order. +* **Viewing Orders**: Site administrators should have access to a page where + they can view any orders that have already been placed. +* **Personal Touch**: Add at least one additional feature of your choosing to + the web application. Possibilities include: allowing site administrators to + mark orders as complete and allowing users to see the status of their pending + or completed orders, integrating with the [Stripe](https://stripe.com/docs) + API to allow users to actually use a credit card to make a purchase during + checkout, or supporting sending users a confirmation email once their purchase + is complete. If you need to use any credentials (like passwords or API + credentials) for your personal touch, be sure not to store any credentials in + your source code, better to use environment variables! +* In `README.md`, include a short writeup describing your project, what's + contained in each file you created or modified, and (optionally) any other + additional information the staff should know about your project. Also, include + a description of your personal touch and what you chose to add to the project. +* If you've added any Python packages that need to be installed in order to run + your web application, be sure to add them to `requirements.txt`! + +Beyond these requirements, the design, look, and feel of the website are up to +you! You're also welcome to add additional features to your website, so long as +you meet the requirements laid out in the above specification! + +## Hints + +* Unlike in Project 1, you shouldn't need to build your application's entire + login and authentication system yourself. Feel free to use Django's built-in + users and authentication system to simplify the process of logging users in + and out. +* Before diving into writing your models, you'll likely want to think carefully + about the different types of menu items and how best to organize them. Some + questions to consider include: how should you represent the different prices + for large and small versions of the same dish? Where do toppings fit into your + model for pizzas, and how do you calculate the ultimate price of a pizza? How + will you make the custom add-ons for the subs work? + +## FAQs + +### What is a "Special" pizza? + +It's up to you to decide what a "special" pizza means, and to implement it +accordingly. It could be one particular set of toppings, allowing up to 5 +different types of toppings, or something else entirely! + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `web50/projects/2019/x/3` or, if you've installed `submit50`, execute + + ``` + submit50 web50/projects/2019/x/3 + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/e980a817-6269-413c-9415-289907147cea). diff --git a/_pages/ocw/web/projects/final/final.md b/_pages/ocw/web/projects/final/final.md new file mode 100644 index 000000000..f71b44e59 --- /dev/null +++ b/_pages/ocw/web/projects/final/final.md @@ -0,0 +1,47 @@ +--- +layout: web/2019/w +--- + +# Final Project + +## Objectives + +* Gain experience with designing and implementing a web application with + Python and JavaScript. + +## Overview + +The final project is your opportunity to design and implement a dynamic website +of your own. So long as your final project draws upon this course's lessons, +the nature of your website will be entirely up to you, albeit subject to the +staff's approval. + +## Requirements + +In this project, you are asked to build a web application of your own. The +nature of the application is up to you, subject to a few requirements: + +* Your web application must utilize at least two of Python, JavaScript, and + SQL. +* Your web application must be mobile-responsive. +* In `README.md`, include a short writeup describing your project, what's + contained in each file you created or modified, and (optionally) any other + additional information the staff should know about your project. +* If you've added any Python packages that need to be installed in order to run + your web application, be sure to add them to `requirements.txt`! + +Beyond these requirements, the design, look, and feel of the website are up to +you! + +## How to Submit + +1. If you haven't already, [install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). +1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `web50/projects/2019/x/final` or, if you've installed `submit50`, execute + + ``` + submit50 web50/projects/2019/x/final + ``` + + instead. +1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. +1. [Submit this form](https://forms.cs50.io/e980a817-6269-413c-9415-289907147cea). diff --git a/_pages/web/2019/x/projects/0/project0.md b/_pages/web/2019/x/projects/0/project0.md index f2795c813..1a8f87010 100644 --- a/_pages/web/2019/x/projects/0/project0.md +++ b/_pages/web/2019/x/projects/0/project0.md @@ -81,7 +81,7 @@ be introduced in Lecture 1. ## How to Submit -1. Visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. Visit [this link](https://submit.cs50.io/invites/89679428401548238ceb022f141b9947), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. [Install Git](https://git-scm.com/downloads) and, optionally, [install `submit50`](https://cs50.readthedocs.io/submit50/). 1. Using Git, push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `web50/projects/2019/x/0` or, if you've installed `submit50`, execute @@ -92,3 +92,5 @@ be introduced in Lecture 1. instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/a8a742ce-32c4-4064-b450-3518de633fec). + +You can then go to [https://cs50.me/cs50w](https://cs50.me/cs50w) to view your current progress! diff --git a/_pages/web/2019/x/projects/1/project1.md b/_pages/web/2019/x/projects/1/project1.md index bab6638f2..4b8c4b2c0 100644 --- a/_pages/web/2019/x/projects/1/project1.md +++ b/_pages/web/2019/x/projects/1/project1.md @@ -224,7 +224,7 @@ Make sure that you've set your `DATABASE_URL` environment variable before runnin ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't already done so, visit [this link](https://submit.cs50.io/invites/89679428401548238ceb022f141b9947), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `web50/projects/2019/x/1` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -234,3 +234,5 @@ Make sure that you've set your `DATABASE_URL` environment variable before runnin instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/a8a742ce-32c4-4064-b450-3518de633fec). + +You can then go to [https://cs50.me/cs50w](https://cs50.me/cs50w) to view your progress! diff --git a/_pages/web/2019/x/projects/2/project2.md b/_pages/web/2019/x/projects/2/project2.md index 54b84cc67..3d3715737 100644 --- a/_pages/web/2019/x/projects/2/project2.md +++ b/_pages/web/2019/x/projects/2/project2.md @@ -108,7 +108,7 @@ you meet the requirements laid out in the above specification! ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't already done so, visit [this link](https://submit.cs50.io/invites/89679428401548238ceb022f141b9947), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `web50/projects/2019/x/2` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -118,3 +118,5 @@ you meet the requirements laid out in the above specification! instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/a8a742ce-32c4-4064-b450-3518de633fec). + +You can then go to [https://cs50.me/cs50w](https://cs50.me/cs50w) to view your progress! diff --git a/_pages/web/2019/x/projects/3/project3.md b/_pages/web/2019/x/projects/3/project3.md index afa8dbc17..c7bc13ae0 100644 --- a/_pages/web/2019/x/projects/3/project3.md +++ b/_pages/web/2019/x/projects/3/project3.md @@ -123,7 +123,7 @@ different types of toppings, or something else entirely! ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't already done so, visit [this link](https://submit.cs50.io/invites/89679428401548238ceb022f141b9947), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `web50/projects/2019/x/3` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -133,3 +133,5 @@ different types of toppings, or something else entirely! instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/a8a742ce-32c4-4064-b450-3518de633fec). + +You can then go to [https://cs50.me/cs50w](https://cs50.me/cs50w) to view your progress! diff --git a/_pages/web/2019/x/projects/final/final.md b/_pages/web/2019/x/projects/final/final.md index 93ae32c59..c1f5c9597 100644 --- a/_pages/web/2019/x/projects/final/final.md +++ b/_pages/web/2019/x/projects/final/final.md @@ -35,7 +35,7 @@ you! ## How to Submit -1. If you haven't done so already, visit [submit.cs50.io](https://submit.cs50.io/), log in with your GitHub account, and click **Authorize cs50**. +1. If you haven't already done so, visit [this link](https://submit.cs50.io/invites/89679428401548238ceb022f141b9947), log in with your GitHub account, and click **Authorize cs50**. Then, check the box indicating that you'd like to grant course staff access to your submissions, and click **Join course**. 1. Using [Git](https://git-scm.com/downloads), push your work to `https://github.com/me50/USERNAME.git`, where `USERNAME` is your GitHub username, on a branch called `web50/projects/2019/x/final` or, if you've installed [`submit50`](https://cs50.readthedocs.io/submit50/), execute ``` @@ -45,3 +45,5 @@ you! instead. 1. [Record a 1- to 5-minute screencast](https://www.howtogeek.com/205742/how-to-record-your-windows-mac-linux-android-or-ios-screen/) in which you demonstrate your app's functionality and/or walk viewers through your code. [Upload that video to YouTube](https://www.youtube.com/upload) (as unlisted or public, but not private) or somewhere else. 1. [Submit this form](https://forms.cs50.io/a8a742ce-32c4-4064-b450-3518de633fec). + +You can then go to [https://cs50.me/cs50w](https://cs50.me/cs50w) to view your progress!