$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600 'szybkość transmisji mikrokontroler - PC
Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 'przypisanie pinów wyświetlacza LCD i jego konfiguracja
Config Lcd = 16 * 2 'konfiguracja rozmiaru wyświetlacza
Config Rc5 = Pind.2 'przypisanie pinów odbiornika podczerwieni
Enable Interrupts 'umożliwienie przetwań
Dim Address As Byte , Command As Byte , Togglebit As Byte 'zmienne używane przy sterowaniu pilotem
Dim Okej(9) As Byte 'tablica wykorzystywana przy sprawdzaniu sudoku
Dim A(81) As Integer 'tablica przechowująca sudoku
Dim I As Integer 'zmienne pomocnicze
Dim J As Integer
Dim K As Integer
Dim S As String * 20 'string wykorzystywany przy wyświetlaniu
Dim Pozycja As Integer 'zmienna przechowująca pozycję kursora
Dim Donzo As Byte 'zmienna pomocnicza
Dim Support(81) As Integer 'tablica pomocnicza przy operacjach na tablicy sudoku
Declare Sub Wygeneruj 'deklaracje: - generuje sudoku
Declare Sub Wypisz ' - wypisuje sudoku
Declare Sub Ustaw(byval Tmp As Integer , Byval Tmp2 As Byte) ' - ustawia wartosc w sudoku
Declare Sub Sprawdz ' - sprawdza poprawność wypełnienia sudoku
Declare Function Move(byval Tmp As Integer , Byval Typruchu As Integer) As Integer 'deklaracja funkcji przesuwania kursora
Print "Witaj w ATMsudoku!" 'pierwsze uruchomienie
Cls
Cursor Off Noblink
Lcd "Podlacz mnie do" 'informacje wyświetlane na LCD
Lowerline
Lcd "komputera :-)"
For I = 1 To 81 Step 1
A(i) = 0
Next I
Call Wygeneruj
Pozycja = 1
Do 'pętla główna
Call Wypisz
Donzo = 0
While Donzo <> 1
Getrc5(address , Command) 'zczytywanie komend pilota
Command = Command And &B01111111
If Command = 37 Then
Donzo = 1
Pozycja = Move(pozycja , 3)
Elseif Command = 38 Then
Donzo = 1
Pozycja = Move(pozycja , 4)
Elseif Command = 53 Then
Donzo = 1
Pozycja = Move(pozycja , 1)
Elseif Command = 54 Then
Donzo = 1
Pozycja = Move(pozycja , 2)
Elseif Command >= 1 And Command <= 9 Then
Donzo = 1
Call Ustaw(pozycja , Command)
Elseif Command = 49 Then
Donzo = 1
Call Ustaw(pozycja , Command)
End If
Wend
Call Sprawdz
Loop
End
'--------------------------------------------------------------------
Sub Wygeneruj '4 sudoku o różnych poziomach trudności
Donzo = 0 '1 sudoku testowe
Print "Wybierz jedna z pieciu plansz"
Print "1 - prosta"
Print "2 - srednia"
Print "3 - trudna"
Print "4 - testowa"
Print ""
While Donzo <> 1
Getrc5(address , Command)
Command = Command And &B01111111
If Command = 1 Then
Donzo = 1
A(3) = 7
A(5) = 4
A(8) = 1
A(9) = 9
A(11) = 8
A(14) = 6
A(15) = 7
A(18) = 2
A(20) = 2
A(25) = 3
A(31) = 9
A(34) = 4
A(36) = 5
A(37) = 4
A(40) = 5
A(41) = 3
A(42) = 6
A(45) = 8
A(46) = 9
A(48) = 1
A(51) = 4
A(57) = 3
A(62) = 5
A(64) = 7
A(67) = 4
A(68) = 1
A(71) = 3
A(73) = 6
A(74) = 1
A(77) = 2
A(79) = 9
Elseif Command = 2 Then
Donzo = 1
A(2) = 1
A(3) = 9
A(5) = 2
A(8) = 4
A(10) = 2
A(11) = 5
A(12) = 8
A(15) = 6
A(16) = 7
A(21) = 7
A(25) = 8
A(30) = 1
A(31) = 3
A(32) = 4
A(33) = 5
A(41) = 7
A(49) = 2
A(50) = 9
A(51) = 8
A(52) = 4
A(57) = 4
A(61) = 1
A(66) = 2
A(67) = 7
A(70) = 5
A(71) = 6
A(72) = 9
A(74) = 9
A(77) = 1
A(79) = 3
A(80) = 8
Elseif Command = 3 Then
Donzo = 1
A(3) = 8
A(5) = 7
A(6) = 4
A(7) = 9
A(8) = 1
A(10) = 6
A(18) = 7
A(20) = 2
A(22) = 9
A(27) = 3
A(32) = 2
A(33) = 1
A(35) = 4
A(38) = 6
A(39) = 1
A(41) = 3
A(42) = 5
A(47) = 8
A(49) = 5
A(50) = 6
A(55) = 3
A(60) = 7
A(62) = 9
A(64) = 8
A(72) = 5
A(74) = 4
A(75) = 6
A(76) = 8
A(77) = 9
A(79) = 2
Elseif Command = 4 Then
Donzo = 1
A(1) = 7
A(2) = 2
A(3) = 5
A(4) = 9
A(5) = 3
A(6) = 4
A(7) = 1
A(8) = 6
A(9) = 8
A(10) = 9
A(11) = 8
A(12) = 6
A(13) = 2
'A(14) = 1 'zakomentowana 1 w celach testowych
A(15) = 7
A(16) = 5
A(17) = 3
A(18) = 4
A(19) = 3
A(20) = 4
A(21) = 1
A(22) = 8
A(23) = 6
A(24) = 5
A(25) = 9
A(26) = 2
A(27) = 7
A(28) = 5
A(29) = 9
A(30) = 4
A(31) = 1
A(32) = 8
A(33) = 6
A(34) = 2
A(35) = 7
A(36) = 3
A(37) = 2
A(38) = 6
A(39) = 3
A(40) = 7
A(41) = 5
A(42) = 9
A(43) = 8
A(44) = 4
A(45) = 1
A(46) = 1
A(47) = 7
A(48) = 8
A(49) = 4
A(50) = 2
A(51) = 3
A(52) = 6
A(53) = 9
A(54) = 5
A(55) = 6
A(56) = 3
A(57) = 9
A(58) = 5
A(59) = 7
A(60) = 1
A(61) = 4
A(62) = 8
A(63) = 2
A(64) = 8
A(65) = 1
A(66) = 7
A(67) = 6
A(68) = 4
A(69) = 2
A(70) = 3
A(71) = 5
A(72) = 9
A(73) = 4
A(74) = 5
A(75) = 2
A(76) = 3
A(77) = 9
A(78) = 8
A(79) = 7
A(80) = 1
A(81) = 6
End If
Upperline
Wend
Cls
Lcd "Milej gry ;-)" 'po wybraniu sudoku wiadomość na lcd się zmienia
End Sub
Sub Wypisz 'wyswietlanie sudoku na ekranie komputera
Local Saving As Integer
Saving = Pozycja
S = ""
For I = 0 To 8 Step 1
For J = 1 To 9 Step 1
Pozycja = Saving
K = I * 9
K = K + J
If K <> Pozycja Then
S = S + " "
Else
S = S + ">"
End If
If A(k) = 0 Then
S = S + "_"
Else
S = S + Str(a(k)) 'zamiana liczby na napis
End If
Next J
Print S
S = ""
Next I
Pozycja = Saving
Print ""
Print "------------"
Print ""
End Sub
Sub Ustaw(byval Tmp As Integer , Byval Tmp2 As Byte) 'ustawianie wartości w miejscu kursora
If Tmp2 >= 1 And Tmp2 <= 9 Then
A(tmp) = Tmp2
Elseif Tmp2 = 49 Then 'komenda 49 pilota usuwa wprowadzoną wartość
A(tmp) = 0
End If
End Sub
Sub Sprawdz 'sprawdzanie wykonania sudoku
Local Test As Byte
Local Tmp As Integer
Test = 1
For I = 0 To 8
For J = 1 To 9
Okej(j) = 0
Next J
For J = 1 To 9
For K = 1 To 81
Support(k) = A(k)
Next K
Tmp = I * 9
Tmp = Tmp + J
Tmp = Support(tmp)
If Tmp <> 0 Then
Okej(tmp) = 1
End If
Next J
For J = 1 To 9
If Okej(j) <> 1 Then
Test = 0
End If
Next J
Next I
For I = 1 To 9
For J = 1 To 9
Okej(j) = 0
Next J
For J = 0 To 8
For K = 1 To 81
Support(k) = A(k)
Next K
Tmp = J * 9
Tmp = Tmp + I
Tmp = Support(tmp)
If Tmp <> 0 Then
Okej(tmp) = 1
End If
Next J
For J = 1 To 9
If Okej(j) <> 1 Then
Test = 0
End If
Next J
Next I
If Test = 1 Then
Print ""
Print "GRATULACJE!"
Print "Udalo Ci sie rozwiazac SUDOKU!"
Print ""
End If
End Sub
Function Move(byval Tmp As Integer , Byval Typruchu As Integer) As Integer 'przesuwsanie kursora
Local Pozycjafinal As Integer
Pozycjafinal = Tmp
If Typruchu = 1 Then
Tmp = Tmp - 9
If Tmp > 0 Then Pozycjafinal = Tmp
Elseif Typruchu = 2 Then
Tmp = Tmp + 9
If Tmp < 82 Then Pozycjafinal = Tmp
Elseif Typruchu = 3 Then
Tmp = Tmp - 1
If Tmp > 0 Then Pozycjafinal = Tmp
Elseif Typruchu = 4 Then
Tmp = Tmp + 1
If Tmp < 82 Then Pozycjafinal = Tmp
End If
Move = Pozycjafinal 'zwracanie nowej pozycji kursora
End Function