采用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);

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

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>