#include #include"conio2.h" /* Uwaga: w docelowym programie należy zadeklarować odpowiednie stałe, na przykład po to, aby wyeliminować z programu wartości numeryczne umieszczajac w ich miejsce dobrze dobrane identyfikatory */ #define POZYCJA_MENU 1 #define POZYCJA_PLANSZY 60 #define PION 4 //przesuniecie planszy w pionie #define DOMYSLNA_WIELKOSC 12 int wyswietlanie_planszy_domyslnej(char plansza[DOMYSLNA_WIELKOSC+2][DOMYSLNA_WIELKOSC+3]); int sprawdz_regule_jeden(char plansza[DOMYSLNA_WIELKOSC + 2][DOMYSLNA_WIELKOSC + 3], int zn, int x, int y); int sprawdzanie_reguly_dwa(char plansza[DOMYSLNA_WIELKOSC+ 2][DOMYSLNA_WIELKOSC + 3]); int sprawdzanie_reguly_dwa_v2(char plansza[DOMYSLNA_WIELKOSC+ 2][DOMYSLNA_WIELKOSC + 3]); int sprawdzanie_reguly_trzy(char plansza[DOMYSLNA_WIELKOSC + 2][DOMYSLNA_WIELKOSC + 3]); int main() { int zn = 0, x = 50, y = 12, attr = 7, back = 0, zero = 0; char txt[32]; bool new_game = false; int regula_2; char plansza[DOMYSLNA_WIELKOSC+2][DOMYSLNA_WIELKOSC+3]= { { "/------------\\" }, { "| 1 1|" }, { "| 0 1 |" }, { "| 0 |" }, { "| 0 1 0 0 0 0|" }, { "|1 1 0 1 |" }, { "| 0 1 |" }, { "| 11 1 |" }, { "|0 0 0|" }, { "| 1 1 1 |" }, { "| 0 0 0 |" }, { "| 0 00 0|" }, { "| 1 0 1 |" }, { "\\------------/" } }; // jeżeli program jest kompilowany w czystym języku C // należy wywołać poniższą linię //#ifndef __cplusplus Conio2_Init(); //#endif // settitle ustawia tytuł okienka settitle("Anna Pazniewska 172027"); do { int regJ, regD, regT; regJ = regD = regT = 1; // ustawiamy czarny kolor tła, z którego będziemy // korzystali rysując po ekranie // proszę zerknąć do conio2.h na listę dostępnych kolorów textbackground(BLACK); // czyścimy ekran: wypełniamy spacjami z ustawionym kolrem tła clrscr(); // ustawiamy kolor tekstu na jasnoszary (7 == LIGHTGRAY) textcolor(7); //najpierw przesuwamy tam gdzie jest domyslnie kursor, zeby pobraly sie wlasciwe x i y w natepnej isntrukcji gotoxy(x, y); //ta funkcja formatuje tekst i zapisuje, w naszej tablicy txt - zadeklarowana wyzej sprintf(txt, "kursor: x - %d, y - %d", wherex(), wherey()); //przesuniecie kursora - musisz wstawic odpowiedni x i y gotoxy(POZYCJA_MENU, 17); //wypisanie tekstu cputs(txt); // przesuwamy kursor do kolumny 55 i wiersza 1 // wiersze i kolumny liczymy od 1 gotoxy(POZYCJA_MENU,1); // wyświetlamy na ekranie, w miejscu kursora napis // kursor przesuwa się w prawo o długość napisu cputs("Anna Pazniewska 172027"); gotoxy(POZYCJA_MENU, 3); cputs("strzalki = poruszanie"); gotoxy(POZYCJA_MENU, 4); cputs("ESC = wyjscie z programu"); gotoxy(POZYCJA_MENU, 5); cputs("n = nowa gra"); gotoxy(POZYCJA_MENU, 6); cputs("01 = wypisanie cyfry na plansze"); gotoxy(POZYCJA_MENU, 7); cputs("o = losowe wypelnienie planszy"); gotoxy(POZYCJA_MENU, 8); cputs("p = prosta podpowiedz"); gotoxy(POZYCJA_MENU, 9); cputs("r = zmiana rozmiaru planszy"); gotoxy(POZYCJA_MENU, 10); cputs("k = proste sprawdzenie mozliwosci ukonczenia gry"); gotoxy(POZYCJA_MENU, 11); cputs("d = sprawdzenie reguly"); gotoxy(POZYCJA_MENU, 12); cputs("a = automatyczna detekcja konca gry"); gotoxy(POZYCJA_MENU, 13); cputs("j = podswietlenie"); gotoxy(POZYCJA_MENU, 14); cputs("w = wypelnienie podswietlonych jednoznacznych pol"); gotoxy(POZYCJA_MENU, 15); cputs("s = zapisanie stanu gry"); gotoxy(POZYCJA_MENU, 16); cputs("l = odczytanie stanu gry"); gotoxy(POZYCJA_MENU, 17); cputs("b = pelne sprawdzenie, przykladowe wypelnienie pol"); gotoxy(POZYCJA_MENU, 18); cputs("spacja = zmiana koloru"); gotoxy(POZYCJA_MENU, 19); cputs("enter = zmiana koloru tla"); // wypisujemy na ekranie kod ostatnio naciśniętego klawisza if (zero) sprintf(txt, "kod klawisza: 0x00 0x%02x", zn); else sprintf(txt, "kod klawisza: 0x%02x", zn); gotoxy(POZYCJA_MENU, 20); cputs(txt); if(regJ == -1) { gotoxy(POZYCJA_MENU, 25); cputs("Nie spełniona reguła 1"); } if(regD == -1) { gotoxy(POZYCJA_MENU, 26); cputs("Nie spełniona reguła 2"); } if(regT == -1) { gotoxy(POZYCJA_MENU, 27); cputs("Nie spełniona reguła 3"); } // do tego momentu wyswietlanie menu //tutaj wyswietlanie planszy if(new_game) wyswietlanie_planszy_domyslnej(plansza); // rysujemy na ekranie kolorową gwiazdkę gotoxy(x, y); textcolor(attr); textbackground(back); // putch rysuje jeden znak i przesuwa kursor w prawo //putch('*'); // czekamy na naciśnięcie klawisza i odczytujemy jego kod, // większość kodów klawiszy odpowiada ich znakom, np. // a to 'a', 2 to '2', + to '+', ale niektóre klawisze // specjalne, np. strzałki są zgłaszane jako dwa kolejne znaki, // z których pierwszy jest zerem, np. strzałka w górę // to zero i 'H' zero = 0; zn = getch(); // nie chcemy, aby klawisz 'H' działał jako strzałka w górę // więc sprawdzamy, czy pierwszym znakiem było zero if (zn == 0) { zero = 1; // jeżeli tak, to czytamy zn = getch(); // kolejny znak wiedząc już, if (zn == 0x48) y--; // że będzie to znak specjalny else if (zn == 0x50) y++; else if (zn == 0x4b) x--; else if (zn == 0x4d) x++; } else if (zn == ' ') attr = (attr + 1) % 16; else if (zn == 0x0d) back = (back + 1) % 16; else if (zn == '0' || zn == '1') { regJ = sprawdz_regule_jeden(plansza, zn, wherex(), wherey()); regD = sprawdzanie_reguly_dwa_v2(plansza); regT = sprawdzanie_reguly_trzy(plansza); if (regJ == 1 && regD == 1 && regT == 1) { int y_gdzie = wherey() - PION; int x_gdzie = wherex() - POZYCJA_PLANSZY; plansza[y_gdzie][x_gdzie] = zn+2; } } else if (zn == 'n') new_game = true; else if(zn='d') regula_2 = sprawdzanie_reguly_dwa(plansza); } while (zn !=27);//0x1b= 27, kod ESC return 0; } int wyswietlanie_planszy_domyslnej(char plansza[DOMYSLNA_WIELKOSC + 2][DOMYSLNA_WIELKOSC + 3]){ //kontrola bledow if (plansza == NULL) return -1; for (int i = 0; i < DOMYSLNA_WIELKOSC + 2; i++) { gotoxy(POZYCJA_PLANSZY, PION + i); for (int j = 0; j < DOMYSLNA_WIELKOSC + 3; j++) { //jesli wpisane wartosci if (plansza[i][j] == '2' || plansza[i][j] == '3') { //zmiana koloru textcolor(5); putch(plansza[i][j] - 2); } //jesli wygenerowane wartosci else { //standardowy kolor textcolor(7); putch(plansza[i][j]); } } } //znow zmiana na standardowy textcolor(7); return 1; } int sprawdz_regule_jeden(char plansza[DOMYSLNA_WIELKOSC + 2][DOMYSLNA_WIELKOSC + 3], int zn, int x, int y) { //najpierw sprawdzamy czy kursor znajduje się w planszy if (x > POZYCJA_PLANSZY && x < POZYCJA_PLANSZY + DOMYSLNA_WIELKOSC + 1 && y > PION && y < PION + DOMYSLNA_WIELKOSC + 1) { //teraz sprawdzamy czy wybrane pole jest modyfikowalne y -= PION; x -= POZYCJA_PLANSZY; if (plansza[y][x] != '0' & plansza[y][x] != '1') { //ostatecznie sprawdzamy czy spelniona zostala regula jeden - w zadnym wierszu i zadnej kolumnie obok siebie nie moga wystapic wiecej niz dwie identyczne cyfry //zmienna pomocniczne char buff = plansza[y][x]; bool koniec = false; //najpierw wpiszmy w wybrane przez uzytkownika pole, wybrany przez niego znak plansza[y][x] = zn; //teraz przechodzimy cala plansze //najpierw sprawdzamy w poziomie for (int i = 1; i < DOMYSLNA_WIELKOSC + 1; i++) { for (int j = 1; j < DOMYSLNA_WIELKOSC - 1; j++) { //3 kolejne są zerami if ((plansza[i][j] == '0' || plansza[i][j] == '2') && (plansza[i][j + 1] == '0' || plansza[i][j + 1] == '2') && (plansza[i][j + 2] == '0' || plansza[i][j + 2] == '2')) { koniec = true; break; } //3 kolejne sa jedynkami else if ((plansza[i][j] == '1' || plansza[i][j] == '3') && (plansza[i][j + 1] == '1' || plansza[i][j + 1] == '3') && (plansza[i][j + 2] == '1' || plansza[i][j + 2] == '3')) { koniec = true; break; } } if (koniec) break; } //jesli w poziomie nie znaleziono bledu if (!koniec) { //sprawdzanie w pionie for (int j = 1; j < DOMYSLNA_WIELKOSC+ 1; j++) { for (int i = 1; i < DOMYSLNA_WIELKOSC - 1; i++) { //3 kolejne są zerami if ((plansza[i][j] == '0' || plansza[i][j] == '2') && (plansza[i + 1][j] == '0' || plansza[i + 1][j] == '2') && (plansza[i + 2][j] == '0' || plansza[i + 2][j] == '2')) { koniec = true; break; } //3 kolejne sa jedynkami else if ((plansza[i][j] == '1' || plansza[i][j] == '3') && (plansza[i + 1][j] == '1' || plansza[i + 1][j] == '3') && (plansza[i + 2][j] == '1' || plansza[i + 2][j] == '3')) { koniec = true; break; } } if (koniec) break; } } //w poziomie znaleziono blad else { //usuwamy wczesniej wpisane pole plansza[y][x] = buff; return -1; } if (koniec) { plansza[y][x] = buff; return -1; } else { plansza[y][x] = buff; //plansza[y][x] += 2; return 1; } } //inaczej wybrano pole niemodyfikowalne else return -1; } //jesli poza plansza else return -1; } int sprawdzanie_reguly_dwa(char plansza[DOMYSLNA_WIELKOSC + 2][DOMYSLNA_WIELKOSC + 3]) { int licz_z; int licz_j; //sprawdzanie w pionie for (int i = POZYCJA_PLANSZY + 1; i= DOMYSLNA_WIELKOSC/2 || licz_j >= DOMYSLNA_WIELKOSC/2) return -1; } //sprawdzanie w poziomie for (int j = PION + 1; j= DOMYSLNA_WIELKOSC/2 || licz_j >= DOMYSLNA_WIELKOSC/2) return -1; } return 1; } int sprawdzanie_reguly_trzy(char plansza[DOMYSLNA_WIELKOSC + 2][DOMYSLNA_WIELKOSC + 3]) { bool przerwanie = false; //sprawdzanie czy kolumny są takie same //ta petla bedzie zmieniala kolumne porownywana - tutaj dochodzimy do przedostatniej for(int i = 1; i <= DOMYSLNA_WIELKOSC-1; i++) { //ta petla zmienia kolumny z ktorymi porownujemy - tutaj dochodzimy do ostatniej for(int i_2 = i+1; i_2 <= DOMYSLNA_WIELKOSC-1; i_2++) { //ta petla przemieszcza sie po wierszach - wszystkich przerwanie = false; for(int j = 1; j <=DOMYSLNA_WIELKOSC-1; j++) { if(plansza[j][i] != plansza[j][i_2]) { przerwanie = true; //wyjscie z 3 petli break; } } //jesli przeszlismy cale i nie bylo roznych elementow - przerwanie == false if(przerwanie == false) //konczymy sprawdzanie - regula nie spelniona return -1; } } //sprawdzanie czy wiersze sa takie same //ta petla bedzie zmieniala wiersz do porownania - tutaj dochodzimy do przedostatniego for(int i = 1; i <= DOMYSLNA_WIELKOSC-1; i++) { //ta petla zmienia wiersze z ktorymi porownyjemy - tutaj dochodzimy do ostatniego for(int i_2 = i+1; i_2 <= DOMYSLNA_WIELKOSC-1; i_2++) { //ta petal przemieszcza sie po kolumnach - wszystkich przerwanie = false; for(int j = 1; j <= DOMYSLNA_WIELKOSC-1; j++) { if(plansza[i][j] != plansza[i_2][j]) { przerwanie = true; //wyjscie z 3 petli break; } } //jesli przeszlismy cala i nie bylo roznych elementow - przerwanie == false if(przerwanie == false) //konczymy sprawdzanie - regula nie spelniona return -1; } } return 1; }