#include "reg51.h"
#include "12864.h"
#define uchar unsigned char
#define uint unsigned int
static unsigned long Seed = 1; //静态
#define A 48271L
#define M 2147483647L
#define Q (M / A)
#define R (M % A)
sbit K1=P1^2;
sbit K2=P1^4;
sbit K3=P1^3;
sbit K4=P1^5;
sbit K5=P1^6;
sbit K6=P1^7;
sbit SPE=P3^7;
unsigned char youxiflag=0;
unsigned int idata 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行,最上面
};//定义共21行,其中num[0]为下墙壁行,num[20]为上墙壁行,每行12格,最左一格为左墙壁列,最右一格为右墙壁列
unsigned char code 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}
};
#define PASSSCORE 20
struct Jimu
{
unsigned int dat;
char x;
unsigned char y;
unsigned char type;
unsigned char change;
}Sign[3];//积木结构体
unsigned char SysFlag=0;
#define NEWSIGNFLAG 0
#define DEADFLAG 1 //结束标志
#define PAUSEFLAG 2//暂停标志
unsigned char Score=0;
unsigned char Level=1;
unsigned char DelayCnt=5;
/*********************************************************/
#define N 25
/***************************************蜂鸣器************/
/************************************
伪随机数发生器
*************************************/
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(unsigned long InitVal)
{
Seed=InitVal;
}
//延时子程序
void Delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
/****************************
welcome 游戏选择界面
/**********************/
void welcome()
{
// Lcd_WriteStr(1,0,"创新实验室");
Lcd_WriteStr(1,1,"☆欢迎您☆");
Lcd_WriteStr(1,2,"◆07级电信◆");
Lcd_WriteStr(1,3,"★向利平★");
}
/*************俄罗斯方块部分
/******************************
画墙壁,初始化界面
*******************************/
void DrawBoard(void)
{
unsigned char n;
for(n=0;n<12;n++)
{
Lcd_Rectangle(3*n,0,3*n+2,2,1);
Lcd_Rectangle(3*n,60,3*n+2,62,1);
}
for(n=0;n<20;n++)
{
Lcd_Rectangle(0,3*n,2,3*n+2,1);
Lcd_Rectangle(33,3*n,35,3*n+2,1);
}
Lcd_WriteStr(4,0,"经典游戏");
Lcd_WriteStr(3,2,"Score:");
Lcd_WriteStr(3,3,"Level:");
}
/***********************************
游戏结束处理
************************************/
void GameOver(void)
{
if((SysFlag&(1<<DEADFLAG))!=0)
Lcd_WriteStr(3,1,"You Fail");
else
Lcd_WriteStr(3,1,"You Pass");
}
unsigned int code MaskTab[16]={
0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,
0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000
};
/**********************************
根据积木图标左下坐标X,Y来画出积木图标
***********************************/
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)
Lcd_Rectangle(Temp.x+n*3,Temp.y-2-3*m,Temp.x+n*3+2,Temp.y-3*m,DrawMode);
}
}
/********************************
将积木图标值融入num数据中
也即把积木图标固定,无法再下降
*********************************/
FixSign(void)
{
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];
}
}
}
/********************************
判断积木图标中方块是否与障碍方块重合
*********************************/
unsigned char 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;
}
/********************************
判断积木图标是否可以继续下降一格
********************************/
unsigned char CheckIfDown(void)
{
Sign[1]=Sign[0];//
Sign[1].y+=3;//假设下降一格
return CheckIf();
}
/********************************
判断积木图标是否可以向左移动
*********************************/
unsigned char CheckIfLeft(void)
{
Sign[1]=Sign[0];
Sign[1].x-=3;
return CheckIf();
}
/********************************
判断积木图标是否可以向右移动
*********************************/
unsigned char CheckIfRight(void)
{
Sign[1]=Sign[0];
Sign[1].x+=3;
return CheckIf();
}
/********************************
判断是否可以旋转
*********************************/
unsigned char 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();
}
/********************************
寻找满格的行并做消除处理
最多寻找4个满行并做消除
*********************************/
void DelFull(void)
{
unsigned char m,n;
unsigned char Temp;
unsigned char 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(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)!=0)//为加速而做的读象素操作
{
Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,0);
}
}
else
{
if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)==0)//为加速而做的读象素操作
{
Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,1);
}
}
}
}
}
/*******************************
随机产生一个积木图标放到预产生区域并显示出来
********************************/
void CreatSign(void)
{
unsigned char n;
unsigned int Temp;
DrawSign(Sign[2],0);//先清除
n=Random()*28;
Temp=(unsigned int)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 PrintScore(void)
{
unsigned char Str[3];
Str[0]=(Score/10)|0x30;
Str[1]=(Score%10)|0x30;
Str[2]=0;
Lcd_WriteStr(6,2,Str);
}
void PrintLevel(void)
{
unsigned char Str[3];
Str[0]=(Level/10)|0x30;
Str[1]=(Level%10)|0x30;
Str[2]=0;
Lcd_WriteStr(6,3,Str);
}
/********************************
游戏的具体过程,也是俄罗斯方块算法的关键部分
*********************************/
void GamePlay(void)
{
unsigned char m,n;
unsigned int Temp;
SysFlag|=1<<NEWSIGNFLAG;//刚开始初始化为需要产生新的积木图标
InitRandom(TL0);
Lcd_WriteStr(3,1,"Playing");
PrintScore();
PrintLevel();
CreatSign();
while(1)
{
i
没有合适的资源?快使用搜索试试~ 我知道了~
基于89C51俄罗斯方块游戏的设计的源程序
共28个文件
bak:6个
lst:3个
plg:2个
需积分: 9 10 下载量 31 浏览量
2010-12-28
11:49:45
上传
评论
收藏 82KB ZIP 举报
温馨提示
#include<intrins.h> #define LcdData P0 sbit RS=P2^7; //并行的指令/数据选择信号, H数据, L命令 sbit RW=P2^6; //并行读写选择信号, H读, L写 sbit E=P2^5; //并行使能端, H有效, L无效 //sbit PSB=P2^3; //并/串接口选择, H并,L串 //sbit RET=P2^4; //复位, L有效
资源推荐
资源详情
资源评论
收起资源包目录
俄罗斯方块程序.zip (28个子文件)
俄罗斯方块程序
STARTUP.LST 14KB
俄罗斯方块程序.M51 41KB
俄罗斯方块_Opt.Bak 1KB
俄罗斯方块.plg 1KB
俄罗斯方块程序 31KB
俄罗斯方块.OBJ 37KB
俄罗斯方块.Opt 1KB
STARTUP.A51 6KB
俄罗斯方块.c 10KB
俄罗斯方块程序.hex 13KB
俄罗斯方块程序.Uv2.bak 2KB
俄罗斯方块程序.plg 188B
俄罗斯方块.hex 13KB
俄罗斯方块程序.opt.bak 2KB
俄罗斯方块程序.OBJ 315B
俄罗斯方块程序.lnp 76B
俄罗斯方块.LST 24KB
俄罗斯方块程序_Uv2.Bak 0B
俄罗斯方块程序_Opt.Bak 1KB
俄罗斯方块.Uv2 2KB
俄罗斯方块程序.uvproj 13KB
俄罗斯方块程序.c 0B
俄罗斯方块_Uv2.Bak 2KB
俄罗斯方块.M51 41KB
俄罗斯方块程序.uvopt 56KB
12864.h 6KB
俄罗斯方块程序.LST 741B
俄罗斯方块.lnp 78B
共 28 条
- 1
资源评论
pingaidie314
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功