当前位置:文档之家› 俄罗斯方块C语言代码

俄罗斯方块C语言代码

俄罗斯方块C语言代码
俄罗斯方块C语言代码

【转载】88行代码实现俄罗斯方块游戏(含讲解)

来源:https://www.doczj.com/doc/124086822.html,/p/8

在正式阅读本文之前,请你记得你应该用娱乐的心态来看,

本代码所使用到的技巧,在工作了的人眼里会觉得很纠结,很蛋疼,很不可理喻,很丑,

注意,是你蛋疼,不关我的事

通常,写一个俄罗斯方块,往往动不动就几百行,甚至上千行,而这里只有88行

正所谓头脑风暴,打破常规。这里将使用很多不平常的手段来减少代码

以下是Win-TC可以成功编译并执行的代码(代码保证单行长度不超过80字符,如果你是Win7系统,那请看后文):

程序代码:

#include"graphics.h"

#include

#include

int gcW = 20, gcColor[] = {DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN,

LIGHTRED, LIGHTMAGENTA,MAGENTA, YELLOW};

struct tetris {

int _pool[16][32], (*pool)[32], tmap[8][4][16];

int x, y, s, st, t;

}gt;

void trsInit() {

int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802},

{39,305,114,562},{54,561},{99,306},{51,51},{-1}};

int *p, i, j, b;

for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2];

gt.pool = >._pool[4];

for (j = 0; j < 7; ++j)

for (i = 0; i < 4; ++i)

for (b = 0; b < 16; ++b)

gt.tmap[j+1][i][b] = (sp[j][i] & 1) * (j + 1),

sp[j][i] >>= 1;

memset(gt._pool, -1, sizeof(gt._pool));

for (i = 0; i < 10; ++i)

memset(>.pool[i], 0, sizeof(int[21]));

return ;

}

int trsCopy(int sp[], int x, int y, int c) {

int m[] = {0,32,64,96,1,33,65,97,2,34,66,98,3,35,67,99}, i, cx, cy;

for (i = 0; i < 16; ++i) if (sp[i]) {

cx = x + (m[i] >> 5), cy = y + (m[i] & 31);

if (gt.pool[cx][cy]) if (c == 2) gt.pool[cx][cy] = 0; else return0;

if (c==1) gt.pool[cx][cy] = sp[i];

}

return1;

}

int trsScene() {

int x, y = 0;

gt.s = random(7) + 1, gt.st = gt.t = 0;

gt.x = 4, gt.y = 0;

for (--gt.t ; ; delay(10), --gt.t) {

int k = 0;

while (kbhit()) {

k = getch();

if (k == 27) return0;

if (k == 'A' || k == 'a') {

if (trsCopy(gt.tmap[gt.s][gt.st], gt.x-1, gt.y, 0)) --gt.x;

} else if (k == 'D' || k == 'd') {

if (trsCopy(gt.tmap[gt.s][gt.st], gt.x+1, gt.y, 0)) ++gt.x;

} else if (k == 'W' || k == 'w') {

if (trsCopy(gt.tmap[gt.s][(gt.st+1) % 4], gt.x, gt.y, 0))

gt.st = (gt.st+1) % 4;

}

}

if (k == 'S' || k == 's' || gt.t < 0) {

if (trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y+1, 0))++gt.y,gt.t=50;

else {

trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 1);

for (--y; y > 0; --y) {

for (x = 0; gt.pool[x][y] > 0; ++x);

if (gt.pool[x][y] < 0)

for (k = y++; k > 0; --k)

for (x = 0; gt.pool[x][0] >= 0; ++x)

gt.pool[x][k] = gt.pool[x][k-1];

}

return1;

}

}

trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 1);

for (x = 0; gt.pool[x][0] >= 0; ++x) {

for (y = 1; gt.pool[x][y] >= 0; ++y) {

setfillstyle(1, gcColor[gt.pool[x][y]]);

bar(201 + x*gcW, 1 + y*gcW, 200 + gcW + x*gcW, gcW + y*gcW); }

}

trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 2);

}

}

int main() {

int g = DETECT, m = 0;

initgraph(&g, &m, "");

randomize();

trsInit();

while (trsScene());

return0;

}

如果你没有Win-TC,或者你是Win7系统,可以用这个能用VC6编译的工程包:

以上是图形界面版本,显示看起来好看一些

但为了能更通用,还有一份控制台版本的代码,同样是88行,直接复制到VC即可编译:

程序代码:

#include

#include

#include

#include

#include

char gcText[] = " 1LJTSZ#";

struct tetris {

int _pool[16][32], (*pool)[32], tmap[8][4][16];

int x, y, s, st, t;

}gt;

void trsInit() {

int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802}, {39,305,114,562},{54,561},{99,306},{51,51},{-1}};

int *p, i, j, b;

for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2];

gt.pool = >._pool[4];

for (j = 0; j < 7; ++j)

for (i = 0; i < 4; ++i)

for (b = 0; b < 16; ++b)

gt.tmap[j+1][i][b] = (sp[j][i] & 1) * (j + 1),

sp[j][i] >>= 1;

memset(gt._pool, -1, sizeof(gt._pool));

for (i = 0; i < 10; ++i)

memset(>.pool[i], 0, sizeof(int[21]));

return ;

}

int trsCopy(int sp[], int x, int y, int c) {

int i, cx, cy;

for (i = 0; i < 16; ++i) if (sp[i]) {

cx = x + (i & 3), cy = y + (i >> 2);

if (gt.pool[cx][cy])

if (c == 2) gt.pool[cx][cy] = 0; else return0;

if (c==1) gt.pool[cx][cy] = sp[i];

}

return1;

}

int trsScene() {

int x, y = 0;

COORD pos = {0};

gt.s = rand() % 7 + 1, gt.st = gt.t = 0;

gt.x = 3, gt.y = 0;

for (--gt.t; ; Sleep(1), --gt.t) {

int k = 0;

while (kbhit()) {

k = getch();

if (k == 27) return0;

if (k == 'A' || k == 'a') {

if (trsCopy(gt.tmap[gt.s][gt.st], gt.x-1, gt.y, 0)) --gt.x;

} else if (k == 'D' || k == 'd') {

if (trsCopy(gt.tmap[gt.s][gt.st], gt.x+1, gt.y, 0)) ++gt.x;

} else if (k == 'W' || k == 'w') {

if (trsCopy(gt.tmap[gt.s][(gt.st+1) % 4], gt.x, gt.y, 0))

gt.st = (gt.st+1) % 4;

}

}

if (k == 'S' || k == 's' || gt.t < 0) {

if (trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y+1, 0))++gt.y,gt.t=50;

else {

trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 1);

for (--y; y > 0; --y) {

for (x = 0; gt.pool[x][y] > 0; ++x);

if (gt.pool[x][y] < 0)

for (k = y++; k > 0; --k)

for (x = 0; gt.pool[x][0] >= 0; ++x)

gt.pool[x][k] = gt.pool[x][k-1];

}

return1;

}

}

trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 1);

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

for (y = 1; gt.pool[0][y] >= 0; ++y,putchar(10)) {

for (x = 0; gt.pool[x][0] >= 0; ++x) {

putchar(gcText[gt.pool[x][y]]);

}

}

trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 2);

}

}

int main() {

srand((unsigned)time(NULL));

for (trsInit(); trsScene(); );

return0;

}

区别仅仅是绘画用的函数不同而已,不过控制台版显示效果自然会差很多了

当你玩下去,你如果堆放到最顶,输了的话,程序就会以最为华丽的方式:Crash(程序崩溃)谢幕

======================================华丽的分割线========================================

以下是对代码的压缩方法进行分析

首先,通常我们需要准备7种方块,4个方向的形状表,相当多的俄罗斯方块程序就是在开头写了这样一个很长的数组定义,

有的光这个定义就直接超100行了,这个程序是怎么实现的呢?

其实这个程序,同样是使用一个7*4*16的数组来保存这个形状表,但是,它没有直接初始化,见这个数组的定义:

int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802},

{39,305,114,562},{54,561},{99,306},{51,51},{-1}};

这个莫名其妙的数组的值是什么意思呢?其实很好猜的,我们尝试把这些数化为二进制:

15 = 1111

4369 = 1000100010001

合理地四位四位拆开,从低位到高位,从左到右,从上到下排列一下:

1111

0000

0000

0000

1000

1000

1000

1000

你终于发现,这就是长条方块的两个形状

后面类似

然后你会发现,这个数组并不完整,有的只定义了两个形状,有的是四个形状,没定义的数会默认置0的,这个怎么解释?

看这个数组定义的下面第二行:

for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2];

意思是找出这个数组为0的元素,用它前面的元素值填上即*p = p[-2]

而数组中最后一个元素值-1起监督头的作用,用于让这个循环跳出

虽然可以把这些常数全直接写在数组里,但常数太多显得不太好,就这样写了

之后你看到这行代码:

gt.pool = >._pool[4];

为什么定义两个pool呢?因为我们需要在原来的pool的界外用-1值填充,以便后面做碰撞检测减少不必要的代码

但如果直接用原来的_pool,那每次访问都要加上一个偏移常数,不美观且显得代码长,就用另一个指针直接指向开始的位置

然后,后面的三重循环就是解开那个位压缩数组以初始化gt.tmap数组,这个数组就是记录7*4种形状的数

再下面三行,就是初始化pool,游戏区为0,界外为-1

而其中,i < 10决定了游戏池的宽度为10,sizeof(int[21])决定了游戏池的高度是20 (0我们不使用,这一行有特殊作用,后文会讲)

用memset也是为了免写二重循环而已。整个初始化流程就到这里了

然后,是一个trsCopy函数,这个函数综合了碰撞检测,复制到游戏池和反复制,行为由参数c (是control 缩写字母)控制

c为0就单纯的碰撞检测,c为1是复制,c为2就是反复制,细心分析一下,这个函数功能就清楚了,这里不详细展开

好了,到了trsScene函数,整个游戏的主逻辑流程就在这里了

我们先看第75行的那个二重循环,只有那个地方是根据pool保存的值来输出

所以,这个时候,你应该明白为什么trsCopy函数还要复制和反复制了,

它把你正在控制的方块,复制到pool里,统一输出,这样就不需要另加一个函数来绘画你的控制块了

而绘图之前,就是键盘处理等的逻辑控制,这里就没有什么复杂难懂的代码了,

唯一要讲讲的是,if (k == 'S' || k == 's' || gt.t < 0)

这一段是判断下落键的按下,和是否到时间强制下落

里面for (--y; y > 0; --y)开始是消行计算

你可能会奇怪这个y没有明显的初始值,直接就来一个 --y,初始从哪里来?

其实就在之前讲的输出绘画那个循环里,循环结束后,y的值一定是最后一行+1

所以我们只要--y就得到最底下一行,因为消行计算,从下往上,只要一次就解决了,代码较少

好了,现在解释之前说的,为什么不是从0,而是从1开始

消行计算这里,每消除一行,最顶的一行就应该用0填充,但如果你因为这个多写一个for循环就不值得了我们改成从1开始,那么把第0行的内容复制到第一行,就完成0填充了,就可以少写一个for

好了,差不多接近尾声了,最后说说trsScene的返回值

trsScene返回值的意思很简单,如果是1就继续循环,如果是0就退出

所以你可以在代码里看到,当按下ESC(值为27)的时候才返回0

而方块落下一个的时候,返回1,让主函数重新调用它,就能再次初始化当前控制块的位置和形状了,

达到免除状态管理的代码的作用

最后,在主循环除了初始化,只要华丽的一行for (trsInit(); trsScene(); ); 就可以玩这个游戏了

看不懂?说明你也是个正常人

看得懂?说明你已经脑殘了。。。

PS: 成年人不要乱学未成年人的东西。。。

C语言俄罗斯方块游戏源代码

/*学无止境*/ #include #include #include #define ESC 27 #define UP 328 #define DOWN 336 #define LEFT 331 #define RIGHT 333 #define BLANK 32 #define BOTTOM 2 #define CANNOT 1 #define CAN 0 #define MAX 30 #define F1 315 #define ADD 43 #define EQUAL 61 #define DEC 45 #define SOUNDs 115 #define SOUNDS 83 #define PAUSEP 80 #define PAUSEp 112

void Init(); void Down(); void GoOn(); void ksdown(); void Display(int color); void Give(); int Touch(int x,int y,int dx,int dy); int GeyKey(); void Select(); void DetectFill(); void GetScores(); void Fail(); void Help(); void Quit(); void DrawBox(int x,int y,int Color); void OutTextXY(int x,int y,char *String); void DispScore(int x,int y,char Ch); void DrawNext(int Color); int Heng=12,Shu=20; /*横竖*/ int Position[MAX][MAX]; int middle[MAX][MAX]; int ActH,ActS;

C语言课程设计报告 俄罗斯方块改进版

课程设计 俄罗斯方块改进 2016年4月20 日 设计题目 学号 专业班级 学生姓名 指导教师

目录 1. 课程设计目的错误!未定义书签。 2. 功能分析错误!未定义书签。 3. 程序设计实现过程错误!未定义书签。 程序总体设计结构错误!未定义书签。 界面设计错误!未定义书签。 重要数据的数据结构设计错误!未定义书签。函数设计错误!未定义书签。 4. 运行效果错误!未定义书签。 5. 源代码详解错误!未定义书签。 6. 参考文献错误!未定义书签。

俄罗斯方块改进 1. 课程设计问题 据百度百科,俄罗斯方块(Tetris)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。游戏的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。 要求支持键盘操作和7种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,消去一行所得到的分数越高,为玩家提供了不同的选择。 2. 功能分析 俄罗斯方块游戏需要解决的问题包括: ⑴按任意键开始游戏,随机产生方块并自动下移 ⑵用Esc键退出游戏。 ⑶用键变换方块 ⑷用键和键左右移动方块 ⑸用键使方块加速下移 ⑹用空格键使方块暂停 ⑺能正确判断满行并消行、计分、定级别 ⑻设定游戏方块为不同形状重点: *游戏面包的数据结构:二维数组 *7种形状方块的数据结构:结构体保存每种形状方块的坐标 3. 程序设计实现过程 程序总体设计结构 首先初始化进入图形模式,进入欢迎界面,玩家按任意进入主菜单界面,按键进入游戏界面,键然后设置新的时钟中断。开始游戏后,进入该程序最核心的部分——处理和实现进行过程中的各种事件和函数。在处理中判断游戏是否结束,如果没有结束,则重新开始游戏,否则结束游戏。 详解如下: (1)游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在19种不同的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。

俄罗斯方块C语言代码

【转载】88行代码实现俄罗斯方块游戏(含讲解) 来源:https://www.doczj.com/doc/124086822.html,/p/8 在正式阅读本文之前,请你记得你应该用娱乐的心态来看, 本代码所使用到的技巧,在工作了的人眼里会觉得很纠结,很蛋疼,很不可理喻,很丑, 注意,是你蛋疼,不关我的事 通常,写一个俄罗斯方块,往往动不动就几百行,甚至上千行,而这里只有88行 正所谓头脑风暴,打破常规。这里将使用很多不平常的手段来减少代码 以下是Win-TC可以成功编译并执行的代码(代码保证单行长度不超过80字符,如果你是Win7系统,那请看后文): 程序代码: #include"graphics.h" #include #include int gcW = 20, gcColor[] = {DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA,MAGENTA, YELLOW}; struct tetris { int _pool[16][32], (*pool)[32], tmap[8][4][16]; int x, y, s, st, t; }gt; void trsInit() { int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802}, {39,305,114,562},{54,561},{99,306},{51,51},{-1}}; int *p, i, j, b; for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2]; gt.pool = >._pool[4]; for (j = 0; j < 7; ++j) for (i = 0; i < 4; ++i) for (b = 0; b < 16; ++b) gt.tmap[j+1][i][b] = (sp[j][i] & 1) * (j + 1), sp[j][i] >>= 1; memset(gt._pool, -1, sizeof(gt._pool));

C语言课程设计俄罗斯方块源代码

1、新建“.h”头文件,将“头文件” 代码粘贴至其中, 2、新建“.c”源文件,将“源代码” 代码粘贴到其中。 3、新建空白工程,将头文件和源代码 添加进去,调试使用。 //头文件 //1.自定义枚举类型,定义7种形态的游戏方块 typedef enum tetris_shape { ZShape=0, SShape, LineShape, TShape, SquareShape, LShape, MirroredLShape }shape; //2.函数声明 //(1)操作方块函数 int maxX();//取得当前方块的最大x坐标 int minX();//取得当前方块的最小x坐标 void turn_left();//当前方块逆时针旋转90度 void turn_right(); int out_of_table(); void transform(); int leftable(); int rightable(); int downable(); void move_left(); void move_right(); //(2)操作游戏桌面的函数 int add_to_table();

void remove_full(); //(3)控制游戏函数 void new_game(); void run_game(); void next_shape(); int random(int seed); //(4)绘图函数 void paint(); void draw_table(); //(5)其他功能函数 void key_down(WPARAM wParam); void resize(); void initialize(); void finalize(); //(6)回调函数,用来处理Windows消息 LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM); //源代码 //1.文件包含 #include #include #include #include"tetris.h" //2.常量定义 #define APP_NAME "TETRIS" #define APP_TITLE "Tetris Game" #define GAMEOVER "GAME OVER" #define SHAPE_COUNT 7 #define BLOCK_COUNT 4 #define MAX_SPEED 5 #define COLUMS 10 #define ROWS 20 #define RED RGB(255,0,0)

俄罗斯方块C语言程序设计报告

C语言课程设计报告 俄罗斯方块程序设计报告 一、问题描述 俄罗斯方块(Tetris,俄文:Тетрис)是一款电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。 在本次设计中,要求支持键盘操作和若干种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,为玩家提供了不同的选择。 二、功能分析 I、俄罗斯方块游戏需要解决的问题包括: ⑴、随机产生方块并自动下移 ⑵、用Esc键退出游戏 ⑶、用键变体 ⑷、用键和键左右移动方块 ⑸、用空格键使游戏暂停

⑹、能正确判断满行并消行、计分、定级别 ⑺、设定游戏为不同级别,级别越高难度越大 II、俄罗斯方块游戏需要设计的功能函数包括: ⑴、声明俄罗斯方块的结构体 ⑵、函数原型声明 ⑶、制作游戏窗口 ⑷、制作俄罗斯方块 ⑸、判断是否可动 ⑹、随机产生俄罗斯方块类型的序号 ⑺、打印俄罗斯方块 ⑻、清除俄罗斯方块的痕迹 ⑼、判断是否满行并删除满行的俄罗斯方块 三、程序设计 1、程序总体结构设计 (1)、游戏方块预览功能。在游戏过程中,游戏界面右侧会有预览区。由于在此游戏中存在多种不同的游戏方块,所以在游戏方块预览区域中显示随机生成的游戏方块有利于游戏玩家控制游戏的策略。 (2)、游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、自由下落、旋转功能,以及行满消除行的功能。 (3)、游戏数据显示功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。例如,消除一行加100分,游戏分数达到一定数量

教你用c语言写俄罗斯方块

来如鹏挺长时间了,受益很多希望更多的朋学加入进来 做俄罗斯方块是因为无意中在杨老师的帖子看到说最少也要能做出俄罗斯方块这样的东西出来,我想这个意思能做出俄罗斯方块就说明水平到了一个层次了吧。 刚才注意到音乐播放器居然下载超过400次!我反醒我上传的代码很少解释 而且做的都是没有趣味的东西。 俄罗斯方块如鹏已经有好几个同学做出来了,但是我想还有很多同学做不出来,我抛砖引玉,其实俄罗斯方块并不复杂 今天先告诉大家第一步, 在屏幕上把方块显示出来 cfree 新建一个工程选窗口程序显示helloworld的 win32的 api 图形函数都要用到 HDC 这是一个保存窗口图形的数据的句柄 比如我要画一个正方形可以用 Rectangle (hdc,标X,左上角坐标y,右下角坐标x,右下角坐标y); 为了方便我们直接在 switch (message) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // 这个下面添加代码 Rectangle (hdc,50,50,100,100); 然后编译运行 这是效果就是一个正方形没别的东西?别着急哈,慢慢来。 俄罗斯方块每块都是四部分的所以要画4个 这里面需要一小点数学知识 把这些复制到刚才的位置看一下效果 { int x,y; const int size=50;//方块大小

x=y=50;//从窗口的左上角位置开始画 //第一个方块 Rectangle (hdc,x,y,x+size,y+size); x+=size; //向右一块位置画第二个方块 Rectangle (hdc,x,y,x+size,y+size); x+=size; //向右一块位置画第三个方块 Rectangle (hdc,x,y,x+size,y+size); //最后一个方块 //相对于第三个方块左下角的位置 x-=50;y-=50; Rectangle (hdc,x,y,x+size,y+size); } 这个画好像很麻烦我们可以自定义一个函数huafangkuai 专门负责画这个正方形以后所有的其他函数也必须经过他才能画正方形 这个类似于win32 api的封装思想 void huafangkuai(int x,int y,int color); x y是方块的坐标color 就是color 函数原理是x y 是相对于游戏里的坐标而不是屏幕坐标 屏幕坐标要经过函数自己转换这样我们就可以把心关注在游戏的事情而不必分心了void huafangkuai(HDC hdc,int x,int y,int color) { const int BEGINX= 50;//游戏图形的开始位置 const int BEGINY= 50 ; const int FSIZE= 35 ; //方块大小 int screenx=BEGINX +x*FSIZE; //方块左上角的坐标是x乘方块大小再加上起始位置 int screeny=BEGINY +y*FSIZE; Rectangle (hdc,screenx,screeny,screenx+FSIZE,screeny+FSIZE); } 这样我们再画就四个就容易多了 color 先不管 int x,y; x=5;y=5; huafangkuai(hdc,x,y,0); huafangkuai(hdc,x+1,y,0); huafangkuai(hdc,x+2,y,0);

C语言编写俄罗斯方块实验报告

````````` 学院:数计学院 班级:13级数媒班 学号: 姓名:

摘要 …………………………………………………………………………………………………….. 关键字: 目录 第一部分设计总概........................................................................................................................... 摘要………………………………………………………………………………………………… 一、设计目的............................................................................................................................. 二、设计要求............................................................................................................................. 三、设计内容............................................................................................................................. 四、系统分析与设计................................................................................................................. 第二部分数据结构设计................................................................................................................... 第三部分功能实现与程序调试………………………………………………………………….第四部分完成设计........................................................................................................................... 一、实习日记............................................................................................................................. 二、实习总结............................................................................................................................. 三、教师评语............................................................................................................................. 四、程序使用说明书…………………………………………………………………………. 第一部分设计总概 一、设计目的 二、设计要求 三、设计内容 四、系统分析与设计

C语言程序设计-俄罗斯方块源程序

其中的主要逻辑有: (1)由于c的随机性函数不好,所以每次游戏开始根据bios时间设置种子。 (2)得分越高,方块下降速度越快(每200分为单位)。 (3)每下落一个方块加1分,每消除一行加10分,两行加30分,三行加70分,四行加150分。初试分数为100分。 游戏控制: up-旋转;空格-下落到底;左右下方向键-控制方向。P-开始或暂停游戏。ESC-退出。 特点: (1)由于tc不支持中文,所以基本都是英文注释。 (2)函数命名尽可能规范的表达其内部处理目的和过程。 (3)代码加上注释仅有577行。(我下载过的两个俄罗斯方块代码一个在1087行,一个在993行,我的比它们代码少)。 (4)除了消除空格时算法比较复杂,其他算法都比较简单易读。 (5)绘图效率和局部代码效率扔有待提高。 (6)FrameTime参数可能依据不同硬件环境进行具体设置,InitGame需要正确的TC路径。 俄罗斯方块源于大约9年前上大一时的一个梦,我们在学习c语言时,我的同寝室友邀请我合作一起完成俄罗斯方块(课外作业性质),但是当时限于我们的水平比较菜和学习状态比较懒散,我们没有完成。大一的时候我在机房里无意发现别人留下的俄罗斯方块程序,运行,老师发现后激动的问我是我写的吗,我惭愧的摇摇头。那时看到别人做c的大程序深感羡慕(自己只是写几十行的程序)。数年后我仍然看到有不同样式的实现,但是我一直没有实现它,知道今天忽然有这个想法去做,算是弥补多年前的遗憾和心愿吧。 --------------------------------------------- Q&A: ---------------------------------------------- Q:我编译时出现错误:fatal error C1083: Cannot open include file: 'bios.h': Nosuch file or directory,该如何解决? A:正文中的代码,是使用Borland公司的TC2.0编译的,编译结果运行在Windows的16位虚拟机上。bi os.h是属于TC的头文件,在VC或者其他编译器中可能没有这个头文件。因此会产生这个错误。 解决办法: (1)可以下载附件中的压缩包,是使用VC6.0进行编译的版本,编译结果是Windows程序,运行在wind ows 32系统上。两者之间的算法完全一致,区别仅仅是绘图时采用的接口不同,TC下采用BGI(进入图形模式),VC下采用的是GDI(使用DC进行绘图)。 (2)下载TC2.0进行编译。 Q:使用TC3.0进行编译时,提示未能初始化图形模式,请使用initgraph函数。 A:这是因为TC3.0的BGI文件的路径和TC2.0有所不同。TC2.0的BGI文件位于TC路径下。而TC3.0的BGI文件位于BGI文件夹中。请把initgame函数中的initgraph函数中的第三个参数设置为正确的路径。例如:initgraph(&..,&..,"C:\\TC\\BGI"); Q:编译后运行时,弹出错误对话框报告16位虚拟机遇到不可执行的指令,点击确定后退出。 A:该问题在某些环境中出现,可能是基于软件或者硬件环境造成,具体原因暂时未知。为避免该问题,请加载附件中的压缩包VC6.0版本。

C语言俄罗斯方块游戏源代码

/*学无止境*/ #include <> #include <> #include <> #define ESC 27 #define UP 328 #define DOWN 336 #define LEFT 331 #define RIGHT 333 #define BLANK 32 #define BOTTOM 2 #define CANNOT 1 #define CAN 0 #define MAX 30 #define F1 315 #define ADD 43 #define EQUAL 61 #define DEC 45 #define SOUNDs 115 #define SOUNDS 83 #define PAUSEP 80 #define PAUSEp 112

void Init(); void Down(); void GoOn(); void ksdown(); void Display(int color); void Give(); int Touch(int x,int y,int dx,int dy); int GeyKey(); void Select(); void DetectFill(); void GetScores(); void Fail(); void Help(); void Quit(); void DrawBox(int x,int y,int Color); void OutTextXY(int x,int y,char *String); void DispScore(int x,int y,char Ch); void DrawNext(int Color); int Heng=12,Shu=20; /*横竖*/ int Position[MAX][MAX]; int middle[MAX][MAX]; int ActH,ActS;

C语言俄罗斯方块(详解..)

#include #include #include #include #define SCREEN_LENGTH 22 //游戏区屏幕长 #define SCREEN_WIDTH 14 //游戏区屏幕实则28,14是一2个字符宽度计算的 #define CONTRAL_WIDTH 7 //控制区宽,控制区长与游戏区长相同 #define STARTX 15 //画界面的初始坐标X 反省的时刻到了,如果我将屏幕数组包含了边界,那样会简单很多的吧 #define STARTY 1 // ............. Y #define MARK 0xf //检验数 int gamescreen[SCREEN_LENGTH + 2][SCREEN_WIDTH + 2]; //界面数组,包含边框 int blockdata[4][4]; //用于存放方块的数据 //隐藏光标函数 void hide_curcor() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(hOut, &cci); cci.bVisible = false; SetConsoleCursorInfo(hOut, &cci); } //光标跳转函数 void goto_rood(int x, int y) { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(hOut, pos); } //显示文字信息 void Message(char *s, int x, int y) { goto_rood(x, y); puts(s); } void delay(int ms) //延迟函数 {

c语言俄罗斯方块代码

#include #include #include #include /*下面定义了一些控制命令*/ /*重画界面命令*/ #define CMDDRAW 5 /*消去一个满行的命令*/ #define CMDDELLINE 6 /*自动下移一行的命令*/ #define CMDAOTODOWN 7 /*生产新的方块*/ #define CMDGEN 8 /*向左移动的命令,以左箭头<-控制,它的ASCII码值是75*/ #define CMDLEFTMOVE 75 /*向右移动的命令,以右箭头->控制,它的ASCII码值是77*/ #define CMDRINGHTMOVE 77 /*旋转方块的命令,以空格来控制*/ #define CMDROTATE 57 /*向下移动的命令,以向下的箭头控制,它的ASCII码值是80*/ #define CMDDOWNMOVE 80 /*退出游戏的控制命令,以esc键控制,它的ASCII码值是1*/ #define CMDESC 1 /*定义了方块下降的时间间隔*/ #define TIMEINTERV AL 4 /*下面定义了游戏区的大小*/ #define MAXWIDTH 15 #define MAXHEIGHT 30 /*组成方块的小格子的宽度*/ #define BOXWIDTH 15 /*用两个数组来表示新旧两个矩形游戏区*/ int oldarea[MAXHEIGHT+1][MAXWIDTH]; int area[MAXHEIGHT+1][MAXWIDTH]; /*定义一个需要改变的屏幕区域,初次之外的区域不用进行重绘*/ int actW,actH,actX,actY; /*当前方块的一些属性(坐标,颜色,高,宽)*/ int curX,curY,curColor,curW,curH; /*新的方块的一些属性(坐标,颜色,高,宽)*/ int newX,newY,newColor,newW,newH; /*制定方块的状态*/ int active;

c语言俄罗斯方块实验报告

C语言之游戏 俄罗斯方块课程设计报告 专业:[] 学生姓名:[] 指导教师:[] 完成时间:

目录 一、需求分析 ................................. 错误!未定义书签。 二、概要设计 ................................. 错误!未定义书签。 三、详细设计 ................................. 错误!未定义书签。 四、调试分析 (19) 五、用户手册 (20) 六、测试数据 ................................. 错误!未定义书签。 七、附录..................................... 错误!未定义书签。

一、需求分析 1.该程序是完成一个简易的俄罗斯方块的任务,其要完成几个重要的功能:界面,方块下落,旋转,判断是否还能下落,左右移动,分数,速度设置,清楚满的每行,下个方块的预览等; 2.可用#include 的头文件来实用几个函数来控制并完成游戏的界面; 3.可用7个二维5*5数组去实现下落方块的全部类型,再用随机函数使其随机下落; 4.用#include 的头文件去使用按键的控制,以保证用户能够合理操作;并用#include 的头文件来使用rand函数来随机出示七种方块;完成正常的显示和下个方块的预览; 5.用 #include 来运用时针去控制时间; 6.程序执行过程:然后加上几个基本的头文件来执行函数,首先设置按键操作,用:w,a,d,s控制,然后进行界面的初始化设置,启动,时针参数设置,开始新游戏,开始随机下落方块,显示下一个方块,再行旋转,移动,清除,加分,速度参数,最后判断是否已满,停止游戏,打出分数,结束的画面设置,游戏终止... 二、概要设计 该程序中的函数设置总体主要功能大致如下 1.找到合适的方块盒子(7种)使其一一下落 box[MAX_C][5][5] = { /*MAX_C(7)种预定义的盒子*/ 这样用类似的7个5*5二维数组来实现每个盒子方块的形状,自此就引荐两个作为介绍, { {0,0,0,0,0}, {0,0,0,0,0}, {0,0,1,0,0}, {0,1,1,1,0}, {0,0,0,0,0},

c语言数据结构程序设计俄罗斯方块

课程名称《数据结构》课程设计指导老师 所在学院 专业年级 提交日期 成绩 小组成员表

课程设计实验 一、需求分析 我们对俄罗斯方块这个游戏一点也不陌生,知道游戏的玩法和实现后,我们很快就着手开干。游戏要有出现场景、方块、消除方块得分、判断游戏结束等几个大功能。结构清晰简洁便于分工。

二、算法原理介绍 游戏主要使用了数组这个数据结构。不过与以往的程序不同,这个游戏有一个大数组包含很多个小数组,大数组不断的吸收小数组内的元素,达到条件得分。 三、概要设计 1、功能块各函数列表 2、场景的设置 int map[28][17]={ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1}, {0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1}, {0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1}, {0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},

{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} }; void showmap() { int i,j; for(i=5;i<28;i++) { for(j=1;j<17;j++) { gotoxy(2*j,i); if(j==1||j==2||j==15||j==16) {printf("┃");} else if(i==26||i==27) {printf("━");} else if(map[i][j]==1) printf("■"); else if(map[i][j]==0) printf("□"); } } }

一个c语言写的俄罗斯方块的代码

一个c语言写的俄罗斯方块的代码#include <stdlib.h> #include <graphics.h> #include <bios.h> #define mDRAW 5 #define mLINE 6 #define mADOWN 7 #define mGEN 8 #define mLEFT 75 #define mRIGHT 77 #define mSPACE 57

#define mESC 1 #define TIMEINT 2 #define MAXX 9 #define MAXY 30 #define BACKCOLOR BLACK #define WINX 50 #define WINY 470 #define GAP 6 #define AREAX (WINX+GAP) #define AREAY (WINY-GAP)

int oldarea[MAXY+1][MAXX]; int area[MAXY+1][MAXX]; int actW,actH,actX,actY; int curX,curY,curColor,curW,curH; int newX,newY,newColor,newW,newH; int active; int box[4][4]; int FORCOLOR; int MESSAGE; int BOX[7][4][4]={

{ {1,1,1,1}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0} },{ {1,1,1,0}, {1,0,0,0}, {0,0,0,0}, {0,0,0,0} },{

俄罗斯方块C语言代码

> #include <> #include <> #include <> __cplusplus #define __CPPARGS ... #else #define __CPPARGS #define MINBOXSIZE 15 /* 最小方块的尺寸*/ #define BGCOLOR 7 /* 背景着色*/ #define GX 200 #define GY 10 #define SJNUM 10000 /* 每当玩家打到一万分等级加一级*/ /* 按键码*/

#define VK_LEFT 0x4b00 #define VK_RIGHT 0x4d00 #define VK_DOWN 0x5000 #define VK_UP 0x4800 #define VK_HOME 0x4700 #define VK_END 0x4f00 #define VK_SPACE 0x3920 #define VK_ESC 0x011b #define VK_ENTER 0x1c0d /* 定义俄罗斯方块的方向(我定义他为4种)*/ #define F_DONG 0 #define F_NAN 1 #define F_XI 2 #define F_BEI 3 #define NEXTCOL 20 /* 要出的下一个方块的纵坐标*/

#define NEXTROW 12 /* 要出的下一个方块的横从标*/ #define MAXROW 14 /* 游戏屏幕大小*/ #define MAXCOL 20 #define SCCOL 100 /*游戏屏幕大显示器上的相对位置*/ #define SCROW 60 int gril[22][16]; /* 游戏屏幕坐标*/ int col=1,row=7; /* 当前方块的横纵坐标*/ int boxfx=0,boxgs=0; /* 当前寺块的形壮和方向*/ int nextboxfx=0,nextboxgs=0,maxcol=22;/*下一个方块的形壮和方向*/ int minboxcolor=6,nextminboxcolor=6; int num=0; /*游戏分*/ int dj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1};/* 游戏等级*/ /* 以下我用了一个3组来纪录方块的最初形状和方向*/ int boxstr[7][4][16]={{

c语言俄罗斯方块游戏程序设计报告

C语言课程设计报告 主标题: C语言课程设计 副标题:俄罗斯方块游戏 ----界面设计 姓名:卢文俊 指导教师:刘慧 院系:信息工程学院 专业:计算机科学与技术 班级: 11计本(二)班 小组成员:卢文俊,齐伟,陈龙 提交日期: 2012-6-7

俄罗斯方块程序设计报告 一、问题描述: 要求支持键盘操作和7种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,消去一行所得到的分数越高,为玩家提供了不同的选择。 二、功能分析: 俄罗斯方块游戏需要解决的问题包括: ⑴按任意键开始游戏,随机产生方块并自动下移 ⑵用Esc键退出游戏。 ⑶用键变换方块 ⑷用键和键左右移动方块 ⑸用键使方块加速下移 ⑹用空格键使方块直接下移 ⑺能正确判断满行并消行、计分、定级别 ⑻能正确计时 ⑼设定游戏为不同级别,级别越高难度越大 重点: *游戏面包的数据结构:二维数组 *7种形状方块的数据结构:结构体保存每种形状方块的坐标、颜色 三、程序设计: 1、程序总体设计结构:首先初始化进入图形模式,进入欢迎界面,玩家按

任意进入主菜单界面,按键进入游戏界面,键然后设置新的时钟中断。开始游戏后,进入该程序最核心的部分——处理和实现进行过程中的各种事件和函数。在处理中判断游戏是否结束,如果没有结束,则重新开始游戏,否则结束游戏。详解如下: (1)、游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在19种不同的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。 (2)、游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、快速下移、自由下落、旋转功能,以及行满消除行的功能。 俄罗斯方块游戏 初始化图形模式 (欢迎界面) 进入菜单选项 开 始新游戏游 戏 帮 助 游 戏 说 明 退 出 游 戏 游 戏 排 名 开始游戏

C语言编写的《俄罗斯方块》详解

C语言编写的《俄罗斯方块》详解.txt铁饭碗的真实含义不是在一个地方吃一辈子饭,而是一辈子到哪儿都有饭吃。就算是一坨屎,也有遇见屎壳郎的那天。所以你大可不必为今天的自己有太多担忧。335280641 Tc2.0 编写俄罗斯方块游戏 很多编程爱好者都编写过俄罗斯方块的游戏程序。很久以前,我用Tc2.0也做过一个;最近有好些朋友看见我以前的俄罗斯方块的程序后, 问我是怎么做的。我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空。正好现在放假了, 而且离回家还有几天。于是我就把这个程序重新写了一遍,尽量使程序的结构比较清晰好懂一些。同时写了下面的这份东西。 俄罗斯方块游戏的程序中用到了一些方法。为了比较容易理解这些方法,我在讲述的同时写了些专门针对这些方法的示例程序。 这些示例程序力求短小,目的是用最小的代码能够清楚的示例所用的方法。这些示例程序都经过tc2.0测试。 最后还附了完整的俄罗斯方块游戏的源代码,和最终的可执行程序。如果你看了这份东东,有什么意见和想法,请发电子邮件告诉我。 我将会继续更新这分东东,最新的版本可以在我的个人主页上下载。 下面的问题是有关俄罗斯方块程序的,其中有些是朋友问我的,有些是我认为可能会被问到的。我尽量按问题从易到难排列这些问题。 关于俄罗斯方块程序的一些问题: ****************************************************** Tc2.0中怎么样设置图形显示? Tc2.0中常用图形函数的用法? 怎样获取鍵盘输入? 怎样控制方块的移动? 怎样控制时间间隔(用于游戏中控制形状的下落)? 游戏中的各种形状及整个游戏空间怎么用数据表示? 游戏中怎么判断左右及向下移动的可能性? 游戏中怎么判断某一形状旋转的可能性? 按向下方向键时加速某一形状下落速度的处理? 怎么判断某一形状已经到底? 怎么判断某一已经被填满? 怎么消去已经被填满的一行? 怎么消去某一形状落到底后能够消去的所有的行?(如长条最多可以消去四行) 怎样修改游戏板的状态? 怎样统计分数? 怎样处理升级后的加速问题? 怎样判断游戏结束? 关于计分板设计的问题。 关于“下一个”形状取法的问题。

俄罗斯方块C语言程序设计报告

C语言课程设计报告 I、俄罗斯方块游戏需要解决的问题包括: ⑴、随机产生方块并自动下移 ⑵、用Esc键退出游戏 ⑶、用键变体 ⑷、用键和键左右移动方块 ⑸、用空格键使游戏暂停

⑹、能正确判断满行并消行、计分、定级别 ⑺、设定游戏为不同级别,级别越高难度越大 II、俄罗斯方块游戏需要设计的功能函数包括: ⑴、声明俄罗斯方块的结构体 ⑵、函数原型声明 ⑶、制作游戏窗口 (2)、游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、自由下落、旋转功能,以及行满消除行的功能。 (3)、游戏数据显示功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。例如,消除一行加100分,游戏分数达到一定数量

之后,需要给游戏者进行等级的上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加。以上游戏数据均会在游戏界面右侧显示以提示玩家。 (4)、游戏信息提示功能。玩家进入游戏后,将有对本游戏如何操作的友情提示。 (5)、游戏结束退出功能。判断游戏结束条件,通过Esc键进行退出。

游戏是否结束 是 关闭游戏界面返回程序 游戏执行主流程图 2、界面设计 分为左右两个部分: *左边为游戏面板 *右边有三部分:游戏数据提示框、下一个方块提示框和功能提示框

3、重要功能函数设计 1)、声明俄罗斯方块的结构体 struct Tetris { int x; //中心方块的x轴坐标 int y; //中心方块的y轴坐标 int flag; //标记方块类型的序号 int next; //下一个俄罗斯方块类型的序号 void del_full(HANDLE hOut,struct Tetris *); //开始游戏 void start_game(); 3)、制作游戏窗口 void make_frame() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量gotoxy(hOut,FrameX+Frame_width-5,FrameY-2); //打印游戏名称

相关主题
文本预览
相关文档 最新文档