首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 俄罗斯方块 游戏界面怎么画?
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 06:08:25 楼主
    看见些代码都是bc下用graphics.h的
    想问下用vc++和dev c++那种 游戏界面和方块该怎么画
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hastings
    • 等级:
    发表于:2008-05-12 06:58:591楼 得分:0
    不是MFC就是纯API
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chlaws
    • 等级:
    发表于:2008-05-12 08:59:182楼 得分:0
    给你顶一帖
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 11:03:043楼 得分:0
    引用 2 楼 chlaws 的回复:
    给你顶一帖
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 11:08:384楼 得分:0
    用控件数组,只要设置某个控件是否显示即可。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 11:16:395楼 得分:0
    我有源码 用c开发的 不是我自己写的
    仔细看了 写的蛮好的 自己觉的
    要的话 留下邮箱 不过要给我分哦

    在说你的问题
    是用边框为界 然后填充
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 12:19:426楼 得分:0
    UP 帮顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 12:21:247楼 得分:0
    帮顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 16:32:548楼 得分:0
    引用 1 楼 hastings 的回复:
    不是MFC就是纯API

    正解.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 19:05:319楼 得分:0
    写一段代码给你
    画10*15的表格
      #include "graphics.h"
      main()
    {int a=DETECT,b,i,j;

    initgraph(&a,&b,"");
    setcolor(RED);
    for(i=100;i <=300;i+=20)
    line(i,100,i,400);
    for(j=100;j <=400;j+=20)
    line(100,j,300,j);
    rectangle(100,100,300,400);
    setbkcolor(BLACK);
    getch();
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-12 20:13:4610楼 得分:0
    1. 先画背景图...简单点的话,直接设置背景色为单色也可以.
    2. 就是画方块罗... 直接调用类似 Rectangle()这样的函数阿...

    对于俄罗斯方块而言, 界面的工作对初学者而言也很简单地...真不懂的话, 到网上找例子看哈就明白了.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 06:27:0311楼 得分:0

    今天看了些系统编程的书
    界面是不是windows.h里的wnd?然后用pen和brush什么的画block?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-13 09:42:1312楼 得分:0
    GDI比较好
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-14 23:00:5613楼 得分:0
    #include <stdio.h>
    #include <stdlib.h>
    #include <graphics.h>
    #include <bios.h>
    /*下面定义了一些控制命令*/
    /*重画界面命令*/
    #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 TIMEINTERVAL  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 <TIMEINTERVAL)
            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 <MAXWIDTH;col++)
            if(!area[row][col])
                {full=0; break;}
        if(!full)
        {
            ++row;
            continue;
        }
        for(j=row; j <MAXHEIGHT-1;j++)
        for(i=0;i <MAXWIDTH;i++)
            area[j][i]=area[j+1][i];
        actX=0;
        actY=row;
        actW=MAXWIDTH-1;
        actH=MAXHEIGHT-1-row;
        DrawSpace();
        rowEnd--;
        }
        CMD=CMDGEN;
    }
    /*向左移动方块*/。。。。

    /*向右移动方块*/。。。。
    /*向下移动方块*/。。。。

    /*按加速键后方块迅速下落到底*/
    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,"c:\\Win-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 <MAXWIDTH;i++)
        {
        x1=56+i*BOXWIDTH;
        line(x1,y1,x1,y2);
        }
        x1=56; x2=x1+MAXWIDTH*BOXWIDTH;
        for(j=0;j <MAXHEIGHT;j++)
        {
        y1=464-j*BOXWIDTH;
            line(x1,y1,x2,y1);
        }
        for(j=0;j <MAXHEIGHT;j++)
      for(i=0;i <MAXWIDTH;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();
        getch();
        do
        {
        GetCMD();
        ExecuteCMD();
        }
        while(!GameOver());
        getch();
        closegraph();
        return 0;
        getch();
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • htqx
    • 等级:
    发表于:2008-05-15 01:22:3014楼 得分:0
    没写过俄罗斯方块.

    随便谈谈.

    1.首先要知道玩法,收集资料.
    2.需要用到的技术,比图填色,加载图片,矩形的函数之类的.
    3.寻找最方便的表示方法,确定数据结构.
    4.写好数据结构的基本操作.
    5.写好操作流程.

    这方面应该首先降低第2项的难度(比如能用单色就用单色,不需要一定很华丽),因为他并不是主要的内容.尤其注重第3步.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 21:46:2315楼 得分:0
    1楼的正解
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved