- #include<stdio.h>
- #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<POZYCJA_PLANSZY + DOMYSLNA_WIELKOSC + 1; i++) {
- licz_z = licz_j = 0;
- for (int j = PION + 1; j<PION + DOMYSLNA_WIELKOSC + 1; j++) {
- if (plansza[j][i] == '0' || plansza[j][i] == '2') {
- licz_z++;
- }
- else if (plansza[j][i] == '1' || plansza[j][i] == '3')
- licz_j++;
- }
- if (licz_z != licz_j)
- return -1;
- }
- //sprawdzanie w poziomie
- for (int j = PION + 1; j<PION + DOMYSLNA_WIELKOSC + 1; j++) {
- licz_z = licz_j = 0;
- for (int i = POZYCJA_PLANSZY + 1; i<POZYCJA_PLANSZY + DOMYSLNA_WIELKOSC + 1; i++) {
- if (plansza[j][i] == '0' || plansza[j][i] == '2') {
- licz_z++;
- }
- else if (plansza[j][i] == '1' || plansza[j][i] == '3')
- licz_j++;
- }
- if (licz_z != licz_j)
- return -1;
- }
- return 1;
- }
- int sprawdzanie_reguly_dwa_v2(char plansza[DOMYSLNA_WIELKOSC+ 2][DOMYSLNA_WIELKOSC + 3]) {
- int licz_z;
- int licz_j;
- //sprawdzanie w pionie
- for (int i = POZYCJA_PLANSZY + 1; i<POZYCJA_PLANSZY + DOMYSLNA_WIELKOSC + 1; i++) {
- licz_z = licz_j = 0;
- for (int j = PION + 1; j<PION + DOMYSLNA_WIELKOSC + 1; j++) {
- if (plansza[j][i] == '0' || plansza[j][i] == '2') {
- licz_z++;
- }
- else if (plansza[j][i] == '1' || plansza[j][i] == '3')
- licz_j++;
- }
- if (licz_z >= DOMYSLNA_WIELKOSC/2 || licz_j >= DOMYSLNA_WIELKOSC/2)
- return -1;
- }
- //sprawdzanie w poziomie
- for (int j = PION + 1; j<PION + DOMYSLNA_WIELKOSC + 1; j++) {
- licz_z = licz_j = 0;
- for (int i = POZYCJA_PLANSZY + 1; i<POZYCJA_PLANSZY + DOMYSLNA_WIELKOSC + 1; i++) {
- if (plansza[j][i] == '0' || plansza[j][i] == '2') {
- licz_z++;
- }
- else if (plansza[j][i] == '1' || plansza[j][i] == '3')
- licz_j++;
- }
- if (licz_z >= 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;
- }