/
Program.cs
189 lines (170 loc) · 8.61 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Skoczek
{
public struct Pole // zawiera informacje o danym polu szachownicy
{
public int nr, wybor;
public Pole(int a, int b)
{
nr = a; // kolejność w jakiej skoczek dociera do tego pola
wybor = b; // który prawidłowy ruch skoczka prowadzi do celu, domyślnie 1 czyli pierwszy, ale jeśli się cofamy wartość ta jest powiększana
}
}
public struct Pozycja // współrzędne; współrzędne określamy od górnego lewego rogu 0;0 do dolnego prawego BokSzachownicy-1;BokSzachownicy-1
{
public int x, y;
public Pozycja(int a, int b)
{
x = a;
y = b;
}
}
class Program
{
private const int BokSzachownicy = 8; // długość boku szachownicy - ilość pól
public static Pole[,] Szachownica = new Pole[BokSzachownicy, BokSzachownicy]; // deklarowanie pustej tablicy szachownicy
static void PokazSzachownice(Pole[,] Szachownica) // TESTOWE procedura do pokazywania szachownicy całej z informacjami o każdym polu
{
for (int y = 0; y < BokSzachownicy; y++)
{
Console.Write(BokSzachownicy-y + " ");
for (int x = 0; x < BokSzachownicy; x++)
{
Console.Write(Szachownica[x, y].wybor);
Console.Write(" ");
}
Console.WriteLine(" ");
}
Console.Write(" A B C D E"); // więcej liter to na razie testowe
Console.WriteLine(" ");
// Console.ReadKey();
}
private static bool Sprawdz(Pozycja p) // funkcja do sprawdzania, czy na danym polu konik już był i czy jest to pole wewnątrz szachownicy
{
if ((p.x >=0) && (p.x <= (BokSzachownicy - 1)) && (p.y >=0) && (p.y <= (BokSzachownicy - 1)) && (Szachownica[p.x,p.y].nr == 0)) return true;
else
return false;
}
private static Pozycja PoprzedniRuch (Pozycja Poz)
{
Pozycja Poprz = new Pozycja();
for (int x = 0; x < BokSzachownicy; x++) // Przeszukujemy tablicę
for (int y = 0; y < BokSzachownicy; y++)
{
if (Szachownica[x, y].nr == (Szachownica[Poz.x, Poz.y].nr - 1))
{
Poprz.x = x;
Poprz.y = y;
break;
}
}
return Poprz;
}
private static Pozycja Skok (Pozycja polestartowe) // funkcja wykonująca skok na kolejne pole - zwraca nowa pozycję konika, pobiera obecną pozycję konika
{
Pozycja wspolrzedne = new Pozycja();
int BiezPoprawnych = 0; // to się ma zwiększać przy sukcesie aż dojdzie do wartości MaxPoprawnych - wtedy bierzemy pozycję
int MaxPoprawnych = (Szachownica[polestartowe.x, polestartowe.y].wybor);
wspolrzedne.x = polestartowe.x + 1; // pierwszy możliwy skok
wspolrzedne.y = polestartowe.y - 2;
if ((Sprawdz(wspolrzedne)) && (++BiezPoprawnych == MaxPoprawnych)) return wspolrzedne;
else
{
wspolrzedne.x = polestartowe.x + 2; // drugi możliwy skok
wspolrzedne.y = polestartowe.y - 1;
if ((Sprawdz(wspolrzedne)) && (++BiezPoprawnych == MaxPoprawnych)) return wspolrzedne;
else
{
wspolrzedne.x = polestartowe.x + 1; // trzeci możliwy skok
wspolrzedne.y = polestartowe.y + 2;
if ((Sprawdz(wspolrzedne)) && (++BiezPoprawnych == MaxPoprawnych)) return wspolrzedne;
else
{
wspolrzedne.x = polestartowe.x + 2; // czwarty możliwy skok
wspolrzedne.y = polestartowe.y + 1;
if ((Sprawdz(wspolrzedne)) && (++BiezPoprawnych == MaxPoprawnych)) return wspolrzedne;
else
{
wspolrzedne.x = polestartowe.x - 1; // piąty możliwy skok
wspolrzedne.y = polestartowe.y + 2;
if ((Sprawdz(wspolrzedne)) && (++BiezPoprawnych == MaxPoprawnych)) return wspolrzedne;
else
{
wspolrzedne.x = polestartowe.x - 2; // szósty możliwy skok
wspolrzedne.y = polestartowe.y + 1;
if ((Sprawdz(wspolrzedne)) && (++BiezPoprawnych == MaxPoprawnych)) return wspolrzedne;
else
{
wspolrzedne.x = polestartowe.x - 1; // siódmy możliwy skok
wspolrzedne.y = polestartowe.y - 2;
if ((Sprawdz(wspolrzedne)) && (++BiezPoprawnych == MaxPoprawnych)) return wspolrzedne;
else
{
wspolrzedne.x = polestartowe.x - 2; // ósmy możliwy skok
wspolrzedne.y = polestartowe.y - 1;
if ((Sprawdz(wspolrzedne)) && (++BiezPoprawnych == MaxPoprawnych)) return wspolrzedne;
else
{
wspolrzedne = polestartowe;
}
}
}
}
}
}
}
}
return wspolrzedne;
}
static void Main(string[] args)
{
int MaksSkokow = BokSzachownicy * BokSzachownicy;
for (int x=0; x < BokSzachownicy; x++) // Wypełniamy tablicę szachownicy
for (int y = 0; y < BokSzachownicy; y++)
{
Szachownica[x, y].nr = 0;
Szachownica[x, y].wybor = 1;
}
Szachownica[0, BokSzachownicy-1].nr = 1; // Określamy pole startowe, czyli pole A1 (pole o współrzędnych 0;DługośćBoku)
Pozycja AktualnaPoz, NowaPoz = new Pozycja();
AktualnaPoz.x = 0;
AktualnaPoz.y = BokSzachownicy-1; // bo współrzędne określamy od 0 a nie od 1, a BokSzachownicy to ilość pól
NowaPoz = AktualnaPoz;
int max = 0;
do
{
do
{
AktualnaPoz = NowaPoz;
NowaPoz = Skok(AktualnaPoz); // skok
if ((NowaPoz.x != AktualnaPoz.x) && (NowaPoz.y != AktualnaPoz.y))
{
Szachownica[NowaPoz.x, NowaPoz.y].nr = Szachownica[AktualnaPoz.x, AktualnaPoz.y].nr + 1;
// Console.Write("Skok " + (Szachownica[NowaPoz.x, NowaPoz.y].nr) + ": " + NowaPoz.x + ", " + NowaPoz.y + "; "); // TESTOWE pozycja po skoku
}
}
while ((NowaPoz.x != AktualnaPoz.x) && (NowaPoz.y != AktualnaPoz.y));
if (Szachownica[AktualnaPoz.x, AktualnaPoz.y].nr != MaksSkokow) // jeśli nie doszliśmy do końca szachownicy
{
// cofnij aktualną pozycję o jeden do tyłu
NowaPoz = PoprzedniRuch(NowaPoz);
if (Szachownica[AktualnaPoz.x, AktualnaPoz.y].nr == 63) { max++; Console.WriteLine("Próba " + max); }
Szachownica[AktualnaPoz.x, AktualnaPoz.y].nr = 0;
Szachownica[AktualnaPoz.x, AktualnaPoz.y].wybor = 1;
// Console.WriteLine("Cofam się na " + NowaPoz.x + " : " + NowaPoz.y);
// Console.ReadKey();
// zaznacz, że trzeba brać inny wybór
if (Szachownica[NowaPoz.x, NowaPoz.y].wybor < 8) Szachownica[NowaPoz.x, NowaPoz.y].wybor ++;
}
}
while (Szachownica[AktualnaPoz.x, AktualnaPoz.y].nr != MaksSkokow);
Console.WriteLine();
Console.WriteLine("SUKCES!");
PokazSzachownice(Szachownica); // TESTOWE pokazuje całą szachownicę z kolejnymi ruchami
Console.ReadKey();
}
}
}