source: trunk/examples/script/qstetrix/tetrixboard.js@ 855

Last change on this file since 855 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 7.6 KB
Line 
1function TetrixBoard(ui)
2{
3 this.ui = ui;
4
5 this.isStarted = false;
6 this.isPaused = false;
7 this.inKeyPress = false;
8
9 this._board = new Array(TetrixBoard.BoardWidth * TetrixBoard.BoardHeight);
10 this.clearBoard();
11
12 this.curPiece = new TetrixPiece();
13 this.nextPiece = new TetrixPiece();
14 this.nextPiece.setRandomShape();
15
16 ui.timer.singleShot = true;
17 ui.timer.timeout.connect(this, this.onTimer);
18 ui.keyPressed.connect(this, this.onKeyPress);
19 ui.paintRequested.connect(this, this.onPaint);
20 ui.paintNextPieceRequested.connect(this, this.onPaintNextPiece);
21}
22
23TetrixBoard.BoardWidth = 10;
24TetrixBoard.BoardHeight = 22;
25
26TetrixBoard.prototype.start = function() {
27 if (this.isPaused)
28 return;
29
30 this.isStarted = true;
31 this.isWaitingAfterLine = false;
32 this.numLinesRemoved = 0;
33 this.numPiecesDropped = 0;
34 this.score = 0;
35 this.level = 1;
36 this.clearBoard();
37
38 this.ui.linesRemovedChanged(this.numLinesRemoved);
39 this.ui.scoreChanged(this.score);
40 this.ui.levelChanged(this.level);
41
42 this.newPiece();
43 this.ui.timer.start(this.timeoutTime());
44}
45
46TetrixBoard.prototype.pause = function() {
47 if (!this.isStarted)
48 return;
49
50 this.isPaused = !this.isPaused;
51 if (this.isPaused) {
52 this.ui.timer.stop();
53 } else {
54 this.ui.timer.start(this.timeoutTime());
55 }
56 this.ui.update();
57}
58
59TetrixBoard.prototype.getShapeAt = function(x, y) {
60 return this._board[(y * TetrixBoard.BoardWidth) + x];
61}
62
63TetrixBoard.prototype.setShapeAt = function(x, y, newShape) {
64 this._board[(y * TetrixBoard.BoardWidth) + x] = newShape;
65}
66
67TetrixBoard.prototype.clearBoard = function() {
68 for (var i = 0; i < TetrixBoard.BoardHeight * TetrixBoard.BoardWidth; ++i)
69 this._board[i] = TetrixShape.NoShape;
70}
71
72TetrixBoard.prototype.dropDown = function() {
73 var dropHeight = 0;
74 var newY = this.curY;
75 while (newY > 0) {
76 if (!this.tryMove(this.curPiece, this.curX, newY - 1))
77 break;
78 --newY;
79 ++dropHeight;
80 }
81 this.pieceDropped(dropHeight);
82}
83
84TetrixBoard.prototype.oneLineDown = function() {
85 if (!this.tryMove(this.curPiece, this.curX, this.curY - 1))
86 this.pieceDropped(0);
87}
88
89TetrixBoard.prototype.pieceDropped = function(dropHeight) {
90 for (var i = 0; i < 4; ++i) {
91 var x = this.curX + this.curPiece.getX(i);
92 var y = this.curY - this.curPiece.getY(i);
93 this.setShapeAt(x, y, this.curPiece.shape);
94 }
95
96 ++this.numPiecesDropped;
97 if ((this.numPiecesDropped % 25) == 0) {
98 ++this.level;
99 this.ui.timer.start(this.timeoutTime());
100 this.ui.levelChanged(this.level);
101 }
102
103 this.score += dropHeight + 7;
104 this.ui.scoreChanged(this.score);
105 this.removeFullLines();
106
107 if (!this.isWaitingAfterLine)
108 this.newPiece();
109
110 if (this.isStarted && !this.ui.timer.active)
111 this.ui.timer.start(this.timeoutTime());
112}
113
114TetrixBoard.prototype.removeFullLines = function() {
115 var numFullLines = 0;
116
117 for (var i = TetrixBoard.BoardHeight - 1; i >= 0; --i) {
118 var lineIsFull = true;
119
120 for (var j = 0; j < TetrixBoard.BoardWidth; ++j) {
121 if (this.getShapeAt(j, i) == TetrixShape.NoShape) {
122 lineIsFull = false;
123 break;
124 }
125 }
126
127 if (lineIsFull) {
128 ++numFullLines;
129 for (var k = i; k < TetrixBoard.BoardHeight - 1; ++k) {
130 for (var j = 0; j < TetrixBoard.BoardWidth; ++j)
131 this.setShapeAt(j, k, this.getShapeAt(j, k + 1));
132 }
133 for (var j = 0; j < TetrixBoard.BoardWidth; ++j)
134 this.setShapeAt(j, TetrixBoard.BoardHeight - 1, TetrixShape.NoShape);
135 }
136 }
137
138 if (numFullLines > 0) {
139 this.numLinesRemoved += numFullLines;
140 this.score += 10 * numFullLines;
141 this.ui.linesRemovedChanged(this.numLinesRemoved);
142 this.ui.scoreChanged(this.score);
143
144 this.ui.timer.start(500);
145 this.isWaitingAfterLine = true;
146 this.curPiece.shape = TetrixShape.NoShape;
147 this.ui.update();
148 }
149}
150
151TetrixBoard.prototype.newPiece = function() {
152 this.curPiece = this.nextPiece;
153 this.nextPiece = new TetrixPiece();
154 this.nextPiece.setRandomShape();
155 this.ui.showNextPiece(this.nextPiece.maxX - this.nextPiece.minX + 1,
156 this.nextPiece.maxY - this.nextPiece.minY + 1);
157 this.curX = TetrixBoard.BoardWidth / 2 + 1;
158 this.curY = TetrixBoard.BoardHeight - 1 + this.curPiece.minY;
159
160 if (!this.tryMove(this.curPiece, this.curX, this.curY)) {
161 this.curPiece.shape = TetrixShape.NoShape;
162 this.ui.timer.stop();
163 this.isStarted = false;
164 }
165}
166
167TetrixBoard.prototype.tryMove = function(newPiece, newX, newY) {
168 for (var i = 0; i < 4; ++i) {
169 var x = newX + newPiece.getX(i);
170 var y = newY - newPiece.getY(i);
171 if ((x < 0) || (x >= TetrixBoard.BoardWidth) || (y < 0) || (y >= TetrixBoard.BoardHeight))
172 return false;
173 if (this.getShapeAt(x, y) != TetrixShape.NoShape)
174 return false;
175 }
176
177 this.curPiece = newPiece;
178 this.curX = newX;
179 this.curY = newY;
180 this.ui.update();
181 return true;