⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 b04278d216f2001a1a47b6584e8f9250

📁 这是一个基于NIOSII的俄罗斯方块游戏设计
💻
📖 第 1 页 / 共 2 页
字号:
		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 + -