《俄罗斯方块》(Tetris, 俄文:Тетрис)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。
该游戏曾经被多家公司代理过。经过多轮诉讼后,该游戏的代理权最终被任天堂获得。 [1] 任天堂对于俄罗斯方块来说意义重大,因为将它与GB搭配在一起后,获得了巨大的成功。
《俄罗斯方块》的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
1.硬件平台
STM32开发板
3.5寸LCD屏(16位并口8080时序)
字库存储W25Q64(SPI)
4个按键
2.方块示例
本设计中方块种类共5种,根据方向的不同可分为19种可能性。

3.游戏效果图
1.游戏结束效果。当方块堆叠触碰到上顶端,则游戏结束。

2.正常游戏和方块颜色分配,下一个方块提示,积分统计,按键操作说明。

3.消行效果展示,得分获取。
软件设计中,消除一行得1分,消除两行得2分,消除3行得4分,消除4行得8分。

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 +关注
关注
2091文章
8467浏览量
339665 -
游戏 +关注
关注
2文章
662浏览量
25518 -
开发板 +关注
关注
19文章
2663浏览量
89349
发布评论请先 登录
相关推荐
怎样去设计一个基于stm32的俄罗斯方块游戏机
实现驱动整个LCD显示的东西(包括文字,每一个俄罗斯方块,还有图片)下面是驱动程序GUI.c#include &quot;stm32f10x.h&quot;#include &quot;Lcd_Driver
发表于 01-25 06:18
如何采用51单片机来实现的智能俄罗斯方块游戏
俄罗斯方块是一款风靡全球的益智游戏。它规则简单,容易上手,且游戏过程变化无穷,使用户在游戏中得到乐趣。本设计是采用51单片机来实现的智能俄罗斯方块游戏。重点从软件工程角度论述了俄罗斯方块模型构造
发表于 01-19 06:44
51单片机控制matlab写的俄罗斯方块
51单片机控制matlab写的俄罗斯方块将单片机的程序下载好之后,取消串口的占用(可直接插拔一下),然后运行matlab的俄罗斯方块程序即可开始控制。亲测有效。单片机主程序#include
发表于 01-06 06:07
OpenHarmony开发板运行俄罗斯方块游戏
本案例展示在OpenHarmony开发板上运行俄罗斯方块游戏, 通过12864液晶屏进行显示. 项目底层通过OpenHarmony的HDF框架来驱动, 并基于linkboy图形引擎编程框架完成游戏显示.
发表于 12-03 17:27
采用单片机来实现的智能俄罗斯方块游戏
俄罗斯方块游戏算法请参考俄罗斯方块游戏的算法1.概述俄罗斯方块是一款风靡全球的益智游戏。它规则简单,容易上手,且游戏过程变化无穷,使用户在游戏中得到乐趣。 本设计是采用单片机来实现的智能俄罗斯方块
发表于 11-19 08:26
51单片机游戏(俄罗斯方块)
51单片机游戏(俄罗斯方块)一、电路设计此电路由AT89C51最小系统、12864显示模块和独立按键组成。可实现类似俄罗斯方块的游戏。二、运行效果三、部分代码#include <
发表于 11-16 16:36
•4次下载

基于51单片机的俄罗斯方块游戏
俄罗斯方块游戏算法 请参考俄罗斯方块游戏的算法1.概述俄罗斯方块是一款风靡全球的益智游戏。它规则简单,容易上手,且游戏过程变化无穷,使用户在游戏中得到乐趣。 本设计是采用单片机来实现的智能
发表于 11-13 10:21
•39次下载

怎样去设计基于51单片机的俄罗斯方块游戏电路
本设计是通过AT89S52单片机来实现俄罗斯方块游戏的设计,使用C语言进行编程,并通过Proteus来进行仿真。本设计要实现的基本功能是:应用按键来控制方块的变换与移动;消除一行并计分;消除多行额外
发表于 11-09 07:17
基于51单片机俄罗斯方块游戏电路设计
本设计是通过AT89S52单片机来实现俄罗斯方块游戏的设计,使用C语言进行编程,并通过Proteus来进行仿真。本设计要实现的基本功能是:应用按键来控制方块的变换与移动;消除一行并计分;消除多行额外
发表于 11-04 17:06
•20次下载

基于labview开发的10个小游戏(贪吃蛇、俄罗斯方块、五子棋、象棋、2048、推箱子等)
1.倒水游戏2.过河游戏3.计算器4.俄罗斯方块5.贪吃蛇6.五子棋7.象棋8.拼图游戏9.204810.推箱子
发表于 09-15 08:52
基于51单片机的俄罗斯方块游戏的设计与制作 相关资料下载
《单片机实践项目》《电子DIY》基于51单片机的俄罗斯方块游戏的设计与制作(LCD12864带中文字库的显示屏)...
发表于 07-01 06:48
俄罗斯方块出现错误
`下载了一个labview编程的俄罗斯方块,用2018版本打开的,出现一项错误运行不了,不知道怎么改,错误显示我都照下来了,不知道怎么找作者问,希望大神帮忙看看?`
发表于 03-27 13:19
使用STM32单片机实现俄罗斯方块设计的资料合集
基于STM32的俄罗斯方块设计,包含源程序、原理图、PCB文件使用STM32单片机实现俄罗斯方块设计的资料合集。
发表于 01-18 08:00
•12次下载
南向设备:HI3861开发版研修实现俄罗斯方块游戏
本功能实现参考与引用Hallym6公开的代码,实现了俄罗斯方块在OLED 屏幕上的操作,可以通过s1和s2这两个自定义按键来控制俄罗斯方块的移动。
发表于 12-16 18:28
俄罗斯方块源代码【代码现在有问题,请勿下载】
本帖最后由 LL54286 于 2020-8-18 15:30 编辑
labview俄罗斯方块小游戏源代码~【代码现在有问题,请勿下载】
发表于 08-17 11:47
使用STM32单片机实现俄罗斯方块游戏的工程和hex文件免费下载
本文档的主要内容详细介绍的是使用STM32单片机实现俄罗斯方块游戏的工程和hex文件免费下载。
发表于 12-16 08:00
•8次下载

使用STM32开发板实现俄罗斯方块游戏的工程文件和源代码免费下载
本文档的主要主要内容详细介绍的是使用STM32单片机开发板实现俄罗斯方块游戏的工程文件和源代码免费下载
发表于 12-02 08:00
•18次下载

使用单片机制作万用板俄罗斯方块的资料合集免费下载
本文档的主要内容详细介绍的是使用单片机制作万用板俄罗斯方块的资料合集免费下载b包括了:程序,器件引脚等资料,PCB板版本俄罗斯方块,PCB版本电路图,俄罗斯方块布线截图,万用板板版本俄罗斯方块,万用板电路图,万用板
发表于 07-04 16:58
•30次下载

使用STM32系列单片机设计的俄罗斯方块游戏的程序免费下载
本文档的主要内容详细介绍的是使用STM32系列单片机设计的俄罗斯方块游戏的程序免费下载。可以使用STM32F系列通过该例程程序通过TFT屏幕显示俄罗斯方块游戏
发表于 05-13 08:00
•24次下载

如何让AI教机器自己玩俄罗斯方块?
这里对 AI 俄罗斯方块的形态做一下特别说明,各个方块都是根据中心点的坐标来生成的,以(0,0)为中心点,在 x、y 轴加减 1 则是其他方格的坐标,这样的好处就是只要确定中心点坐标,其他的方格位置就能随即生成。
索尼以《俄罗斯方块:效应》的形式首次发布了与VR相关的合作
《俄罗斯方块》是由Enhance Games开发的,《breakout Infinite & Lumines》背后的团队。官方发布的声明中写道:《俄罗斯方块:效应》有30多个阶段,从海底深处
通过AT89S52单片机来实现俄罗斯方块游戏的设计详细中文概述
本设计是通过AT89S52单片机来实现俄罗斯方块游戏的设计,使用C语言进行编程,并通过Proteus来进行仿真。
发表于 06-07 08:00
•7次下载

带AI的俄罗斯方块
本帖最后由 shi_dongyu 于 2017-2-11 08:05 编辑
这周花了几天时间研究了下俄罗斯方块,并写了一个带AI的俄罗斯方块游戏。我想这个游戏对每个人都很熟悉,很多编程爱好者也
发表于 02-10 20:08
TM4C123GH6PM编写俄罗斯方块程序,随机产生方块部分如何解决?
用TM4C123GH6PM的ARM编写俄罗斯方块游戏,方块的类型和下落消除部分都解决了,但是现在不知道如何让方块随机产生,不知道这个开发板的程序编写里有没有随机产生的功能?或者说大家会怎样解决随机
发表于 12-23 23:21
虚拟串口控制的俄罗斯方块游戏仿真及源码
转一个工程给大家共享一个好东东,使用51单片机实现的俄罗斯方块游戏, 能虚拟串口控制,实用性还是比较高的,下面是仿真原理图,大家可以下载附件后直接用proteus打开
发表于 11-02 11:27
俄罗斯方块游戏设计原理
俄罗斯方块游戏是VHDL 应用于复杂数字系统的一个经典设计,本章将详细介绍该游戏的设计原理和设计方法。其中包括系统构成、系统设计原理和系统各个模块的实现方法。
发表于 09-01 17:24
•47次下载
基于单片机实现的俄罗斯方块
《俄罗斯方块》(Tetris, 俄文:Тетрис)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。用单片机实现。
发表于 06-17 16:16
•1次下载
俄罗斯方块
俄罗斯方块........................................................................................
发表于 03-13 23:08
基于LabVIEW小游戏11款合集
/jishu_215246_1_1.html11、基于labview的俄罗斯方块小游戏 https://bbs.elecfans.com/jishu_218962_1_1.html
发表于 12-10 15:16
LabVIEW俄罗斯方块分解(三):欢迎大家提意见!【每日一练11.26】
俄罗斯方块游戏有关介绍请戳链接https://bbs.elecfans.com/jishu_459327_1_1.html今天要实现的功能是:1.前两天的完成;2.方块落下后可以停在底部3.新块可以
发表于 11-25 21:38
LabVIEW做俄罗斯方块游戏分解(一):随机产生俄罗斯方块所需方块【每日一练11.24】
俄罗斯方块游戏有关介绍请戳链接https://bbs.elecfans.com/jishu_459327_1_1.html题目要求:随机产生俄罗斯方块所需方块(自己百度一下是哪几种),在一个15
发表于 11-23 21:31
用labview的VI范例中的游戏:俄罗斯方块【每日一练第三周(11.24—11.28)】
这周我们来看看VI范例中的游戏:俄罗斯方块,看看VI工程师们的编程风格,今后每天9.30准时为大家献上每日一练的题目,希望大家可以按时关注,另外,有坛友提议建QQ群,我跟管理员反映了一下,看看如果她
发表于 11-23 21:25
汇编语言的结构化设计及其在俄罗斯方块中的应用
为了简化汇编语言的编写过程,本文提出了一种结构化的汇编编程思路,并以基于AT89C51芯片(以下对汇编语言的讨论针对51单片机系统)的俄罗斯方块游戏为例,来展现在51单片机中汇编语言结构化编写的优势。##俄罗斯方块的软件实现方法##实验测试与结果
发表于 06-23 10:27
•2370次阅读

小游戏终端
留有其他模块接口),可以投入市场中,供51单片机学习者使用。并且与其他开发板所能做的项目实战不同,不在是实时时钟这种枯燥无味的东西,而是贪食蛇、俄罗斯方块等小游戏终端,在学习知识的同时还可以回味经典,寓教于乐。
发表于 11-10 16:09
Protues大屏幕液晶仿真俄罗斯方块
发一个protues仿真实例,大屏幕液晶仿真俄罗斯方块,可以设置速度,难度,好东西不敢独享,现上传给大家共同学习!忘了声明下,非本人原创作品,网上看到的
发表于 12-18 09:54
/*基于MSP430F5529俄罗斯方块游戏程序*/
/*基于MSP430F5529俄罗斯方块游戏程序*///作者:詹磊//功能:基于MSP430F5529俄罗斯方块游戏程序//说明:运行环境:TI官方MSP-EXP5529开发板(外接4个带上拉电阻
发表于 11-19 08:35
labview范例中的俄罗斯方块游戏
本帖最后由 eehome 于 2013-1-5 09:58 编辑
这个俄罗斯方块游戏来自范例.对于键盘的操作有指导性的意义.希望大家可以学习参考
发表于 05-21 11:25
论坛基于labview的小游戏合集(绝对精彩)
/jishu_206863_1_1.html 基于labview的国际象棋小程序https://bbs.elecfans.com/jishu_215246_1_1.html 基于labview的俄罗斯方块
发表于 03-01 15:29
俄罗斯方块游戏编程揭秘
`大家都玩过经典游戏俄罗斯方块,现在我通过51单片机基于迪文科技的串口液晶终端把游戏的制作过程和源代码分享给大家,希望能给大家提供帮助。1、先制作5张 需要的界面,这个通过Photoshop来处
发表于 01-27 13:35
俄罗斯方块——java源代码提供
俄罗斯方块——java源代码提供
import java.awt.*; import java.awt.event.*; //俄罗斯方块类 public class
发表于 02-10 14:00
•69次下载
俄罗斯方块源码(带烟花版)
俄罗斯方块源码(带烟花版)游戏简介经典游戏,俄罗斯方块,源码公布。我争取简化功能,使结构清晰、框架简单,代码更容易看懂。每打到300分,速度增加一级。同时消去两
发表于 08-02 09:55
•98次下载
俄罗斯方块单片机游戏源程序原理图和源程序代码
俄罗斯方块单片机游戏源程序原理图和源程序代码[hide][/hide][此贴子已经被作者于2009-4-17 23:43:05编辑过]
发表于 04-17 23:42
评论