W tego typu systemie jedyne opóźnienie obliczeniowe wynika z czasu propagacji bramek lub urządzeń logicznych. Ponieważ nasz komputer reaguje wyłącznie na statyczne stany logiczne, nie może się pomylić, zawiesić ani przestać działać.
Szybkość nie jest istotna dla tego zastosowania, ale niski pobór prądu już tak. W systemach taktowanych jakimś przebiegiem zegarowym pobór prądu wzrasta wraz z jego częstotliwością. Komputer statyczny wykonany w technologii CMOS jest wyjątkowo energooszczędny i doskonale nadaje się do zasilania z baterii. Pobór prądu ze źródła zasilania 9 V waha się od 75 mA do 90 mA, z czego większość jest pobierana przez świecące diody LED.
Urządzenie zawiera generator, ale nie jest on używany do żadnych obliczeń, a służy jedynie do generowania liczb losowych (RNG) wykorzystujący technikę „wirującego koła” opisaną dalej.
Zanim zabrałem się za rozwiązanie tego problemu, uznałem, że warto najpierw zastanowić się, jak właściwie w kółko i krzyżyk grają dwie osoby. Gracz rozpoczynający partię ma wyraźną przewagę nad przeciwnikiem, dlatego w kolejnych rozgrywkach należy zaczynać grę na przemian. Dzięki temu szanse obu stron pozostaną wyrównane. Oznacza to, że komputer musi umieć zarówno wykonać pierwszy ruch, jak i pozwolić człowiekowi rozpocząć grę.
Przewidywalny gracz może rozpocząć grę w ten sam sposób za każdym razem, na przykład zaczynając na centralnym polu, aby uzyskać maksymalną przewagę. Ale takie przewidywalne zachowanie szybko staje się bardzo nudne, więc gdy komputer jest pierwszym graczem, powinien zmieniać swoją strategię otwarcia.
Kiedy człowiek wygrywa grę, prawdopodobnie ogłasza to z wielkim entuzjazmem, więc komputer potrzebuje sposobu na powiadomienie człowieka o wygranej.
Wreszcie, dwaj ludzie grający ze sobą są na tyle niedoskonali, że prędzej czy później jeden z nich popełnia błąd w ocenie. Pozwoliłoby to drugiemu człowiekowi, który nie popełnił żadnych błędów, nie tylko zapobiec wygranej drugiego człowieka (powodując remis), ale także pokonać drugiego gracza.
Prawidłowa i kompletna maszyna Kółko i Krzyżyk nie tylko byłaby niepokonana przez człowieka, ale też powinna być w stanie wygrać z nim przy każdej okazji. Wymaga to analizy każdego możliwego błędu, jaki człowiek może popełnić podczas rozgrywki.
W świetle powyższych cech zdecydowałem, że sposobem na zaprojektowanie maszyny będzie początkowo stworzenie gry planszowej dla dwóch graczy. Każdy gracz mógłby umieścić dysk z etykietą „X” lub „O” na planszy. Działałaby ona dobrze nawet przy braku zasilania elektrycznego, a dwóch graczy mogłoby cieszyć się grą razem, jak podczas zwykłej gry.
Jeśli jednak jeden z graczy (ludzi) „zaginie”, a gra jest zasilana, maszyna wkracza do akcji, aby zastąpić jednego z nich. Uruchamiany jest wtedy scenariusz człowiek kontra maszyna.
Maszyna musi być w stanie wykonywać funkcje, które posiadałby „bezbłędny” gracz – człowiek: nigdy nie popełniać błędów, nigdy nie zostać pokonanym, ale także wygrywać, gdy nadarzy się okazja.
Gra została zaprojektowana jako plansza dla gracza z żetonami „X” i „O”, natomiast komputer ma jedynie „mózg” – bez oczu i rąk. Dlatego to człowiek umieszcza na planszy żetony w imieniu maszyny. Komputer wskazuje swoje pole, zapalając diodę LED w miejscu, w którym chce umieścić swój żeton.
Zauważ, że w tym projekcie maszyna zawsze gra jako O, a człowiek jako X.
Plansza może wykryć obecność żetonu „X” lub „O” na planszy gracza. Komputer „wie”, gdzie na planszy znajduje się każdy z nich i „wie”, kiedy jest ruch maszyny, kiedy człowieka.
Gdy nadchodzi kolej maszyny, jej ruch jest obliczany w czasie krótszym niż 200 ns. Po przeanalizowaniu rozmieszczenia żetonów „X” i „O” komputer zapala diodę LED w polu, w którym chce umieścić swój żeton „O”.
Na planszy znajduje się dziewięć pól, więc w pełnej partii można wykonać dziewięć ruchów. Gdy pierwszy ruch wykonuje „X”, w grze pojawia się pięć żetonów „X” i cztery żetony „O”. Jeśli natomiast jako pierwszy zaczyna „O”, sytuacja się odwraca – pięć żetonów „O” i cztery żetony „X”.
Oznacza to, że w grze pozostaje albo żeton „X”, albo żeton „O”, w zależności od tego, czy grę rozpoczął – człowiek (X), czy maszyna (O). W związku z tym zapewniono dodatkowe miejsce do przechowywania nieużywanego żetonu. Miejsce to działa również jako dwubiegunowy przełącznik elektryczny do konfigurowania obwodów komputera w celu ustalenia, kto zaczyna pierwszy. Jest to nie tylko wygodne, ale także pozwala uniknąć konieczności stosowania jakichkolwiek przełączników mechanicznych.
Jeśli X (człowiek) ma rozpocząć grę jako pierwszy, na wolnym polu jest umieszczany żeton „O”, ale jeśli O ma rozpocząć grę jako pierwszy, żeton „X” jest umieszczany na dodatkowym polu. Instrukcja ta jest wygrawerowana na powierzchni planszy gracza wraz z informacją, że człowiek gra żetonami „X”, a maszyna żetonami „O”.
Gdy gra jest włączona, a na planszy nie ma początkowo żadnych żetonów, wszystkie diody LED świecą się. Jest to sygnalizacja, że nastąpi „losowe uruchomienie”. Diody LED na planszy zapalają się szybko w sekwencji, jedna po drugiej. Jest to za razem testowanie diod, podobnie jak kiedyś zwyczajowo zapalano w urządzeniach na krótko wszystkie lampki zaraz po włączeniu.
Jeśli żeton „X” zostanie umieszczony w wolnym miejscu (co oznacza, że maszyna zaczyna jako pierwsza), „obracające się koło” zatrzyma się i zablokuje pierwszy ruch komputera. Diody LED, które pozostają zapalone, wskazują losową pozycję dla pierwszego ruchu O.
Gdy pokrywa gry (górna pokrywa na zawiasach) jest zamknięta, bezpiecznie przechowuje wszystkie żetony wewnątrz, dzięki czemu nie zgubią się ani nie oddzielą od planszy.
Prototyp gry jest zasilany z zasilacza 9 V, ale ponieważ pobór prądu jest mały, urządzenie może być zasilane z baterii 9 V.
Projekt układu
Zainspirował mnie fakt, że w 1958 roku Dick Smith zbudował maszynę do gry w kółko i krzyżyk z części pochodzących z centrali telefonicznej. Najprawdopodobniej były to wówczas części zabytkowe, a większość z nich pochodziła z centrali telefonicznej z lat 30. ubiegłego wieku.
Uznałem, że możliwe powinno być zrobienie podobnego urządzenia przy użyciu bramek logicznych. Bardzo lubię bramki logiczne z serii 74 i zwykle używam typów 74xxx (TTL) lub 74LSxxx (logika Schottky o niskim poborze mocy). Istnieją również wersje CMOS, takie jak seria 74HCTxxx. Wykonują one te same funkcje logiczne przy niższym zużyciu energii, więc wybrałem je do tego projektu. Użyłem również niebieskich diod LED, ponieważ świecą bardzo jasno przy małym prądzie.
Układy komputera są rozmieszczone na dwóch płytkach drukowanych, „płytce do gry” ze wszystkimi elementami interfejsu użytkownika (czujniki Halla, diody LED itp.) oraz „płytce obliczeniowej”, która zawiera wszystkie układy sterujące.
Aby przeanalizować wzorce rozgrywki i wykonać prawidłowy ruch, używam pamięci EPROM lub EEPROM. Potrzebują one 18 linii adresowych do przetwarzania logiki planszy gracza. Do sterowania działaniem komputera układ wykorzystuje informacje o „parzystości” wytwarzane na planszy w zależności od tego, który gracz zaczyna pierwszy.
Odpowiednią pamięcią EPROM dostępną w obudowach PLCC lub DIL jest AT27C020 firmy Microchip. Kompatybilna jest też łatwo dostępna i niedroga pamięć EEPROM Winbond W27C020. W moim prototypie użyłem podobnej pamięci EPROM 27C020 kasowanej promieniami UV, ponieważ miałem ją pod ręką, wraz z odpowiednim programatorem.
Zabawa ze słabymi magnesami
Chcąc uniknąć mechanicznych przełączników i nie mając mikrokontrolera do obsługi interfejsu dotykowego, zdecydowałem się użyć magnesów ferrytowych firmy Jaycar. Są one umieszczone w elementach gracza, wraz z ratiometrycznymi (analogowymi) czujnikami Halla i służą do wprowadzania danych przez użytkownika.
Magnesy ferrytowe (Jaycar Cat LM1616) są dostarczane w paczce po 12 sztuk, ja użyłem tylko 10, pięć dla żetonów „X” i pięć dla „O”. Wyciąłem otwór o średnicy 14,5 mm i głębokości 4,5 mm w dolnej części każdego plastikowego żetonu o średnicy 25 mm i grubości 10 mm. Następnie przykleiłem do nich magnesy używając żywicy epoksydowej utwardzającej się w czasie 24 godzin.
Celowo nie użyłem silnych magnesów neodymowych, ponieważ ich pole magnetyczne byłoby zbyt silne i mogłoby zakłócać działanie pobliskich elementów. Mają one również zwyczaj przeskakiwania do siebie nawzajem lub do najbliższego obiektu magnetycznego i magnesowania go, co sprzyja przypadkowemu wymazywaniu nośników magnetycznych. Chociaż użyłem słabych magnesów, ich pole magnetyczne jest wystarczające do działania czujników Halla.
Siatka 3×3 czujników Halla oznaczonych HS1...HS9 i cztery diody LED powiązane z każdym z nich tworzą planszę do gry. Dziesiąty czujnik Halla, HS10, służy do określania, który gracz zaczyna pierwszy, jak opisano wcześniej. Sześć poczwórnych wzmacniaczy operacyjnych LM324 (w sumie 24 pojedyncze wzmacniacze, cztery nieużywane) odpowiednio przetwarza napięcia wyjście czujników Halla.
Bez przyłożonego pola magnetycznego, napięcie wyjściowe DC każdego czujnika Halla mieści się w zakresie od 70 mV od 2,5 V. Elementy gracza X i O mają magnesy przyklejone wewnątrz nich w przeciwnych orientacjach. Umieszczenie żetonu „O” powoduje, że sygnał wyjściowy z czujnika Halla jest niski (poniżej 2 V), natomiast umieszczenie żetonu „X” na czujniku powoduje, że sygnał wyjściowy jest wysoki (powyżej 3 V).
Wzmacniacze operacyjne są używane jako komparatory do generowania stanu logicznego 1 (wysokiego poziomu) na wejściu Data X lub O, gdy na płytce umieszczony jest odpowiednio element gracza X lub O. Układy LM324 są przydatne do tego zadania, ponieważ ich zakres napięć wyjściowych, gdy są zasilane z 5 V, jest idealnie dopasowany do poziomów logicznych TTL.