-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsokkelo.h
85 lines (58 loc) · 2.7 KB
/
sokkelo.h
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
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
#include <utility> /* pair */
// sokkelo.h
namespace otecpp_sokkelo {
const char SEINA = '#';
const char VAPAA = ' ';
const char SIJ = 'X'; // Nykyistä sijaintia merkkaava merkki
const char X = 'x'; // ruutu jossa on käyty (myös jossa ollaan parasta aikaa). HUOM! tiedostoa lukiessa merkki on iso 'X'
const char KAYTY = '*'; // ruudut, joissa on jo käyty, mutta jotka eivät ole nykyruudun ja lähtöruudun välisellä polulla
// Pino, jossa koordinaattipareja. Muotoa <RIVI, SARAKE>. Alkaa 0:sta
typedef std::pair<unsigned int, unsigned int> sijainti_t;
typedef std::stack<sijainti_t> stakki_t;
typedef std::vector< std::vector<char> > sokkelo_t;
enum Suunta { YLOS, OIK, ALAS, VAS, EI_MIKAAN }; // Kulkusuunta. 0,1,2,3
enum Yritys { OIK_, SUOR_, VAS_ };
class Sokkelo {
public:
Sokkelo(std::istream& in);
// Getteri stackille.
stakki_t pino() const;
const stakki_t& pino_() const;
bool askella(unsigned int x);
// Lisää liikkeen pinoon ja päivittää this.sokkelon jotta piirto onnistuu, sekä muuttaa kulkusuunnan
// Liikkeen oletetaan olevan oikeellinen(!)
// -- Eli ei seinää ja käymätön
inline void liiku(const sijainti_t& uusi_sijainti);
// Peruu viimeisimmän liikkeen, eli liikepinon päällimmäisen, ja muuttaa kulkusuunnan
inline Suunta liikuTaaksepain();
inline bool onkoReunalla();
// Ystävämääritys:
// eli että ulkopuolisella vast. funk. on pääsy param. yksityisiin jäseniin
friend std::ostream& operator << (std::ostream& out, const Sokkelo& s);
private:
// Dimensiot. Alusta nollaksi
unsigned short lev;
unsigned short kork;
std::ofstream output;
stakki_t stakki;
sokkelo_t sokkelo;
Suunta suunta;
std::stack<Suunta> suuntahistoria; // pino, jossa tallessa suuntahistoria
// Käy läpi nykyisen sij. suhteen 1. vapaan SUUNNAN (tarkistaa ensin oikean, jne...)
char getMahdollinenSuunta();
// Palauttavat sijainti-parin nyk. haluttuun suuntaan nyk. sijainnista
// Saa parametriksi sen suunnan mihin ollaan yrittämässä
// Saatu sijainti_t EI OLE automaattisesti kelpaava, vaan laskennallinen ehdotus
inline sijainti_t getUusiSijainti(const Yritys yritys);
// Palauttaa paikan <rivi, sarake> merkin charina
inline char getRuudunTyyppi( const sijainti_t& sijainti );
// Vaihtaa sijainnin merkin. Boolean sijoituksen laillisuudesta.
inline bool vaihdaRuutu(const sijainti_t& sijainti, const char uusi);
};
// friend
std::ostream& operator << (std::ostream& out, const Sokkelo& s);
}