-
Notifications
You must be signed in to change notification settings - Fork 36
/
Well.hpp
94 lines (79 loc) · 2.98 KB
/
Well.hpp
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
/*
Bastet - tetris clone with embedded bastard block chooser
(c) 2005-2009 Federico Poloni <[email protected]> minus 37
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef WELL_HPP
#define WELL_HPP
#include "Block.hpp" //for Color
#include "BlockPosition.hpp"
#include <cstddef> //size_t
#include <vector>
#include <bitset>
#include <boost/array.hpp>
//DBG
#include <iostream>
namespace Bastet{
class GameOver{}; //used as an exception
class WellLine: public std::bitset<WellWidth>{
public:
std::string PrettyPrint() const;
};
///complex type that holds which lines are completed
///if _completed[k]==true, then line _baseY+k exists and is completed
class LinesCompleted{
public:
int _baseY;
std::bitset<4> _completed;
///clear, returns iterator such that the segment [it, rend) is "new" (to be zeroed out by hand)
template<typename Iterator> Iterator Clear(Iterator rbegin, Iterator rend) const;
};
/*
* the real height of the well is _height+2, with the top two rows( -1 and -2) hidden (see guidelines)
*/
class Well{
private:
typedef boost::array<WellLine,RealWellHeight> WellType;
WellType _well;
public:
Well();
~Well();
void Clear();
bool Accomodates(const DotMatrix &d) const; //true if the given tetromino fits into the well
bool IsValidLine(int y) const{return (y>=-2) && (y<WellHeight);};
bool IsLineComplete(int y) const;
LinesCompleted Lock(BlockType t, const BlockPosition &p); //permanently adds a tetromino to the well; returns a bitset of 4 bits where return[i]==1 iff line (start of fb)+i is complete
void ClearLines(const LinesCompleted &lc); //removes the given lines from the well (whether they are completed or not)
int LockAndClearLines(BlockType t, const BlockPosition &p); //locks, clear lines, returns number of lines cleared
friend long Evaluate(const Well *w, int extralines); //for BastetBlockChooser
std::string PrettyPrint() const;
};
template <typename Iterator> Iterator LinesCompleted::Clear(Iterator rbegin, Iterator rend) const{
if(_completed.none()) return rend;
Iterator orig=rbegin;
Iterator dest=rbegin;
int j=WellHeight-1;
while(orig<rend){
if(j-_baseY>=0 && j-_baseY<4 && _completed[j-_baseY]){
//skip
}
else{
*dest=*orig;
dest++;
}
j--;
orig++;
}
return dest++;
}
}
#endif //WELL_HPP