采用STM32开发板制作俄罗斯方块小游戏

发布时间: 2024-06-06
来源: 电子工程世界

《俄罗斯方块》(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);

文章来源于: 电子工程世界 原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。