ROB Bowden: Hi. Mi Rob, kaj mi esperas ke via ludo por ludo 15. Nu, jen estas kvar funkciojn vi bezonas por apliki en tiu programo - init, desegni, movi, kaj gajnis. Do, ni rigardu init. Tie, ni vidas la unua afero, kiun ni estas tuj fari estas deklari variablon vokis vendotablo. Oni tuj povas pravalorizita al d fojojn d minus 1. Memoru ke d estas la dimensio de nia estraro. Kiom init iras labori estas tuj persisti super la tuta forumaro kaj ni tuj komencu ĉe la supro maldekstro. Kaj ni simple diras, ke ni havas 4 de 4 tabulo. Do la supro forlasis ni estas dironta estas 15. Kaj tiam ni nur iri al la grafo meze de la tabuloj, dirante 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, kaj tiel plu. Do supre maldekstre, ni atendas esti d fojojn d minus 1, kiu en la 4 de 4 kazo tuj estos 16 minus 1, kiu estas ĝuste 15. Kaj nun jen kie ni iras al persisti super la tuta forumaro. Kaj ni tuj starigu ĉiun pozicion en la estraro por la aktuala valoro de nia vendotablo, kaj tiam nombrilo tuj al dekremento, por ke la venonta pozicio ni atingas tuj havos nombrilo esti unu malpli ol la antaŭan pozicion. Do ni komence havis 15 kaj dekremento vendotablo. Tial ni iras al asigni 14 al la sekvanta pozicio, dekremento vendotablo, kaj ni iras al atribuitaj 13, kaj tiel plu. Fine, ni bezonas manipuli tiu angulo kazo kie, se la estraro havas eĉ dimensio, do nur faras 15, 14, 13, 12, la tutan vojon malsupren al 3, 2, 1, estas tuj forlasi nin per nesolvebla tabulo. Kaj ni devas interŝanĝi la 1 kaj la 2. Do, se d _mod_ 2 egalas 0, tio estas kiel ni tuj kontroli por vidi, ĉu ĝi estas vespero. Se d _mod_ 2 egalas 0, tiam en vico d minus 1, kiu estas malsupre, kaj pozicio d minus 2, aŭ kolumno d minus 2, ni tuj starigu ke al 2, kaj kolumno d minus 3 ni estas tuj agordita al 1. Do tio estas nur dorsflankanta kie 1 kaj 2 aktuale estas. Fine, ni tuj starigu la tre malsupro rajton egalan al malplenan, kie malplenan estis hash difinita ĉe la supro kiel 0. Do, tio ne estis strikte necesa, ekde ĉi por buklo tuj havos starigis malsupre dekstre al 0, ekde nombrilo nature atingi 0. Sed tio dependas al ni scii ke malplenan estis hashed trovi 0. Se mi iros en tiun programon kaj poste ŝanĝi malplenan je la supro al 100, ĝi devus ankoraŭ funkcias. Do tiu estas simple certigi, ke la malsupro dekstra estas fakte egala al nia malplena valoro. Fine, ni havas du mallokajn variablojn, tiel malplenan i kaj malplenan j, kaj ni vidas tiuj deklaris ĉe la supro. Kaj ni tuj uzi tiujn du tutmondaj variabloj por konservi trako de la pozicio de la celo, por ke ni ne bezonas rigardi tra la tuta tabulo por trovi la malplenan ĉiu sola tempo ni provos fari movon. Do la pozicio de la malplenan ĉiam estas tuj komenci ĉe la malsupro pravas. Do la dekstra malsupra estas donita per indeksoj d minus 1, d minus 1. Do, jen init. Nun ni pluiru, por cxerpi. Do, egaleco tuj estos simila kie ni iras persisti super la tuta forumaro. Kaj ni volas nur presi la valoro tio estas en ĉiu pozicio de la tabulo. Do jen, ni estas videbligi la valoro kiu estas en ĉiu pozicio de la tabulo. Kaj rimarki ke ni faras -. Kaj tio estas ĝuste diri printf ke sendepende de ĉu ĝi estas unu cifero aŭ du cifera nombro, ni tamen volas lin al prenu du kolumnojn en la print out, por ke, se ni havas du cifero kaj unu ciferaj nombroj en la sama estraro, niaj forumaro ankoraŭ aspektas bela kaj kvadrato. Do ni volas fari, ke por ĉiu valoro en la estraro, krom por la celo. Do, se la pozicio en la estraro egalas la malplenan, tiam ni specife deziras presi nur substreko reprezenti la malplenan, anstataŭ kion ajn la valoron de la malplenan reale estas. Fine, ni deziras presi el nova linio. Rimarku, ke tiu estas ankoraŭ ene la eksterajn por ciklo, sed ekstere la ena por buklo. Ekde ĉi tiu ekstera por buklo estas ripetanta super ĉiuj vicoj, kaj tiel ĉi printf estas tuj ĝuste presi novan linion, do ni pluiri por presi la sekva vico. Kaj tio estas por egaleco. Do, nun ni pluiru al movi. Nun, ni pasas movado, la kahelo, ke la uzanto eniris en la ludo - ili eniri la kahelo ili volas movi - kaj vi supozas resendas bool, tiel ĉu vera aŭ malvera, depende de ĉu tiu decido estis efektive valida - ĉu tiu tile povas esti enpenetris la malplenan spacon. Do jen, ni deklaras loka variablo, tile_1 kaj tile_j, kiuj tuj esti simila al blank_i kaj blank_j, krom ĝi estas tuj sekvigi la pozicio de la kahelo. Nun ĉi tie, ni tuj uzi blank_i kaj blank_j kaj diru ĉiuj pravas, tiel jen la malplena sur la tabulo. Nun, estas la kahelo super la malplenaj? Ĉu la kahelo maldekstre de la blanka? Ĉu la kahelo por la rajto de la malplenan? Ĉu la kahelo sube la blankan? Do, se la kahelo estas en iu ajn el tiuj pozicioj, tiam ni scias ke la kahelo povas movi sur la malplenan lokon kaj la malplenan povas esti movita al kie la kahelo aktuale estas. Do jen, ni diru, se estraro ĉe pozicio blank_i minus 1 blank_j. Do tiu estas diranta estas la kahelo supre la nuna malplenan? Kaj se jes, ni tuj memoras kiu estas la pozicio de la kahelo. La tegmentoj estas en pozicio blank_i minus 1 kaj blank_j. Nun unue, ni ankaŭ havas ĉi ĉeko ĝuste ĉi tie, do blank_i estas pli granda ol 0. Kial ni volas fari tion? Nu, se la malplenan estas en la supera vico de la estraro, tiam ni ne volas rigardi super la malplenaj por la kahelo ekde nenio estas supre la pinto vico de la tabulo. Jen kiel vi eble finos atingi iu kiel segmentación kulpo aŭ via programo povus simple labori en neatenditaj manieroj. Do, ĉi tiu estas certigi ke ni ne rigardu en lokoj, kiuj ne estas validaj. Nun ni tuj faru la samon por ĉiujn aliajn eblajn kombinojn. Do jen, ni serĉas sub la malplenan por vidi, ĉu tio estas la kahelo. Kaj ni devas ankaŭ certigi ni estas ne sur la suban linion, ĉar alie ni ne devas serĉi la kahelo. Tie, ni tuj rigardas al la maldekstro de la malplena por vidi, ĉu ĝi estas la kahelo. Kaj ni ne devus rigardi maldekstren se ni estas en la plej maldekstra kolumno. Kaj tie ni iras rigardi al la Dekstre de la malplenan, kaj ni ne devus rigardas al la dekstra, se ni estas en la plej dekstra kolumno. Do, se neniu el tiuj aferoj estas veraj, kiu signifas la kahelo ne estis najbara al la malplena kaj ni povas reveni falsaj. La movado estis ne valida. Sed, se unu el tiuj estis la vera, tiam ĉe tiu punkto, ni scias ke tile_i kaj tile_j estas egalaj al la pozicio de la kahelo. Kaj tiel, ni povas ĝisdatigi la tabulo ĉe pozicioj tile_i kaj tile_j. Ni scias la nova valoro estos la malplenan kaj ke la pozicio blank_i blank_j, kiu estis la originala malplena - ni konas la kahelo tuj movi tie. Rimarku ke ni ne efektive devas fari reala swap ĉi tie, ĉar ni konas la valoroj kiuj devas esti enmetita en tiuj pozicioj. Ni ne bezonas portempa variablo ĉirkaŭe. Fine, ni devas memori, ke ni havas nian mallokajn variablojn, kiuj estas konservanta trako de la pozicio de la celo. Do ni volas aktualigi la pozicio de la malplenan esti kie la kahelo origine estis. Fine, ni revenas vera ekde la movado sukcesis. Ni sukcese interŝanĝu la malplenan kun la kahelo. Enorde, do finfine ni bezonas kontroli gajnis. Do, gajnis simile resendas bool kie vera tuj indikas ke la uzanto gajnis la ludon. Kaj malvera estas indikante ke La ludo estas ankoraŭ iras. La uzanto ne gajnis. Do, ĉi tiu tuj estos sufiĉe tre la malo de init, kie init, memoru, ni pravalorizi la estraro 15, 14, 13, 12, ktp. Dum gajnis, ni volas kontroli, ĉu la tabulo estas 1, 2, 3, 4, 5, kaj tiel plu. Do, ni iras al pravalorizi nia kontraŭi al 1 kiam tio estas kion la supron Maldekstre de la estraro devus esti. Kaj poste ni iras al buklo super la tuta forumaro. Ni ignoru ĉi kondiĉo por dua. Kaj ĉi tiu kondiĉo estas ĝuste tuj ĉeko estas la tabulo ĉe ĉi pozicio egala al la nuna grafoj? Se jes, pliigo de la grafo por ke la sekvanta pozicio ni rigardas unu pli alta ol la pozicio ni estas je dekstra nun. Do jen kiel ni atingos la supre maldekstre devus esti 1. Pliigo la grafon al 2. Rigardu la sekva pozicio. Ĉu ĉi tiu estas 2? Se jes, pliigo de la grafo por 3. Sekva pozicio, estas jena 3? Se jes, pliigo de la grafo al 4, kaj tiel plu. Do, se estas ia pozicio en la tabulo kiu ne egalas nian grafon, do ni volas redoni malvera ĉar tio signifas, ke estas iuj tile ke estas ne en la korektan pozicion. Do jen, kio estas ĉi tiu kondiĉo faras? Nu, memoru, ke la malplenan estas supozis iri sur la fundo pravas. Kaj la malplenan valoro ne fariĝu nepre egali la valoron de la kontraŭi, ke tuj estos atingita ĉe la malsupro pravas. Do ni specife volas kontroli ĉu i egalas egalas d minus 1 kaj J egaluloj egalas d minus 1 - kio estas diranta, se ni rigardas sube dekstre de la tabulo - poste ni simple volas sekvi. Ni volas salti ĉi aparta ripeto de la buklo. Kaj do, se ni sukcesos ricevi per cxi nestitaj por buklo, tio signifas ke ne estis kahelo, kiu estis en la malĝusta pozicio. Kaj ni rompi la buklo kaj venu tie, kie ni povas reveni vera. Ĉiuj kaheloj restis en la korekta pozicioj kaj tio signifas ke la uzanto havas gajnis la ludon. Kaj tio estas ĝi. Mia nomo estas Rob Bowden, kaj tio estis 15.