#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;
/*存储当前方块的数组*/
int box[4][4];
/*当前方块的颜色*/
int BOXCOLOR;
/*控制命令*/
int CMD;
/*定义七种基本的方块形状*/
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}},
{{1,1,1,0},{0,0,1,0},{0,0,0,0},{0,0,0,0}},
{{1,1,1,0},{0,1,0,0},{0,0,0,0},{0,0,0,0}},
{{1,1,0,0},{0,1,1,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}},
{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}}
};
/*得到方块的宽度,即从右向左第一个不空的列*/ int GetWidth()
{
int i,j;
for(i=3;i>0;i--)
for(j=0;j<4;j++)
if(box[j][i]) return i;
return 0;
}
/*得到方块的高度,从上往下第一个不空的行*/ int GetHeight()
{
int i,j;
for(j=3;j>0;j--)
for(i=0;i<4;i++)
if(box[j][i]) return j;
return 0;
}
/*清除原有的方块占有的空间*/
void ClearOldspace()
{
int i,j;
for(j=0;j<=curH; j++)
for(i=0;i<=curW; i++)
if(box[j][i])
area[curY+j][curX+i]=0;
}
/*置位新方块的位置*/
void PutNewspace()
{
int i,j;
for(j=0;j<=newH;j++)
for(i=0;i<=newW;i++)
if(box[j][i])
area[newY+j][newX+i]=BOXCOLOR;
}
/*判断方块的移动是否造成区域冲突*/
int MoveCollision(int box[][4])
{
int i,j;
if(newX<0) return 1;
if(newX+newW>=MAXWIDTH) return 1;
if(newY<0) return 1;
for(j=0;j<=newH;j++)
for(i=0;i<=newW;i++)
if(area[newY+j][newX+i]&&box[j][i]) return 1;
return 0;
}
/*判断翻转方块是否造成区域的冲突*/
int RotateBoxCollision(int box[][4])
{
int i,j;
if(newX+newW>=MAXWIDTH) newX=MAXWIDTH-1-newW;
if(newY+newH>=MAXHEIGHT) newY=MAXHEIGHT-1-newH;
if(MoveCollision(box)) return 1;
for(i=0;i<=newW;i++)
for(j=0;j<=newH;j++)
if(area[newY+j][newX+i])
{
newX-=newW-i+1; goto L;
}
L: return MoveCollision(box);
}
/*游戏结束*/
int GameOver()
{
if(!active &&(curY+curH>MAXHEIGHT-3))
return 1;
else
return 0;
}
/*判断是否超时,即是否超过允许的时间间隔*/
int TimeOut()
{
static long tm,old;
tm=biostime(0,tm);
if(tm-old return 0; else { old=tm; return 1; } } /*重绘游戏区*/ void DrawSpace() { int row,col,x1,y1,x2,y2; for(row=actY;row<=actY+actH;row++) for(col=actX;col<=actX+actW;col++) if(area[row][col]!=oldarea[row][col]) { if(area[row][col]==0) setfillstyle(SOLID_FILL,BLACK); else setfillstyle(SOLID_FILL,BOXCOLOR); x1=56+col*BOXWIDTH; x2=x1+BOXWIDTH; y1=464-(row+1)*BOXWIDTH; y2=y1+BOXWIDTH; bar(++x1,++y1,--x2,--y2); oldarea[row][col]=area[row][col]; } CMD=0; } /*消去满行*/ void ClearFullline() { int row,col, rowEnd,full,i,j; rowEnd=newY+newH; if(rowEnd>=MAXHEIGHT-1) rowEnd=MAXHEIGHT-2; for(row=newY; row<=rowEnd;) { full=1; for(col=0;col if(!area[row][col]) {full=0; break;} if(!full) { ++row; continue; } for(j=row; j for(i=0;i area[j][i]=area[j+1][i]; actX=0; actY=row; actW=MAXWIDTH-1; actH=MAXHEIGHT-1-row; DrawSpace(); rowEnd--; } CMD=CMDGEN; } /*向左移动方块*/ int MoveLeft() { newX=curX-1; ClearOldspace(); if(MoveCollision(box)) { newX=curX; PutNewspace(); CMD=0; return 0; } PutNewspace(); actW=curW+1; actX=curX=newX; CMD=CMDDRAW; return 1; } /*向右移动方块*/ int MoveRight() { newX=curX+1; ClearOldspace(); if(MoveCollision(box)) { newX=curX; PutNewspace(); CMD=0; return 0; } PutNewspace(); actW=curW+1; actX=curX; curX=newX; CMD=CMDDRAW; return 1; } /*向下移动方块*/ int MoveDown() { int i,j; newY=curY-1; ClearOldspace(); if(MoveCollision(box)) { newY=curY; PutNewspace(); active=0; CMD=CMDDELLINE; return 0; } PutNewspace(); actH=curH+1; actY=newY; curY=newY; CMD=CMDDRAW; return 1; } /*按加速键后方块迅速下落到底*/ void MoveBottom() { while(active) { MoveDown(); DrawSpace(); } CMD=CMDDELLINE; } /*初始化*/ void InitialGame() { int i,j,x1,y1,x2,y2; int driver=DETECT, mode=0; initgraph(&driver,&mode,"e:\\tc"); cleardevice(); randomize(); setfillstyle(SOLID_FILL,BLUE); bar(0,0,639,479); x1=56; y1=464-BOXWIDTH*MAXHEIGHT; x2=56+MAXWIDTH*BOXWIDTH; y2=464; rectangle(--x1,--y1,++x2,++y2); setfillstyle(SOLID_FILL,BLACK); bar(++x1,++y1,--x2,--y2); y1=464-MAXHEIGHT*BOXWIDTH; y2=464; setcolor(DARKGRAY); for(i=0;i { x1=56+i*BOXWIDTH; line(x1,y1,x1,y2); } x1=56; x2=x1+MAXWIDTH*BOXWIDTH; for(j=0;j { y1=464-j*BOXWIDTH; line(x1,y1,x2,y1); } for(j=0;j for(i=0;i area[j][i]=oldarea[j][i]=0; actX=0; actY=0; actW=MAXWIDTH-1; actH=MAXHEIGHT-1; DrawSpace(); CMD=CMDGEN; } /*得到控制命令*/ void GetCMD() { if(CMD) return; if(TimeOut()) { CMD=CMDAOTODOWN; return; } if(bioskey(1)) { CMD=bioskey(0)>>8; return; } } /*生成一个新的方块*/ int GenerateNewbox() { int i,j,boxidx; boxidx=random(7); BOXCOLOR=random(7)+1; for(j=0;j<4;j++) for(i=0;i<4;i++) box[j][i]=BOX[boxidx][j][i]; curW=GetWidth(); curH=GetHeight(); curX=(MAXWIDTH+curW)/2; if(curX+curW>=MAXWIDTH)curX=MAXWIDTH-1-curW; curY=MAXHEIGHT-1-curH; newX=curX; newY=curY; actX=curX;actY=curY; actW=newW=curW; actH=newH=curH; active=1; if(MoveCollision(box)) return 0; PutNewspace(); DrawSpace(); CMD=0; return 1; } /*翻转方块*/ int RotateBox() { int newBox[4][4]; int i,j; ClearOldspace(); for(j=0;j<4;j++) for(i=0;i<4;i++) newBox[j][i]=0; for(j=0;j<4;j++) for(i=0;i<4;i++) newBox[curW-i][j]=box[j][i]; newW=curH; newH=curW; if(RotateBoxCollision(newBox)) { newW=curW; newH=curH; newX=curX; newY=curY; PutNewspace(); CMD=0; return 0; } for(j=0;j<4;j++) for(i=0;i<4;i++) box[j][i]=newBox[j][i]; PutNewspace(); actH=newH>curH? newH:curH; actW=curX+actH-newX; actX=newX; actY=newY; curX=newX; curY=newY; curW=newW; curH=newH; CMD=CMDDRAW; return 1; } /*根据获得的命令来执行不同的操作*/ void ExecuteCMD() { switch(CMD) { case CMDLEFTMOVE: MoveLeft(); break; case CMDRINGHTMOVE: MoveRight(); break; case CMDAOTODOWN: MoveDown(); break; case CMDROTATE: RotateBox(); break; case CMDDOWNMOVE: MoveBottom(); break; case CMDDRAW: DrawSpace(); break; case CMDDELLINE: ClearFullline(); break; case CMDGEN: GenerateNewbox(); break; case CMDESC: closegraph(); return 0; default: CMD=0; } } /*主函数*/ int main() { int i; InitialGame(); do { GetCMD(); ExecuteCMD(); } while(!GameOver()); getch(); closegraph(); return 0; } /*学无止境*/ #include 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; 课程设计 俄罗斯方块改进 2016年4月20 日 设计题目 学号 专业班级 学生姓名 指导教师 目录 1. 课程设计目的错误!未定义书签。 2. 功能分析错误!未定义书签。 3. 程序设计实现过程错误!未定义书签。 程序总体设计结构错误!未定义书签。 界面设计错误!未定义书签。 重要数据的数据结构设计错误!未定义书签。函数设计错误!未定义书签。 4. 运行效果错误!未定义书签。 5. 源代码详解错误!未定义书签。 6. 参考文献错误!未定义书签。 俄罗斯方块改进 1. 课程设计问题 据百度百科,俄罗斯方块(Tetris)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。游戏的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。 要求支持键盘操作和7种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,消去一行所得到的分数越高,为玩家提供了不同的选择。 2. 功能分析 俄罗斯方块游戏需要解决的问题包括: ⑴按任意键开始游戏,随机产生方块并自动下移 ⑵用Esc键退出游戏。 ⑶用键变换方块 ⑷用键和键左右移动方块 ⑸用键使方块加速下移 ⑹用空格键使方块暂停 ⑺能正确判断满行并消行、计分、定级别 ⑻设定游戏方块为不同形状重点: *游戏面包的数据结构:二维数组 *7种形状方块的数据结构:结构体保存每种形状方块的坐标 3. 程序设计实现过程 程序总体设计结构 首先初始化进入图形模式,进入欢迎界面,玩家按任意进入主菜单界面,按键进入游戏界面,键然后设置新的时钟中断。开始游戏后,进入该程序最核心的部分——处理和实现进行过程中的各种事件和函数。在处理中判断游戏是否结束,如果没有结束,则重新开始游戏,否则结束游戏。 详解如下: (1)游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在19种不同的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。 【转载】88行代码实现俄罗斯方块游戏(含讲解) 来源:https://www.doczj.com/doc/5315553614.html,/p/8 在正式阅读本文之前,请你记得你应该用娱乐的心态来看, 本代码所使用到的技巧,在工作了的人眼里会觉得很纠结,很蛋疼,很不可理喻,很丑, 注意,是你蛋疼,不关我的事 通常,写一个俄罗斯方块,往往动不动就几百行,甚至上千行,而这里只有88行 正所谓头脑风暴,打破常规。这里将使用很多不平常的手段来减少代码 以下是Win-TC可以成功编译并执行的代码(代码保证单行长度不超过80字符,如果你是Win7系统,那请看后文): 程序代码: #include"graphics.h" #include 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 C语言课程设计报告 俄罗斯方块程序设计报告 一、问题描述 俄罗斯方块(Tetris,俄文:Тетрис)是一款电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。 在本次设计中,要求支持键盘操作和若干种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,为玩家提供了不同的选择。 二、功能分析 I、俄罗斯方块游戏需要解决的问题包括: ⑴、随机产生方块并自动下移 ⑵、用Esc键退出游戏 ⑶、用键变体 ⑷、用键和键左右移动方块 ⑸、用空格键使游戏暂停 ⑹、能正确判断满行并消行、计分、定级别 ⑺、设定游戏为不同级别,级别越高难度越大 II、俄罗斯方块游戏需要设计的功能函数包括: ⑴、声明俄罗斯方块的结构体 ⑵、函数原型声明 ⑶、制作游戏窗口 ⑷、制作俄罗斯方块 ⑸、判断是否可动 ⑹、随机产生俄罗斯方块类型的序号 ⑺、打印俄罗斯方块 ⑻、清除俄罗斯方块的痕迹 ⑼、判断是否满行并删除满行的俄罗斯方块 三、程序设计 1、程序总体结构设计 (1)、游戏方块预览功能。在游戏过程中,游戏界面右侧会有预览区。由于在此游戏中存在多种不同的游戏方块,所以在游戏方块预览区域中显示随机生成的游戏方块有利于游戏玩家控制游戏的策略。 (2)、游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、自由下落、旋转功能,以及行满消除行的功能。 (3)、游戏数据显示功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。例如,消除一行加100分,游戏分数达到一定数量 来如鹏挺长时间了,受益很多希望更多的朋学加入进来 做俄罗斯方块是因为无意中在杨老师的帖子看到说最少也要能做出俄罗斯方块这样的东西出来,我想这个意思能做出俄罗斯方块就说明水平到了一个层次了吧。 刚才注意到音乐播放器居然下载超过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); ````````` 学院:数计学院 班级:13级数媒班 学号: 姓名: 摘要 …………………………………………………………………………………………………….. 关键字: 目录 第一部分设计总概........................................................................................................................... 摘要………………………………………………………………………………………………… 一、设计目的............................................................................................................................. 二、设计要求............................................................................................................................. 三、设计内容............................................................................................................................. 四、系统分析与设计................................................................................................................. 第二部分数据结构设计................................................................................................................... 第三部分功能实现与程序调试………………………………………………………………….第四部分完成设计........................................................................................................................... 一、实习日记............................................................................................................................. 二、实习总结............................................................................................................................. 三、教师评语............................................................................................................................. 四、程序使用说明书…………………………………………………………………………. 第一部分设计总概 一、设计目的 二、设计要求 三、设计内容 四、系统分析与设计 其中的主要逻辑有: (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版本。 /*学无止境*/ #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; #include #include C语言之游戏 俄罗斯方块课程设计报告 专业:[] 学生姓名:[] 指导教师:[] 完成时间: 目录 一、需求分析 ................................. 错误!未定义书签。 二、概要设计 ................................. 错误!未定义书签。 三、详细设计 ................................. 错误!未定义书签。 四、调试分析 (19) 五、用户手册 (20) 六、测试数据 ................................. 错误!未定义书签。 七、附录..................................... 错误!未定义书签。 一、需求分析 1.该程序是完成一个简易的俄罗斯方块的任务,其要完成几个重要的功能:界面,方块下落,旋转,判断是否还能下落,左右移动,分数,速度设置,清楚满的每行,下个方块的预览等; 2.可用#include 课程名称《数据结构》课程设计指导老师 所在学院 专业年级 提交日期 成绩 小组成员表 课程设计实验 一、需求分析 我们对俄罗斯方块这个游戏一点也不陌生,知道游戏的玩法和实现后,我们很快就着手开干。游戏要有出现场景、方块、消除方块得分、判断游戏结束等几个大功能。结构清晰简洁便于分工。 二、算法原理介绍 游戏主要使用了数组这个数据结构。不过与以往的程序不同,这个游戏有一个大数组包含很多个小数组,大数组不断的吸收小数组内的元素,达到条件得分。 三、概要设计 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语言写的俄罗斯方块的代码#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} },{ > #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语言课程设计 副标题:俄罗斯方块游戏 ----界面设计 姓名:卢文俊 指导教师:刘慧 院系:信息工程学院 专业:计算机科学与技术 班级: 11计本(二)班 小组成员:卢文俊,齐伟,陈龙 提交日期: 2012-6-7 俄罗斯方块程序设计报告 一、问题描述: 要求支持键盘操作和7种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,消去一行所得到的分数越高,为玩家提供了不同的选择。 二、功能分析: 俄罗斯方块游戏需要解决的问题包括: ⑴按任意键开始游戏,随机产生方块并自动下移 ⑵用Esc键退出游戏。 ⑶用键变换方块 ⑷用键和键左右移动方块 ⑸用键使方块加速下移 ⑹用空格键使方块直接下移 ⑺能正确判断满行并消行、计分、定级别 ⑻能正确计时 ⑼设定游戏为不同级别,级别越高难度越大 重点: *游戏面包的数据结构:二维数组 *7种形状方块的数据结构:结构体保存每种形状方块的坐标、颜色 三、程序设计: 1、程序总体设计结构:首先初始化进入图形模式,进入欢迎界面,玩家按 任意进入主菜单界面,按键进入游戏界面,键然后设置新的时钟中断。开始游戏后,进入该程序最核心的部分——处理和实现进行过程中的各种事件和函数。在处理中判断游戏是否结束,如果没有结束,则重新开始游戏,否则结束游戏。详解如下: (1)、游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在19种不同的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。 (2)、游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、快速下移、自由下落、旋转功能,以及行满消除行的功能。 俄罗斯方块游戏 初始化图形模式 (欢迎界面) 进入菜单选项 开 始新游戏游 戏 帮 助 游 戏 说 明 退 出 游 戏 游 戏 排 名 开始游戏 C语言编写的《俄罗斯方块》详解.txt铁饭碗的真实含义不是在一个地方吃一辈子饭,而是一辈子到哪儿都有饭吃。就算是一坨屎,也有遇见屎壳郎的那天。所以你大可不必为今天的自己有太多担忧。335280641 Tc2.0 编写俄罗斯方块游戏 很多编程爱好者都编写过俄罗斯方块的游戏程序。很久以前,我用Tc2.0也做过一个;最近有好些朋友看见我以前的俄罗斯方块的程序后, 问我是怎么做的。我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空。正好现在放假了, 而且离回家还有几天。于是我就把这个程序重新写了一遍,尽量使程序的结构比较清晰好懂一些。同时写了下面的这份东西。 俄罗斯方块游戏的程序中用到了一些方法。为了比较容易理解这些方法,我在讲述的同时写了些专门针对这些方法的示例程序。 这些示例程序力求短小,目的是用最小的代码能够清楚的示例所用的方法。这些示例程序都经过tc2.0测试。 最后还附了完整的俄罗斯方块游戏的源代码,和最终的可执行程序。如果你看了这份东东,有什么意见和想法,请发电子邮件告诉我。 我将会继续更新这分东东,最新的版本可以在我的个人主页上下载。 下面的问题是有关俄罗斯方块程序的,其中有些是朋友问我的,有些是我认为可能会被问到的。我尽量按问题从易到难排列这些问题。 关于俄罗斯方块程序的一些问题: ****************************************************** Tc2.0中怎么样设置图形显示? Tc2.0中常用图形函数的用法? 怎样获取鍵盘输入? 怎样控制方块的移动? 怎样控制时间间隔(用于游戏中控制形状的下落)? 游戏中的各种形状及整个游戏空间怎么用数据表示? 游戏中怎么判断左右及向下移动的可能性? 游戏中怎么判断某一形状旋转的可能性? 按向下方向键时加速某一形状下落速度的处理? 怎么判断某一形状已经到底? 怎么判断某一已经被填满? 怎么消去已经被填满的一行? 怎么消去某一形状落到底后能够消去的所有的行?(如长条最多可以消去四行) 怎样修改游戏板的状态? 怎样统计分数? 怎样处理升级后的加速问题? 怎样判断游戏结束? 关于计分板设计的问题。 关于“下一个”形状取法的问题。 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); //打印游戏名称C语言俄罗斯方块游戏源代码
C语言课程设计报告 俄罗斯方块改进版
俄罗斯方块C语言代码
C语言课程设计俄罗斯方块源代码
俄罗斯方块C语言程序设计报告
教你用c语言写俄罗斯方块
C语言编写俄罗斯方块实验报告
C语言程序设计-俄罗斯方块源程序
C语言俄罗斯方块游戏源代码
C语言俄罗斯方块(详解..)
c语言俄罗斯方块代码
c语言俄罗斯方块实验报告
c语言数据结构程序设计俄罗斯方块
一个c语言写的俄罗斯方块的代码
俄罗斯方块C语言代码
c语言俄罗斯方块游戏程序设计报告
C语言编写的《俄罗斯方块》详解
俄罗斯方块C语言程序设计报告