1 00:00:00,000 --> 00:00:13,070 2 00:00:13,070 --> 00:00:13,715 >> ROB Bowden: Hi. 3 00:00:13,715 --> 00:00:17,800 Estic Rob, i espero que la seva joc per al joc del 15. 4 00:00:17,800 --> 00:00:22,040 Ara, hi ha quatre funcions que necessita per aplicar en aquest programa - init, 5 00:00:22,040 --> 00:00:24,650 dibuixar, moure, i va guanyar. 6 00:00:24,650 --> 00:00:27,230 Per tant, donem una ullada a init. 7 00:00:27,230 --> 00:00:32,930 >> Aquí, veiem la primera cosa que estem farem és declarar una variable 8 00:00:32,930 --> 00:00:34,600 anomenat comptador. 9 00:00:34,600 --> 00:00:37,620 Això serà inicialitzat de vegades d d almenys 1. 10 00:00:37,620 --> 00:00:40,200 Recordeu que d és la dimensió del nostre consell. 11 00:00:40,200 --> 00:00:43,840 Com init funcionarà és que va iterar sobre els fòrums 12 00:00:43,840 --> 00:00:46,050 i anem a començar a la part superior esquerra. 13 00:00:46,050 --> 00:00:48,570 >> I direm que tenir una placa de 4 per 4. 14 00:00:48,570 --> 00:00:51,220 Així que la part superior esquerra estem dirà és de 15. 15 00:00:51,220 --> 00:00:53,960 I llavors només explicarem a través de les juntes, dient: 15, 14, 13, 16 00:00:53,960 --> 00:00:58,510 12, 11, 10, 9, 8, 7, 6, 5, 4, i així successivament. 17 00:00:58,510 --> 00:01:03,780 Així que la part superior esquerra, esperem estar d vegades D menys 1, que en el 4 per 4 18 00:01:03,780 --> 00:01:08,290 cas serà 16 menys 1, que és correcta 15. 19 00:01:08,290 --> 00:01:10,885 >> I ara aquí és on anem a iterar sobre el fòrum sencer. 20 00:01:10,885 --> 00:01:14,720 I anem a ajustar cada posició en el tauler per al valor actual de 21 00:01:14,720 --> 00:01:19,090 nostre taulell, i després comptador es va per disminuir, de manera que la següent 22 00:01:19,090 --> 00:01:22,300 posició que arribem tindrà comptador sigui un menys que 23 00:01:22,300 --> 00:01:23,690 la posició anterior. 24 00:01:23,690 --> 00:01:26,970 Així que al principi teníem 15 i decrementar comptador. 25 00:01:26,970 --> 00:01:30,065 Així que anem a assignar 14 a la següent posició, comptador decreixent, 26 00:01:30,065 --> 00:01:33,710 i que anem a assignar 13, i així successivament. 27 00:01:33,710 --> 00:01:37,620 >> Finalment, hem de manejar aquesta cantonada cas en què, si el tauler té una encara 28 00:01:37,620 --> 00:01:44,450 dimensió, a continuació, només fer 15, 14, 13, 12, fins al final baix a 3, 2, 1, és 29 00:01:44,450 --> 00:01:46,780 ens deixarà amb una junta irresoluble. 30 00:01:46,780 --> 00:01:49,390 I hem de canviar la 1 i la 2. 31 00:01:49,390 --> 00:01:52,930 Per tant, si d mod 2 és igual a 0, això és com anem a comprovar 32 00:01:52,930 --> 00:01:54,410 per veure si és encara. 33 00:01:54,410 --> 00:01:59,810 Si d mod 2 és igual a 0, llavors a la fila d menys 1, que és la fila inferior, i 34 00:01:59,810 --> 00:02:05,430 posició d almenys 2 o columna d menys 2, anem a establir que a 2, i 35 00:02:05,430 --> 00:02:07,860 columna d mínim 3 estem va a establir en 1. 36 00:02:07,860 --> 00:02:12,170 Així que això és només invertir on l'1 i 2 són actualment. 37 00:02:12,170 --> 00:02:16,270 >> Finalment, anem a configurar el baix a la dreta igual al blanc, on 38 00:02:16,270 --> 00:02:20,700 blanc ha estat definit de hash a la part superior com 0. 39 00:02:20,700 --> 00:02:26,785 Per tant, això no era estrictament necessari, ja que aquest bucle tindrà 40 00:02:26,785 --> 00:02:30,610 fixar la part inferior dreta de 0, ja que comptador naturalment arribar a 0. 41 00:02:30,610 --> 00:02:34,610 Però això depèn de nosaltres, sabent que blanc s'aplica un algoritme hash per trobar un 0. 42 00:02:34,610 --> 00:02:38,280 Si entro en aquest programa i més tard canviar en blanc a la part superior a 100, es 43 00:02:38,280 --> 00:02:39,770 hauria de funcionar. 44 00:02:39,770 --> 00:02:43,180 >> Així que això és simplement assegurar-se que el baix a la dreta és en realitat igual a la nostra 45 00:02:43,180 --> 00:02:44,870 valor en blanc. 46 00:02:44,870 --> 00:02:50,270 Finalment, tenim dues variables globals, tan en blanc i i j en blanc, i veiem 47 00:02:50,270 --> 00:02:53,360 les declarades a la part superior. 48 00:02:53,360 --> 00:02:56,270 I utilitzarem aquests dos mundial variables per realitzar un seguiment de la 49 00:02:56,270 --> 00:02:59,040 posició del blanc, així que nosaltres no que hagi de mirar a través de la totalitat de 50 00:02:59,040 --> 00:03:03,890 fòrum per trobar el blanc cada vegada que tractem de fer un moviment. 51 00:03:03,890 --> 00:03:08,450 Així la posició de la peça en brut és sempre va a començar a la part inferior dreta. 52 00:03:08,450 --> 00:03:13,270 Així que la part inferior dreta està donada per Índexs 1 d menys 1, d menys. 53 00:03:13,270 --> 00:03:14,880 Llavors, això és init. 54 00:03:14,880 --> 00:03:17,040 >> Ara passem a dibuixar. 55 00:03:17,040 --> 00:03:19,370 Així, sorteig serà similar on repetirem 56 00:03:19,370 --> 00:03:20,970 sobre el fòrum sencer. 57 00:03:20,970 --> 00:03:25,400 I només volem imprimir el valor això és en cada posició de la junta. 58 00:03:25,400 --> 00:03:29,580 Així que aquí, anem a imprimir el valor que és en cada posició de la junta. 59 00:03:29,580 --> 00:03:32,280 I notem que estem fent -. 60 00:03:32,280 --> 00:03:37,410 I això és simplement dir-li a printf que independentment de si és un dígit o 61 00:03:37,410 --> 00:03:42,010 nombre de dos dígits, encara volem que ocupen dos columnes en la impressió, 62 00:03:42,010 --> 00:03:46,290 pel que si tenim dos dígits i una nombre de dos dígits en el mateix tauler, el nostre 63 00:03:46,290 --> 00:03:49,450 tauler encara es vegin bé i quadrat. 64 00:03:49,450 --> 00:03:54,190 >> Així que volem fer que per cada valor a la taula, excepte per al blanc. 65 00:03:54,190 --> 00:03:58,260 Per tant, si la posició en el tauler és igual l'espai en blanc, llavors específicament 66 00:03:58,260 --> 00:04:01,730 voleu imprimir només un guió baix per representar l'espai en blanc, en lloc de 67 00:04:01,730 --> 00:04:05,150 qualsevol que sigui el valor de la en blanc en realitat és. 68 00:04:05,150 --> 00:04:08,500 >> Finalment, volem imprimir una nova línia. 69 00:04:08,500 --> 00:04:11,970 Tingueu en compte que això és encara a l'interior el cicle for exterior, però fora 70 00:04:11,970 --> 00:04:13,200 l'interior de bucle. 71 00:04:13,200 --> 00:04:17,930 Atès que aquest cicle for exterior està iterant sobre totes les files, i pel que aquest és printf 72 00:04:17,930 --> 00:04:22,130 voleu imprimir només una nova línia, de manera que passar a imprimir la següent fila. 73 00:04:22,130 --> 00:04:23,910 I això és tot per sorteig. 74 00:04:23,910 --> 00:04:27,770 >> Així que, ara anem a passar a moure. 75 00:04:27,770 --> 00:04:32,590 Ara, passem moviment, la rajola que el usuari s'introdueix en el joc - que 76 00:04:32,590 --> 00:04:36,360 entrar al taulell que volen moure - i se suposa que has de tornar un bool, per 77 00:04:36,360 --> 00:04:39,300 ja sigui veritable o fals, depenent de si aquesta mesura era en realitat 78 00:04:39,300 --> 00:04:43,360 vàlida - si aquesta fitxa pot ser mogut en l'espai en blanc. 79 00:04:43,360 --> 00:04:48,340 >> Així que aquí, declarem una variable local, tile_1 i tile_j, que es va a 80 00:04:48,340 --> 00:04:52,150 ser similar a blank_i i blank_j, excepte que realitzarà un seguiment de la 81 00:04:52,150 --> 00:04:54,910 posició de la rajola. 82 00:04:54,910 --> 00:05:00,370 Ara aquí, utilitzarem blank_i i blank_j i dir bé, pel que 83 00:05:00,370 --> 00:05:01,930 aquí hi ha l'espai en blanc al tauler. 84 00:05:01,930 --> 00:05:04,420 >> Ara, és el mosaic sobre el blanc? 85 00:05:04,420 --> 00:05:06,210 És la rajola a l'esquerra de la peça en brut? 86 00:05:06,210 --> 00:05:07,420 És la rajola a la dreta del blanc? 87 00:05:07,420 --> 00:05:08,970 És la rajola sota del blanc? 88 00:05:08,970 --> 00:05:13,330 Per tant, si la fitxa està en cap dels posicions, llavors sabem que la rajola 89 00:05:13,330 --> 00:05:16,390 es pot moure en l'espai en blanc i la peça en brut es pot moure a on el 90 00:05:16,390 --> 00:05:18,240 rajoles actualment és. 91 00:05:18,240 --> 00:05:26,400 >> Així que aquí, diem si la targeta en la posició blank_i almenys 1 blank_j. 92 00:05:26,400 --> 00:05:31,120 Així que això està dient és la rajola per sobre de la peça en brut actual? 93 00:05:31,120 --> 00:05:34,350 I si és així, anem a recordar que és la posició de la rajola. 94 00:05:34,350 --> 00:05:37,870 El taulell està en posició blank_i menys 1 i blank_j. 95 00:05:37,870 --> 00:05:40,660 ara primer, també tenim aquesta comprovació aquí, pel que és blank_i 96 00:05:40,660 --> 00:05:41,760 més gran que 0. 97 00:05:41,760 --> 00:05:43,410 >> Per què volem fer això? 98 00:05:43,410 --> 00:05:47,290 Bé, si el blanc es troba a la fila superior del tauler, llavors no volem 99 00:05:47,290 --> 00:05:51,240 mirar per sobre del blanc per la rajola ja no hi ha res per sobre de la part superior 100 00:05:51,240 --> 00:05:52,430 fila de la taula. 101 00:05:52,430 --> 00:05:55,950 Aquesta és la forma en que podria acabar damunt d'aconseguir una mena de violació de segment o 102 00:05:55,950 --> 00:05:59,030 el programa podria funcionar de maneres inesperades. 103 00:05:59,030 --> 00:06:04,310 Per tant, aquest és assegurar-se que no ho fem buscar a llocs que no són vàlids. 104 00:06:04,310 --> 00:06:08,470 >> Ara farem el mateix per totes les altres combinacions possibles. 105 00:06:08,470 --> 00:06:13,250 Així que aquí, estem buscant per sota del blanc per veure si aquest és el taulell. 106 00:06:13,250 --> 00:06:16,950 I també hem de assegurar-nos que estem no a la fila inferior, o en cas contrari 107 00:06:16,950 --> 00:06:18,910 no ha de buscar la rajola. 108 00:06:18,910 --> 00:06:25,040 Aquí, anem a mirar a l'esquerra l'espai en blanc per veure si es tracta de la rajola. 109 00:06:25,040 --> 00:06:27,860 I no hem de mirar cap a l'esquerra si estem a la columna de l'esquerra. 110 00:06:27,860 --> 00:06:30,100 I aquí anem a mirar cap al dret de l'espai en blanc, i no hem 111 00:06:30,100 --> 00:06:33,340 mirar a la dreta si som a la columna més a la dreta. 112 00:06:33,340 --> 00:06:37,820 >> Així que, si cap d'aquestes coses fos cert, això vol dir que la rajola no era adjacent 113 00:06:37,820 --> 00:06:39,640 a la peça i podem tornar false. 114 00:06:39,640 --> 00:06:41,230 El moviment no era vàlida. 115 00:06:41,230 --> 00:06:47,010 Però, si un d'ells fos cert, llavors en aquest punt, sabem que tile_i i 116 00:06:47,010 --> 00:06:50,540 tile_j són iguals a la posició de la rajola. 117 00:06:50,540 --> 00:06:55,210 I així, podem actualitzar la pensió en posicions tile_i i tile_j. 118 00:06:55,210 --> 00:06:59,820 Sabem que el nou valor serà l'espai en blanc i que la posició blank_i 119 00:06:59,820 --> 00:07:02,950 blank_j, que era l'original blanc - sabem que la rajola es va a 120 00:07:02,950 --> 00:07:04,030 mudar-se allà. 121 00:07:04,030 --> 00:07:07,610 >> Noteu que en realitat no hem de fer una intercanvi real aquí, ja que sabem que el 122 00:07:07,610 --> 00:07:09,850 valors que necessiten ser inserit en aquestes posicions. 123 00:07:09,850 --> 00:07:13,780 No necessitem un temporal variable del voltant. 124 00:07:13,780 --> 00:07:16,920 >> Finalment, hem de recordar que Disposem de variables globals que estan 125 00:07:16,920 --> 00:07:18,980 fer el seguiment de la posició de la peça en brut. 126 00:07:18,980 --> 00:07:22,780 Així que volem actualitzar la posició de l'espai en blanc per ser on la rajola 127 00:07:22,780 --> 00:07:24,190 originalment era. 128 00:07:24,190 --> 00:07:27,680 Finalment, tornem cert ja el moviment va ser reeixit. 129 00:07:27,680 --> 00:07:31,110 Intercanviem amb èxit el en blanc amb la rajola. 130 00:07:31,110 --> 00:07:34,890 >> Molt bé, així que passat necessitarà comprovar won. 131 00:07:34,890 --> 00:07:39,900 Així, va guanyar retorna de manera similar un bool on veritat va a indicar que l' 132 00:07:39,900 --> 00:07:41,460 usuari ha guanyat la partida. 133 00:07:41,460 --> 00:07:43,780 I fals és el que indica que el joc està encara en curs. 134 00:07:43,780 --> 00:07:46,340 L'usuari no ha guanyat. 135 00:07:46,340 --> 00:07:52,100 Per tant, això serà més o menys el contrari init, on init, 136 00:07:52,100 --> 00:07:56,920 Recordem, inicialitzem el tauler a 15, 14, 13, 12, etc. 137 00:07:56,920 --> 00:08:03,000 Atès que el bestiar, volem comprovar si el Junta és 1, 2, 3, 4, 5, i així successivament. 138 00:08:03,000 --> 00:08:06,600 >> Per tant, anem a inicialitzar la nostra contrarestar a 1 ja que això és el que la part superior 139 00:08:06,600 --> 00:08:08,400 esquerre de la placa ha de ser. 140 00:08:08,400 --> 00:08:10,860 I després anem a bucle sobre el fòrum sencer. 141 00:08:10,860 --> 00:08:13,690 Anem a ignorar aquesta condició per un segon. 142 00:08:13,690 --> 00:08:18,410 I aquesta condició és només va a xec és el consell en aquesta posició 143 00:08:18,410 --> 00:08:20,790 igual als recomptes actuals? 144 00:08:20,790 --> 00:08:27,040 Si és així, incrementar el recompte de manera que el següent posició observem és una major 145 00:08:27,040 --> 00:08:29,690 que la posició que estem en aquests moments. 146 00:08:29,690 --> 00:08:32,700 >> Així és com s'obté la dalt a l'esquerra ha de ser 1. 147 00:08:32,700 --> 00:08:33,950 Incrementa el recompte de 2. 148 00:08:33,950 --> 00:08:35,010 Mira la següent posició. 149 00:08:35,010 --> 00:08:35,690 És això febrer? 150 00:08:35,690 --> 00:08:37,659 Si és així, incrementar el compte de 3. 151 00:08:37,659 --> 00:08:39,179 Posició següent, això és 3? 152 00:08:39,179 --> 00:08:42,440 Si és així, incrementar el recompte a 4, i així successivament. 153 00:08:42,440 --> 00:08:49,190 Així, si hi ha qualsevol posició en la tauler que no és igual al nostre compte, 154 00:08:49,190 --> 00:08:52,640 llavors volem tornar false ja que vol dir que hi ha alguna peça que es va 155 00:08:52,640 --> 00:08:55,490 no en la posició correcta. 156 00:08:55,490 --> 00:08:58,810 >> Així que aquí, el que fa d'aquesta condició? 157 00:08:58,810 --> 00:09:02,170 Bé, recordeu que el blanc és suposa anar a la part inferior dreta. 158 00:09:02,170 --> 00:09:06,180 I el valor del blanc podria no necessàriament igual al valor de l' 159 00:09:06,180 --> 00:09:11,080 responen que serà assolit a la part inferior dreta. 160 00:09:11,080 --> 00:09:15,760 Així que específicament volem comprovar si i és igual a és igual a D menys 1 i j iguals 161 00:09:15,760 --> 00:09:19,470 és igual a D almenys 1 - que ja és dir si estan buscant en la part inferior dreta de 162 00:09:19,470 --> 00:09:22,050 la junta - llavors només desitja continuar. 163 00:09:22,050 --> 00:09:26,200 Volem saltar aquest particular, iteració del bucle per. 164 00:09:26,200 --> 00:09:31,250 >> I així, si aconseguim sortir d'això niat bucle, el que significa que 165 00:09:31,250 --> 00:09:34,690 no hi havia rajola que estava en la posició incorrecta. 166 00:09:34,690 --> 00:09:38,900 I vam sortir de bucle i venim aquí, on podem tornar realitat. 167 00:09:38,900 --> 00:09:41,800 Tots les rajoles estaven en les posicions correctes i això significa que l'usuari té 168 00:09:41,800 --> 00:09:43,230 guanyat el joc. 169 00:09:43,230 --> 00:09:44,460 I això és tot. 170 00:09:44,460 --> 00:09:46,550 El meu nom és Rob Bowden, i això va ser el 15. 171 00:09:46,550 --> 00:09:52,726