1
0
Fork 0
forked from len0rd/rockbox

Zoomed Screen

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@864 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Felix Arends 2002-05-31 22:16:10 +00:00
parent 7844e67034
commit 739f2ae0fe

View file

@ -33,14 +33,14 @@
#endif #endif
#define TETRIS_TITLE "Tetris!" #define TETRIS_TITLE "Tetris!"
#define TETRIS_TITLE_FONT 2 #define TETRIS_TITLE_FONT 1
#define TETRIS_TITLE_XLOC 10 #define TETRIS_TITLE_XLOC 43
#define TETRIS_TITLE_YLOC 32 #define TETRIS_TITLE_YLOC 15
int start_x = 1; int start_x = 2;
int start_y = 1; int start_y = 1;
int max_x = 14; int max_x = 28;
int max_y = 24; int max_y = 48;
int current_x = 0; int current_x = 0;
int current_y = 0; int current_y = 0;
int current_f = 0; int current_f = 0;
@ -127,22 +127,59 @@ void draw_block(int x,int y,int block,int frame,bool clear)
{ {
int i; int i;
for(i=0;i < 4;i++) { for(i=0;i < 4;i++) {
if (clear) if (clear)
lcd_clearpixel(start_x+x+block_data[block][frame][0][i], {
start_y+y+block_data[block][frame][1][i]); lcd_clearpixel(start_x+x+block_data[block][frame][0][i] * 2,
start_y+y+block_data[block][frame][1][i] * 2);
lcd_clearpixel(start_x+x+block_data[block][frame][0][i] * 2 + 1,
start_y+y+block_data[block][frame][1][i] * 2);
lcd_clearpixel(start_x+x+block_data[block][frame][0][i] * 2,
start_y+y+block_data[block][frame][1][i] * 2 + 1);
lcd_clearpixel(start_x+x+block_data[block][frame][0][i] * 2 + 1,
start_y+y+block_data[block][frame][1][i] * 2 + 1);
}
else else
lcd_drawpixel(start_x+x+block_data[block][frame][0][i], {
start_y+y+block_data[block][frame][1][i]); lcd_drawpixel(start_x+x+block_data[block][frame][0][i] * 2,
start_y+y+block_data[block][frame][1][i] * 2);
lcd_drawpixel(start_x+x+block_data[block][frame][0][i] * 2 + 1,
start_y+y+block_data[block][frame][1][i] * 2);
lcd_drawpixel(start_x+x+block_data[block][frame][0][i] * 2,
start_y+y+block_data[block][frame][1][i] * 2 + 1);
lcd_drawpixel(start_x+x+block_data[block][frame][0][i] * 2 + 1,
start_y+y+block_data[block][frame][1][i] * 2 + 1);
}
} }
} }
void to_virtual(void) void to_virtual(void)
{ {
int i; int i;
for(i=0;i < 4;i++) for(i = 0; i < 4; i++)
*(virtual+ {
((current_y+block_data[current_b][current_f][1][i])*max_x)+ *(virtual +
(current_x+block_data[current_b][current_f][0][i])) = current_b+1; (current_y + block_data[current_b][current_f][1][i] * 2) * max_x +
current_x + block_data[current_b][current_f][0][i] * 2) = current_b + 1;
*(virtual +
(current_y + block_data[current_b][current_f][1][i] * 2 + 1) * max_x +
current_x + block_data[current_b][current_f][0][i] * 2) = current_b + 1;
*(virtual +
(current_y + block_data[current_b][current_f][1][i] * 2) * max_x +
current_x + block_data[current_b][current_f][0][i] * 2 + 1) = current_b + 1;
*(virtual +
(current_y + block_data[current_b][current_f][1][i] * 2 + 1) * max_x +
current_x + block_data[current_b][current_f][0][i] * 2 + 1) = current_b + 1;
}
}
bool block_touch (int x, int y)
{
if (*(virtual + y * max_x + x) != 0 ||
*(virtual + y * max_x + x + 1) != 0 ||
*(virtual + (y + 1) * max_x + x) != 0 ||
*(virtual + (y + 1) * max_x + x + 1) != 0)
return true;
return false;
} }
bool gameover(void) bool gameover(void)
@ -157,11 +194,10 @@ bool gameover(void)
for(i=0;i < 4; i++){ for(i=0;i < 4; i++){
/* Do we have blocks touching? */ /* Do we have blocks touching? */
if(*(virtual+((y+block_data[block][frame][1][i])*max_x)+x+ if(block_touch(x + block_data[block][frame][0][i] * 2, y + block_data[block][frame][1][i] * 2))
block_data[block][frame][0][i]) != 0)
{ {
/* Are we at the top of the frame? */ /* Are we at the top of the frame? */
if(y+block_data[block][frame][1][i] < start_y) if(y + block_data[block][frame][1][i] * 2 < start_y)
{ {
/* Game over ;) */ /* Game over ;) */
return true; return true;
@ -175,12 +211,11 @@ bool valid_position(int x,int y,int block,int frame)
{ {
int i; int i;
for(i=0;i < 4;i++) for(i=0;i < 4;i++)
if( (*(virtual+((y+block_data[block][frame][1][i])*max_x)+x+ if ((y + block_data[block][frame][1][i] * 2 > max_y - 2) ||
block_data[block][frame][0][i]) != 0) || (x + block_data[block][frame][0][i] * 2 > max_x - 2) ||
(x+block_data[block][frame][0][i] < 0) || (y + block_data[block][frame][1][i] * 2 < 0) ||
(x+block_data[block][frame][0][i] > max_x-1) || (x + block_data[block][frame][0][i] * 2 < 0) ||
(y+block_data[block][frame][1][i] < 0) || block_touch (x + block_data[block][frame][0][i] * 2, y + block_data[block][frame][1][i] * 2))
(y+block_data[block][frame][1][i] > max_y-1))
return false; return false;
return true; return true;
} }
@ -188,12 +223,12 @@ bool valid_position(int x,int y,int block,int frame)
void from_virtual(void) void from_virtual(void)
{ {
int x,y; int x,y;
for(y=0;y < max_y;y++) for(y = 0; y < max_y; y++)
for(x=0;x < max_x;x++) for(x = 1; x < max_x - 1; x ++)
if(*(virtual+(y*max_x)+x)) if(*(virtual + (y * max_x) + x) != 0)
lcd_drawpixel(start_x+x,start_y+y); lcd_drawpixel(start_x + x, start_y + y);
else else
lcd_clearpixel(start_x+x,start_y+y); lcd_clearpixel(start_x + x, start_y + y);
} }
void move_block(int x,int y,int f) void move_block(int x,int y,int f)
@ -206,7 +241,8 @@ void move_block(int x,int y,int f)
current_f = 0; current_f = 0;
if(current_f < 0) if(current_f < 0)
current_f = block_frames[current_b]-1; current_f = block_frames[current_b]-1;
} }
if(valid_position(current_x+x,current_y+y,current_b,current_f)) if(valid_position(current_x+x,current_y+y,current_b,current_f))
{ {
draw_block(current_x,current_y,current_b,last_frame,true); draw_block(current_x,current_y,current_b,last_frame,true);
@ -243,32 +279,34 @@ int check_lines(void)
int x,y,i; int x,y,i;
bool line; bool line;
int lines = 0; int lines = 0;
for(y=0;y < max_y;y++) for(y = 0; y < max_y; y++)
{ {
line = true; line = true;
for(x=0;x < max_x;x++) for(x = 1; x < max_x - 1; x++)
if(virtual[y*max_x+x] == 0) if(*(virtual + y * max_x + x) == 0)
{
line = false; line = false;
break;
}
if(line) if(line)
{ {
lines++; lines++;
for(i=y;i > 1;i--) for(i = y; i > 1; i--)
for (x=0;x<max_x;x++) memcpy(virtual + i * max_x + 1, virtual + (i-1) * max_x + 1, max_x - 2);
memcpy(&virtual[i*max_x], &virtual[((i-1)*max_x)], max_x); memset (&virtual[max_x] + 1, 0, max_x - 2);
for (x=0;x<max_x;x++)
memset (&virtual[max_x], 0, max_x);
} }
} }
return lines; return lines / 2;
} }
void move_down(void) void move_down(void)
{ {
int l; int l;
char s[25];
if(!valid_position(current_x,current_y+1,current_b,current_f)) if(!valid_position(current_x,current_y+1,current_b,current_f))
{ {
to_virtual(); to_virtual();
l = check_lines(); l = check_lines();
if(l) if(l)
{ {
lines += l; lines += l;
@ -278,11 +316,13 @@ void move_down(void)
from_virtual(); from_virtual();
score += l*l; score += l*l;
} }
sprintf (s, "%d Rows - Level %d", lines, level);
lcd_putsxy (2, 52, s, 0);
new_block(); new_block();
move_block(0,0,0); move_block(0,0,0);
} }
else else
move_block(0,1,0); move_block(0,2,0);
} }
void game_loop(void) void game_loop(void)
@ -298,10 +338,10 @@ void game_loop(void)
return; /* get out of here */ return; /* get out of here */
if ( b & BUTTON_LEFT ) { if ( b & BUTTON_LEFT ) {
move_block(-1,0,0); move_block(-2,0,0);
} }
if ( b & BUTTON_RIGHT ) { if ( b & BUTTON_RIGHT ) {
move_block(1,0,0); move_block(2,0,0);
} }
if ( b & BUTTON_UP ) { if ( b & BUTTON_UP ) {
move_block(0,0,1); move_block(0,0,1);
@ -332,10 +372,10 @@ void game_loop(void)
void init_tetris(void) void init_tetris(void)
{ {
memset(&virtual, 0, sizeof(virtual)); memset(&virtual, 0, sizeof(virtual));
start_x = 1; start_x = 2;
start_y = 1; start_y = 1;
max_x = 14; max_x = 28;
max_y = 24; max_y = 48;
current_x = 0; current_x = 0;
current_y = 0; current_y = 0;
current_f = 0; current_f = 0;
@ -351,9 +391,12 @@ void tetris(void)
{ {
init_tetris(); init_tetris();
draw_frame(start_x-1,start_x+max_x,start_y-1,start_y+max_y); draw_frame(start_x,start_x + max_x - 1, start_y - 1, start_y + max_y);
lcd_putsxy(TETRIS_TITLE_XLOC, TETRIS_TITLE_YLOC, TETRIS_TITLE, lcd_putsxy(TETRIS_TITLE_XLOC, TETRIS_TITLE_YLOC, TETRIS_TITLE,
TETRIS_TITLE_FONT); TETRIS_TITLE_FONT);
lcd_putsxy(TETRIS_TITLE_XLOC, TETRIS_TITLE_YLOC + 16, "*******",
TETRIS_TITLE_FONT);
lcd_putsxy (2, 52, "0 Rows - Level 0", 0);
lcd_update(); lcd_update();
next_b = t_rand(blocks); next_b = t_rand(blocks);