单片机俄罗斯方块游戏设计大全(设计思路大全,程序大全)
- 格式:doc
- 大小:6.28 MB
- 文档页数:95
本科课程设计题目:基于单片机的8*8LED 俄罗斯方块设计姓名孙俊学号2008130346院(系)物理与信息科学学院电子系专业、年级电子信息科学与技术2008级指导教师刘美容二○一一年十月基于单片机的8x8 俄罗斯方块设计一、设计任务《俄罗斯方块》是一款世人皆知,看似简单实则变化无穷的小游戏。
本次设计以51单片机为基础,设计一款功能简单的8*8点阵俄罗斯方块游戏,我们将以汇编语言编程实现以下操作:图形的显示合成,通过按键控制图形的移动和旋转,满格消行,手动复位等。
本次设计俄罗斯方块功能简单,用单片机的最小系统就能得以实现。
而单片机的最小系统设计中实际上最重要的就是对键盘/显示器接口电路的设计,由于系统功能不同所以要求就不同,接口设计也就不同。
对一个键盘/显示器接口设计应从整个系统出发,综合考虑软、硬件特点。
其中,硬件设计包括初始的设计原理和原理图介绍,到最终的电路图实际焊接以及布局,软件设计我们会给出具体的设计方案,比如图形的显示合成,通过按键控制图形的移动和旋转,满格消行等的设计流程图,以及具体的汇编程序。
二、设计方案本次设计初期是在keil和proteus联合仿真中进行,编程语言为51汇编语言,后期是进行实物焊接。
本次我们采用单片机STC89C52控制模块提供电源,以点阵式LED 显示,采用独立按键,直接在I/O口线上接上按键开关。
因为设计时精简和优化了电路,所以剩余的口资源还比较多,我们使用四个按键,分别是旋转键,下键,左键,右键。
这种方案实现可行,既满足系统功能要求,又减少了系统实现的复杂度。
而由于STC89C52是一种带8K 字节闪烁可编程可檫除只读存储器的低电压,高性能COMOS8的微处理器,该器件采用ATMEL 搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
89C52内置8位中央处理单元、256字节内部数据存储器RAM 、8k 片内程序存储器(ROM )32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。
游戏机的制作:俄罗斯方块目录摘要 (1)1 方案论证……………………………………………………………………….1.1 开发意义…………………………………………………………………1.2 功能介绍………………………………………………………………….2 设计思路………………………………………………………………………….3 硬件电路………………………………………………………………………2.1 74HC573驱动芯片电路…………………………………………………….2.2 8*8LED点阵的接口电路…………………………………………………..2.3单片机最小系统电路………………………………………………………..2.4整体电路图………………………………………………………………….4 系统调试………………………………………………………………………..3.1硬件调试………………………………………………………………………3.2软件调试……………………………………………………………………..5 作品展示………………………………………………………………………….6 元器件清单……………………………………………………………………..7 结束语……………………………………………………………………………..致谢……………………………………………………………………………参考文献………………………………………………………………………….游戏机的制作:俄罗斯方块摘要:近年来随着计算机在社会领域的渗透, 单片机的应用正在不断地走向深入,应用到各个领域。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
我做的题目是一个用51单片机制作的游戏机,大致分位软件和硬件2大部分,硬件主要通过5按键、1个8*8LED点阵屏、一个单片机系统,实现积木的左、右、下、变化、复位五个模式,完全达到俄罗斯方块所实现的功能。
************说明******************************此程序包含一个俄罗斯方块.c 文件和一个12864.h 文件********************俄罗斯方块.c文件**************************#include "reg51.h"#include "12864.h"#define uchar unsigned char#define uint unsigned intstatic unsigned long Seed = 1;#define A 48271L#define M 2147483647L#define Q (M / A)#define R (M % A)sbit K1=P3^4;sbit K2=P3^5;sbit K3=P3^6;sbit K4=P3^7;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 20struct 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 2unsigned 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;elseSeed=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++);}/*********************************初始化MPU**********************************/void InitCpu(void){TMOD=0x0;TH0=0;TL0=0;TR0=1;ET0=1;EX1=1;EA=1;TCON|=0x04;}/**************************** welcome 游戏选择界面/**********************/void welcome(){Lcd_WriteStr(0,0,"欢迎来玩");Lcd_WriteStr(0,1,"俄罗斯方块");Lcd_WriteStr(0,2,"设置按K1");Lcd_WriteStr(0,2,"开玩按K2");}/*************俄罗斯方块部分/******************************画墙壁,初始化界面*******************************/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");elseLcd_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;elseTemp=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){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;//如果产生新的积木图标中的方块与已固定好的方块重合,则死亡。
基于51单片机的俄罗斯方块游戏代码实现主要包括以下几个方面:
1. 数据结构:使用数据结构来表示游戏中的各种元素,如方块、矩阵等。
2. 导航键控制:通过键盘扫描代码,获取用户输入的导航键(上下左右)信息,以便控制方块的移动。
3. 方块生成:随机生成新的方块,或者根据游戏规则生成特定的方块。
4. 方块移动:根据用户输入的导航键信息,移动当前方块的位置。
5. 方块旋转:根据用户输入的导航键信息,旋转当前方块的角度。
6. 碰撞检测:检测方块与游戏区域边界、其他方块之间的碰撞,以及方块自身的碰撞。
7. 游戏规则:实现游戏的基本规则,如方块消除、得分、游戏结束等。
8. 用户界面:显示游戏界面,包括方块、游戏区域边界、得分等信息。
9. 延时与中断:通过延时函数和中断函数,实现游戏的实时性,如方块自动下落、响应用户输入等。
10. 代码优化:对代码进行优化,提高游戏运行效率和用户体验。
总之,基于51单片机的俄罗斯方块游戏代码实现涉及到数据结构、键盘扫描、方块生成与移动、碰撞检测、游戏规则、用户界面、延时与中断等多个方面。
在2KB内存的单片机上实现的的俄罗斯方块一. 综述相对于五子棋,俄罗斯方块算法更是满天飞。
我的代码还是相对好移植的,看起来也更清晰,方便学弟学妹们做编程小学期时移植。
不过要做就要做的有特色:它运行在软硬件由我们独立开发的平台上。
以下是截图:有如下特点:∙跑在独立开发的平台上,平台为MSP430F149,内存2KB,频率8MHz∙支持体感:可以通过左右倾斜来左右移动方块,还可以上下抖动改变方块形状∙代码精简,方便移植∙内存占用率极低∙支持横屏和竖屏操作∙支持等级:用户在达到一定分数后,等级会上升,从而方块下落速度变得更快二. 系统设计我们将问题细化为以下几个方面:1. 方块的形状如何存储俄罗斯方块总共有19种形状,每种形状都由四个小方块组成。
如何高效存储这些方块的形状是个值得思考的问题。
上图介绍了存储方法:我们用以下数组保存形状:const unsigned char BoxShape[19][9]={{ 1,0,0,1,1,1,2,1,1 },{ 1,0,1,1,2,1,1,2,2 },{ 0,0,1,0,2,0,1,1,3 },{ 1,0,0,1,1,1,1,2,0 },{ 1,0,2,0,1,1,1,2,5 },{ 0,0,1,0,2,0,2,1,6 },{ 2,0,2,1,2,2,1,2,7 },{ 0,0,0,1,1,1,2,1,4 },{ 1,0,2,0,2,1,2,2,9 },{ 2,0,0,1,1,1,2,1,10 },{ 1,0,1,1,1,2,2,2,11 },{ 0,0,1,0,2,0,0,1,8 },{ 0,0,0,1,1,1,1,2,13 },{ 1,0,2,0,0,1,1,1,12 },{ 2,0,1,1,2,1,1,2,15 },{ 0,0,1,0,1,1,2,1,14 },{ 1,0,1,1,1,2,1,3,17 },{ 0,1,1,1,2,1,3,1,16 },{ 1,0,2,0,1,1,2,1,18 }};2. 如何解决各个方块的互相转换的顺序:以上的数组已经解决了这一问题,多维数组的最后一位即该形状发生改变后的下一个形状。
基于51单片机俄罗斯方块游戏设计作者:左厚臣前言闲得无事,想用单片机和LCD12864写一个俄罗斯方块游戏,培养培养兴趣,丰富一下业余生活,同时也熟练熟练单片机应用。
然后整理一下过程,本文没有什么专业的流程图,系统框图,随手画的。
希望各位大神勿喷,本菜鸟就献丑了。
关键字:51单片机LCD12864 俄罗斯方块游戏设计一、实物写真1、先展示一下实物效果呗,看能不能吸引到各位大神的眼球!!!!2、单片机选型IO口占用:7个程序存储器占用:6459Byte内部RAM:117.0Byte内部扩展RAM:1016ByteFosc = 24Mhz(也可选择12Mhz)中断使用状况:16位定时器溢出中断1个手头有一块STC12C5A60S2 51系列单片机,本实验也采用的此款单片机,或许有大神能用很节省资源的方法写出这款游戏,本菜鸟甘拜下风。
二、游戏算法整个游戏的算法也就是这样子的吧!下面就对每个步骤进说明吧!三、算法说明算法就捡重点的说吧,省得各位大神都闲啰嗦。
1、当前随机方块获取和下一回合游戏方块生成并显示此步骤拆解成如下流程图所示:(1)随机数生成51单片机需要调用库函数来产生随机数,如下:#include <stdlib.h>//调用库函数的头文件函数rand ()会生成一个int型的随机数,int型变量范围为-32768~32767占用2 字节。
我们使用时其实是可以把它当做一个unsigned int型变量的,取值范围0-65535 这个应该是很好理解的。
但是如果我们需要一个0-7的随机数怎么处理呢,没关系有办法,程序如下:u8 Random(u8 max){u16 temp;u8 a;max = max +1;temp=rand();//获取随机种子a = temp%max;return a;}其实也就是把得到随机数与想要得到数范围的最大数求余运算就可以了,即:a = temp%max;我们的游戏方块可以描述成2个要素:A、形状比如说形状有:■■■■■■■■■等,可用0-n来表示B、姿态比如说形状■■■姿态有4种如下:■■■■■■■■■■■■它们从左往右看可以看出规律分别旋转了0°,90°,180°,270°,也分别相对旋转了90°,可以用0-3来表示。
信息与电子工程学院题目:俄罗斯方块班级: 12应用电子技术3班材料包括仿真图、PCB、软件、制作图片等学习可留言时间: 2014-6-25目录一摘要 (1)二设计内容与要求 (1)2.1 内容 (1)2.2 要求 (1)三硬件设计说明 (1)3.1 STC89C52芯片 (1)3.1.1芯片简介 (1)3.1.2 电路应用 (2)3.1.3 主要性能参数 (2)3.1.4 功能概述 (2)3.1.5 引脚功能 (2)3.2 74HC573芯片 (4)3.2.1 芯片简介 (4)3.2.2 电路应用 (4)3.2.3 主要性能参数 (4)3.2.4 功能概述 (4)3.2.5 引脚功能 (4)3.3 74HC154芯片 (6)3.3.1 芯片简介 (6)3.3.2 电路应用 (6)3.3.3 主要性能参数 (6)3.3.4 功能概述 (6)3.3.5 引脚功能 (6)四工作原理 (8)4.1系统总体框图 (8)4.2端口去向表 (8)4.3硬件工作原理 (9)4.3.1最小系统模块工作原理 (9)4.3.2数码显示模块 (9)4.3.3点阵驱动模块 (10)4.3.4按键控制模块 (11)4.4软件工作原理 (11)五调试过程 (14)六总结 (15)附录Ⅰ原理图 (16)附录ⅡPCB图 (17)附录Ⅲ实物图 (18)附录ⅣBOM表 (20)附录Ⅴ仪器型号 (21)参考文献 (22)一摘要在这个信息时代,计算机已经离不开我们的生活,适当的游戏可以带来愉快的心情和健康,俄罗斯方块这个小游戏已经风靡全球,是一款老少皆宜的游戏。
二设计内容与要求2.1 内容我组俄罗斯方块共使用了STC89C52、74HC154和74HC573,三个芯片的共同使用,加上两个8*8的点阵屏来完成硬件的操作。
其中共使用6个按键进行功能的操作,每个按键的功能依程序而定分别有:复位、向上、向下、向左、向右和暂停/开始。
2.2 要求1.了解集成芯片的作用STC89C52、74HC154和74HC573及引脚功能;掌握电路的接线方式,记下每个按键的功能。
基于51单片机实现的俄罗斯方块游戏整体设计方案 (5)2.1系统的核心部分单片机 (5)2.1.1单片机的选择 (5)2.1.2AT89S52引脚功能描述 (7)2.1.3晶振特性 (9)2.2液晶显示模块 (10)2.2.1液晶显示控制驱动器HD61202的特点 (10)2.2.2液晶显示控制驱动器HD61202的引脚功能 (10)2.2.3液晶显示控制驱动器HD61202的指令系统 (11)2.2.4HD61202的软件设计 (12)2.2.5JM12864J的电路结构特点 (15)2.2.6JM12864J的应用 (16)2.2.7键盘电路 (17)3系统程序的设计 (18)3.1俄罗斯方块驱动流程图 (18)3.2俄罗斯方块所有绘图工作流程图 (19)3.3俄罗斯方块中按下键的流程图 (20)3.4俄罗斯方块所有绘图工作流程图 (21)附录1:C语言程序 (30)附录2:电路原理图 (59)整体设计方案1.1系统的核心部分单片机1.1.1单片机的选择单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。
因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机经过3代的发展,正朝着多功能、高性能、低电压、低功耗、低价格、大存储容量、强I/O功能及较好的结构兼容性方向发展。
其发展趋势不外乎以下几个方面:1.多功能单片机中尽可能地把所需要的存储器和I/O口都集成在一块芯片上,使得单片机可以实现更多的功能。
比如A/D、PWM、PCA(可编程计数器阵列)、WDT(监视定时器---看家狗)、高速I/O口及计数器的捕获/比较逻辑等。
有的单片机针对某一个应用领域,集成了相关的控制设备,以减少应用系统的芯片数量。
俄罗斯方块游戏程序设计报告学号:姓名:难度:****知识点:(1)绘图(2)键盘事件处理(3)定时器控件(4)多模块程序设计(5)文本文件的读写1.功能要求:(1)启动程序,单击“开始”或“回车”键开始游戏。
不同形状以随机颜色出现,出现时的方向是随机的;(2)使用“选项”菜单画框提供按键方案;(3)游戏过程中可以单击窗口右下角的“暂停”和“继续”,也可使用“回车”键控制,打开“选项”对话框时,程序自动进入暂停状态;(4)计分遵循一次消去一行加一百,两行三百,三行七百,四行一千五,程序自动记录并显示历史的最高分;(5)得分每增加2000分,程序自动将方块下落速度提高一档。
2.需要解决的疑难问题和方法:(1)本程序在模块中定义变量:Private blnGrid(0 To 19, 0 To 9) As Boolean '网格Private lngColor(0 To 19, 0 To 9) As Long '网格绘制颜色Private blnBlock(0 To 4, 0 To 3, 0 To 3, 0 To 3) As Boolean '五种方块的四种不同方位Private blnStarted As Boolean '是否已开始玩Dim intTypeCur As Integer '当前方块的类型Dim lngColorCur As Long '当前方块的颜色Dim intOrieCur As Integer '当前方块的方位Dim intOrieNext As Integer '当前方块的下一个方位Dim intXCur As Integer '当前方块的当前位置Dim intYCur As IntegerDim intXNext As Integer '当前方块的下一个位置Dim intYNext As IntegerPublic intDownDistance As Integer '快速下降时的下降距离Public blnClockWise As Boolean '方块旋转方向Public blnShowNext As Boolean '是否显示下一个方块Public blnScheme As Boolean '按键方案Dim lngScore As Long '得分Dim intTypeNew As Integer '下一个方块的类型Dim lngColorNew As Long '下一个方块的颜色Dim intOrieNew As Integer '下一个方块的方位Dim lngHighScore As LongDim blnRedraw As Boolean(2)画10×20的网格:Dim i As Integer, j As Integer'去掉旧图象For i = 0 To 3If i + intYCur >= 0 And i + intYCur <= 19 Then '如果在大方框外,则不绘制For j = 0 To 3If j + intXCur >= 0 And j + intXCur <= 9 ThenIf (j + intXCur >= 0) And (j + intXCur <= 9) And (blnBlock(intTypeCur, intOrieCur, i, j)) And Not blnGrid(i + intYCur, j + intXCur) ThenpicGrid.Line ((j + intXCur) * 20 + 2, (i + intYCur) * 20 + 2)-((j + intXCur) * 20 + 19, (i + intYCur) * 20 + 19), vbBlack, BpicGrid.Line ((j + intXCur) * 20 + 4, (i + intYCur) * 20 + 4)-((j + intXCur) * 20 + 17, (i + intYCur) * 20 + 17), vbWhite, BFEnd IfEnd IfNextEnd IfNext'画新图象For i = 0 To 3If i + intYNext >= 0 And i + intYNext <= 19 Then '如果在大方框外,则不绘制For j = 0 To 3If (j + intXNext >= 0) And (j + intXNext <= 9) And (blnBlock(intTypeCur, intOrieNext, i, j)) Then picGrid.Line ((j + intXNext) * 20 + 2, (i + intYNext) * 20 + 2)-((j + intXNext) * 20 + 19, (i + intYNext) * 20 + 19), lngColorCur, BpicGrid.Line ((j + intXNext) * 20 + 4, (i + intYNext) * 20 + 4)-((j + intXNext) * 20 + 17, (i + intYNext) * 20 + 17), lngColorCur, BFEnd IfNextEnd If(3)五种方块形状:'I 型方块数据blnBlock(0, 0, 0, 0) = False: blnBlock(0, 0, 0, 1) = False: blnBlock(0, 0, 0, 2) = True: blnBlock(0, 0, 0, 3) = False blnBlock(0, 0, 1, 0) = False: blnBlock(0, 0, 1, 1) = False: blnBlock(0, 0, 1, 2) = True: blnBlock(0, 0, 1, 3) = False blnBlock(0, 0, 2, 0) = False: blnBlock(0, 0, 2, 1) = False: blnBlock(0, 0, 2, 2) = True: blnBlock(0, 0, 2, 3) = False blnBlock(0, 0, 3, 0) = False: blnBlock(0, 0, 3, 1) = False: blnBlock(0, 0, 3, 2) = True: blnBlock(0, 0, 3, 3) = FalseblnBlock(0, 1, 0, 0) = False: blnBlock(0, 1, 0, 1) = False: blnBlock(0, 1, 0, 2) = False: blnBlock(0, 1, 0, 3) = False blnBlock(0, 1, 1, 0) = True: blnBlock(0, 1, 1, 1) = True: blnBlock(0, 1, 1, 2) = True: blnBlock(0, 1, 1, 3) = TrueblnBlock(0, 1, 3, 0) = False: blnBlock(0, 1, 3, 1) = False: blnBlock(0, 1, 3, 2) = False: blnBlock(0, 1, 3, 3) = FalseblnBlock(0, 2, 0, 0) = False: blnBlock(0, 2, 0, 1) = False: blnBlock(0, 2, 0, 2) = True: blnBlock(0, 2, 0, 3) = False blnBlock(0, 2, 1, 0) = False: blnBlock(0, 2, 1, 1) = False: blnBlock(0, 2, 1, 2) = True: blnBlock(0, 2, 1, 3) = False blnBlock(0, 2, 2, 0) = False: blnBlock(0, 2, 2, 1) = False: blnBlock(0, 2, 2, 2) = True: blnBlock(0, 2, 2, 3) = False blnBlock(0, 2, 3, 0) = False: blnBlock(0, 2, 3, 1) = False: blnBlock(0, 2, 3, 2) = True: blnBlock(0, 2, 3, 3) = FalseblnBlock(0, 3, 0, 0) = False: blnBlock(0, 3, 0, 1) = False: blnBlock(0, 3, 0, 2) = False: blnBlock(0, 3, 0, 3) = False blnBlock(0, 3, 1, 0) = False: blnBlock(0, 3, 1, 1) = False: blnBlock(0, 3, 1, 2) = False: blnBlock(0, 3, 1, 3) = FalseblnBlock(0, 3, 2, 0) = True: blnBlock(0, 3, 2, 1) = True: blnBlock(0, 3, 2, 2) = True: blnBlock(0, 3, 2, 3) = True blnBlock(0, 3, 3, 0) = False: blnBlock(0, 3, 3, 1) = False: blnBlock(0, 3, 3, 2) = False: blnBlock(0, 3, 3, 3) = False'反L 型方块数据blnBlock(1, 0, 0, 0) = False: blnBlock(1, 0, 0, 1) = True: blnBlock(1, 0, 0, 2) = True: blnBlock(1, 0, 0, 3) = TrueblnBlock(1, 0, 1, 0) = False: blnBlock(1, 0, 1, 1) = False: blnBlock(1, 0, 1, 2) = False: blnBlock(1, 0, 1, 3) = True blnBlock(1, 0, 2, 0) = False: blnBlock(1, 0, 2, 1) = False: blnBlock(1, 0, 2, 2) = False: blnBlock(1, 0, 2, 3) = FalseblnBlock(1, 0, 3, 0) = False: blnBlock(1, 0, 3, 1) = False: blnBlock(1, 0, 3, 2) = False: blnBlock(1, 0, 3, 3) = FalseblnBlock(1, 1, 0, 0) = False: blnBlock(1, 1, 0, 1) = False: blnBlock(1, 1, 0, 2) = True: blnBlock(1, 1, 0, 3) = True blnBlock(1, 1, 1, 0) = False: blnBlock(1, 1, 1, 1) = False: blnBlock(1, 1, 1, 2) = True: blnBlock(1, 1, 1, 3) = False blnBlock(1, 1, 2, 0) = False: blnBlock(1, 1, 2, 1) = False: blnBlock(1, 1, 2, 2) = True: blnBlock(1, 1, 2, 3) = False blnBlock(1, 1, 3, 0) = False: blnBlock(1, 1, 3, 1) = False: blnBlock(1, 1, 3, 2) = False: blnBlock(1, 1, 3, 3) = FalseblnBlock(1, 2, 0, 0) = False: blnBlock(1, 2, 0, 1) = True: blnBlock(1, 2, 0, 2) = False: blnBlock(1, 2, 0, 3) = FalseblnBlock(1, 2, 1, 0) = False: blnBlock(1, 2, 1, 1) = True: blnBlock(1, 2, 1, 2) = True: blnBlock(1, 2, 1, 3) = TrueblnBlock(1, 2, 2, 0) = False: blnBlock(1, 2, 2, 1) = False: blnBlock(1, 2, 2, 2) = False: blnBlock(1, 2, 2, 3) = FalseblnBlock(1, 2, 3, 0) = False: blnBlock(1, 2, 3, 1) = False: blnBlock(1, 2, 3, 2) = False: blnBlock(1, 2, 3, 3) = FalseblnBlock(1, 3, 0, 0) = False: blnBlock(1, 3, 0, 1) = False: blnBlock(1, 3, 0, 2) = False: blnBlock(1, 3, 0, 3) = True blnBlock(1, 3, 1, 0) = False: blnBlock(1, 3, 1, 1) = False: blnBlock(1, 3, 1, 2) = False: blnBlock(1, 3, 1, 3) = True blnBlock(1, 3, 2, 0) = False: blnBlock(1, 3, 2, 1) = False: blnBlock(1, 3, 2, 2) = True: blnBlock(1, 3, 2, 3) = True blnBlock(1, 3, 3, 0) = False: blnBlock(1, 3, 3, 1) = False: blnBlock(1, 3, 3, 2) = False: blnBlock(1, 3, 3, 3) = False'正L型方块数据blnBlock(2, 0, 0, 0) = False: blnBlock(2, 0, 0, 1) = True: blnBlock(2, 0, 0, 2) = True: blnBlock(2, 0, 0, 3) = TrueblnBlock(2, 0, 2, 0) = False: blnBlock(2, 0, 2, 1) = False: blnBlock(2, 0, 2, 2) = False: blnBlock(2, 0, 2, 3) = False blnBlock(2, 0, 3, 0) = False: blnBlock(2, 0, 3, 1) = False: blnBlock(2, 0, 3, 2) = False: blnBlock(2, 0, 3, 3) = FalseblnBlock(2, 1, 0, 0) = False: blnBlock(2, 1, 0, 1) = False: blnBlock(2, 1, 0, 2) = True: blnBlock(2, 1, 0, 3) = False blnBlock(2, 1, 1, 0) = False: blnBlock(2, 1, 1, 1) = False: blnBlock(2, 1, 1, 2) = True: blnBlock(2, 1, 1, 3) = False blnBlock(2, 1, 2, 0) = False: blnBlock(2, 1, 2, 1) = False: blnBlock(2, 1, 2, 2) = True: blnBlock(2, 1, 2, 3) = True blnBlock(2, 1, 3, 0) = False: blnBlock(2, 1, 3, 1) = False: blnBlock(2, 1, 3, 2) = False: blnBlock(2, 1, 3, 3) = FalseblnBlock(2, 2, 0, 0) = False: blnBlock(2, 2, 0, 1) = False: blnBlock(2, 2, 0, 2) = False: blnBlock(2, 2, 0, 3) = True blnBlock(2, 2, 1, 0) = False: blnBlock(2, 2, 1, 1) = True: blnBlock(2, 2, 1, 2) = True: blnBlock(2, 2, 1, 3) = True blnBlock(2, 2, 2, 0) = False: blnBlock(2, 2, 2, 1) = False: blnBlock(2, 2, 2, 2) = False: blnBlock(2, 2, 2, 3) = False blnBlock(2, 2, 3, 0) = False: blnBlock(2, 2, 3, 1) = False: blnBlock(2, 2, 3, 2) = False: blnBlock(2, 2, 3, 3) = FalseblnBlock(2, 3, 0, 0) = False: blnBlock(2, 3, 0, 1) = False: blnBlock(2, 3, 0, 2) = True: blnBlock(2, 3, 0, 3) = True blnBlock(2, 3, 1, 0) = False: blnBlock(2, 3, 1, 1) = False: blnBlock(2, 3, 1, 2) = False: blnBlock(2, 3, 1, 3) = True blnBlock(2, 3, 2, 0) = False: blnBlock(2, 3, 2, 1) = False: blnBlock(2, 3, 2, 2) = False: blnBlock(2, 3, 2, 3) = True blnBlock(2, 3, 3, 0) = False: blnBlock(2, 3, 3, 1) = False: blnBlock(2, 3, 3, 2) = False: blnBlock(2, 3, 3, 3) = False'T型方块数据blnBlock(3, 0, 0, 0) = False: blnBlock(3, 0, 0, 1) = True: blnBlock(3, 0, 0, 2) = True: blnBlock(3, 0, 0, 3) = True blnBlock(3, 0, 1, 0) = False: blnBlock(3, 0, 1, 1) = False: blnBlock(3, 0, 1, 2) = True: blnBlock(3, 0, 1, 3) = False blnBlock(3, 0, 2, 0) = False: blnBlock(3, 0, 2, 1) = False: blnBlock(3, 0, 2, 2) = False: blnBlock(3, 0, 2, 3) = False blnBlock(3, 0, 3, 0) = False: blnBlock(3, 0, 3, 1) = False: blnBlock(3, 0, 3, 2) = False: blnBlock(3, 0, 3, 3) = FalseblnBlock(3, 1, 0, 0) = False: blnBlock(3, 1, 0, 1) = False: blnBlock(3, 1, 0, 2) = True: blnBlock(3, 1, 0, 3) = False blnBlock(3, 1, 1, 0) = False: blnBlock(3, 1, 1, 1) = False: blnBlock(3, 1, 1, 2) = True: blnBlock(3, 1, 1, 3) = True blnBlock(3, 1, 2, 0) = False: blnBlock(3, 1, 2, 1) = False: blnBlock(3, 1, 2, 2) = True: blnBlock(3, 1, 2, 3) = False blnBlock(3, 1, 3, 0) = False: blnBlock(3, 1, 3, 1) = False: blnBlock(3, 1, 3, 2) = False: blnBlock(3, 1, 3, 3) = FalseblnBlock(3, 2, 0, 0) = False: blnBlock(3, 2, 0, 1) = False: blnBlock(3, 2, 0, 2) = True: blnBlock(3, 2, 0, 3) = False blnBlock(3, 2, 1, 0) = False: blnBlock(3, 2, 1, 1) = True: blnBlock(3, 2, 1, 2) = True: blnBlock(3, 2, 1, 3) = True blnBlock(3, 2, 2, 0) = False: blnBlock(3, 2, 2, 1) = False: blnBlock(3, 2, 2, 2) = False: blnBlock(3, 2, 2, 3) = False blnBlock(3, 2, 3, 0) = False: blnBlock(3, 2, 3, 1) = False: blnBlock(3, 2, 3, 2) = False: blnBlock(3, 2, 3, 3) = FalseblnBlock(3, 3, 0, 0) = False: blnBlock(3, 3, 0, 1) = False: blnBlock(3, 3, 0, 2) = True: blnBlock(3, 3, 0, 3) = False blnBlock(3, 3, 1, 0) = False: blnBlock(3, 3, 1, 1) = True: blnBlock(3, 3, 1, 2) = True: blnBlock(3, 3, 1, 3) = False blnBlock(3, 3, 2, 0) = False: blnBlock(3, 3, 2, 1) = False: blnBlock(3, 3, 2, 2) = True: blnBlock(3, 3, 2, 3) = False blnBlock(3, 3, 3, 0) = False: blnBlock(3, 3, 3, 1) = False: blnBlock(3, 3, 3, 2) = False: blnBlock(3, 3, 3, 3) = False'正方形型方块数据blnBlock(4, 0, 0, 0) = False: blnBlock(4, 0, 0, 1) = True: blnBlock(4, 0, 0, 2) = True: blnBlock(4, 0, 0, 3) = False blnBlock(4, 0, 1, 0) = False: blnBlock(4, 0, 1, 1) = True: blnBlock(4, 0, 1, 2) = True: blnBlock(4, 0, 1, 3) = False blnBlock(4, 0, 2, 0) = False: blnBlock(4, 0, 2, 1) = False: blnBlock(4, 0, 2, 2) = False: blnBlock(4, 0, 2, 3) = FalseblnBlock(4, 1, 0, 0) = False: blnBlock(4, 1, 0, 1) = True: blnBlock(4, 1, 0, 2) = True: blnBlock(4, 1, 0, 3) = False blnBlock(4, 1, 1, 0) = False: blnBlock(4, 1, 1, 1) = True: blnBlock(4, 1, 1, 2) = True: blnBlock(4, 1, 1, 3) = False blnBlock(4, 1, 2, 0) = False: blnBlock(4, 1, 2, 1) = False: blnBlock(4, 1, 2, 2) = False: blnBlock(4, 1, 2, 3) = False blnBlock(4, 1, 3, 0) = False: blnBlock(4, 1, 3, 1) = False: blnBlock(4, 1, 3, 2) = False: blnBlock(4, 1, 3, 3) = FalseblnBlock(4, 2, 0, 0) = False: blnBlock(4, 2, 0, 1) = True: blnBlock(4, 2, 0, 2) = True: blnBlock(4, 2, 0, 3) = False blnBlock(4, 2, 1, 0) = False: blnBlock(4, 2, 1, 1) = True: blnBlock(4, 2, 1, 2) = True: blnBlock(4, 2, 1, 3) = False blnBlock(4, 2, 2, 0) = False: blnBlock(4, 2, 2, 1) = False: blnBlock(4, 2, 2, 2) = False: blnBlock(4, 2, 2, 3) = False blnBlock(4, 2, 3, 0) = False: blnBlock(4, 2, 3, 1) = False: blnBlock(4, 2, 3, 2) = False: blnBlock(4, 2, 3, 3) = FalseblnBlock(4, 3, 0, 0) = False: blnBlock(4, 3, 0, 1) = True: blnBlock(4, 3, 0, 2) = True: blnBlock(4, 3, 0, 3) = False blnBlock(4, 3, 1, 0) = False: blnBlock(4, 3, 1, 1) = True: blnBlock(4, 3, 1, 2) = True: blnBlock(4, 3, 1, 3) = False blnBlock(4, 3, 2, 0) = False: blnBlock(4, 3, 2, 1) = False: blnBlock(4, 3, 2, 2) = False: blnBlock(4, 3, 2, 3) = False blnBlock(4, 3, 3, 0) = False: blnBlock(4, 3, 3, 1) = False: blnBlock(4, 3, 3, 2) = False: blnBlock(4, 3, 3, 3) = False 3.窗体和模块说明:本程序有两个窗体,为frmMain和frmOption,两个PictureBox,是picGrid和picNext,四个TextBox,十四个Label,两个CommandButton,四个OptionButton,一个CheckBox,六个Frame,三个Line,一个Timer。
基于单片机的8*8俄罗斯方块游戏摘要:本文集中论述了如何使用AT89C52单片机来实现8*8俄罗斯方块游戏,该系统能具体根据8*8俄罗斯方块游戏的基本规则进行游戏,并通过单片机控制点阵屏显示其8*8俄罗斯方块游戏界面。
系统具有实用实时性强、操作简单、娱乐性能好,扩展性能较好价格便宜等特点。
关键词:单片机;AT89C52;点阵屏显示管;俄罗斯方块游戏一前言汇编语言易学易用的特点,特别适合于初学者学习单片机系统编程。
随着21世纪信息社会的到来,计算机在人们的工作和生活中的深入,要求我们越来越多地与计算机打交道,为了使用户在繁忙的日程工作中得到放松,于是出现了各种各样的休闲软件,如聊天工具,游戏等等。
于是我们着手设计开始一个这样的游戏软件。
通过汇编语言的学习,我初步掌握了汇编语言的最基本的知识,于是在王筝老师的指导下动手用汇编语言编写俄罗斯方块游戏。
无可争议,《俄罗斯方块》是有史以来最伟大的游戏之一。
它是永恒的娱乐经典,但它实际上又和那些传统的经典娱乐方式不同,因为它的本质是电子化的,所以它的确属于现代产物。
《俄罗斯方块》举世闻名的游戏性,在该游戏新鲜出炉时就显得非常直观。
某些与坠落的玩具碎片和它们的形状有关的东西,使得哪怕新手也会很自然地企图把它们排列起来,并加以适当组合,就好似《俄罗斯方块》触动了我们某些内在的感官,使得哪怕是我们当中最杂乱无章的人也要把事情整理妥当。
在曾经发布过的所有游戏中,《俄罗斯方块》还被认为是仅有的一个能够真正吸引广泛人群的作品。
为了怀念经典,也为了能够给大多的计算机用户在工作之余找到一个休闲、娱乐的一个方式,我们小组开始着手用汇编语言开发一个经典的俄罗斯方块游戏,本文就是介绍一种采用52系列单片AT89C52为中心器件来实现8*8俄罗斯方块游戏,下面就设计过程及关键技术作一些具体介绍。
该文将主要为硬件和软件两部分来介绍如何用AT89C52实现8*8俄罗斯方块游戏。
二设计思路,方案比较、设计与论证1、单片机的总体设计思路:系统调试开始硬件调试软件调试系统联调现场调试调试结束模拟调试2、电源提供方案:为使模块稳定工作,须有可靠电源。