| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1449 人关注过本帖
标题:我也写个俄罗斯方块
取消只看楼主 加入收藏
虾B写
Rank: 8Rank: 8
来 自:湖北
等 级:蝙蝠侠
威 望:3
帖 子:395
专家分:922
注 册:2009-10-1
结帖率:100%
收藏
 问题点数:0 回复次数:4 
我也写个俄罗斯方块
双休日写的,还要吃饭拉屎看NBA,所以写的很仓促,但是能玩了,剩下的时间我要看电影,就写到这了

e.zip (72.8 KB)
EXE文件

对C不熟,写的不好

程序代码:
#include <gl/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static int ma1[]={24,74};
static int ma2[]={426,576};

static int dat[4][4][4]={
    {{0,0,0,0},{0,1,1,0},{0,1,1,0},{0,0,0,0}},
    {{0,1,1,0},{0,1,0,0},{0,1,0,0},{0,0,0,0}},
    {{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0}},
    {{0,1,0,0},{0,1,1,0},{0,0,1,0},{0,0,0,0}}
};

static int a[4][4]={{0,1,1,0},{0,1,0,0},{0,1,0,0},{0,0,0,0}};
static int oi[26][20];
static int xe=25,ye=75;

static int l=0;

void arrayH(int ar[4][4]){

    int i,o,af[4][4];
    for(i=0;i<4;i++){
        for(o=0;o<4;o++){    
            af[o][3-i]=ar[i][o];
        }
    }
    for(i=0;i<4;i++){
        for(o=0;o<4;o++){    
            ar[i][o]=af[i][o];
        }
    }
}



void createRect(int x1,int y1,int x2,int y2){
    glColor3f(0,0,0);
    glBegin(GL_POLYGON);
        glVertex2i(x1,y1);
        glVertex2i(x2,y1);
        glVertex2i(x2,y2);
        glVertex2i(x1,y2);
    glEnd();
    glColor3f(0,1,1);
    glBegin(GL_LINE_LOOP);
        glVertex2i(x1,y1);
        glVertex2i(x2,y1);
        glVertex2i(x2,y2);
        glVertex2i(x1,y2);
    glEnd();
}

 
int getD(){
    int i,ii;
    for(i=0;i<4;i++){
        for(ii=0;ii<4;ii++){
            if(a[i][ii]==1 && oi[(ye-75)/20+i][(xe-25)/20+ii]==1){return 1;}
        }
    }
    return 0;
}

void ji(int* i,int x,int y,int al,int la){
    int q,p,xx,yy;
    for(q=0;q<la;q++){
        for(p=0;p<al;p++){
            if(i[q*al+p]==1){
                xx=p*20+x;
                yy=q*20+y;
                createRect(xx,yy,xx+20,yy+20);
                //printf("%d",xx);
            }
        }
    }
}

void display(){
    int i;
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0,0,0);
    glBegin(GL_LINE_LOOP);
        glVertex2iv(ma1);
        glVertex2i(ma2[0],ma1[1]);
        glVertex2iv(ma2);
        glVertex2i(ma1[0],ma2[1]);
    glEnd();

    ji(&a[0][0],xe,ye,4,4);
    ji(&oi[0][0],25,75,20,25);
    for(i=0;i<20;i++){
        if(oi[4][i]==1){
            glutIdleFunc(NULL);
        }
    }
    glutSwapBuffers();

}

void ae(){
    int i,ii,da,y,n;
    if(l++>2500){
        ye+=20;
        if(getD()){            
            ye-=20;
            for(i=0;i<4;i++){
                for(ii=0;ii<4;ii++){
                    if(a[i][ii]==1){oi[(ye-75)/20+i][(xe-25)/20+ii]=a[i][ii];}
                }
            }
            ye=75;
            xe=25;
            da=rand() << (sizeof(double)*8-3) >> (sizeof(double)*8-3);
            if(da<0)
                da=-da;            
            for(i=0;i<4;i++){
                for(ii=0;ii<4;ii++){
                    a[i][ii]=dat[da][i][ii];
                }
            }


        }
        l=0;
        for(i=0;i<25;i++){
            da=1;
            for(ii=0;ii<20;ii++){
                if(oi[i][ii]==0){da=0;}
            }
            if(da){
                for(y=i;y>4;y--){
                    for(ii=0;ii<20;ii++){
                        oi[y][ii]=oi[y-1][ii];
                    }
                }
            }

        }

    
    }
    glutPostRedisplay();
}

int getY(){
    int i,ii;
    for(i=0;i<4;i++){
        for(ii=0;ii<4;ii++){
            if(((xe-25)/20+ii)<0  && a[i][ii]==1){
                return 1;
            }else if(((xe-25)/20+ii)>19 && a[i][ii]==1){
                return -1;
            }
        }
    }
    return 0;

}
void an(unsigned char key,int x,int y){
    int i;
    printf("软盘按下(%d)\n",key);
    if(key==119){
        arrayH(a);
            //printf("%d", );
    }else if(key==97){
        xe-=20;
    }else if(key==100){
        xe+=20;
    }else if(key==115){l+=2500;}
    i=getY();
    while(i!=0){
        xe=xe+i*20;
        i=getY();
    }
}



int main(){
    int o,i;
    for(i=0;i<20;i++){
        oi[25][i]=1;
    }

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(450,650);
    glutInitWindowPosition(20,20);
    glutCreateWindow("俄罗斯方块");
    glClearColor(1,1,1,1);
    glOrtho(0,450,650,0,-1,1);
    glutDisplayFunc(display);
    glutIdleFunc(ae);
    glutKeyboardFunc(an);
    glutMainLoop();
}
搜索更多相关主题的帖子: 俄罗斯方块 
2012-11-11 13:01
虾B写
Rank: 8Rank: 8
来 自:湖北
等 级:蝙蝠侠
威 望:3
帖 子:395
专家分:922
注 册:2009-10-1
收藏
得分:0 
W变
A左  D右

S下

白娘故意下雨骗许仙的伞。祝英台十八里相送时装疯卖傻调戏梁山伯。七仙女挡住了董永的去路。牛郎趁织女洗澡时拿走了她的衣服。。。这些故事告诉我们;伟大爱情的开始,总归的有一个要先耍流氓!
2012-11-11 13:05
虾B写
Rank: 8Rank: 8
来 自:湖北
等 级:蝙蝠侠
威 望:3
帖 子:395
专家分:922
注 册:2009-10-1
收藏
得分:0 
da=rand() << (sizeof(double)*8-3) >> (sizeof(double)*8-3);

这句话有问题,第一,INT写成了DOUBLE,<<30>>30就行了

第二,想把它变成3~0的数,结果发现是负数,原来移位处理int和unsigned int是不一样的,虽然长度是一样的.

[ 本帖最后由 虾B写 于 2012-11-11 20:07 编辑 ]

白娘故意下雨骗许仙的伞。祝英台十八里相送时装疯卖傻调戏梁山伯。七仙女挡住了董永的去路。牛郎趁织女洗澡时拿走了她的衣服。。。这些故事告诉我们;伟大爱情的开始,总归的有一个要先耍流氓!
2012-11-11 19:47
虾B写
Rank: 8Rank: 8
来 自:湖北
等 级:蝙蝠侠
威 望:3
帖 子:395
专家分:922
注 册:2009-10-1
收藏
得分:0 
是的,想到了没写,还有一些灵异事件,定义dat[4][4][4]  我用dat[6][i][ii]不报错,出现我没定义的图像。难道是读到数组后面的其它地址数据,真有意思。

白娘故意下雨骗许仙的伞。祝英台十八里相送时装疯卖傻调戏梁山伯。七仙女挡住了董永的去路。牛郎趁织女洗澡时拿走了她的衣服。。。这些故事告诉我们;伟大爱情的开始,总归的有一个要先耍流氓!
2012-11-11 22:37
虾B写
Rank: 8Rank: 8
来 自:湖北
等 级:蝙蝠侠
威 望:3
帖 子:395
专家分:922
注 册:2009-10-1
收藏
得分:0 
编译时将里面的glut32.DLL和编译文件放一块,还用.h文件放VC/include/下,请百度openGL安装
glutdlls37beta.zip (145.95 KB)


[ 本帖最后由 虾B写 于 2012-11-12 17:36 编辑 ]

白娘故意下雨骗许仙的伞。祝英台十八里相送时装疯卖傻调戏梁山伯。七仙女挡住了董永的去路。牛郎趁织女洗澡时拿走了她的衣服。。。这些故事告诉我们;伟大爱情的开始,总归的有一个要先耍流氓!
2012-11-12 17:30
快速回复:我也写个俄罗斯方块
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033253 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved