📄 b04278d216f2001a1a47b6584e8f9250
字号:
FK_CUR.x = 0 - i/4;
for (i = 0; i < 16; ++i)
{
if (fk->data[i%4][4 - i/4 - 1] > 0)
break;
}
if (FK_CUR.x + 4 - i/4 >= H_FKN)
FK_CUR.x = H_FKN - 4 + i/4;
};
int check_fk(FK_STRUCT *fk)
{
int i, j, px, py;
if (!fk)
return 0;
for (i = 0; i < 4; ++i)
{
py = fk->y + i;
for (j = 0; j < 4; ++j)
{
px = fk->x + j;
if (fk->data[i][j] > 0 && px >= 0 && px < H_FKN && py >= 0 && py <= V_FKN)
{
if (py == V_FKN || FK_DATA[py][px] > 0)
{
while (i > 0 && fk->data[--i][j] > 0)
--py;
if (py <= 1)
return V_FKN;
else
return 1;
}
}
}
}
return 0;
};
void add_cur_fk(FK_STRUCT *fk)
{
int i, j, px, py;
if (!fk)
return;
for (i = 0; i < 4; ++i)
{
py = fk->y + i;
for (j = 0; j < 4; ++j)
{
px = fk->x + j;
if (fk->data[i][j] > 0 && px >= 0 && px < H_FKN && py >= 0 && py < V_FKN)
FK_DATA[py][px] = fk->data[i][j];
}
}
};
void copy_fk_next()
{
int i;
for (i = 0; i < 16; ++i)
FK_CUR.data[i/4][i%4] = FK_NEXT.data[i/4][i%4];
FK_CUR.index = FK_NEXT.index;
FK_CUR.x = H_FKN / 2 - 2;
FK_CUR.y = 0;
for (i = 0; i < 16; ++i)
{
if (FK_CUR.data[i/4][i%4] > 0)
break;
}
FK_CUR.y -= i/4;
};
void update_score(int rows)
{
int i;
unsigned char str_temp[30];
if (rows < 0)
return ;
G_ROWS += rows;
switch (rows)
{
case 1:
G_SCORE += 10 + (1 << G_LEVEL);
break;
case 2:
G_SCORE += 20 + (2 << G_LEVEL);
break;
case 3:
G_SCORE += 50 + (4 << G_LEVEL);
break;
case 4:
G_SCORE += 100 + (8 << G_LEVEL);
break;
default:
break;
}
if (G_SCORE > G_BESTSCORE)
G_BESTSCORE = G_SCORE;
for (i = 9; i>= 0;--i)
{
if(G_SCORE > SCORE[i]|| i ==0 )
break;
}
G_LEVEL = i;
clear_bk((640 + v_nwidth) / 2 + 50, (480 - v_nheight) / 2 + 6 * FK_SIZE, 100, 8 * FK_SIZE, 0x00);
sprintf(str_temp, "Best Score: %d", G_BESTSCORE);
drawstr((640 + v_nwidth) / 2 + 10, (480 - v_nheight) / 2 + 6 * FK_SIZE, str_temp, strlen(str_temp), 0x04);
sprintf(str_temp, "Score: %d", G_SCORE);
drawstr((640 + v_nwidth) / 2 + 10, (480 - v_nheight) / 2 + 8 * FK_SIZE, str_temp, strlen(str_temp), 0x06);
sprintf(str_temp, "Level: %d", G_LEVEL + 1);
drawstr((640 + v_nwidth) / 2 + 10, (480 - v_nheight) / 2 + 10 * FK_SIZE, str_temp, strlen(str_temp), 0x06);
sprintf(str_temp, "Rows: %d", G_ROWS);
drawstr((640 + v_nwidth) / 2 + 10, (480 - v_nheight) / 2 + 12 * FK_SIZE, str_temp, strlen(str_temp), 0x06);
};
int clear_full_row()
{
char str_temp[30];
int i, j, k, c = 0;
int bFull;
for (i = V_FKN - 1; i > 0; --i)
{
bFull = 1;
for (j = 0; j < H_FKN; ++j)
if (FK_DATA[i][j] == 0)
{
bFull = 0;
break;
}
if (bFull)
{
k = i;
while (k > 0)
{
for (j = 0; j < H_FKN; ++j)
FK_DATA[k][j] = FK_DATA[k - 1][j];
k--;
}
c++;
i++;
}
}
update_score(c);
return c;
};
void move_fk_left(void)
{
int i ,ret;
FK_CUR.x--;
ret = check_fk(&FK_CUR);
if (ret > 0)
FK_CUR.x++;
for (i = 0; i < 16; ++i)
{
if (FK_CUR.data[i%4][i/4] > 0 )
break;
}
if (FK_CUR.x + i/4 < 0)
FK_CUR.x = 0 - i/4;
};
void move_fk_right(void)
{
int i,ret;
FK_CUR.x++;
ret = check_fk(&FK_CUR);
if (ret > 0)
FK_CUR.x--;
for (i = 0; i < 16; ++i)
{
if (FK_CUR.data[i%4][4 - i/4 - 1] > 0)
break;
}
if (FK_CUR.x + 4 - i/4 >= H_FKN)
FK_CUR.x = H_FKN - 4 + i/4;
};
void move_fk_down(void)
{
int ret;
FK_CUR.y++;
ret = check_fk(&FK_CUR);
if (ret == 1)
{
FK_CUR.y--;
add_cur_fk(&FK_CUR);
draw_fk_data((VGA_WIDTH - v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2, 0x06);
if (clear_full_row() > 0 )
{
clear_bk((VGA_WIDTH - v_nwidth) / 2 + 1, (VGA_HEIGHT - v_nheight) / 2 + 1 , v_nwidth - 2, v_nheight - 2, 0x00);
draw_fk_data((VGA_WIDTH - v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2, 0x06);
}
copy_fk_next();
draw_cur_fk((VGA_WIDTH - v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2 + 20, &FK_NEXT, 0x00);
rand_fk(&FK_NEXT);
draw_cur_fk((VGA_WIDTH - v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2 + 20, &FK_NEXT, 0x02);
}
else if (ret == V_FKN)
{
clear_fkdata();
copy_fk_next();
draw_cur_fk((VGA_WIDTH - v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2 + 20, &FK_NEXT, 0x00);
rand_fk(&FK_NEXT);
draw_cur_fk((VGA_WIDTH - v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2 + 20, &FK_NEXT, 0x02);
G_RUNNING = 0;
G_ROWS = G_SCORE = G_BESTSCORE = G_LEVEL = 0;
}
};
void move_fk_rotate(void)
{
int i,ret;
i = FK_CUR.x;
rotate_fk(&FK_CUR, 1);
ret = check_fk(&FK_CUR);
if (ret > 0)
{
rotate_fk(&FK_CUR, 0);
FK_CUR.x = i;
}
};
/*static void timer_interrupts(void*context,alt_u32 id)
{
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0);
};*/
void timer_milliseconds(void)
{
/*alt_irq_register(timer_irq,timer1_base,timer_interrupts);*/
IOWR_ALTERA_AVALON_TIMER_PERIODL(SYS_CLK_TIMER_BASE,0x0080);
IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER1_BASE,0x00BB);
};
void init_fk(void)
{
unsigned int i;
unsigned char str_temp[30]="AAAAAAA";
timer_milliseconds();
IOWR_ALTERA_AVALON_TIMER_CONTROL(SYS_CLK_TIMER_BASE,7);
G_ROWS = G_SCORE = G_BESTSCORE = G_LEVEL = 0;
loadasc();
clear_bk(0,0,640,480,0);
drawstr((VGA_WIDTH - v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2 - 50, str_temp, strlen(str_temp),0x07);
sprintf(str_temp,"BBB");
drawstr((VGA_WIDTH - v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2 + 2*FK_SIZE, str_temp, strlen(str_temp),0x07);
sprintf(str_temp,"CC");
drawstr((VGA_WIDTH - v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2 + 4*FK_SIZE, str_temp, strlen(str_temp),0x07);
sprintf(str_temp,"DD");
drawstr((VGA_WIDTH - v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2 + 6*FK_SIZE, str_temp, strlen(str_temp),0x07);
sprintf(str_temp,"键4:开始游戏\旋转");
drawstr((VGA_WIDTH - v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2 + 8*FK_SIZE, str_temp, strlen(str_temp),0x07);
for (i = 0; i < v_nwidth - 2; ++i)
{
drawpixel((VGA_WIDTH - v_nwidth) / 2 + i, (VGA_HEIGHT - v_nheight) / 2, 0x02);
drawpixel((VGA_WIDTH - v_nwidth) / 2 + i, (VGA_HEIGHT + v_nheight) / 2, 0x02);
}
for (i = 0; i < v_nheight; ++i)
{
drawpixel((VGA_WIDTH - v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2 + i, 0x02);
drawpixel((VGA_WIDTH + v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2 + i, 0x02);
}
rand_fk(&FK_CUR);
rand_fk(&FK_NEXT);
update_score(0);
draw_cur_fk((VGA_WIDTH - v_nwidth) / 2, (VGA_HEIGHT - v_nheight) / 2 + 20, &FK_NEXT, 0x02);
};
void isr_dma(void* context1, alt_u32 id)
{
volatile int* dma_statue_rigest = (volatile int*) context1;
* dma_statue_rigest = IORD_ALTERA_AVALON_DMA_STATUS(DMA_BASE);
if((IORD_ALTERA_AVALON_DMA_STATUS(DMA_BASE) & ALTERA_AVALON_DMA_STATUS_BUSY_MSK));
{
IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_BASE,0);
IOWR_ALTERA_AVALON_DMA_STATUS(DMA_BASE,0);
IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_BASE,ALTERA_AVALON_DMA_CONTROL_I_EN_MSK |ALTERA_AVALON_DMA_CONTROL_GO_MSK | ALTERA_AVALON_DMA_CONTROL_WORD_MSK|ALTERA_AVALON_DMA_CONTROL_WEEN_MSK|ALTERA_AVALON_DMA_CONTROL_LEEN_MSK | ALTERA_AVALON_DMA_CONTROL_WCON_MSK );
}
};
void init_dma(void)
{
alt_irq_register( DMA_IRQ,DMA_BASE, isr_dma );
IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_BASE,0);
IOWR_ALTERA_AVALON_DMA_STATUS(DMA_BASE,0);
IOWR_ALTERA_AVALON_DMA_LENGTH(DMA_BASE,640*480);
IOWR_ALTERA_AVALON_DMA_RADDRESS(DMA_BASE,P_VGA_RAM);
IOWR_ALTERA_AVALON_DMA_WADDRESS(DMA_BASE,0X01000000);
IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_BASE,ALTERA_AVALON_DMA_CONTROL_I_EN_MSK |ALTERA_AVALON_DMA_CONTROL_GO_MSK | ALTERA_AVALON_DMA_CONTROL_WORD_MSK|ALTERA_AVALON_DMA_CONTROL_WEEN_MSK|ALTERA_AVALON_DMA_CONTROL_LEEN_MSK | ALTERA_AVALON_DMA_CONTROL_WCON_MSK );
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -