From 4a7292f829e04dd3480c604bc95ba6642b10c0c0 Mon Sep 17 00:00:00 2001 From: Nircek Date: Sat, 20 Oct 2018 19:59:52 +0200 Subject: [PATCH 1/8] Przeniesienie getch() do osobnego pliku --- getch.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ getch.h | 8 ++++++++ main.cpp | 34 +--------------------------------- 3 files changed, 64 insertions(+), 33 deletions(-) create mode 100644 getch.cpp create mode 100644 getch.h diff --git a/getch.cpp b/getch.cpp new file mode 100644 index 0000000..2aef2d8 --- /dev/null +++ b/getch.cpp @@ -0,0 +1,55 @@ +/* +MIT License + +Copyright (c) 2018 Nircek + +Permission is hereby granted free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +// code from https://gist.github.com/Nircek/c8b104456e6c68068866425072a0863f +// under MIT license +#include +#ifdef _WIN32 +#include +#else +#include +#include +char getch(){ + // src: https://stackoverflow.com/a/16361724/6732111 + char buf=0; + struct termios old={0}; + std::cout.flush(); + if(tcgetattr(0, &old)<0) + throw "tcsetattr()"; + old.c_lflag&=~ICANON; + old.c_lflag&=~ECHO; + old.c_cc[VMIN]=1; + old.c_cc[VTIME]=0; + if(tcsetattr(0, TCSANOW, &old)<0) + throw "tcsetattr ICANON"; + if(read(0,&buf,1)<0) + throw "read()"; + old.c_lflag|=ICANON; + old.c_lflag|=ECHO; + if(tcsetattr(0, TCSADRAIN, &old)<0) + throw "tcsetattr ~ICANON"; + std::cout< #include #include - - -// code from https://gist.github.com/Nircek -// under MIT license -#include -#ifdef _WIN32 -#include -#else -#include -#include -char getch(){ - // src: https://stackoverflow.com/a/16361724/6732111 - char buf=0; - struct termios old={0}; - std::cout.flush(); - if(tcgetattr(0, &old)<0) - throw "tcsetattr()"; - old.c_lflag&=~ICANON; - old.c_lflag&=~ECHO; - old.c_cc[VMIN]=1; - old.c_cc[VTIME]=0; - if(tcsetattr(0, TCSANOW, &old)<0) - throw "tcsetattr ICANON"; - if(read(0,&buf,1)<0) - throw "read()"; - old.c_lflag|=ICANON; - old.c_lflag|=ECHO; - if(tcsetattr(0, TCSADRAIN, &old)<0) - throw "tcsetattr ~ICANON"; - //std::cout< Date: Sat, 20 Oct 2018 20:01:51 +0200 Subject: [PATCH 2/8] =?UTF-8?q?Usuni=C4=99cie=20zb=C4=99dnego=20wypisywani?= =?UTF-8?q?a=20wci=C5=9Bni=C4=99tego=20klawisza?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- getch.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/getch.cpp b/getch.cpp index 2aef2d8..5911cf7 100644 --- a/getch.cpp +++ b/getch.cpp @@ -49,7 +49,6 @@ char getch(){ old.c_lflag|=ECHO; if(tcsetattr(0, TCSADRAIN, &old)<0) throw "tcsetattr ~ICANON"; - std::cout< Date: Sat, 20 Oct 2018 20:05:49 +0200 Subject: [PATCH 3/8] =?UTF-8?q?Powi=C4=85zanie=20kodu=20=C5=BAr=C3=B3d?= =?UTF-8?q?=C5=82owego=20getch=20z=20nag=C5=82=C3=B3wkiem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- getch.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/getch.cpp b/getch.cpp index 5911cf7..e0ac2c4 100644 --- a/getch.cpp +++ b/getch.cpp @@ -1,3 +1,4 @@ +#include "getch.h" /* MIT License From 38dd0f47b4921ba3f823337c259a5a2cbdffb801 Mon Sep 17 00:00:00 2001 From: Nircek Date: Sat, 20 Oct 2018 20:27:08 +0200 Subject: [PATCH 4/8] Przeniesienie rzeczy labiryntu do labirynt* --- labirynt.cpp | 286 ++++++++++++++++++++++++++++++++++++++++++++++++++ labirynt.h | 49 +++++++++ main.cpp | 291 +-------------------------------------------------- 3 files changed, 336 insertions(+), 290 deletions(-) create mode 100644 labirynt.cpp create mode 100644 labirynt.h diff --git a/labirynt.cpp b/labirynt.cpp new file mode 100644 index 0000000..0a33508 --- /dev/null +++ b/labirynt.cpp @@ -0,0 +1,286 @@ +#include "labirynt.h" + +// zmienne globalne +string mapy="maps"; //folder, w którym są mapy +string file_name; //ścieżka do mapy +string prev_file; //nazwa poprzedniej mapy +size_t SIZE=0; +string *bufor = NULL; +vector mapa; +char user_ch='X', end_ch='O'; +COORDS player_coords; +COORDS end_coords; + +void getMap() +{ +std::fstream file; +file.open(file_name.c_str(), ios::in); +if(file.good()==false) +{ + throw "File does not exist"; + +} +mapa.clear(); +SIZE = 0; +string line; +while (getline(file, line)) { + mapa.push_back(line); + ++SIZE; +} + +file.close(); +} + +bool isExist(COORDS p) { // sprawdza czy dane pole jest na mapie + if(p.y>=SIZE)return false; + return mapa[p.y].size()>=p.x; +} + +bool isWall(COORDS c) // czy na podanych kordach nie ma spacji +{ + if(!isExist(c))return true; + if (mapa[c.y][c.x] == ' ') //sprawdza czy space + return false; //zwraca, czy jest, czy nie + else return true; +} +COORDS randomCoords(bool notWall) { + COORDS c; + do { + c.y = rand() % SIZE; + size_t s = mapa[c.y].size(); + if(s) // s != 0 + c.x = rand() % s; + }while((!isExist(c))||(notWall&&isWall(c))); + return c; +} +void beginingcoords() { // bierze poczontkowe koordy i wrzuca do zmiennej + player_coords = randomCoords(); +} +void targetcoords() { // bierze koordy celu/wyjścia i wrzuca do zmiennej + int rozmiar ,rzmr,sm=SIZE,sn=SIZE ; + do{ + end_coords = randomCoords(); + rozmiar = sqrt(2*pow(mapa[0].size(),2))/2; + rzmr = sqrt(pow(player_coords.x-end_coords.x,2)+pow(player_coords.y-end_coords.y,2)); + cout << rzmr << " "<< rozmiar << endl; + }while (rzmrwidth*height*3) + break; + } + } +} + +char getEvent() + + { + return getch(); + }// pobierz znak +void doEvent(char c) { + c = toupper(c); + COORDS n=player_coords; + switch(c) { + case 'W': --n.y; break; + case 'S': ++n.y; break; + case 'A': --n.x; break; + case 'D': ++n.x; break; + } + if(!isWall(n)) + player_coords = n; + +}// wykonaj operację przypisaną do danego znaku (np WSAD) +char drawOnBufor(COORDS C, char c) { // narysuj na x i y znak c i zwróć poprzednie co tam było + char oc = bufor[C.y][C.x]; + bufor[C.y][C.x] = c; + return oc; +} +void refreshBufor() { // załaduj mapę do bufora i nanieś na nie usera i wyjście + if(!bufor) delete[] bufor; + bufor = new string[SIZE]; + for(size_t i=0; i0) + cout << bufor[i] << '\n'; +} +bool isEnd() {// czy jesteśmy na kordach wyjścia + if ((player_coords.x== end_coords.x) && (player_coords.y==end_coords.y)) + return true; + else return false; + } +class pojemnik { + string s; + int part(int l, int r){ + string x = get(l); + int i = l, j = r; + string w; + while(1) { + while (get(j) > x)j--; + while (get(i) < x)i++; + if (id_name).size()>=4) + if(string(plik->d_name).substr(string(plik->d_name).size()-4) == string(".map")) + p1.push( plik->d_name ); + closedir( sciezka ); + } + else + throw "Nie udalo sie wylistowac katalogow"; + + p1.sort(); + + index = p1.search(prev_file); + prev_file = p1.get(index+1); + file_name = mapy+"/"+prev_file; + if(prev_file == string (":")) + { + return false; + } + return true; +} + +void loop() { + beginingcoords(); + targetcoords(); + while(1) { + refreshBufor(); + viewBufor(); + doEvent(getEvent()); + if(isEnd()) + break; + } +} + diff --git a/labirynt.h b/labirynt.h new file mode 100644 index 0000000..8394350 --- /dev/null +++ b/labirynt.h @@ -0,0 +1,49 @@ +#ifndef _GH_NIRCEK_LABIRYNT_LABIRYNT_H_ +#define _GH_NIRCEK_LABIRYNT_LABIRYNT_H_ + +#include +#include /* srand, rand */ +#include /* time */ +#include +#include +#include +#include +#include "getch.h" + +using namespace std; + +//struktury +typedef struct{int x; int y;} COORDS; + +// zmienne globalne +extern string mapy; //folder, w którym są mapy +extern string file_name; //ścieżka do mapy +extern string prev_file; //nazwa poprzedniej mapy +extern size_t SIZE; +extern string *bufor; +extern vector mapa; +extern char user_ch, end_ch; +extern COORDS player_coords; +extern COORDS end_coords; + +// procedury +void getMap(); +bool isExist(COORDS); // sprawdza czy dane pole jest na mapie +bool isWall(COORDS); // czy na podanych kordach nie ma spacji +COORDS randomCoords(bool notWall=true); +void beginingcoords(); // bierze poczontkowe koordy i wrzuca do zmiennej +void targetcoords(); // bierze koordy celu/wyjścia i wrzuca do zmiennej +char get(COORDS); +void set(COORDS, char); +void generateMap(size_t width=SIZE, size_t height=SIZE); // generuje mapę o podanych w parametrach wymiarach oraz zapisuje ją w zmiennej mapa +char getEvent(); //pobierz znak +void doEvent(char); // wykonaj operację przypisaną do danego znaku (np WSAD) +char drawOnBufor(COORDS, char); // narysuj na x i y znak c i zwróć poprzednie co tam było +void refreshBufor(); // załaduj mapę do bufora i nanieś na nie usera i wyjście +void viewBufor(); // wypisz bufor na ekran +bool isEnd(); // czy jesteśmy na kordach wyjścia +void animate(); +bool doEnd(bool animation=true); // wykonaj animację wygranej i przerzuć do następnego pliku +void loop(); +#endif + diff --git a/main.cpp b/main.cpp index d724f05..6e0113e 100644 --- a/main.cpp +++ b/main.cpp @@ -6,296 +6,7 @@ #include #include #include "getch.h" - -using namespace std; - -//struktury -typedef struct{int x; int y;} COORDS; - -// zmienne globalne -string mapy="maps"; //folder, w którym są mapy -string file_name; //ścieżka do mapy -string prev_file; //nazwa poprzedniej mapy -size_t SIZE=0; -string *bufor = NULL; -vector mapa; -char user_ch='X', end_ch='O'; -COORDS player_coords; -COORDS end_coords; - -// procedury -void getMap() -{ -std::fstream file; -file.open(file_name.c_str(), ios::in); -if(file.good()==false) -{ - throw "File does not exist"; - -} -mapa.clear(); -SIZE = 0; -string line; -while (getline(file, line)) { - mapa.push_back(line); - ++SIZE; -} - -file.close(); -} - -bool isExist(COORDS p) { // sprawdza czy dane pole jest na mapie - if(p.y>=SIZE)return false; - return mapa[p.y].size()>=p.x; -} - -bool isWall(COORDS c) // czy na podanych kordach nie ma spacji -{ - if(!isExist(c))return true; - if (mapa[c.y][c.x] == ' ') //sprawdza czy space - return false; //zwraca, czy jest, czy nie - else return true; -} -COORDS randomCoords(bool notWall=true) { - COORDS c; - do { - c.y = rand() % SIZE; - size_t s = mapa[c.y].size(); - if(s) // s != 0 - c.x = rand() % s; - }while((!isExist(c))||(notWall&&isWall(c))); - return c; -} -void beginingcoords() { // bierze poczontkowe koordy i wrzuca do zmiennej - player_coords = randomCoords(); -} -void targetcoords() { // bierze koordy celu/wyjścia i wrzuca do zmiennej - int rozmiar ,rzmr,sm=SIZE,sn=SIZE ; - do{ - end_coords = randomCoords(); - rozmiar = sqrt(2*pow(mapa[0].size(),2))/2; - rzmr = sqrt(pow(player_coords.x-end_coords.x,2)+pow(player_coords.y-end_coords.y,2)); - cout << rzmr << " "<< rozmiar << endl; - }while (rzmrwidth*height*3) - break; - } - } -} - -char getEvent() - - { - return getch(); - }// pobierz znak -void doEvent(char c) { - c = toupper(c); - COORDS n=player_coords; - switch(c) { - case 'W': --n.y; break; - case 'S': ++n.y; break; - case 'A': --n.x; break; - case 'D': ++n.x; break; - } - if(!isWall(n)) - player_coords = n; - -}// wykonaj operację przypisaną do danego znaku (np WSAD) -char drawOnBufor(COORDS C, char c) { // narysuj na x i y znak c i zwróć poprzednie co tam było - char oc = bufor[C.y][C.x]; - bufor[C.y][C.x] = c; - return oc; -} -void refreshBufor() { // załaduj mapę do bufora i nanieś na nie usera i wyjście - if(!bufor) delete[] bufor; - bufor = new string[SIZE]; - for(size_t i=0; i0) - cout << bufor[i] << '\n'; -} -bool isEnd() {// czy jesteśmy na kordach wyjścia - if ((player_coords.x== end_coords.x) && (player_coords.y==end_coords.y)) - return true; - else return false; - } -class pojemnik { - string s; - int part(int l, int r){ - string x = get(l); - int i = l, j = r; - string w; - while(1) { - while (get(j) > x)j--; - while (get(i) < x)i++; - if (id_name).size()>=4) - if(string(plik->d_name).substr(string(plik->d_name).size()-4) == string(".map")) - p1.push( plik->d_name ); - closedir( sciezka ); - } - else - throw "Nie udalo sie wylistowac katalogow"; - - p1.sort(); - - index = p1.search(prev_file); - prev_file = p1.get(index+1); - file_name = mapy+"/"+prev_file; - if(prev_file == string (":")) - { - return false; - } - return true; -} - -void loop() { - beginingcoords(); - targetcoords(); - while(1) { - refreshBufor(); - viewBufor(); - doEvent(getEvent()); - if(isEnd()) - break; - } -} +#include "labirynt.h" int main() { srand (time(NULL)); From 71be060e366135479f816c998274a4d887748beb Mon Sep 17 00:00:00 2001 From: Nircek Date: Sat, 20 Oct 2018 20:38:22 +0200 Subject: [PATCH 5/8] Oddzielenie pojemnika do osobnego pliku --- labirynt.cpp | 82 +---------------------------------------- pojemnik.cpp | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++ pojemnik.h | 38 +++++++++++++++++++ 3 files changed, 140 insertions(+), 81 deletions(-) create mode 100644 pojemnik.cpp create mode 100644 pojemnik.h diff --git a/labirynt.cpp b/labirynt.cpp index 0a33508..90bac39 100644 --- a/labirynt.cpp +++ b/labirynt.cpp @@ -156,87 +156,7 @@ bool isEnd() {// czy jesteśmy na kordach wyjścia return true; else return false; } -class pojemnik { - string s; - int part(int l, int r){ - string x = get(l); - int i = l, j = r; - string w; - while(1) { - while (get(j) > x)j--; - while (get(i) < x)i++; - if (i x)j--; + while (get(i) < x)i++; + if (i +#include +using namespace std; +class pojemnik { + string s; + int part(int l, int r); + public: + void sort(int l=0, int r=-1); + size_t len(); + void push(string ns); + void set(size_t ix, string ns); //zwraca ":" jeżeli nie ma elementu o takim ID + size_t search(string q); + string get(size_t ix); //zwraca ":" jeżeli nie ma elementu o takim ID + string cont(); +}; From 1d6afcf667e92589d82bd3ceba7f5f3ff3aca59d Mon Sep 17 00:00:00 2001 From: Nircek Date: Sat, 20 Oct 2018 20:42:40 +0200 Subject: [PATCH 6/8] =?UTF-8?q?Usuni=C4=99cie=20zb=C4=99dnych=20nag=C5=82?= =?UTF-8?q?=C3=B3wk=C3=B3w?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- labirynt.h | 1 - main.cpp | 4 ---- pojemnik.h | 1 - 3 files changed, 6 deletions(-) diff --git a/labirynt.h b/labirynt.h index 8394350..89fbeef 100644 --- a/labirynt.h +++ b/labirynt.h @@ -3,7 +3,6 @@ #include #include /* srand, rand */ -#include /* time */ #include #include #include diff --git a/main.cpp b/main.cpp index 6e0113e..c4bc255 100644 --- a/main.cpp +++ b/main.cpp @@ -1,10 +1,6 @@ #include #include /* srand, rand */ #include /* time */ -#include -#include -#include -#include #include "getch.h" #include "labirynt.h" diff --git a/pojemnik.h b/pojemnik.h index c2b938f..c9cac17 100644 --- a/pojemnik.h +++ b/pojemnik.h @@ -22,7 +22,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include -#include using namespace std; class pojemnik { string s; From 8aadd9c250f08c6c125d490ec2372b3b2b44c2a0 Mon Sep 17 00:00:00 2001 From: Nircek Date: Sat, 20 Oct 2018 20:48:53 +0200 Subject: [PATCH 7/8] Naprawa na Windowsach --- getch.cpp | 4 +--- getch.h | 4 +++- labirynt.cbp | 6 ++++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/getch.cpp b/getch.cpp index e0ac2c4..8b58263 100644 --- a/getch.cpp +++ b/getch.cpp @@ -26,9 +26,7 @@ SOFTWARE. // code from https://gist.github.com/Nircek/c8b104456e6c68068866425072a0863f // under MIT license #include -#ifdef _WIN32 -#include -#else +#ifndef _WIN32 #include #include char getch(){ diff --git a/getch.h b/getch.h index 6a55ae3..17d3fab 100644 --- a/getch.h +++ b/getch.h @@ -1,7 +1,9 @@ #ifndef _GH_NIRCEK_LABIRYNT_GETCH_H_ #define _GH_NIRCEK_LABIRYNT_GETCH_H_ -#ifndef _WIN32 +#ifdef _WIN32 +#include +#else char getch(); #endif diff --git a/labirynt.cbp b/labirynt.cbp index ff8f12a..6913a10 100644 --- a/labirynt.cbp +++ b/labirynt.cbp @@ -32,7 +32,13 @@ + + + + + + From 6e52c183f7d83ed0d685d2199d5daa589edaed24 Mon Sep 17 00:00:00 2001 From: Nircek Date: Sat, 20 Oct 2018 20:59:02 +0200 Subject: [PATCH 8/8] Naprawa externu coloru --- color.h | 1 + main.cpp | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/color.h b/color.h index ade25e8..9230ff0 100644 --- a/color.h +++ b/color.h @@ -28,4 +28,5 @@ enum color {BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, BBLACK, BRED, enum surface {FG, BG}; bool isModeAvailable(color_mode); void setColor(color, surface); +extern color_mode g_color_mode; #endif diff --git a/main.cpp b/main.cpp index ec77071..765fe91 100644 --- a/main.cpp +++ b/main.cpp @@ -4,8 +4,6 @@ #include "getch.h" #include "labirynt.h" - -extern color_mode g_color_mode; int main() { if(isModeAvailable(WIN))g_color_mode=WIN; else if(isModeAvailable(ANSI))g_color_mode=ANSI;