source: trunk/demos/declarative/snake/content/snake.js

Last change on this file was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

File size: 7.8 KB
Line 
1
2var snake = new Array;
3var board = new Array;
4var links = new Array;
5var scheduledDirections = new Array;
6var numRows = 1;
7var numColumns = 1;
8var linkComponent = Qt.createComponent("content/Link.qml"); // XXX should resolve relative to script, not component
9var cookieComponent = Qt.createComponent("content/Cookie.qml");
10var cookie;
11var linksToGrow = 0;
12var linksToDie = 0;
13var waitForCookie = 0;
14var growType = 0;
15var skullMovementsBeforeDirectionChange = 0;
16
17
18function rand(n)
19{
20 return (Math.floor(Math.random() * n));
21}
22
23function scheduleDirection(dir)
24{
25 direction = dir;
26 if(scheduledDirections[scheduledDirections.length-1]!=direction)
27 scheduledDirections.push(direction);
28}
29
30function startNewGame()
31{
32 if (state == "starting")
33 return;
34
35 if (activeGame) {
36 endGame();
37 startNewGameTimer.running = true;
38 state = "";
39 return;
40 }
41
42 state = "starting";
43
44 numRows = numRowsAvailable;
45 numColumns = numColumnsAvailable;
46 board = new Array(numRows * numColumns);
47 snake = new Array;
48 scheduledDirections = new Array;
49 growType = 0;
50
51 skull.z = numRows * numColumns + 1;
52
53 for (var i = 0; i < numRows * numColumns; ++i) {
54 if (i < links.length) {
55 var link = links[i];
56 link.spawned = false;
57 link.dying = false;
58 } else {
59 if(linkComponent.status != Component.Ready) {
60 if(linkComponent.status == Component.Error)
61 console.log(linkComponent.errorString());
62 else
63 console.log("Still loading linkComponent");
64 continue;//TODO: Better error handling?
65 }
66 var link = linkComponent.createObject(playfield);
67 link.z = numRows * numColumns + 1 - i;
68 link.type = i == 0 ? 2 : 0;
69 link.spawned = false;
70 link.dying = false;
71 links.push(link);
72 }
73 }
74
75 head = links[0];
76 snake.push(head);
77 head.row = numRows/2 -1;
78 head.column = numColumns/2 -1;
79 head.spawned = true;
80
81 linksToGrow = 5;
82 linksToDie = 0;
83 waitForCookie = 5;
84 score = 0;
85 startHeartbeatTimer.running = true;
86}
87
88function endGame()
89{
90 activeGame = false;
91 for(var i in snake)
92 snake[i].dying = true;
93 if (cookie) {
94 cookie.dying = true;
95 cookie = 0;
96 }
97 lastScore = score;
98 highScores.saveScore(lastScore);
99 state = "";
100}
101
102function move() {
103
104 if (!head)
105 return;
106
107 var dir = direction;
108
109 if (scheduledDirections.length) {
110 dir = scheduledDirections.shift();
111 }
112
113 if (state == "starting") {
114 var turn = (dir - headDirection);
115 head.rotation += turn == -3 ? 1 : (turn == 3 ? -1 : turn );
116 headDirection = dir;
117 return;
118 }
119
120 var row = head.row;
121 var column = head.column;
122
123 if (dir == 0) {
124 row = row - 1;
125 } else if (dir == 1) {
126 column = column + 1
127 } else if (dir == 2) {
128 row = row + 1;
129 } else if (dir == 3) {
130 column = column - 1;
131 }
132
133 //validate the new position
134 if (row < 0 || row >= numRows
135 || column < 0 || column >= numColumns
136 || (row == skull.row && column == skull.column)
137 || !isFree(row, column)) {
138 var turn = (dir - headDirection);
139 head.rotation += turn == -3 ? 1 : (turn == 3 ? -1 : turn );
140 headDirection = dir;
141 endGame();
142 return;
143 }
144
145 var newLink;
146 if (linksToGrow > 0) {
147 --linksToGrow;
148 newLink = links[snake.length];
149 newLink.spawned = false;
150 newLink.rotation = snake[snake.length-1].rotation;
151 newLink.type = growType;
152 newLink.dying = false;
153 snake.push(newLink);
154 } else {
155 var lastLink = snake[snake.length-1];
156 board[lastLink.row * numColumns + lastLink.column] = undefined;
157 }
158
159 if (waitForCookie > 0) {
160 if (--waitForCookie == 0)
161 createCookie(cookie? (cookie.value+1) : 1);
162 }
163
164 for (var i = snake.length-1; i > 0; --i) {
165 snake[i].row = snake[i-1].row;
166 snake[i].column = snake[i-1].column;
167 snake[i].rotation = snake[i-1].rotation;
168 }
169
170 if (newLink) {
171 newLink.spawned = true;
172 }
173
174 // move the head
175 head.row = row;
176 head.column = column;
177 board[row * numColumns + column] = head;
178
179 var turn = (dir - headDirection);
180 head.rotation += turn == -3 ? 1 : (turn == 3 ? -1 : turn );
181 headDirection = dir;
182
183 var value = testCookie(row, column);
184 if (value > 0) {
185 linksToGrow += value;
186 score += value;
187 }
188}
189
190function isFree(row, column)
191{
192 return board[row * numColumns + column] == undefined;
193}
194
195function isHead(row, column)
196{
197 return head.column == column && head.row == row;
198}
199
200function testCookie(row, column)
201{
202 if (cookie && !cookie.dying && cookie.row == row && cookie.column == column) {
203 var value = cookie.value;
204 waitForCookie = value;
205 growType = snake[snake.length-1].type == 1 ? 0 : 1;
206 cookie.dying = true;
207 cookie.z = numRows * numColumns + 2;
208 return value;
209 }
210 return 0;
211}
212
213function moveSkull()
214{
215
216 if (linksToDie > 0) {
217 --linksToDie;
218 var link = snake.pop();
219 link.dying = true;
220 board[link.row * numColumns + link.column] = undefined;
221 if (score > 0)
222 --score;
223 if (snake.length == 0) {
224 endGame();
225 return;
226 }
227 }
228
229 var row = skull.row;
230 var column = skull.column;
231 if (isHead(row, column)) {
232 endGame();
233 return;
234 }
235 row += skull.verticalMovement;
236 column += skull.horizontalMovement;
237
238 var attempts = 4;
239
240 while (skullMovementsBeforeDirectionChange == 0 || row < 0 || row >= numRows
241 || column < 0 || column >= numColumns
242 || (!isFree(row, column) && !isHead(row, column))) {
243 var d = rand(8);
244 skull.verticalMovement = 0;
245 skull.horizontalMovement = 0;
246 skullMovementsBeforeDirectionChange = rand(20)+1;
247 if (d == 0) {
248 skull.verticalMovement = -1
249 } else if (d == 1) {
250 skull.horizontalMovement = -1;
251 } else if (d == 2) {
252 skull.verticalMovement = 1
253 } else if (d == 3){
254 skull.horizontalMovement = 1;
255 } else if (cookie) {
256 var rd = cookie.row - skull.row;
257 var rc = cookie.column - skull.column;
258 if (Math.abs(rd) > Math.abs(rc)) {
259 skull.verticalMovement = rd > 0 ? 1 : -1;
260 skullMovementsBeforeDirectionChange = Math.abs(rd);
261 } else {
262 skull.horizontalMovement= rc > 0 ? 1 : -1;
263 skullMovementsBeforeDirectionChange = Math.abs(rc);
264 }
265 }
266 row = skull.row + skull.verticalMovement;
267 column = skull.column + skull.horizontalMovement;
268 if (--attempts == 0)
269 return;
270 }
271
272 skull.row = row;
273 skull.column = column;
274 --skullMovementsBeforeDirectionChange;
275 var value = testCookie(row, column);
276 if (value > 0)
277 linksToDie += value/2;
278
279 if (isHead(row, column))
280 endGame();
281}
282
283function createCookie(value) {
284 if (numRows * numColumns - snake.length < 10)
285 return;
286
287 var column = rand(numColumns);
288 var row = rand(numRows);
289 while (!isFree(row, column)) {
290 column++;
291 if (column == numColumns) {
292 column = 0;
293 row++;
294 if (row == numRows)
295 row = 0;
296 }
297 }
298
299 if(cookieComponent.status != Component.Ready) {
300 if(cookieComponent.status == Component.Error)
301 console.log(cookieComponent.errorString());
302 else
303 console.log("Still loading cookieComponent");
304 return;//TODO: Better error handling?
305 }
306 cookie = cookieComponent.createObject(head.parent);
307 cookie.value = value;
308 cookie.row = row;
309 cookie.column = column;
310}
Note: See TracBrowser for help on using the repository browser.