俄罗斯方块很详细还有注释,是我转的(俺正在研究中)

作者在 2010-05-25 12:36:56 发布以下内容
/*俄罗斯方块源代码*/
#include <graphics.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>

void draw_block(int x,int y,int style,int way);
void kill_line(int y);
void draw_little_block(int x,int y,int z,int style);
int check_block(int x,int y,int style);

int change(int *i,int *j,int key);
int style1,style,score,speed,l;
int board[10][20];
char str[100];

struct shape
{
    int xy[8],next;
};
struct shape shapes[19]= /* 19种方块(前8个点表示4个小方块的相对位置 第9点表示类型) */
{
{ 0,-2, 0,-1, 0, 0, 1, 0, 1 },
{-1, 0, 0, 0, 1,-1, 1, 0, 2},
{ 0,-2, 1,-2, 1,-1, 1, 0, 3},
{-1,-1,-1, 0, 0,-1, 1,-1, 0},
{ 0,-2, 0,-1, 0, 0, 1,-2, 5},
{-1,-1, 0,-1, 1,-1, 1, 0, 6},
{ 0, 0, 1,-2, 1,-1, 1, 0, 7},
{-1,-1,-1, 0, 0, 0, 1, 0, 4},
{-1, 0, 0,-1, 0, 0, 1, 0, 9},
{ 0,-2, 0,-1, 0, 0, 1,-1,10},
{-1,-1, 0,-1, 1,-1, 0, 0,11},
{ 0,-1, 1,-2, 1,-1, 1, 0, 8},
{-1, 0, 0,-1, 0, 0, 1,-1,13},
{ 0,-2, 0,-1, 1,-1, 1, 0,12},
{-1,-1, 0,-1, 0, 0, 1, 0,15},
{ 0,-1, 0, 0, 1,-2, 1,-1,14},
{ 0,-3, 0,-2, 0,-1, 0, 0,17},
{-1, 0, 0, 0, 1, 0, 2, 0,16},
{ 0,-1, 0, 0, 1,-1, 1, 0,18}
};

#define MAPXOFT 9 /* 第1个方块的位置 */
#define MAPYOFT 5

#define MAPXOFT1 18 /* 下一个方块的位置 */
#define MAPYOFT1 17

#define LEFT 0x4b00 /*按键宏定义*/
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define ENTER 0x1c0d
/*-----------------------------------主函数-------------------------------------------*/
int main()
{
    int gdriver,gmode,
    i,j,key,x0=5,y0=1,m,n,c,key1,p,q,le=0,b;
    l=1,score=0;
    gdriver=DETECT;
    initgraph(&gdriver,&gmode," ");
    randomize();
    for(m=0;m<=9;m++)
        for(n=0;n<=19;n++)
            board[m][n]=0; /* 初始游戏版 */
    getch();
    settextstyle(0,0,1);
    cleardevice();
    setcolor(LIGHTRED); /* 画出游戏所在的范围图 */
    setlinestyle(0,0,3);
    setfillstyle(1,14);
    rectangle(157,419,533,429);
    floodfill(300,424,LIGHTRED);
    
    setcolor(LIGHTRED);
    setlinestyle(0,0,3);
    setfillstyle(1,14);
    rectangle(147,95,157,429);
    floodfill(152,200,LIGHTRED);
    
    setcolor(LIGHTRED);
    setlinestyle(0,0,3);
    setfillstyle(1,14);
    rectangle(323,95,333,429);
    floodfill(330,320,LIGHTRED);
    
    setcolor(LIGHTRED);
    setlinestyle(0,0,1);
    setfillstyle(1,BLUE);
    rectangle(450,50,500,70);
    floodfill(455,55,LIGHTRED);

    key=bioskey(0);
    if(key==ENTER)
    {
        style=random(19);
        for(m=1;m<=le;m++) /* 具体的对高度的调整 */
        {
            b=random(7)+1;
            for(n=1;n<=10;n++)
            {
                if(random(2))
                {
                    board[n-1][20-m]=1;
                    draw_little_block(MAPXOFT+n,MAPYOFT+21-m,1,b);
                }
            }
        }
        while(1)
        {
            while(1)
            {
                i=x0,j=y0;
                style1=random(19);
                setcolor(14); /* 画出下一个方块 */
                draw_block(MAPXOFT1,MAPYOFT1,style1,1);
                for(j=y0;j<=20;j++)
                {
                    while(1)
                    {
                        if(bioskey(1)) /* 方块的调整 */
                        {
                            key=bioskey(0);
                            change(&i,&j,key);
                        }
                        if(!check_block(i,j+1,style)) /* 判断方块能不能下降 */
                            break;
                        if(j==20)
                            break;
                        if(speed==1)
                        {
                            draw_block (i,j,style,0); /* 方块的下降 */
                            j++;
                            draw_block(i,j,style,1);
                            delay(10000);
                        }
                        if(speed!=1)
                        {
                            m++;
                            delay(10000);
                            if(m>=3*(10-l))
                            {
                                m=0;
                                draw_block(i,j,style,0); /* 方块的下降 */
                                j++;
                                draw_block(i,j,style,1);
                            }
                        }
                    }
                    speed=0;
                    for(m=0;m<=6;m+=2) /* 对有方块的位置给予1 的数值 */
                        board[i+shapes[style].xy[m]-1][j+shapes[style].xy[m+1]-1]=1;
                    
                    if(l==1) /* 显示当前游戏等级 */
                    {
                        setcolor(LIGHTRED);
                        setlinestyle(0,0,1); /* 容易的速度 */
                        setfillstyle(1,10);
                        rectangle(10,65,110,85);
                        floodfill(15,75,LIGHTRED);
                        outtextxy(7,70," easy speed");
                    }
                    
                    kill_line(j);
                    if(j==20)
                        break;
                    if(!check_block(i,j+1,style))
                        break;
                }
                draw_block(MAPXOFT1,MAPYOFT1,style1,0);
                /* 对下1个方块显示位置进行覆盖 */
                style=style1; /* 使的方块和显示的方块一样 */
                if(j==1) /* 关机的画面 */
                {
                    setcolor(14);
                    settextstyle(0,0,2);
                    outtextxy(170,200,"GAME OVER");
                    outtextxy(170,240,"THANK YOU");
                    sleep(3);
                    exit(0);
                }
            }
        }
    }
    getch();
}

/*****************************************************************************************************************/
/* -------------------------------方块的具体的变化(移动 变形 下降)----------------------- */
int change(int *i,int *j,int key)
{
    if(key==UP&&check_block(*i,*j,shapes[style].next)) /* 变形 */
    {
        draw_block(*i,*j,style,0);
        style=shapes[style].next;
        draw_block(*i,*j,style,1);
    }
    else if(key==LEFT&&check_block(*i-1,*j,style)) /* 移动 */
    {
        draw_block(*i,*j,style,0);
        (*i)--;
        draw_block(*i,*j,style,1);
    }
    else if(key==RIGHT&&check_block(*i+1,*j,style))
    {
        draw_block(*i,*j,style,0);
        (*i)++;
        draw_block(*i,*j,style,1);
    }
    else if(key==DOWN&&check_block(*i,*j+1,style)) /* 下降 */
    {
        draw_block(*i,*j,style,0);
        (*j)++;
        draw_block(*i,*j,style,1);
        speed=1;
    }
    else if(key==ESC) /* 退出 */
        exit(0);
}
/* ----------------------画出方块 的位置------------------------------ */
void draw_block(int x,int y,int style,int way)
{
    int x1=x+MAPXOFT,y1=y+MAPYOFT;
    int i;
    if(way==1)
        setcolor(WHITE);
    else
        setcolor(BLACK);
    for(i=0;i<=6;i+=2)
        draw_little_block(x1+shapes[style].xy[ i],y1+shapes[style].xy[i+1],way,style);
}

/* ------------------------------画 出方块的每一个小方块的形状(方块的色彩)--------------------------------- */
void draw_little_block(int x,int y,int z,int style)
{
    int m,n;
    if(z==1) /* 对色彩的调整 */
    {
        if(0<=style&&style<=3)
            n=2;
        if(4<=style&&style<=7)
            n=3;
        if(8<=style&&style<=11)
            n=4;
        if(12<=style&&style<=13)
            n=5;
        if(14<=style&&style<=15)
            n=6;
        if(16<=style&&style<=17)
            n=7;
        if(style==18)
            n=8;
        m=1;
    }
    if(z==0)
    {
        m=0,n=0;
    }
    setcolor(m);
    setfillstyle(1,n);
    rectangle(x*16,y*16,x*16+16,y*16+16);
    floodfill(x*16+2,y*16+2,m);
}
/*----------------------------------- 消行----------------------------------- */
void kill_line(int y)
{
    int i,t=1,j,k,color=random(7)+1;
    for(;y>=1&&t<=4;y--,t++) /* 对4行进行验证 */
    {
        for(i=1;i<=10;i++)
            if(!board[i-1][y-1]) /* 严整1行的数组是不是全 为1 */
                break;
        if(i==11)
        {
            setcolor(LIGHTRED); /* 对积分底色的画法 */
            setlinestyle(0,0,1);
            setfillstyle(1,BLUE);
            rectangle(450,50,500,70);
            floodfill(455,55,LIGHTRED);
            score++; /* 每消去1行 可以得1分 */
            setcolor(14);
            itoa(score,str,10);
            outtextxy(460,55,str);
            if(score!=0&&score%3==0)
                l++; /* 每次分到一定位置是 速度进行提高(目前是3行加1次 可以调整) */
            setcolor(14); /* 每次消去是进行庆祝模式 */
            settextstyle(0,0,4);
            outtextxy(10,310,"COOL");
            outtextxy(10,270,"^_^");
            delay(100000000);
            delay(100000000);
            delay(100000000);
            setcolor(BLACK);
            settextstyle(0,0,4);
            outtextxy(10,310,"COOL");
            outtextxy(10,270,"^_^");
            settextstyle(0,0,1);
            if(score%3==0&&score!=0)
            {
                setcolor(14);
                settextstyle(0,0,2);
                outtextxy(10,435,"CONGRATULATION ON YOU ^_^");
                sleep(2);
                setcolor(BLACK);
                settextstyle(0,0,2);
                outtextxy(10,435,"CONGRATULATION ON YOU ^_^ ");
                settextstyle(0,0,1);
            }
            for(k=1;k<=10;k++) /* 对满了行进行消去 */
            {
                setcolor(BLACK);
                draw_little_block (k+MAPXOFT,y+MAPYOFT,0,2);
            }
            for(j=y-1;j>=1;j--) /* 消去1行后 用上面的累下来(并且调整色彩) */
                for(k=1;k<=10;k++)
                {
                    board[k-1][j]=board[k-1][j-1];
                    if(board[k-1][j])
                    {
                        setcolor(BLACK);
                        draw_little_block (k+MAPXOFT,j+MAPYOFT,0,2);
                        setcolor(WHITE);
                        draw_little_block (k+MAPXOFT,j+1+MAPYOFT,1,color);
                    }
                }
            delay(100000000000);
            y++;
        }
    }
}

/*---------------------------------- 验证能不能往下1 个位置累方块------------------------------------ */
int check_block(int x,int y,int style)
{
    int x1=x+MAPXOFT,y1=y+MAPYOFT;
    int x2,y2,i;
    for(i=0;i<=6;i+=2)
    {
        x2=x1+shapes[style].xy[ i];
        y2=y1+shapes[style].xy[i+1];
        if(x2>=10&&x2<20&&y2<26&&(y2<6||board[x2-10][y2-6]==0))
            continue;
        else
            break;
    }
    if(i==8)
        return 1;
    else
        return 0;
    getch();
}
 
默认分类 | 阅读 1185 次
文章评论,共8条
xiaoyaoo
2010-05-27 15:08
1
你用什么工具写的啊?为什么我在vc上运行一下他显示错误‘graphics.h': No such file or directory。。。
Spygg(作者)
2010-05-27 20:38
2
<div class="quote"><span class="q"><b>xiaoyaoo</b>: 你用什么工具写的啊?为什么我在vc上运行一下他显示错误‘graphics.h': No such file or directory。。。</span></div>呵呵,这个是用tc运行的,那个graphics.h是tc的头文件vc没有,就算在tc环境下运行也会出同样的问题,最简单的解决方法是:找到tc下EGAVGA.BGI这个文件和程序放在一块,其他的方法网上有
暗夜の似火
2010-05-31 14:11
3
好多问题···我都没法运行,还看不等···哎···
李臣
2010-06-03 15:10
4
在tuborc++下编译的吧,那要是在vc++下编译该咋改写呢
Spygg(作者)
2010-06-03 15:21
5
<div class="quote"><span class="q"><b>李臣</b>: 在tuborc++下编译的吧,那要是在vc++下编译该咋改写呢</span></div>网上有VC下图形编程你搜下
源本英明C
2010-06-11 09:17
6
jj
风飏
2010-07-17 20:48
7
晕倒 我在研究c#的俄罗斯方块
Spygg(作者)
2010-07-18 23:46
8
<div class="quote"><span class="q"><b>风飏</b>: 晕倒 我在研究c#的俄罗斯方块</span></div>看了一下很纠结其中的图形实现,用tc实现有时候就会死机很郁闷,就没看了……<img src="image/face/9.gif" class="face">
游客请输入验证码
浏览52024次
文章分类