JavaRush /Java Blog /Random-TL /Harvard CS50: Linggo 3 Takdang-aralin (Mga Lektura 7 at 8...
Masha
Antas

Harvard CS50: Linggo 3 Takdang-aralin (Mga Lektura 7 at 8), Bahagi 2

Nai-publish sa grupo
Harvard Programming Fundamentals Lectures CS50 Karagdagang materyales: asymptotic notation, sorting at searching algorithms Linggo 3 takdang-aralin, bahagi 1. Pag-uuri at paghahanap.

Magsisimula na ang laro!

Harvard CS50: Linggo 3 Takdang-aralin (Mga Lektura 7 at 8), Bahagi 2 - 1 Oras na para maglaro! Karamihan sa mga tao ay pamilyar sa larong puzzle na "Tag". Upang gawing pormal ito, ang "Tag" ay isang two-dimensional na 4x4 na patlang, sa field na ito ay walang 16, ngunit 15 na mga parisukat, iyon ay, ang isang puwang ay nananatiling walang laman. Ang bawat isa sa mga parisukat ay may bilang at maaaring ilipat nang pahalang o patayo sa loob ng field (kung, siyempre, may puwang upang ilipat). Ang layunin ay ilagay ang mga numero sa pagkakasunud-sunod, mula 1 hanggang 15 mula kaliwa hanggang kanan mula sa itaas hanggang sa ibaba. Pagkatapos ay ang bakanteng espasyo ay nasa kanang sulok sa ibaba. Ang paggalaw ng anumang tile (o ilang) ay isang "hakbang" sa espasyo ng larong ito. Ang kumbinasyong ipinapakita sa larawan sa itaas ay nakasalansan na, ngunit tandaan na ang 12 o 15 na mga tile ay maaaring itulak sa bakanteng espasyo. Ang mga patakaran ay nagsasaad na ang isang tile ay hindi maaaring ilipat sa pahilis o alisin mula sa playing board. Mayroong talagang maraming mga pagsasaayos upang simulan ang laro (maaari mong bilangin kung ilan ang eksaktong), ngunit para sa kapakanan ng pagiging simple, ayusin natin ang mga tile sa pagkakasunud-sunod mula sa pinakamalaki hanggang sa pinakamaliit at mag-iwan ng walang laman na espasyo sa kanang ibabang sulok ng board . Ang tanging bagay ay, palitan natin ang 1 at 2 upang ang palaisipan ay malulutas. Harvard CS50: Linggo 3 Mga Takdang-aralin (Mga Lektura 7 at 8), Bahagi 2 - 2 Pumunta ngayon sa ~/ directory ng iyong workbench , pagkatapos ay /pset3/fifteen at buksan ang fifteen.c . Naglalaman ito ng code para sa engine ng laro. Ang gawain ay magdagdag ng code sa laro. Ngunit una, i-compile natin ang aming "engine" (malamang alam mo na kung paano gawin ito). Sa kabila ng katotohanan na ang laro ay hindi natapos, maaari mong ilunsad ang application. Magiging mas maginhawang patakbuhin ito sa mas malaki kaysa sa karaniwang terminal window, na mabubuksan sa pamamagitan ng pag-click sa berdeng plus (+) sa tabi ng isa sa mga tab ng code at pagpili sa Bagong Terminal . O maaari mong buksan ang terminal window sa buong screen sa pamamagitan ng pag-click sa icon na I-maximize sa kanang sulok sa itaas ng console. Nakikita mo na may mga bagay na gumagana kahit papaano. Ngunit sa katunayan, karamihan sa laro ay hindi pa naisusulat. At narito - maghanda - ang iyong paglabas!
Mag-aral
Pag-aralan ang code at mga komento ng fifteen.c at pagkatapos ay sagutin ang mga tanong sa ibaba:
  1. Bukod sa isang 4x4 board, anong laki ng field ang pinapayagan ng aming makina?
  2. Anong istruktura ng data ang field ng laro?
  3. Anong function ang tinatawag upang batiin ang manlalaro sa simula ng laro?
  4. Anong mga tampok ang kailangan mong ipatupad?
  5. Tandaan: Kung gusto mong auto-check upang sabihin sa iyo kung nasagot mo nang tama ang mga tanong, sa tabi ng file na fifteen.c, hanapin ang file na fifteen.txt at isulat ang mga sagot sa mga tanong na ito dito.
Pagpapatupad
Well, simulan natin ang pagpapatupad ng laro. Tandaan, tayo ay gumagalaw sa maliliit na hakbang, huwag subukang gawin ang lahat nang sabay-sabay. Sa halip, ipatupad natin ang mga feature nang paisa-isa at tiyaking gumagana ang mga ito bago sumulong. Sa partikular, iminumungkahi namin na ipatupad mo ang mga function ng laro sa sumusunod na pagkakasunud-sunod: init (initialization), draw (drawing), move (take a step), won (win). Ang mga desisyon sa disenyo (gaya ng kung gaano karaming espasyo ang ilalagay sa pagitan ng aming mga tile ng numero) ay sa iyo. Dapat ganito ang hitsura ng playing field: 15 14 13 12 11 10 9 8 7 6 5 4 3 1 2 _ Muli, pakitandaan na sa panimulang posisyon, ang 1 at 2 ay matatagpuan sa reverse order (ito ay naaangkop sa classic na 4x4 field kung kakaiba ang bilang ng mga tile). Kung pantay ang bilang ng mga tile at ang field ay 3x3, hindi na kailangang palitan ang dalawang "pinakamababang" tile. 8 7 6 5 4 3 2 1 _ Upang subukan ang iyong pagpapatupad ng "Tag," kailangan mong subukang i-play ang mga ito (huwag kalimutan, maaari kang lumabas sa programa bago ang natural na pagkumpleto nito sa pamamagitan ng pagpindot sa key combination na crtl+c). Tiyaking gagana ang programa kung maling numero ang ipinasok. At tandaan na kung paano mo na-automate ang input sa paghahanap, maaari mong i-automate ang "walkthrough" ng laro. Sa katunayan, sa folder na ~cs50/pset3 mayroong mga file na 3x3.txt at 4x4.txt , na naglalaman ng lahat ng mga pagkakasunud-sunod ng mga hakbang para sa panalo sa 3x3 at 4x4 na mga patlang. Upang subukan ang program, halimbawa, gamit ang una sa mga file, patakbuhin ang sumusunod na command: ./fifteen 3 < ~cs50/pset3/3x3.txt I-set up ang argumento na kailangan mo upang mapabilis ang animation. At sa pangkalahatan, kung gusto mo, maaari mong palaging baguhin ang laro. Para magsaya sa "ANSI escape sequence" kasama ang kulay. Tingnan ang aming pagpapatupad ng malinaw at tingnan ang http://isthe.com/chongo/tech/comp/ansi_escapes.html upang matuto ng mga bagong trick. Kung gusto mo, isulat ang iyong sariling mga function o baguhin ang mga prototype ng mga function na isinulat namin. Ang tanging limitasyon ay hindi mo babaguhin ang lohika ng pangunahing pag-andar, kung hindi, hindi namin mailalapat ang ilang mga awtomatikong pagsubok dito upang kumpirmahin na gumagana nang tama ang iyong programa. Sa partikular, dapat ibalik ng main ang 0 kung at kung nalutas lang ng user ang puzzle. Ang mga hindi zero na halaga ay dapat ibalik para sa lahat ng mga pagpipilian sa error. Kung may anumang mga error na nangyari, sumulat sa amin. Buweno, kung gusto mong maglaro sa pagpapatupad ng application na inihanda ng mga katulong ng CS50, patakbuhin ang sumusunod na utos: ~cs50/pset3/fifteen Kung interesado kang makakita ng mas malamig na pagpapatupad, na may awtomatikong paglutas ng palaisipan, tingnan ang "Hacker" na bersyon ng programa: ~cs50/hacker3/fifteen Sa halip na maglagay ng numero sa window ng laro, i-type ang salitang GOD. Mahusay, hindi ba? Kung nais mong suriin ang tama ng iyong programa nang opisyal gamit ang check50, tandaan na ang check50 ay ipinapalagay na ang walang laman na espasyo ng playfield ay puno ng 0; kung pumili ka ng ibang value, palitan ito ng zero para sa tamang pag-verify. Gayundin, ipinapalagay ng check50 na ini-index mo ang mga field ng board sa pagkakasunud-sunod [row] [column], hindi board [column] [row]. check50 2015.fall.pset3.fifteen fifteen.c
Matuto nang higit pa tungkol sa pagpapatupad ng Labinlimang mga function ng laro
  • init (pagsisimula)
  • gumuhit
  • gumalaw (gumawa ng isang hakbang)
  • nanalo (panalo)
sa loob
Sa function na ito ipinakilala namin ang playing field. Upang gawin ito, gumagamit kami ng dalawang-dimensional na hanay ng mga integer. Ang dimensyon ng array ay MAX x MAX, kung saan ang MAX ay isang pare-parehong nagsasaad ng maximum na bilang ng mga tile na maaaring magkasya sa isang row o column ng isang field. Kaya, kailangan nating tukuyin ang variable int board[MAX][MAX] Gayunpaman, tandaan na ang laki ng playing field ay tinutukoy ng user. Samakatuwid, kailangan nating tukuyin ang isang variable na magsasaad ng laki ng board na dapat ilagay ng user. Ito ay int d . kung saan ang d ay ang dimensyon ng board, d <= MAX. Gayunpaman, sa C hindi mo mababago ang laki ng isang array, kaya kailangan mong manirahan para sa maximum na laki. Sa init kailangan mong ilagay ang mga halaga sa board. Harvard CS50: Linggo 3 Mga Takdang-aralin (Mga Lektura 7 at 8), Bahagi 2 - 3 Magbasa nang higit pa tungkol sa mga two-dimensional na array kung hindi ka pa nakakatrabaho sa kanila. Sa madaling salita, mayroon silang dalawang indeks, ang una ay tumutukoy sa numero ng hilera, ang pangalawa ay numero ng hanay. Para sa aming problema, nagsisimula kami sa maximum na bilang at nagtatapos sa kaso ng d = 3 ("Eights") na may isa at isang walang laman na sulok. Kung mayroon pa tayong "Tag", palitan natin ang 1 at 2. Ano ang gagawin sa walang laman na espasyo? Ang aming array ay binubuo ng mga integer, kaya ang void ay dapat punan ng ilang integer. Samakatuwid, dapat kang pumili ng ilang integer upang masimulan ang walang laman na tile (o, sa kaso ng isang pisikal na laro, ang kawalan ng tile). Maaaring gamitin ang mga loop upang simulan ang game board at punan ito ng panimulang hanay ng mga tile. Umiikot kami sa mga indeks i at j, kung saan ang board[i][j] ay isang tile na matatagpuan sa row number i at column number j. Pinupuno namin ang board sa pababang pagkakasunud-sunod. Kung ang bilang ng mga tile (nang walang laman) ay kakaiba, palitan ang 1 at 2.
gumuhit
Dapat i-print ng function na ito ang kasalukuyang estado ng playfield. Tandaan na maaari tayong magkaroon ng mga halaga na may isa o dalawang digit, kaya para sa magandang pag-format pagkatapos ng mga numero 1-9 ang function ay dapat mag-print ng isang puwang ( #s ). Magagawa ito gamit ang %2d placeholder . printf (“%2d”, board[i][j]); Gayundin huwag kalimutan ang tungkol sa walang laman na cell. Piliin ang karakter na kakatawan dito (sa aming halimbawa, ito ay isang underscore). Dapat iguhit ng function ng draw ang karakter na ito sa sandaling pindutin mo ang isang walang laman na cell. Kaya't ang aming loop ay magiging ganito: for каждой строки for каждого element строки print meaning и пробел print новую строку Tandaan na ang pagkakasunud-sunod kung saan ang draw function ay kumukuha ng mga tile sa screen ay dapat na sumasalamin sa pagkakasunud-sunod kung saan sila ay nasa array na tinukoy sa init function .
gumalaw
Kapag nasimulan mo na ang playing field at iguguhit ang mga paunang posisyon ng tile, kailangan mong payagan ang user na i-edit ang posisyon ng mga tile, iyon ay, gumawa ng mga paggalaw. Kaya sa Fifteen.c ang program ay kumukuha ng output mula sa user, bubuo ng game board at pagkatapos ay tinatawagan ang move function at sasabihin dito kung aling tile ang gusto niyang ilipat. Mag-ingat: partikular na inilalapat mo ang function sa numero sa tile, at hindi sa posisyon nito sa board (sa array). Kaya kailangan mong hanapin ang aktwal na posisyon ng tile. Bukod pa rito, dapat mo lang payagan ang user na ilipat ang tile kapag posible. Harvard CS50: Linggo 3 Mga Takdang-aralin (Mga Lektura 7 at 8), Bahagi 2 - 4 Sa larawan sa itaas, maaari lamang nating ilipat ang mga tile bilang 2, 5 at 8. Paano ito matukoy? Sa pamamagitan ng halaga ng isang walang laman na tile. Kaya ang function ng paglipat ay gumagana tulad nito:
  • Tinatanggap ang numero ng tile na gustong ilipat ng user
  • Hinahanap ang posisyon sa array (sa playing field) ng tile na ito
  • Naaalala ang posisyon ng isang walang laman na tile
  • Kung ang isang walang laman na tile ay katabi ng isa na gustong ilipat ng user, sila ay pinapalitan sa array.
nanalo
Sinusuri ng function na ito kung natapos na ang laro pagkatapos ng bawat hakbang ng user. Nagbabalik ito ng true kung ang mga tile ay nasa tamang pagkakasunod-sunod (kabilang ang posisyon ng walang laman na tile sa kanang sulok sa ibaba). Sa kasong ito, maaaring wakasan ang programa. Kung ang mga tile ay nakakalat pa rin, ang function ay nagbabalik ng false at ipapasa ang mga bato sa paglipat ng function . Paano ayusin ang isang inspeksyon? Tulad ng sa kaso ng pagsisimula at pagguhit ng board - gamit ang dalawang nested para sa mga loop. Halimbawa, maaari kang magtakda ng kundisyon na ang bawat kasunod na numero sa array ay dapat na mas malaki kaysa sa nauna. Pansinin kung anong halaga ang nakasulat sa walang laman na tile. O ibang paraan - gumamit ng counter upang matiyak na ang lahat ng mga tile ay nasa lugar, kung maaari mong hawakan ito at isulat ang formula upang makuha ito. Nais ka naming good luck sa iyong mga eksperimento!

Paano i-validate ang iyong code at makakuha ng mga marka

Pansin! Kung mahalaga para sa iyo na suriin lamang ang kawastuhan ng mga gawain, pagkatapos ay gamitin ang cs50check. Kung gusto mong makakuha ng mga marka sa edx platform, sundin ang pamamaraang inilarawan sa ibaba. Tandaan, ang pamamaraang ito ay gumagamit ng parehong cs50check upang suriin ang mga gawain. Ang pagkakaiba lang ay naaalala nito ang mga resulta at kinakalkula ang kabuuang marka.
  1. Mag-login sa CS50 IDE
  2. Malapit sa kaliwang sulok sa itaas ng CS50 IDE , kung saan matatagpuan ang file browser nito (wala sa terminal window), i-right-click ang iyong pset3 na direktoryo at i-click ang I- download . Dapat mong makita na na-download ng browser ang pset3.tar.gz archive .
  3. Sa isang hiwalay na window o tab, mag-log in sa CS50 Submit
  4. Mag-click sa icon na Isumite sa kaliwang sulok sa itaas ng screen
  5. Sa listahan ng mga folder sa kaliwa, mag-click sa direktoryo ng Problema Set 3 , pagkatapos ay mag-click sa button na Mag-upload ng Bagong Pagsusumite. Nasa kanan.
  6. Sa lalabas na screen, mag-click sa Add files ... na buton. Magbubukas ang isang window para sa pagpili ng mga file mula sa iyong computer.
  7. Mag-navigate sa folder kung saan mo na-save ang pset3.tar.gz. Malamang na matatagpuan ito sa iyong folder ng Mga Download o saanman inilalagay ng iyong browser ang mga file bilang default. Kapag nahanap mo ang pset3.tar.gz , i-click ito nang isang beses upang piliin ito, pagkatapos ay i-click ang Buksan .
  8. I-click ang Simulan ang pag-upload . Ang iyong mga file ay ia-upload sa CS50 server .
  9. Sa screen na lalabas, dapat mong makita ang No File Selected window . Kung ililipat mo ang iyong mouse cursor sa kaliwa, makakakita ka ng listahan ng mga na-download na file. Upang kumpirmahin, mag-click sa bawat isa sa kanila. Kung hindi ka sigurado tungkol sa isang bagay, maaari mong muling i-upload ang mga file sa pamamagitan ng pag-uulit sa parehong mga hakbang. Magagawa mo ito nang maraming beses hangga't gusto mo hanggang sa katapusan ng 2016.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION