久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
基于stm32的12864俄羅斯方塊程序
[打印本頁]
作者:
未完待續
時間:
2018-11-29 21:08
標題:
基于stm32的12864俄羅斯方塊程序
基礎功能已經實現
單片機源程序如下:
#include "Game.h"
#include "LCD12864.h"
#include "delay.h"
u8 Key_value=0; //按鍵值
u32 random_value=1; //隨機數產生填充值
u8 Score=0; //分數寄存變量 每消除一格 便分數加1
u8 Level=1; //等級寄存器
u8 SysFlag=0; //系統標志;
u8 DelayCnt=5; //時間變量
#define NEWSIGNFLAG 0 //產生新得積木標志
#define DEADFLAG 1 //全局標志
#define PAUSEFLAG 2 //暫停標志
#define PASSSCORE 20 //完成當前局 就是20行 得分為20 等級加1
//按鍵定義
#define RESEVER 1 //復位
#define CHANGE 2 //換方向
#define DOWN 3 //向下
#define LEFT 4 //向左
#define RIGHT 5 //向右
#define PAUSE 6 //暫停 開始
//定義共21行,其中num[0]為下墻壁行,num[20]為上墻壁行,每行12格,最左一格為左墻壁列,最右一格為右墻壁列
u16 num[19+2]={
0xfff,//第1行,最下面
0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,
0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,//第2行到第20行共19行
0xfff//第21行,最上面
};
//二維數組 用來存放積木塊;
u8 Block[28][2]={
/*
* 口 口口口 口口
* 口 口 口 口
* 口口 口 口口口
*/
{0x88,0xc0},{0xe8,0x00},{0x62,0x20},{0x02,0xe0},
/*
* 口 口口 口口口
* 口 口 口 口
* 口口 口口口 口
*/
{0x22,0x60},{0x08,0xe0},{0xc8,0x80},{0xe2,0x00},
/*
* 口
* 口口 口口
* 口 口口
*/
{0x8c,0x40},{0x6c,0x00},{0x8c,0x40},{0x6c,0x00},
/*
* 口 口口
* 口口 口口
* 口
*/
{0x4c,0x80},{0xc6,0x00},{0x4c,0x80},{0xc6,0x00},
/*
* 口 口
* 口 口口 口口口 口口
* 口口口 口 口 口
*/
{0x04,0xe0},{0x8c,0x80},{0xe4,0x00},{0x26,0x20},
/*口
* 口
* 口 口口口口
* 口
*/
{0x44,0x44},{0x0f,0x00},{0x44,0x44},{0x0f,0x00},
/*
* 口口
* 口口
*/
{0x06,0x60},{0x06,0x60},{0x06,0x60},{0x06,0x60}
};
//積木結構體
struct Jimu
{
u16 dat;
char x;
u8 y;
u8 type;
u8 change;
}Sign[3];
//隨機數生成 這里用來隨機生成積木塊;
static u32 Seed = 1;
#define A 48271L
#define M 2147483647L
#define Q (M / A)
#define R (M % A)
/************************************
偽隨機數發生器
*************************************/
double Random(void)
{
long TmpSeed;
TmpSeed=A*(Seed%Q)-R*(Seed/Q);
if(TmpSeed>=0)
Seed=TmpSeed;
else
Seed=TmpSeed+M;
return (double)Seed/M;
}
/**************************************
為偽隨機數發生器播種
***************************************/
void InitRandom(u32 InitVal)
{
Seed=InitVal;
}
void DrawBoard(void) //畫墻壁,就是指在屏幕上畫一個框框和初始化界面顯示文字
{
unsigned char n;
for(n=0;n<12;n++)
{
LCD12864_Rectangle(3*n,0,3*n+2,2,1);
LCD12864_Rectangle(3*n,60,3*n+2,62,1);
}
for(n=0;n<20;n++)
{
LCD12864_Rectangle(0,3*n,2,3*n+2,1);
LCD12864_Rectangle(33,3*n,35,3*n+2,1);
}
LCD12864_String(3,0," ");
LCD12864_String(3,1,"設計:呂鈺");
LCD12864_String(3,2,"得分:0");
LCD12864_String(3,3,"等級:0");
}
//根據積木圖標左下坐標X,Y來畫出積木圖標
u16 MaskTab[16]={
0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,
0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000
};
void DrawSign(struct Jimu Temp,unsigned char DrawMode)
{
unsigned char m,n;
for(m=0;m<4;m++)
for(n=0;n<4;n++)
{
if((Temp.dat&MaskTab[4*m+n])!=0)
LCD12864_Rectangle(Temp.x+n*3,Temp.y-2-3*m,Temp.x+n*3+2,Temp.y-3*m,DrawMode);
}
}
//隨機產生一個積木圖標放到預產生區域并顯示出來
void CreatSign(void)
{
u8 n;
u16 Temp;
DrawSign(Sign[2],0);//先清除
n=Random()*28;
Temp=(u16)Block[n][0]<<8;
Temp=Temp|Block[n][1];
Sign[2].dat=Temp;
Sign[2].x=45;
Sign[2].y=4*3+2;
Sign[2].type=n/4;
Sign[2].change=n%4;
DrawSign(Sign[2],1);//后畫出
}
void FixSign(void) //將積木圖標值融入num數據中 也即把積木圖標固定,無法再下降
{
unsigned char m,n;
for(m=0;m<4;m++)//行循環
for(n=0;n<4;n++)//列循環
{
if((Sign[0].dat&MaskTab[4*m+n])!=0)
{
num[20-(Sign[0].y-2)/3+m]|=MaskTab[11-Sign[0].x/3-n];
}
}
}
u8 CheckIf(void) //判斷積木圖標中方塊是否與障礙方塊重合
{
unsigned char m,n;
for(m=0;m<4;m++)//行循環
for(n=0;n<4;n++)//列循環
{
if((Sign[1].dat&MaskTab[4*m+n])!=0)
{
if((num[20-(Sign[1].y-2)/3+m]&MaskTab[11-Sign[1].x/3-n])!=0)
return 0;
}
}
return 1;
}
u8 CheckIfDown(void) //判斷積木圖標是否可以繼續下降一格
{
Sign[1]=Sign[0];//
Sign[1].y+=3;//假設下降一格
return CheckIf();
}
u8 CheckIfLeft(void) //判斷積木圖標是否可以向左移動
{
Sign[1]=Sign[0];
Sign[1].x-=3;//假設左移一格
return CheckIf(); //返回檢測重合函數
}
u8 CheckIfRight(void) //判斷積木圖標是否可以向右移動
{
Sign[1]=Sign[0];
Sign[1].x+=3;//假設右移一格
return CheckIf();
}
u8 CheckIfRoll(void) //判斷是否可以旋轉
{
unsigned char i;
unsigned int Temp;
Sign[1]=Sign[0];
if(++Sign[1].change>3)
Sign[1].change=0;
i=Sign[1].type*4+Sign[1].change;
Temp=(unsigned int)Block[i][0]<<8;
Temp=Temp|Block[i][1];
Sign[1].dat=Temp;
return CheckIf();
}
void DelFull(void) //尋找滿格的行并做消除處理,最多尋找4個滿行并做消除
{
u8 m,n;
u8 Temp;
u8 Flag=0;
Temp=(Sign[0].y-2)/3;
if(Temp>=20)//防止越過了下邊界
Temp=1;
else
Temp=20-Temp;
for(n=Temp+3;n>=Temp;n--)//積木圖標的最頂行開始尋找滿行比較有利于運算
{
if(num[n]==0xfff)
{
Flag=1;
for(m=n+1;m<=19;m++)
{
num[m-1]=num[m];
}
num[m]=0x801;
Score++;//每找到一個滿行,則分數加1
}
}
if(Flag)//為加速而設置并判斷的標志,有已固定的積木有滿格消行變化則重畫積木界面
{
for(m=Temp;m<=19;m++)//為加速,不必要重第一行重畫起,只需要從積木圖標最下行開始往上的重畫
for(n=1;n<=10;n++)
{
if((num[m]&MaskTab[n])==0)
{
if(LCD12864_Readpoint(30-(n-1)*3,57-(m-1)*3)!=0)//為加速而做的讀象素操作
{
LCD12864_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,0);
}
}
else
{
if(LCD12864_Readpoint(30-(n-1)*3,57-(m-1)*3)==0)//為加速而做的讀象素操作
{
LCD12864_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,1);
}
}
}
}
}
void PrintScore(void) //分數顯示輸出
{
unsigned char Str[3]; //定義了一個局部數組
Str[0]=(Score/10)|0x30; //分數得十位
Str[1]=(Score%10)|0x30; //分數得個位
Str[2]=0;
LCD12864_String(6,2,Str); //在指定位置輸出分數
}
void PrintLevel(void) //等級顯示輸出
{
unsigned char Str[3]; //定義了一個局部數組
Str[0]=(Level/10)|0x30;
Str[1]=(Level%10)|0x30;
Str[2]=0;
LCD12864_String(6,3,Str);
}
void GamePlay(void) //玩游戲流程
{
unsigned char m,n;
unsigned int Temp;
SysFlag|=1<<NEWSIGNFLAG;//剛開始初始化為需要產生新的積木圖標
InitRandom(random_value); //偽隨機數發生器播種
LCD12864_String(3,1," ");
LCD12864_String(3,1,"開始");
PrintScore();
PrintLevel();
CreatSign(); //隨機顯示一個方塊到預覽區
while(1)
{
if((SysFlag&(1<<NEWSIGNFLAG))==1)//判是否需要產生新的積木圖標
{
SysFlag&=~(1<<NEWSIGNFLAG);
Sign[0]=Sign[2];
CreatSign();
Sign[0].x=12;
Sign[0].y=14;
for(m=0;m<4;m++)//行循環
{
for(n=0;n<4;n++)//列循環
{
if((Sign[0].dat&MaskTab[15-m*4-n])==0)
break;
}
if(n==4)
Sign[0].y-=3;
}//將積木圖標出現置頂
for(m=0;m<4;m++)//行循環
for(n=0;n<4;n++)//列循環
{
if((Sign[0].dat&MaskTab[4*m+n])!=0)
{
if((num[20-(Sign[0].y-2)/3+m]&MaskTab[11-Sign[0].x/3-n])!=0)
SysFlag|=1<<DEADFLAG;
}
}
if((SysFlag&(1<<DEADFLAG))!=0)
break;//如果產生新的積木圖標中的方塊與已固定好的方塊重合,則死亡。游戲結束
DrawSign(Sign[0],1);
}
switch(Key_value)
{
case LEFT:
Key_value=0;
if((SysFlag&(1<<PAUSEFLAG))==0)
{
if(CheckIfLeft())
{
DrawSign(Sign[0],0);
Sign[0].x-=3;
DrawSign(Sign[0],1);
}
}
else
{
if(++Level>=4)
Level=1;
PrintLevel();
}
break;
case RIGHT:
Key_value=0;
if((SysFlag&(1<<PAUSEFLAG))==0)
{
if(CheckIfRight())
{
DrawSign(Sign[0],0);
Sign[0].x+=3;
DrawSign(Sign[0],1);
}
}
else
{
if(++Level>=4)
Level=1;
PrintLevel();
}
break;
case DOWN:
Key_value=0;
if((SysFlag&(1<<PAUSEFLAG))==0)
{
if(CheckIfDown())//判斷是否能繼續下降一格
{
DrawSign(Sign[0],0);
Sign[0].y+=3;
DrawSign(Sign[0],1);
}
}
break;
case CHANGE:
Key_value=0;
if((SysFlag&(1<<PAUSEFLAG))==0)
{
if(CheckIfRoll())
{
DrawSign(Sign[0],0);
if(++Sign[0].change>3)
Sign[0].change=0;
m=Sign[0].type*4+Sign[0].change;
Temp=(unsigned int)Block[m][0]<<8;
Temp=Temp|Block[m][1];
Sign[0].dat=Temp;
DrawSign(Sign[0],1);
}
}
break;
case PAUSE:
Key_value=0;
SysFlag^=1<<PAUSEFLAG;
if((SysFlag&(1<<PAUSEFLAG))==0)
{
LCD12864_String(3,1," "); //在顯示“開始”之前將改區域得顯示清除
LCD12864_String(3,1,"開始");
}
else
{
LCD12864_String(3,1," ");//在顯示“暫停”之前將改區域得顯示清除
LCD12864_String(3,1,"暫停");
}
break;
default:
break;
}
if((SysFlag&(1<<PAUSEFLAG))!=0)
continue;
delay_ms(50);
if(++DelayCnt>=2*(11-Level))
{
DelayCnt=0;
if(CheckIfDown())//判斷是否能繼續下降一格
{
DrawSign(Sign[0],0);
Sign[0].y+=3;
DrawSign(Sign[0],1);
}
else
{
FixSign();
DelFull();
PrintScore();
if(Score>=PASSSCORE)
{
SysFlag&=~(1<<DEADFLAG);
break;//跳出玩游戲過程
}
SysFlag|=1<<NEWSIGNFLAG;//新的積木圖標產生標志置1
}
}
}
}
void GameOver(void) //游戲結束處理
{
if((SysFlag&(1<<DEADFLAG))!=0)
{
LCD12864_Init(); //初始化LCD屏
LCD12864_String(1,2,"失敗");
}
else
{
LCD12864_Init(); //初始化LCD屏
LCD12864_String(1,2,"恭喜");
}
}
復制代碼
所有資料51hei提供下載:
俄羅斯方塊.rar
(310.57 KB, 下載次數: 68)
2018-12-1 02:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時間:
2018-12-1 02:04
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
作者:
單片機小渣渣1
時間:
2018-12-7 13:33
這個用kill怎么看 沒學過stm32 不怎么會用
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产激情自拍视频
|
日韩成人
|
欧美三级电影在线播放
|
特级黄一级播放
|
精品美女视频在线观看免费软件
|
亚洲精品综合
|
91看片在线观看
|
国产偷久久一级精品60部
|
一本色道精品久久一区二区三区
|
免费一区
|
亚洲一级黄色
|
国产在线一区观看
|
国产精品久久久久久久久久久久
|
国产高清精品一区二区三区
|
日本黄色大片免费看
|
亚洲第一视频网
|
日韩一区二区福利
|
日本高清aⅴ毛片免费
|
精品综合网
|
91网站视频在线观看
|
精一区二区
|
黄色片免费在线观看
|
免费看91
|
中文字幕一级
|
日韩在线免费播放
|
日韩国产在线
|
97色综合
|
欧美成人一区二区
|
视频一区二区在线观看
|
国产精品福利视频
|
国产98色在线 | 日韩
|
成年女人免费v片
|
国产精品海角社区在线观看
|
日日夜夜免费精品视频
|
亚洲国产黄色av
|
国产成人精品一区二区三区在线观看
|
亚洲午夜精品
|
www.一级片
|
亚洲电影一区二区三区
|
天天拍天天操
|
www亚洲精品
|