色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

采用STM32開發板制作俄羅斯方塊小游戲

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2022-05-30 09:13 ? 次閱讀

《俄羅斯方塊》(Tetris, 俄文:Тетрис)是一款由俄羅斯人阿列克謝·帕基特諾夫于1984年6月發明的休閑游戲。

該游戲曾經被多家公司代理過。經過多輪訴訟后,該游戲的代理權最終被任天堂獲得。 [1] 任天堂對于俄羅斯方塊來說意義重大,因為將它與GB搭配在一起后,獲得了巨大的成功。

《俄羅斯方塊》的基本規則是移動、旋轉和擺放游戲自動輸出的各種方塊,使之排列成完整的一行或多行并且消除得分。

1.硬件平臺

STM32開發板

3.5寸LCD屏(16位并口8080時序)

字庫存儲W25Q64(SPI)

4個按鍵

2.方塊示例

本設計中方塊種類共5種,根據方向的不同可分為19種可能性。

pYYBAGKSJKyADRpfAAm2yYHLuRg863.png

3.游戲效果圖

1.游戲結束效果。當方塊堆疊觸碰到上頂端,則游戲結束。

pYYBAGKSJOeAZykbAApWvKh3oFU964.png

2.正常游戲和方塊顏色分配,下一個方塊提示,積分統計,按鍵操作說明。

pYYBAGKSJYCAeoYUAAWq-f7Fa7I160.png

3.消行效果展示,得分獲取。

軟件設計中,消除一行得1分,消除兩行得2分,消除3行得4分,消除4行得8分。

poYBAGKSJZWABMUCAAo1jutCgew698.png

4.軟件設計

1.單個方塊繪制和清除一行處理

/*************繪制單個方塊**************/
void Lcd_DrawDiamond(u16 x,u16 y,u16 c)
{
  u16 i;
  LcdWriteReg(0x2A);//設置x坐標
  LcdWriteData((x>>8)&0xff);//x坐標高8位
  LcdWriteData(x&0xff);//x坐標低8位
  LcdWriteData(((x+8)>>8)&0xff);//x坐標高8位
  LcdWriteData((x+8)&0xff);//x坐標低8位
  LcdWriteReg(0x2B);//設置Y坐標
  LcdWriteData((y>>8)&0xff);//Y坐標高8位
  LcdWriteData(y&0xff);//Y坐標低8位
  LcdWriteData(((y+8)>>8)&0xff);//Y坐標高8位
  LcdWriteData((y+8)&0xff);//Y坐標低8位
  LcdWriteReg(0x2C);//設置x坐標
  for(i=0;i<9*9;i++)LcdWriteData(c);
}
/******************消除一行*******************/
void Lcd_ClearOneLineDisplay(u16 y,u16 c)
{
  u16 i=0;
  for(i=2;i;i+=10)>

2.繪制各個方塊,設置方塊顏色

 /*每一個種類的顏色*/
/*
		1  -- DARKBLUE --Drawshape_color[0]
		2,3 -- BRRED  --Drawshape_color[1]
		4,5,6,7 -- BLUE --Drawshape_color[2]
		8,9,10,11,12,13,14,15 -- GRAY --Drawshape_color[3]
		16,17,18,19  --BLACK -- Drawshape_color[4]
*/
const u16 Drawshape_color[]={DARKBLUE,BRRED,BLUE,GRAY,BLACK};
/*******************繪制一個俄羅斯方塊***************************
**形參:x,y -- 要顯示的位置
**			what  --要繪制的方塊序號(1~19)
**      c   --方塊顏色
**			stat  --更新到二維數組中的狀態(0表示清除,1表示寫入狀態)
*******************************************************************/
void Lcd_Drawshape(u16 x,u16 y,u8 what,u16 c,u8 stat)
{
	switch (what)
	{
		case 1:
		{
      Lcd_DrawDiamond(x,y,c);
      Lcd_DrawDiamond(x+10,y,c);
      Lcd_DrawDiamond(x,y+10,c);
      Lcd_DrawDiamond(x+10,y+10,c);
      
      Lcd_Refreshbuff(x,y,stat);
      Lcd_Refreshbuff(x+10,y,stat);
      Lcd_Refreshbuff(x,y+10,stat);
      Lcd_Refreshbuff(x+10,y+10,stat);
		}
		break;
		
		case 2:
		{
      Lcd_DrawDiamond(x,y,c);
      Lcd_DrawDiamond(x+10,y,c);
      Lcd_DrawDiamond(x+20,y,c);
      Lcd_DrawDiamond(x+30,y,c);

      Lcd_Refreshbuff(x,y,stat);
      Lcd_Refreshbuff(x+10,y,stat);
      Lcd_Refreshbuff(x+20,y,stat);
      Lcd_Refreshbuff(x+30,y,stat);
		}
		break;
		
		case 3:
		{
      Lcd_DrawDiamond(x,y,c);
      Lcd_DrawDiamond(x,y+10,c);
      Lcd_DrawDiamond(x,y+20,c);
      Lcd_DrawDiamond(x,y+30,c);
      
      Lcd_Refreshbuff(x,y,stat);
      Lcd_Refreshbuff(x,y+10,stat);
      Lcd_Refreshbuff(x,y+20,stat);
      Lcd_Refreshbuff(x,y+30,stat);
		}
		break;
		
		case 4:
		{
      Lcd_DrawDiamond(x+10,y,c);
      Lcd_DrawDiamond(x,y+10,c);
      Lcd_DrawDiamond(x+10,y+10,c);
      Lcd_DrawDiamond(x+20,y+10,c);
  
      Lcd_Refreshbuff(x+10,y,stat);
      Lcd_Refreshbuff(x,y+10,stat);
      Lcd_Refreshbuff(x+10,y+10,stat);
      Lcd_Refreshbuff(x+20,y+10,stat);
		}
		break;
		
		case 5:
		{
      Lcd_DrawDiamond(x+10,y+10,c);
      Lcd_DrawDiamond(x,y,c);
      Lcd_DrawDiamond(x,y+10,c);
      Lcd_DrawDiamond(x,y+20,c);
      
      Lcd_Refreshbuff(x+10,y+10,stat);
      Lcd_Refreshbuff(x,y,stat);
      Lcd_Refreshbuff(x,y+10,stat);
      Lcd_Refreshbuff(x,y+20,stat);
		}
		break;

		case 6:
		{
      Lcd_DrawDiamond(x,y+10,c);
      Lcd_DrawDiamond(x+10,y,c);
      Lcd_DrawDiamond(x+10,y+10,c);
      Lcd_DrawDiamond(x+10,y+20,c);
      
      Lcd_Refreshbuff(x,y+10,stat);
      Lcd_Refreshbuff(x+10,y,stat);
      Lcd_Refreshbuff(x+10,y+10,stat);
      Lcd_Refreshbuff(x+10,y+20,stat);
		}
		break;
		
		case 7:
		{
      Lcd_DrawDiamond(x+10,y+10,c);
      Lcd_DrawDiamond(x,y,c);
      Lcd_DrawDiamond(x+10,y,c);
      Lcd_DrawDiamond(x+20,y,c);
      
      Lcd_Refreshbuff(x+10,y+10,stat);
      Lcd_Refreshbuff(x,y,stat);
      Lcd_Refreshbuff(x+10,y,stat);
      Lcd_Refreshbuff(x+20,y,stat);    
		}
		break;
	
		case 8:
		{
      Lcd_DrawDiamond(x,y,c);
      Lcd_DrawDiamond(x,y+10,c);
      Lcd_DrawDiamond(x,y+20,c);
      Lcd_DrawDiamond(x+10,y+20,c);
      
      Lcd_Refreshbuff(x,y,stat);
      Lcd_Refreshbuff(x,y+10,stat);
      Lcd_Refreshbuff(x,y+20,stat);
      Lcd_Refreshbuff(x+10,y+20,stat);
		}
		break;
		
		case 9:
		{
      Lcd_DrawDiamond(x,y,c);
      Lcd_DrawDiamond(x,y+10,c);
      Lcd_DrawDiamond(x+10,y,c);
      Lcd_DrawDiamond(x+20,y,c);
      
      Lcd_Refreshbuff(x,y,stat);
      Lcd_Refreshbuff(x,y+10,stat);
      Lcd_Refreshbuff(x+10,y,stat);
      Lcd_Refreshbuff(x+20,y,stat);
		}
		break;
		
		case 10:
		{
      Lcd_DrawDiamond(x,y,c);
      Lcd_DrawDiamond(x+10,y,c);
      Lcd_DrawDiamond(x+10,y+10,c);
      Lcd_DrawDiamond(x+10,y+20,c);
      
      Lcd_Refreshbuff(x,y,stat);
      Lcd_Refreshbuff(x+10,y,stat);
      Lcd_Refreshbuff(x+10,y+10,stat);
      Lcd_Refreshbuff(x+10,y+20,stat);
		}
		break;
		
		case 11:
		{
      Lcd_DrawDiamond(x,y+10,c);
      Lcd_DrawDiamond(x+10,y+10,c);
      Lcd_DrawDiamond(x+20,y+10,c);
      Lcd_DrawDiamond(x+20,y,c);
      
      Lcd_Refreshbuff(x,y+10,stat);
      Lcd_Refreshbuff(x+10,y+10,stat);
      Lcd_Refreshbuff(x+20,y+10,stat);
      Lcd_Refreshbuff(x+20,y,stat);
		}
		break;
		
		case 12:
		{
      Lcd_DrawDiamond(x+10,y,c);
      Lcd_DrawDiamond(x+10,y+10,c);
      Lcd_DrawDiamond(x+10,y+20,c);
      Lcd_DrawDiamond(x,y+20,c);
      
      Lcd_Refreshbuff(x+10,y,stat);
      Lcd_Refreshbuff(x+10,y+10,stat);
      Lcd_Refreshbuff(x+10,y+20,stat);
      Lcd_Refreshbuff(x,y+20,stat);
		}
		break;
		
		case 13:
		{
      Lcd_DrawDiamond(x,y,c);
      Lcd_DrawDiamond(x+10,y,c);
      Lcd_DrawDiamond(x+20,y,c);
      Lcd_DrawDiamond(x+20,y+10,c);
      
      Lcd_Refreshbuff(x,y,stat);
      Lcd_Refreshbuff(x+10,y,stat);
      Lcd_Refreshbuff(x+20,y,stat);
      Lcd_Refreshbuff(x+20,y+10,stat);
		}
		break;
		
		case 14:
		{
      Lcd_DrawDiamond(x,y,c);
      Lcd_DrawDiamond(x+10,y,c);
      Lcd_DrawDiamond(x,y+10,c);
      Lcd_DrawDiamond(x,y+20,c);
      
      Lcd_Refreshbuff(x,y,stat);
      Lcd_Refreshbuff(x+10,y,stat);
      Lcd_Refreshbuff(x,y+10,stat);
      Lcd_Refreshbuff(x,y+20,stat);
		}
		break;
		
		case 15:
		{
      Lcd_DrawDiamond(x,y,c);
      Lcd_DrawDiamond(x,y+10,c);
      Lcd_DrawDiamond(x+10,y+10,c);
      Lcd_DrawDiamond(x+20,y+10,c);
      
      Lcd_Refreshbuff(x,y,stat);
      Lcd_Refreshbuff(x,y+10,stat);
      Lcd_Refreshbuff(x+10,y+10,stat);
      Lcd_Refreshbuff(x+20,y+10,stat);
		}
		break;
		
		
		case 16:
		{
      Lcd_DrawDiamond(x+10,y,c);
      Lcd_DrawDiamond(x,y+10,c);
      Lcd_DrawDiamond(x+10,y+10,c);
      Lcd_DrawDiamond(x,y+20,c);
      
      Lcd_Refreshbuff(x+10,y,stat);
      Lcd_Refreshbuff(x,y+10,stat);
      Lcd_Refreshbuff(x+10,y+10,stat);
      Lcd_Refreshbuff(x,y+20,stat);
		}
		break;
		
		case 17:
		{
      Lcd_DrawDiamond(x,y,c);
      Lcd_DrawDiamond(x+10,y,c);
      Lcd_DrawDiamond(x+10,y+10,c);
      Lcd_DrawDiamond(x+20,y+10,c);
      
      Lcd_Refreshbuff(x,y,stat);
      Lcd_Refreshbuff(x+10,y,stat);
      Lcd_Refreshbuff(x+10,y+10,stat);
      Lcd_Refreshbuff(x+20,y+10,stat);
		}
		break;
		
		case 18:
		{
      Lcd_DrawDiamond(x,y,c);
      Lcd_DrawDiamond(x,y+10,c);
      Lcd_DrawDiamond(x+10,y+10,c);
      Lcd_DrawDiamond(x+10,y+20,c);
      
      Lcd_Refreshbuff(x,y,stat);
      Lcd_Refreshbuff(x,y+10,stat);
      Lcd_Refreshbuff(x+10,y+10,stat);
      Lcd_Refreshbuff(x+10,y+20,stat);
		}
		break;
		case 19:
		{
      Lcd_DrawDiamond(x,y+10,c);
      Lcd_DrawDiamond(x+10,y+10,c);
      Lcd_DrawDiamond(x+10,y,c);
      Lcd_DrawDiamond(x+20,y,c);
      
      Lcd_Refreshbuff(x,y+10,stat);
      Lcd_Refreshbuff(x+10,y+10,stat);
      Lcd_Refreshbuff(x+10,y,stat);
      Lcd_Refreshbuff(x+20,y,stat);
		}
		break;
	}
}

3.方塊移動和方向切換

/******************向下移動*****************/
int Lcd_DownMove(u16 x,u16 y,u16 what,u16 c)
{
  Lcd_Drawshape(x,y,what,WHITE,0);
  Lcd_Drawshape(x,y+10,what,c,1);
  return y+10;
}
/***************向左移動*********************/
int Lcd_LeftMove(u16 x,u16 y,u16 what,u16 c)
{
  Lcd_Drawshape(x,y,what,WHITE,0);
  Lcd_Drawshape(x-10,y,what,c,1);
  return x-10;
}
/****************向右移動********************/
int Lcd_RightMove(u16 x,u16 y,u16 what,u16 c)
{
  Lcd_Drawshape(x,y,what,WHITE,0);
  Lcd_Drawshape(x+10,y,what,c,1);
  return x+10;
}
/**************************改變圖形***************/
u8 Lcd_Changshape(u16 x,u16 y,u16 what,u16 c)
{
  u8 stat;
	switch(what)
	{
		case 1:stat=1;break;
		
		case 2:
		{
			if(shape_place_stat[(y+40)/10][x/10] || shape_place_stat[(y+30)/10][x/10] || shape_place_stat[(y+20)/10][x/10] || shape_place_stat[(y+10)/10][x/10])
			{
				stat=2;
				break;	
			}
			Lcd_Drawshape(x,y,2,WHITE,0);Lcd_Drawshape(x,y,3,c,1);stat=3;break;
		}
    case 3:
		{
			if(shape_place_stat[(y+40)/10][(x+40)/10])
			{
				stat=3;
				break;	
			}
			Lcd_Drawshape(x,y,3,WHITE,0);Lcd_Drawshape(x,y,2,c,1);stat=2;break;
		}
    case 4:
		{
			Lcd_Drawshape(x,y,4,WHITE,0);Lcd_Drawshape(x,y,5,c,1);stat=5;break;
		}
    case 5:
		{
			Lcd_Drawshape(x,y,5,WHITE,0);Lcd_Drawshape(x,y,6,c,1);stat=6;break;
		}
    case 6:
		{
			if(shape_place_stat[y/10][(x+30)/10])
			{
					stat=6;
					break;
			}
			Lcd_Drawshape(x,y,6,WHITE,0);Lcd_Drawshape(x,y,7,c,1);stat=7;break;
		}
    case 7:Lcd_Drawshape(x,y,7,WHITE,0);Lcd_Drawshape(x,y,4,c,1);stat=4;break;
    
    case 8:
		{
			if(shape_place_stat[y/10][(x+30)/10])
			{
				stat=8;
				break;
			}
			Lcd_Drawshape(x,y,8,WHITE,0);Lcd_Drawshape(x,y,9,c,1);stat=9;break;
		}
    case 9:
		{
			if(shape_place_stat[(y+30)/10][x/10])
			{
				stat=9;
				break;
			}
			Lcd_Drawshape(x,y,9,WHITE,0);Lcd_Drawshape(x,y,10,c,1);stat=10;break;
		}
    case 10:
		{
			if(shape_place_stat[y/10][(x+30)/10])
			{
				stat=10;
				break;
			}
			Lcd_Drawshape(x,y,10,WHITE,0);Lcd_Drawshape(x,y,11,c,1);stat=11;break;
		}
    case 11:
		{
			if(shape_place_stat[(y+30)/10][x/10])
			{
				stat=11;
				break;
			}
			Lcd_Drawshape(x,y,11,WHITE,0);Lcd_Drawshape(x,y,8,c,1);stat=8;break;
		}
    
    case 12:
		{
			if(shape_place_stat[(y)/10][(x+30)/10] || shape_place_stat[(y+20)/10][x/10] || shape_place_stat[(y+20)/10][(x+30)/10])
			{
				stat=12;
				break;
			}
			Lcd_Drawshape(x,y,12,WHITE,0);Lcd_Drawshape(x,y,13,c,1);stat=13;break;
		}
    case 13:
		{
			if(shape_place_stat[(y+30)/10][x/10])
			{
				stat=13;
				break;
			}
			Lcd_Drawshape(x,y,13,WHITE,0);Lcd_Drawshape(x,y,14,c,1);stat=14;break;
		}
    case 14:
		{
			if(shape_place_stat[y/10][(x+30)/10])
			{
				stat=14;
				break;
			}
			Lcd_Drawshape(x,y,14,WHITE,0);Lcd_Drawshape(x,y,15,c,1);stat=15;break;
		}
    case 15:
		{
			if(shape_place_stat[(y+30)/10][x/10])
			{
				stat=15;
				break;
			}
			Lcd_Drawshape(x,y,15,WHITE,0);Lcd_Drawshape(x,y,12,c,1);stat=12;break;
		}
    
    case 16:
		{
			if(shape_place_stat[y/10][(x+30)/10])
			{
				stat=16;
				break;
			}
			Lcd_Drawshape(x,y,16,WHITE,0);Lcd_Drawshape(x,y,17,c,1);stat=17;break;
		}
    case 17:
		{
			Lcd_Drawshape(x,y,17,WHITE,0);Lcd_Drawshape(x,y,16,c,1);stat=16;break;
		}
    
    case 18:
		{
			if(shape_place_stat[y/10][(x+30)/10])
			{
				stat=18;
				break;
			}
			Lcd_Drawshape(x,y,18,WHITE,0);Lcd_Drawshape(x,y,19,c,1);stat=19;break;
		}
    case 19:
		{
			Lcd_Drawshape(x,y,19,WHITE,0);Lcd_Drawshape(x,y,18,c,1);stat=18;break;
		}
	}  
  return stat;
}

4.判斷得分,消行。

/***********得分判斷*********************/
u8 Lcd_GetMark(u8 *buff)
{
  int i,j,k;
  u8 cnt=0;//保存要消除的行數
  int line=0;
  /*判斷當前最高位置*/
  for(i=47;i>=0;i--)//高度
  {
    for(j=1;j<23;j++)//每一行的方格數
    {
      if(shape_place_stat[i][j])break;
    }
    if(j==23)
    {
      line=i;//記錄當前方塊有多少行
      break;
    }
  }
//	printf("line=%d\r\n",line);
	if(line<=1)return 0xff;//游戲結束
  for(i=47;i>line;i--)
  {
    for(j=0;j<24;j++)
    {
      if(shape_place_stat[i][j]==0)break;
    }
    if(j==24)buff[cnt++]=i;//記錄哪一行需要消除
  }

  /*得分,消行*/
  if(cnt)
  {
    for(i=0;i=0;k--)
		{
			for(j=buff[k];j>=line;j--)
			{
					for(i=0;i<24;i++)
					{
							shape_place_stat[j][i]=shape_place_stat[j-1][i];
					}
			}
			line--;
		}
		
    for(i=buff[0];i>=line;i--)
   {
      Lcd_ClearOneLine(i);
   }
  }
	if(cnt==0)cnt=0;
	else if(cnt==1)cnt=1;//消除1行得1分
	else if(cnt==2)cnt=4;//消除2行得4分
	else if(cnt==3)cnt=8;
	else if(cnt==4)cnt=16;
  return cnt; 
}
/*清空圖形掉落位置狀態信息*/
void Lcd_Clearshape(void)
{
	int i,j;
	for(i=0;i<48;i++)
	{
		for(j=1;j<23;j++)
		{
			shape_place_stat[i][j]=0;
		}
	}
}
;i++)>

5.窗口設計

/*******************************繪制顯示窗口**************************/
void Lcd_TetrisShowWind(void)
{
  LCD_DrawLine(LCD_WIDTH-97, 0, LCD_WIDTH-97, LCD_HIGHT,BLACK);//畫直線
  LCD_DrawLine(LCD_WIDTH-96, 0, LCD_WIDTH-96, LCD_HIGHT,BLACK);//畫直線
	LCD_DrawLine(LCD_WIDTH-96, 170, LCD_WIDTH-1, 170,BLACK);
	LCD_DrawLine(LCD_WIDTH-96, 171, LCD_WIDTH-1, 171,BLACK);
  LCD_Display_Str(LCD_WIDTH-96+25,30,24,(u8 *)"NEXT",DARKBLUE);//顯示字符串
  LCD_Display_Str(LCD_WIDTH-96+25,200,16,(u8 *)"得 分",DARKBLUE);//顯示字符串
	LCD_Display_Str(LCD_WIDTH-96+96/2-12,200+30,24,(u8 *)"0",RED);//顯示字符串
	LCD_Display_Str(LCD_WIDTH-96+10,320,16,(u8 *)"旋轉 KEYUP ",DARKBLUE);//顯示字符串
	LCD_Display_Str(LCD_WIDTH-96+10,360,16,(u8 *)"暫停 KEY1",DARKBLUE);//顯示字符串
	LCD_Display_Str(LCD_WIDTH-96+10,400,16,(u8 *)"左 KEY2  ",DARKBLUE);//顯示字符串
	LCD_Display_Str(LCD_WIDTH-96+10,440,16,(u8 *)"右 KEY0",DARKBLUE);//顯示字符串
}

6.初始化硬件,開始游戲

#include "stm32f10x.h"
#include "beep.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "usart.h"
#include "w25q64.h"
#include "timer.h"
#include 
#include "nt35310.h"
#include "tetris_game.h"
#include 
int main()
{
  u8 buff[49];
  u8 stat=1;
  int x0=112,y0=0;
  u16 cnt=1,cnt2=0;
  u8 key;
	u16 mark=0,res,mark2=0;
	u16 color;//方塊顏色
  u16 i=200;
  Beep_Init();
  Led_Init();
  Key_Init();//按鍵初始化
	TIMx_Init(TIM4,7200,65535);
  Usartx_Init(USART1,115200,72);
  printf("串口初始化完成\r\n");
  W25Q64_Init();
  LCD_Init();
AA:
	LCD_Clear(WHITE);//清屏函數
  Lcd_TetrisShowWind();
  cnt=rand()%20;
  if(cnt==0)cnt=1;
	cnt2=rand()%20;
	if(cnt2==0)cnt2=1;
	Lcd_Drawshape(LCD_WIDTH-96+35,80,cnt2,BLACK,0);
	/*俄羅斯方塊示例圖*/
//  for(i=1;i<=19;i++)
//  {
//		if(i==1)color=Drawshape_color[0];
//		else if(i>=2 && i<=3)color=Drawshape_color[1];
//		else if(i>=4 && i<=7)color=Drawshape_color[2];
//		else if(i>=8 && i<=15)color=Drawshape_color[3];
//		else if(i>=16 && i<=19)color=Drawshape_color[4];
//    Lcd_Drawshape(x0,y0,i,color,0);//繪制圖形
//    x0+=50;
//    if(x0>=260)
//    {
//      x0=50;
//      y0+=50;
//    }
//  }
  while(1)
  { 
		key=Key_Getval();
    if(key==3)//暫停
    {
      stat=!stat;
    }
		else if((key==1) && stat)//切換方向
    {
      i=0;
			if(cnt==1)color=Drawshape_color[0];
			else if(cnt>=2 && cnt<=3)color=Drawshape_color[1];
			else if(cnt>=4 && cnt<=7)color=Drawshape_color[2];
			else if(cnt>=8 && cnt<=15)color=Drawshape_color[3];
			else if(cnt>=16 && cnt<=19)color=Drawshape_color[4];
      cnt=Lcd_Changshape(x0,y0,cnt,color);
    }
    else if((key==2) && stat)//右
    {
      if(Lcd_Shape_GetStat(x0+shape_widht[cnt-1]*10,y0)==0)
      {
				if(cnt==1)color=Drawshape_color[0];
				else if(cnt>=2 && cnt<=3)color=Drawshape_color[1];
				else if(cnt>=4 && cnt<=7)color=Drawshape_color[2];
				else if(cnt>=8 && cnt<=15)color=Drawshape_color[3];
				else if(cnt>=16 && cnt<=19)color=Drawshape_color[4];
        x0=Lcd_RightMove(x0,y0,cnt,color);
      }
    }
    else if((key==4) && stat)//左
    {
      if(x0>=10)
      {
        if(Lcd_Shape_GetStat(x0-10,y0)==0)
				{
					if(cnt==1)color=Drawshape_color[0];
					else if(cnt>=2 && cnt<=3)color=Drawshape_color[1];
					else if(cnt>=4 && cnt<=7)color=Drawshape_color[2];
					else if(cnt>=8 && cnt<=15)color=Drawshape_color[3];
					else if(cnt>=16 && cnt<=19)color=Drawshape_color[4];
          x0=Lcd_LeftMove(x0,y0,cnt,color);
				}
      }
    }
    if(i>=100 && stat)
    {
      i=0;
			if(cnt==1)color=Drawshape_color[0];
			else if(cnt>=2 && cnt<=3)color=Drawshape_color[1];
			else if(cnt>=4 && cnt<=7)color=Drawshape_color[2];
			else if(cnt>=8 && cnt<=15)color=Drawshape_color[3];
			else if(cnt>=16 && cnt<=19)color=Drawshape_color[4];
      y0=Lcd_DownMove(x0,y0,cnt,color);//向下
      if(Lcd_Shape_GetLowerBoundary(x0,y0,cnt))//
      {
				res=Lcd_GetMark(buff);
				if(res==0xff)
				{
					mark=0;
					res=0;
					LCD_Display_Str(LCD_WIDTH/2-9*12,230,24,(u8 *)"GAME OVER",RED);
					LCD_Display_Str(LCD_WIDTH/2-9*12-20,265,16,(u8 *)"請按任意鍵重新開始!",RED);
					while(1)
					{
						key=Key_Getval();	
						if(key)
						{
							Lcd_Clearshape();
							goto AA;
						}
					}
				}
				mark+=res;
				if(mark2!=mark)
				{
					mark2=mark;
					snprintf((char *)buff,sizeof(buff),"%02d",mark2);
					LCD_Display_Str(LCD_WIDTH-94,230,24,(u8 *)"       ",WHITE);//顯示字符串
					LCD_Display_Str(LCD_WIDTH-94+96/2-strlen((char *)buff)*12,230,24,buff,RED);//顯示字符串
				}
       // printf("得分:%d\r\n",mark);
        x0=112,y0=0;
				Lcd_Drawshape(LCD_WIDTH-96+35,80,cnt2,WHITE,0);
				cnt=cnt2;
				cnt2=rand()%20;
				if(cnt2==0)cnt2=1;
				Lcd_Drawshape(LCD_WIDTH-96+35,80,cnt2,BLACK,0);
      }
    } 
    Delay_Ms(1);
    i++;
  }
}

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2270

    文章

    10895

    瀏覽量

    355729
  • 游戲
    +關注

    關注

    2

    文章

    742

    瀏覽量

    26312
  • 開發板
    +關注

    關注

    25

    文章

    5032

    瀏覽量

    97371
收藏 人收藏

    評論

    相關推薦

    俄羅斯方塊游戲實例

    一個很完善的俄羅斯方塊游戲
    發表于 01-10 17:45

    俄羅斯方塊

    單片機做的俄羅斯方塊游戲
    發表于 07-31 19:56

    好玩的俄羅斯方塊游戲仿真

    好玩的俄羅斯方塊游戲仿真,學protues看到的,很好玩,分享下
    發表于 10-21 20:31

    帶AI的俄羅斯方塊

    本帖最后由 shi_dongyu 于 2017-2-11 08:05 編輯 這周花了幾天時間研究了下俄羅斯方塊,并寫了一個帶AI的俄羅斯方塊游戲。我想這個游戲對每個人都很熟悉,很
    發表于 02-10 20:08

    采用單片機來實現的智能俄羅斯方塊游戲

    俄羅斯方塊游戲算法請參考俄羅斯方塊游戲的算法1.概述俄羅斯方塊是一款風靡全球的益智游戲。它規則簡
    發表于 11-19 08:26

    OpenHarmony開發板運行俄羅斯方塊游戲

    本案例展示在OpenHarmony開發板上運行俄羅斯方塊游戲, 通過12864液晶屏進行顯示. 項目底層通過OpenHarmony的HDF框架來驅動, 并基于linkboy圖形引擎編程框架完成
    發表于 12-03 17:27

    基于STM32與MSP43051的俄羅斯方塊游戲設計

    單片機 STM32 MSP430 51 俄羅斯方塊 游戲 戰艦
    發表于 02-15 06:44

    俄羅斯方塊游戲設計原理

    俄羅斯方塊游戲是VHDL 應用于復雜數字系統的一個經典設計,本章將詳細介紹該游戲的設計原理和設計方法。其中包括系統構成、系統設計原理和系統各個模塊的實現方法。
    發表于 09-01 17:24 ?0次下載

    STM32F103ZET6開發板實現俄羅斯方塊小游戲

    使用STM32F103ZET6開發板實現俄羅斯方塊小游戲
    發表于 12-19 15:27 ?39次下載

    使用STM32系列單片機設計的俄羅斯方塊游戲的程序免費下載

    本文檔的主要內容詳細介紹的是使用STM32系列單片機設計的俄羅斯方塊游戲的程序免費下載。可以使用STM32F系列通過該例程程序通過TFT屏幕顯示俄羅
    發表于 05-13 08:00 ?25次下載
    使用<b class='flag-5'>STM32</b>系列單片機設計的<b class='flag-5'>俄羅斯方塊</b><b class='flag-5'>游戲</b>的程序免費下載

    使用單片機制作萬用俄羅斯方塊的資料合集免費下載

    本文檔的主要內容詳細介紹的是使用單片機制作萬用俄羅斯方塊的資料合集免費下載b包括了:程序,器件引腳等資料,PCB版本俄羅斯方塊,PCB版
    發表于 07-04 16:58 ?39次下載
    使用單片機<b class='flag-5'>制作</b>萬用<b class='flag-5'>板</b><b class='flag-5'>俄羅斯方塊</b>的資料合集免費下載

    使用STM32開發板實現俄羅斯方塊游戲的工程文件和源代碼免費下載

    本文檔的主要主要內容詳細介紹的是使用STM32單片機開發板實現俄羅斯方塊游戲的工程文件和源代碼免費下載
    發表于 12-02 08:00 ?21次下載
    使用<b class='flag-5'>STM32</b><b class='flag-5'>開發板</b>實現<b class='flag-5'>俄羅斯方塊</b><b class='flag-5'>游戲</b>的工程文件和源代碼免費下載

    基于51單片機的俄羅斯方塊游戲

    俄羅斯方塊游戲算法 請參考俄羅斯方塊游戲的算法1.概述俄羅斯方塊是一款風靡全球的益智游戲。它規
    發表于 11-13 10:21 ?57次下載
    基于51單片機的<b class='flag-5'>俄羅斯方塊</b><b class='flag-5'>游戲</b>

    RT-Badge V2.0制作俄羅斯方塊小游戲

    在看到 ART-Badge V2.0 支持了 2048 小游戲之后,萌生了制作一個 俄羅斯方塊小游戲,畢竟是童年的經典。
    的頭像 發表于 01-27 18:57 ?2222次閱讀
    RT-Badge V2.0<b class='flag-5'>制作</b><b class='flag-5'>俄羅斯方塊</b><b class='flag-5'>小游戲</b>

    FPGA實現的“俄羅斯方塊游戲系統設計

    本項目主要在FPGA上實現了一個經典小游戲俄羅斯方塊”。本項目基本解決方案是,使用Xilinx Zynq系列開發板 ZedBoard 作為平臺,實現主控模塊,通過VGA接口來控制屏幕進行顯示。
    發表于 03-28 10:41 ?1971次閱讀
    FPGA實現的“<b class='flag-5'>俄羅斯方塊</b>”<b class='flag-5'>游戲</b>系統設計
    主站蜘蛛池模板: 免费久久狼人香蕉网| 高h gl肉文| 1区2区3区4区产品不卡码网站| 亚洲娇小性色xxxx| 亚洲国产韩国欧美在线不卡| 无人区在线日本高清免费| 使劲别停好大好深好爽动态图| 秋霞最新高清无码鲁丝片| 热中文热国产热综合| 青娱乐极品视觉盛宴国产视频| 欧美视频 亚洲视频| 欧美特级特黄AAAAA片| 欧美日韩无套内射另类| 免费a毛片| 泡妞高手在都市免费观看| 人妻体内射精一区二区| 搡女人免费免费视频观看| 受被攻做到腿发颤高h文| 天天射天天爱天天干| 午夜理论片YY4399影院| 亚洲国产精品无码中文字满| 亚洲精品色婷婷在线蜜芽| 伊人久久大香线蕉综合电影网| 中文字幕人妻无码系列第三区| 2018年免费三级av观看| a级销魂美女| 成人永久免费视频| 国产人妻人伦精品A区| 黑色丝袜美女被网站| 久久99精品视频| 免费在线观看的毛片| 日本双渗透| 亚洲白色白色在线播放| 在线观看中文| 哺乳期妇女挤奶水36d| 国产精品一区二区免费| 九九热这里只有国产精品| 美女内射少妇三区五区| 日韩无码在线| 亚洲精品久久无码AV片WWW| 8090碰成年女人免费碰碰尤物|