1.我需要做一个基于FPGA的俄罗斯方块设计,需要FPGA的程序,用的
我有用VGA显示的,你要不要?要的话给邮箱
ENTITY RUSSIA IS
PORT(CLK :IN STD_LOGIC; -------时钟频率,选用低频
RESET :IN STD_LOGIC; -------复位键
LEFT :IN STD_LOGIC; -------左移键
RIGHT :IN STD_LOGIC; -------右移键
SCORES :OUT INTEGER RANGE 0 TO 15; -------分数
STA0 : OUT STD_LOGIC_VECTOR(0 TO 3) ; -------以下为四行状态寄存
STA1 : OUT STD_LOGIC_VECTOR(0 TO 3) ;
STA2 : OUT STD_LOGIC_VECTOR(0 TO 3) ;
STA3 : OUT STD_LOGIC_VECTOR(0 TO 3) );
END RUSSIA;
ARCHITECTURE MOVING OF RUSSIA IS
SIGNAL STATU0 : STD_LOGIC_VECTOR(0 TO 3) ;
SIGNAL STATU1 : STD_LOGIC_VECTOR(0 TO 3) ;
SIGNAL STATU2 : STD_LOGIC_VECTOR(0 TO 3) ;
SIGNAL STATU3 : STD_LOGIC_VECTOR(0 TO 3) ;
SIGNAL FLAG : STD_LOGIC; -------game over 标志
SIGNAL FP :INTEGER RANGE 0 TO 499; -------1000分频
SIGNAL CLK1 :STD_LOGIC;
SIGNAL SCOR_TEMP :INTEGER RANGE 0 TO 15;
SIGNAL ROW4 :STD_LOGIC; -------消行标志
SIGNAL ROW,COL:INTEGER RANGE 0 TO 3; -------点的坐标控制
BEGIN
--------p1用来分频(字数限制,此处省略)--------
P2:PROCESS(CLK1,RESET)
BEGIN
IF RESET='1' THEN --------系统初始化(略)
ELSIF(CLK1'EVENT AND CLK1='1')THEN
--------此处是(game over 进入空循环、消行、加分、判断四列中是否有一列全为1,是则FLAGIF STATU0(COL+1)='0' THEN COLIF STATU1(COL+1)='0' THEN COLIF STATU2(COL+1)='0' THEN COLIF STATU3(COL+1)='0' THEN COL0 THEN ---------左移判断
CASE ROW IS
WHEN 0=>IF STATU0(COL-1)='0' THEN COLIF STATU1(COL-1)='0' THEN COLIF STATU2(COL-1)='0' THEN COLIF STATU3(COL-1)='0' THEN COL
2.用c语言编写俄罗斯方块程序 求详解
1、用C语言绘制图形界面 EasyX图形库()即TC的图形库在VC下的移植。
包含库#include
注意:由于我们用的是EasyX图形库,故源文件后缀要为.cpp,但其中内容都是C的语法。2、存储表示出俄罗斯方块的形状 一、我们可以用编号,不同的编号代表不同的俄罗斯方块,根据编号把不同方块的画法写在代码中,这样19种 方块就得有19种相应的代码来描绘。
而且这样扩展性不好,若以后设计了新的方块,则需要更改大量源代码。二、我们很自然的想到可用字模点阵的形式来表示,即设置一个4行4列的数组,元素置1即代表这个位置有小 方块,元素置0即代表这个位置无小方块,这个整个的4*4的数组组成俄罗斯方块的形状。
1000100011000000 这个方法挺靠谱,但我们还可以优化一下:不用4*4的数组,而是用16个bit位来表示这个点阵。这样存储起来比较方便,故我们用unsigned int 的低16位来表示方块的点阵。
我们可以用掩码与表示俄罗斯方块的位进行操作,来识别并在屏幕上画出方块。我们把俄罗斯方块点阵的数位存在rockArray中,我们可以事先把这19种方块的字模点阵自己转化成十六进制,然后在rockArray数组的初始化时赋值进去。
但这样做未免有点太费力,且扩展性也不太好,若以后设计的新方块种类加入,要改变数组rockArray中的值。我们可以考虑把所有俄罗斯方块的点阵存储在配置文件中,在程序初始化时读取文件,把这些点阵转换成unsigned int的变量存储在rockArray中。
这样,以后我们增添新的方块形状只需要在配置文件中增加新的点阵即可。@### @### @@###### (为使得看起来更醒目,我们用@表示1,用#表示0)3、让图形动起来 在某位置处用函数DrawRock在屏幕上画出俄罗斯方块,然后再擦除掉(即用背景色在原位置处重绘一次方块),最后在下落的下一个位置处用函数DrawRock在屏幕上画出俄罗斯方块,如此循环,中间用计时器间隔一段时间以控制下落的速度。
同理,按下屏幕的左右键也是如此,只是在按下键盘时把方块的位置重新计算了。那么按下上方向键时,如何让方块翻转呢?我们在配置文件中就把方块的顺时针翻转形态放在了一起:@### @### @@###### @@@# @########### @@###@###@########@# @@@######### 我们每按一次上方向键改变一次方块的形状即可。
若一直按上键,形状应该是循环地翻滚。我们想到了循环链表的数据结构可实现这个效果。
可是我们若把这些一种类的方块的各种形态串成循环链表形式,那么每次重新生成方块时我们就难以随机地生成方块了。故还是得用数组来存储,但又要有循环链表的功能,于是我们想到了静态循环链表。
我们用结构体来作为一个方块在rockArray中的元素 typedef struct ROCK { //用来表示方块的形状(每一个字节是8位,用每4位表示方块中的一行) unsigned int rockShapeBits ; int nextRockIndex ; //下一个方块,在数组中的下标 } RockType ; 这样,当我们按下上方向键时,把传入函数DrawRock中的rockIndex变为当前方块结构体中的nextRockIndex即可。参考资料:C语言图形界面篇。
3.软件工程设计实例
游戏交互代码如下所示:
void CRusGridView::OnKeyDown (UINT nChar,UINT nRepC—
nt,UINT nFlags)
{if(b startgame==false)retum;,/未进行游戏,则无法触发键
盘
Switch(nChar)
{ case 37:
grid.moveleft(game.position);
display()
break;
case 38:
grid.rotate(game.position);
display()
break;
case 39:
grid.moveright(gam e.position);
display();
break;
ease 40
if(grid.movedown(game.position)=-false)
{if(game.isgam efail(&grd)),/如果游戏失败,则
结束游戏
f display();this->OnGame();//结束游戏并重新
设置菜单
}
else{char linefull;
int grid_ type;
linefull=new char[20];
if(game.isfullline(1ineful1)),/如果存在满行,则消行
并加分
{game.addcount(1ineful1);
game.refreshgame(1ineful1);
l
/生成新的方块:根据方块类型初始化方块信息
grid_ type=game.selectgrid();
d.init(grid type);
this >SetTimer(1,INTERVAL M0VED0WN,NULL):,/触发方
块定时下落.
display();delete linefull;
}
}
else
{this >SetTimer(1,INTERVAL MOVEDOWN,NULL);
display();
},,触发方块定时下落
break:
}
CView::OnKeyDown(nChar,nRepCnt,nFlags)
}
4.pic18f452的俄罗斯方块c语言程序
// 程序名称:俄罗斯方块// 最后更新:2010-12-18//#include #include #include /////////////////////////////////////////////// 定义常量、枚举量、结构体、全局变量/////////////////////////////////////////////#define WIDTH 10 // 游戏区宽度#define HEIGHT 22 // 游戏区高度#define SIZE 20 // 每个游戏区单位的实际像素// 定义操作类型 enum CTRL { CTRL_ROTATE, // 方块旋转 CTRL_LEFT, CTRL_RIGHT, CTRL_DOWN, // 方块左、右、下移动 CTRL_SINK, // 方块沉底 CTRL_QUIT // 退出游戏 };// 定义绘制方块的方法 enum DRAW { SHOW, // 显示方块 HIDE, // 隐藏方块 FIX // 固定方块 };// 定义七种俄罗斯方块 struct BLOCK { WORD dir[4]; // 方块的四个旋转状态 COLORREF color; // 方块的颜色 } g_Blocks[7] = { {0x0F00, 0x4444, 0x0F00, 0x4444, RED}, // I {0x0660, 0x0660, 0x0660, 0x0660, BLUE}, // 口 {0x4460, 0x02E0, 0x0622, 0x0740, MAGENTA}, // L {0x2260, 0x0E20, 0x0644, 0x0470, YELLOW}, // 反L {0x0C60, 0x2640, 0x0C60, 0x2640, CYAN}, // Z {0x0360, 0x4620, 0x0360, 0x4620, GREEN}, // 反Z {0x4E00, 0x4C40, 0x0E40, 0x4640, BROWN}}; // T// 定义当前方块、下一个方块的信息 struct BLOCKINFO { byte id; // 方块 ID char x, y; // 方块在游戏区中的坐标 byte dir:2; // 方向 } g_CurBlock, g_NextBlock;// 定义游戏区 BYTE g_World[WIDTH][HEIGHT] = {0}; /////////////////////////////////////////////// 函数声明/////////////////////////////////////////////void Init(); // 初始化游戏 void Quit(); // 退出游戏 void NewGame(); // 开始新游戏 void GameOver(); // 结束游戏 CTRL GetControl(bool _onlyresettimer = false); // 获取控制命令 void DispatchControl(CTRL _ctrl); // 分发控制命令 void NewBlock(); // 生成新的方块 bool CheckBlock(BLOCKINFO _block); // 检测指定方块是否可以放下 void DrawBlock(BLOCKINFO _block, DRAW _draw = SHOW); // 画方块 void OnRotate(); // 旋转方块 void OnLeft(); // 左移方块 void OnRight(); // 右移方块 void OnDown(); // 下移方块 void OnSink(); // 沉底方块 /////////////////////////////////////////////// 函数定义/////////////////////////////////////////////// 主函数 void main() { Init(); CTRL c; while(true) { c = GetControl(); DispatchControl(c); // 按退出时,显示对话框咨询用户是否退出 if (c == CTRL_QUIT) { HWND wnd = GetHWnd(); if (MessageBox(wnd, "您要退出游戏吗?", "提醒", MB_OKCANCEL | MB_ICONQUESTION) == IDOK) Quit(); } } }// 初始化游戏 void Init() { initgraph(640, 480); srand((unsigned)time(NULL)); // 显示操作说明 setfont(14, 0, "宋体"); outtextxy(20, 330, "操作说明"); outtextxy(20, 350, "上:旋转"); outtextxy(20, 370, "左:左移"); outtextxy(20, 390, "右:右移"); outtextxy(20, 410, "下:下移"); outtextxy(20, 430, "空格:沉底"); outtextxy(20, 450, "ESC:退出"); // 设置坐标原点 setorigin(220, 20); // 绘制游戏区边界 rectangle(-1, -1, WIDTH * SIZE, HEIGHT * SIZE); rectangle((WIDTH + 1) * SIZE - 1, -1, (WIDTH + 5) * SIZE, 4 * SIZE); // 开始新游戏 NewGame(); }// 退出游戏 void Quit() { closegraph(); exit(0); }// 开始新游戏 void NewGame() {// 清空游戏区 setfillstyle(BLACK); bar(0, 0, WIDTH * SIZE - 1, HEIGHT * SIZE - 1); ZeroMemory(g_World, WIDTH * HEIGHT); // 生成下一个方块 g_NextBlock.id = rand() % 7; g_NextBlock.dir = rand() % 4; g_NextBlock.x = WIDTH + 1; g_NextBlock.y = HEIGHT - 1; // 获取新方块 NewBlock(); }// 结束游戏 void GameOver() { HWND wnd = GetHWnd(); if (MessageBox(wnd, "游戏结束。
\n您想重新来一局吗?", "游戏结束", MB_YESNO | MB_ICONQUESTION) == IDYES) NewGame(); else Quit(); }// 获取控制命令 CTRL GetControl(bool _onlyresettimer) { static DWORD oldtime = GetTickCount(); // 重置计时器 if (_onlyresettimer) { oldtime = GetTickCount(); return CTRL_DOWN; // 仅仅为了重置计时器,随便返回一个值 } // 获取控制值 while(true) {// 如果超时,自动下落一格。
转载请注明出处众文网 » 毕业论文基于at89c52单片机led点阵屏的俄罗斯方块游戏设计(我需要做一个基于FPGA的俄罗斯方块设计,需要FPGA的程序,用的)