1 00:00:00,000 --> 00:00:13,070 2 00:00:13,070 --> 00:00:13,715 >> ROB BOWDEN: Hallo. 3 00:00:13,715 --> 00:00:17,800 Ich bin Rob, und ich hoffe, dass Ihr Spiel für Spiel von 15 Jahren. 4 00:00:17,800 --> 00:00:22,040 Jetzt gibt es vier Funktionen, die Sie brauchen in diesem Programm zu implementieren - init, 5 00:00:22,040 --> 00:00:24,650 ziehen, verschieben und gewann. 6 00:00:24,650 --> 00:00:27,230 Also, schauen wir uns init. 7 00:00:27,230 --> 00:00:32,930 >> Hier sehen wir das erste, was wir sind zu tun ist, deklarieren Sie eine Variable 8 00:00:32,930 --> 00:00:34,600 Gegen genannt. 9 00:00:34,600 --> 00:00:37,620 Es wird initialisiert werden d d minus 1 mal. 10 00:00:37,620 --> 00:00:40,200 Denken Sie daran, dass d ist die Dimension von unserem Vorstand. 11 00:00:40,200 --> 00:00:43,840 Wie init funktionieren wird ist, es wird über die gesamte Platine laufen 12 00:00:43,840 --> 00:00:46,050 und wir werden beginnen in der oberen linken. 13 00:00:46,050 --> 00:00:48,570 >> Und lassen Sie uns einfach sagen, dass wir eine 4 mal 4 Bord. 14 00:00:48,570 --> 00:00:51,220 Also die oben links, wir sind sagen 15 ist. 15 00:00:51,220 --> 00:00:53,960 Und dann sind wir gerade dabei, zählen durch die Bretter, sagen 15, 14, 13, 16 00:00:53,960 --> 00:00:58,510 12, 11, 10, 9, 8, 7, 6, 5, 4, und so weiter. 17 00:00:58,510 --> 00:01:03,780 Also die oben links, erwarten wir, d mal sein d minus 1, die in der 4 mal 4 18 00:01:03,780 --> 00:01:08,290 Fall wird zu 16 minus sein 1, die vollständig 15 ist. 19 00:01:08,290 --> 00:01:10,885 >> Und jetzt ist hier, wo wir zu gehen durchlaufen das gesamte Board. 20 00:01:10,885 --> 00:01:14,720 Und wir werden um jede Position in eingestellt der Vorstand auf den aktuellen Wert von 21 00:01:14,720 --> 00:01:19,090 unsere Zähler, Zähler und dann wird zu verringern, so daß die nächste 22 00:01:19,090 --> 00:01:22,300 Position, die wir erreichen, ist zu haben, Zähler sein ein weniger als 23 00:01:22,300 --> 00:01:23,690 die vorherige Position. 24 00:01:23,690 --> 00:01:26,970 So hatten wir zunächst 15 und Zähler verringern. 25 00:01:26,970 --> 00:01:30,065 Also werden wir weisen Sie 14, um die nächste Position, Abnahme-Zähler, 26 00:01:30,065 --> 00:01:33,710 und wir gehen zugewiesen 13, und so weiter. 27 00:01:33,710 --> 00:01:37,620 >> Schließlich müssen wir diese Ecke hand Fall, wenn das Board hat eine noch 28 00:01:37,620 --> 00:01:44,450 Dimension, dann nur tun, 15, 14, 13, 12 den ganzen Weg hinunter bis 3, 2, 1, ist 29 00:01:44,450 --> 00:01:46,780 gehen, um uns verlassen ein unlösbares Bord. 30 00:01:46,780 --> 00:01:49,390 Und wir haben zu tauschen die 1 und die 2. 31 00:01:49,390 --> 00:01:52,930 Also, wenn d mod 2 gleich 0 ist, ist, dass wie wir gehen, um zu überprüfen, 32 00:01:52,930 --> 00:01:54,410 um zu sehen, ob es überhaupt. 33 00:01:54,410 --> 00:01:59,810 Wenn d mod 2 gleich 0 ist, dann in Reihe d minus 1, die die untere Reihe ist, und 34 00:01:59,810 --> 00:02:05,430 Position d minus 2 oder minus Spalte d 2, werden wir das auf 2 gesetzt, und 35 00:02:05,430 --> 00:02:07,860 Spalte d minus 3 wir sind werde auf 1 gesetzt. 36 00:02:07,860 --> 00:02:12,170 Also das ist nur, wo Umkehr die 1 und 2 gerade befinden. 37 00:02:12,170 --> 00:02:16,270 >> Schließlich werden wir die sehr gesetzt unten rechts gleich leer, wo 38 00:02:16,270 --> 00:02:20,700 Rohling wurde Hash definiert an der Spitze als 0 ist. 39 00:02:20,700 --> 00:02:26,785 So, das war nicht unbedingt notwendig, da dies für die Schleife ist zu haben, 40 00:02:26,785 --> 00:02:30,610 stellen Sie die unten rechts auf 0, da Zähler wird natürlich erreichen 0. 41 00:02:30,610 --> 00:02:34,610 Aber das beruht auf uns zu wissen, dass Rohling wurde gehasht, um eine 0 zu finden. 42 00:02:34,610 --> 00:02:38,280 Wenn ich in diesem Programm und später ändern blank an der Spitze bis 100, es 43 00:02:38,280 --> 00:02:39,770 sollte immer noch funktionieren. 44 00:02:39,770 --> 00:02:43,180 >> Das ist also nur sicher, dass die unten rechts ist eigentlich gleich unsere 45 00:02:43,180 --> 00:02:44,870 Blindwert. 46 00:02:44,870 --> 00:02:50,270 Schließlich haben wir zwei globale Variablen, so blank und leer i j, und wir sehen, 47 00:02:50,270 --> 00:02:53,360 die an der Spitze erklärt. 48 00:02:53,360 --> 00:02:56,270 Und wir werden diese beiden global zu bedienen Variablen zu verfolgen, die halten 49 00:02:56,270 --> 00:02:59,040 Position des leer, so dass wir nicht benötigen, um durch die gesamte Look 50 00:02:59,040 --> 00:03:03,890 Bord der Rohling jeder einzelne zu finden Zeit, die wir versuchen, einen Schritt zu machen. 51 00:03:03,890 --> 00:03:08,450 Also immer die Position des Rohlings gehen, um rechts unten starten. 52 00:03:08,450 --> 00:03:13,270 Also das rechts unten ist gegeben durch Indizes d minus 1, d minus 1. 53 00:03:13,270 --> 00:03:14,880 Also, das ist init. 54 00:03:14,880 --> 00:03:17,040 >> Jetzt bewegen wir uns auf zu zeichnen. 55 00:03:17,040 --> 00:03:19,370 Also, Unentschieden geht ähnlich zu sein wohin wir gehen, um laufen 56 00:03:19,370 --> 00:03:20,970 im gesamten Forum. 57 00:03:20,970 --> 00:03:25,400 Und wir, um den Wert zu drucken will nur das ist in jeder Position der Platine. 58 00:03:25,400 --> 00:03:29,580 Also hier, wir Druck den Wert, ist in jeder Position der Platine. 59 00:03:29,580 --> 00:03:32,280 Und feststellen, dass wir tun, -. 60 00:03:32,280 --> 00:03:37,410 Und das ist nur zu sagen, dass printf unabhängig davon, ob es eine Ziffer oder ein 61 00:03:37,410 --> 00:03:42,010 zweistellige Zahl, wir wollen, dass es noch nehmen zwei Spalten in dem Ausdruck, 62 00:03:42,010 --> 00:03:46,290 so dass, wenn wir zwei Ziffer und ein stellige Zahlen in der gleichen Platine, unsere 63 00:03:46,290 --> 00:03:49,450 Board wird noch schön Platz zu suchen. 64 00:03:49,450 --> 00:03:54,190 >> So zu, dass für jeden Wert wollen wir tun im Vorstand, mit Ausnahme der leer. 65 00:03:54,190 --> 00:03:58,260 Also, wenn die Position in der Platine gleich der Rohling, dann haben wir speziell 66 00:03:58,260 --> 00:04:01,730 ausdrucken wollen einfach nur einen Unterstrich um den Rohling dar, anstatt 67 00:04:01,730 --> 00:04:05,150 unabhängig vom Wert der blank tatsächlich ist. 68 00:04:05,150 --> 00:04:08,500 >> Schließlich drucken möchten wir aus einer neuen Zeile. 69 00:04:08,500 --> 00:04:11,970 Beachten Sie, dass es sich immer noch in die äußere for-Schleife, aber außerhalb 70 00:04:11,970 --> 00:04:13,200 die innere for-Schleife. 71 00:04:13,200 --> 00:04:17,930 Seit dieser äußere for-Schleife wird die Iteration über alle Zeilen, so dass diese printf 72 00:04:17,930 --> 00:04:22,130 werde nur eine neue Zeile zu drucken, so dass wir gehen Sie zum Ausdrucken der nächsten Zeile. 73 00:04:22,130 --> 00:04:23,910 Und das ist es Unentschieden. 74 00:04:23,910 --> 00:04:27,770 >> So, jetzt nun zu bewegen zu lassen. 75 00:04:27,770 --> 00:04:32,590 Jetzt kommen wir zu bewegen, die Fliesen, die die Benutzer im Spiel eingetragen - sie 76 00:04:32,590 --> 00:04:36,360 geben Sie die Fliese sie sich bewegen wollen - und sollen Sie einen bool zurück, so 77 00:04:36,360 --> 00:04:39,300 entweder wahr oder falsch, je nachdem, ob diese Bewegung war eigentlich 78 00:04:39,300 --> 00:04:43,360 gültig - ob Fliesen können zog in den leeren Raum. 79 00:04:43,360 --> 00:04:48,340 >> So, hier erklären wir, eine lokale Variable, tile_1 und tile_j, die gehen 80 00:04:48,340 --> 00:04:52,150 ähnlich sein blank_i und blank_j, außer es geht um den Überblick über die zu halten 81 00:04:52,150 --> 00:04:54,910 Position der Fliese. 82 00:04:54,910 --> 00:05:00,370 Jetzt ist hier, wir gehen zu bedienen blank_i und blank_j und sagen, alles in Ordnung, so 83 00:05:00,370 --> 00:05:01,930 hier ist der Rohling auf dem Brett. 84 00:05:01,930 --> 00:05:04,420 >> Jetzt ist die Fliese über der leer? 85 00:05:04,420 --> 00:05:06,210 Ist die Fliese auf der linken Seite des Rohlings? 86 00:05:06,210 --> 00:05:07,420 Ist die Fliese auf der rechten Seite des Zuschnitts? 87 00:05:07,420 --> 00:05:08,970 Ist die Platte unter der leer? 88 00:05:08,970 --> 00:05:13,330 Also, wenn die Fliese ist in jedem der genannten Positionen, dann wissen wir, dass die Fliese 89 00:05:13,330 --> 00:05:16,390 in die leere Stelle bewegt und der Rohling bewegt werden, wo der 90 00:05:16,390 --> 00:05:18,240 Fliesen derzeit. 91 00:05:18,240 --> 00:05:26,400 >> So, hier, sagen wir, wenn Karte an Position blank_i minus 1 blank_j. 92 00:05:26,400 --> 00:05:31,120 Also das sagt, ist die Fliese über dem aktuellen leer? 93 00:05:31,120 --> 00:05:34,350 Und wenn ja, werden wir daran erinnern, das ist die Position der Fliese. 94 00:05:34,350 --> 00:05:37,870 Die Fliese ist in Position blank_i minus 1 und blank_j. 95 00:05:37,870 --> 00:05:40,660 Jetzt erste, haben wir auch dieses Kontroll genau hier, so blank_i 96 00:05:40,660 --> 00:05:41,760 größer als 0 ist. 97 00:05:41,760 --> 00:05:43,410 >> Warum wollen wir das tun? 98 00:05:43,410 --> 00:05:47,290 Nun, wenn der Rohling in der oberen Reihe des Vorstandes, dann wollen wir nicht zu 99 00:05:47,290 --> 00:05:51,240 Blick über den Zuschnitt für die Fliesen seit Es ist nichts über die Oberseite 100 00:05:51,240 --> 00:05:52,430 Reihe der Platine. 101 00:05:52,430 --> 00:05:55,950 Dies ist, wie Sie vielleicht am Ende immer so etwas wie ein Segmentierungsfehler oder 102 00:05:55,950 --> 00:05:59,030 Ihr Programm könnte nur funktionieren auf unerwartete Weise. 103 00:05:59,030 --> 00:06:04,310 So, das ist, sicherzustellen, dass wir nicht schauen Sie in Orten, die nicht gültig sind. 104 00:06:04,310 --> 00:06:08,470 >> Jetzt werden wir das Gleiche zu tun für alle anderen Kombinationen möglich. 105 00:06:08,470 --> 00:06:13,250 So, hier sind wir unter dem leeren Blick um zu sehen, ob das die Fliese. 106 00:06:13,250 --> 00:06:16,950 Und wir müssen auch sicherstellen, dass wir nicht in der unteren Reihe, oder wir 107 00:06:16,950 --> 00:06:18,910 sollte nicht nach den Fliesen. 108 00:06:18,910 --> 00:06:25,040 Hier werden wir auf der linken Seite sehen der Rohling, um zu sehen, ob es die Fliese. 109 00:06:25,040 --> 00:06:27,860 Und wir sollten nicht nach links zu schauen wenn wir in der linken Spalte. 110 00:06:27,860 --> 00:06:30,100 Und hier werden wir auf der Suche rechts von der leer, und wir sollten nicht 111 00:06:30,100 --> 00:06:33,340 nach rechts zu schauen, wenn wir in der rechten Spalte. 112 00:06:33,340 --> 00:06:37,820 >> Also, wenn nichts von alledem wahr wäre, das bedeutet, dass die Fliese war nicht benachbart 113 00:06:37,820 --> 00:06:39,640 auf den Rohling und wir false zurück. 114 00:06:39,640 --> 00:06:41,230 Der Umzug war nicht gültig. 115 00:06:41,230 --> 00:06:47,010 Aber, wenn einer von denen wahr wäre, dann dieser Punkt, wissen wir, dass tile_i und 116 00:06:47,010 --> 00:06:50,540 tile_j gleich das sind Position der Fliese. 117 00:06:50,540 --> 00:06:55,210 Und so können wir das Board an aktualisieren Positionen tile_i und tile_j. 118 00:06:55,210 --> 00:06:59,820 Wir wissen, dass der neue Wert wird der leer sein und dass die Position blank_i 119 00:06:59,820 --> 00:07:02,950 blank_j, die das Original war blank - wir wissen die Fliese wird sich 120 00:07:02,950 --> 00:07:04,030 bewegen gibt. 121 00:07:04,030 --> 00:07:07,610 >> Beachten wir eigentlich nicht haben, zu tun, ein Echt Swap hier, da wir wissen, dass die 122 00:07:07,610 --> 00:07:09,850 Werte, die eingefügt werden müssen, in diesen Positionen. 123 00:07:09,850 --> 00:07:13,780 Wir haben nicht einen vorübergehenden Bedarf Variable um. 124 00:07:13,780 --> 00:07:16,920 >> Schließlich müssen wir, dass wir uns erinnern haben unsere globale Variablen, die sind 125 00:07:16,920 --> 00:07:18,980 Verfolgen der Position des Rohlings. 126 00:07:18,980 --> 00:07:22,780 Also, um die Position aktualisieren möchten wir der Rohling, wo die Fliese sein 127 00:07:22,780 --> 00:07:24,190 ursprünglich war. 128 00:07:24,190 --> 00:07:27,680 Schließlich kehren wir wahr, da der Umzug war erfolgreich. 129 00:07:27,680 --> 00:07:31,110 Wir tauschen die erfolgreich Rohling mit der Fliese. 130 00:07:31,110 --> 00:07:34,890 >> Na gut, so haben wir letzten müssen gewonnen zu überprüfen. 131 00:07:34,890 --> 00:07:39,900 Also, hat eine ähnlich bool zurück wo wahr wird, um anzuzeigen, dass die 132 00:07:39,900 --> 00:07:41,460 Benutzer hat das Spiel gewonnen. 133 00:07:41,460 --> 00:07:43,780 Und falsch ist, die anzeigt, dass das Spiel ist noch im Gange. 134 00:07:43,780 --> 00:07:46,340 Der Benutzer hat nicht gewonnen. 135 00:07:46,340 --> 00:07:52,100 Also, das wird ziemlich viel sein das Gegenteil von init, wo init, 136 00:07:52,100 --> 00:07:56,920 erinnern, initialisieren wir das Board 15, 14, 13, 12, usw.. 137 00:07:56,920 --> 00:08:03,000 Zu überprüfen Während gewonnen, wir wollen, wenn die Platte 1, 2, 3, 4, 5 und so weiter. 138 00:08:03,000 --> 00:08:06,600 >> Also, wir gehen zu initialisieren unsere Zähler auf 1 denn das ist, was die Top 139 00:08:06,600 --> 00:08:08,400 links von der Bord sein sollte. 140 00:08:08,400 --> 00:08:10,860 Und dann sind wir in einer Schleife gehen im gesamten Forum. 141 00:08:10,860 --> 00:08:13,690 Lassen Sie uns diesen Zustand zu ignorieren für eine Sekunde. 142 00:08:13,690 --> 00:08:18,410 Und dieser Zustand wird nur gehen, um Prüfung ist der Vorstand an dieser Stelle 143 00:08:18,410 --> 00:08:20,790 gleich den aktuellen Zählerstände? 144 00:08:20,790 --> 00:08:27,040 Wenn ja, inkrementiert die Zählung, so daß die nächste Position wir uns eins höher 145 00:08:27,040 --> 00:08:29,690 als die Position, die wir sind gerade jetzt. 146 00:08:29,690 --> 00:08:32,700 >> Also das ist, wie wir die Oben links sollte 1 sein. 147 00:08:32,700 --> 00:08:33,950 Erhöhen Sie die Anzahl auf zwei. 148 00:08:33,950 --> 00:08:35,010 Schauen Sie sich die nächste Position. 149 00:08:35,010 --> 00:08:35,690 Ist das 2? 150 00:08:35,690 --> 00:08:37,659 Wenn ja, inkrementiert den Zähler auf 3. 151 00:08:37,659 --> 00:08:39,179 Nächste Position, das ist 3? 152 00:08:39,179 --> 00:08:42,440 Wenn dem so ist, erhöhen Sie die Anzahl 4, und so weiter. 153 00:08:42,440 --> 00:08:49,190 Also, wenn es irgendeine Position auf der Brett, das unserer Zählung nicht gleich, 154 00:08:49,190 --> 00:08:52,640 dann false zurück, da wollen wir, dass bedeutet, es gibt einige, die Fliese ist 155 00:08:52,640 --> 00:08:55,490 nicht in der richtigen Position. 156 00:08:55,490 --> 00:08:58,810 >> So, hier, was ist diese Bedingung zu tun? 157 00:08:58,810 --> 00:09:02,170 Nun, daran erinnern, dass der Rohling soll unten rechts zu gehen. 158 00:09:02,170 --> 00:09:06,180 Und der Wert des Rohlings vielleicht nicht notwendigerweise den Wert der 159 00:09:06,180 --> 00:09:11,080 entgegen, dass wird zu erreichen unten rechts. 160 00:09:11,080 --> 00:09:15,760 Also haben wir speziell überprüfen wollen, ob i gleich gleich d minus 1 und j Gleichen 161 00:09:15,760 --> 00:09:19,470 gleich d minus 1 - das sagt, wenn wir sind am unteren rechten Betrachtungs 162 00:09:19,470 --> 00:09:22,050 der Vorstand - dann haben wir nur wollen weiter. 163 00:09:22,050 --> 00:09:26,200 Wir wollen diese besondere überspringen Iteration der for-Schleife. 164 00:09:26,200 --> 00:09:31,250 >> Und so, wenn wir es schaffen, durch diese zu bekommen for-Schleife verschachtelt ist, bedeutet das, dass 165 00:09:31,250 --> 00:09:34,690 es gab keine Fliese, die in war die falsche Position. 166 00:09:34,690 --> 00:09:38,900 Und wir aus der Schleife zu brechen und kommen hier, wo wir true zurück. 167 00:09:38,900 --> 00:09:41,800 Alle Fliesen waren in den richtigen Positionen und das bedeutet, der Benutzer 168 00:09:41,800 --> 00:09:43,230 gewann das Spiel. 169 00:09:43,230 --> 00:09:44,460 Und das ist es. 170 00:09:44,460 --> 00:09:46,550 Mein Name ist Rob Bowden, und das war 15. 171 00:09:46,550 --> 00:09:52,726