C语言/C加加编程基础入门俄罗斯方块源代码分享

您所在的位置:网站首页 c加加编程入门小游戏 C语言/C加加编程基础入门俄罗斯方块源代码分享

C语言/C加加编程基础入门俄罗斯方块源代码分享

2024-07-17 14:19:07| 来源: 网络整理| 查看: 265

[代码运行效果截图]

[c++]代码库

/*

*/

#include

#include

#include

#define CELL 20

#define ROWS 25

#define COLS 15

//升级所需分数值

#define SCORE_LEVEL_INC 80

#define ID_TIMER 1

/////////////////全局变量/////////////////////////////

HWND hwnd; //保存窗口句柄

int score=0; //分数

int level=0; //级数

int interval_unit=25; //随级数递增的时间间隔增量

int interval_base=300; //时间间隔基量

int old_interval; //保存当前的时间间隔,用于加速操作

int cur_left,cur_top; //记录方块当前的位置

int width_block,height_block; //方块的宽带和高度

bool isPause=false; //暂停标识

UINT timer_id=0; //保存计时器ID

static byte *block=NULL; //方块,方块为随机大小,采用动态分配内存方式,所以这里是指针变量

byte g_panel[ROWS][COLS]={0};

////////////////////////////////////////////////////

LRESULT CALLBACK WndProc ( HWND,UINT,WPARAM,LPARAM );

void DrawPanel ( HDC hdc ); //绘制表格

void RefreshPanel ( HDC hdc ); //刷新面板

void DoDownShift ( HDC hdc ); //下移

void DoLeftShift ( HDC hdc ); //左移

void DoRightShift ( HDC hdc ); //右移

void DoAccelerate ( HDC hdc ); //加速

void DoRedirection ( HDC hdc ); //改变方向

void ClearRow ( HDC hdc ); //消行

bool ExportBlock(); //输出方块,

//该函数会直接修改全局变量block,width_block,height_block,

//cur_left和cur_top

bool IsTouchBottom ( HDC hdc ); //判断是否到达底部

int main()

{

    HINSTANCE hInstance=GetModuleHandle ( NULL );

    TCHAR szAppName[]=TEXT ( "teris" );

    MSG msg;

    WNDCLASS wc;

    wc.style=CS_HREDRAW|CS_VREDRAW;

    wc.lpfnWndProc=WndProc;

    wc.cbClsExtra=0;

    wc.cbWndExtra=0;

    wc.hInstance=hInstance;

    wc.hIcon=LoadIcon ( NULL,IDI_APPLICATION );

    wc.hCursor=LoadCursor ( NULL,IDC_ARROW );

    wc.hbrBackground= ( HBRUSH ) GetStockObject ( WHITE_BRUSH );

    wc.lpszMenuName=NULL;

    wc.lpszClassName=szAppName;

    if ( !RegisterClass ( &wc ) )

    {

        printf ( "RegisterClass occur errors!" );

        return 0;

    }

    hwnd=CreateWindow ( szAppName,TEXT ( "Teris Demo" ),

                        WS_OVERLAPPEDWINDOW,

                        0,0,0,0,

                        NULL,

                        NULL,

                        hInstance,

                        NULL );

    ShowWindow ( hwnd,SW_SHOW );

    UpdateWindow ( hwnd );

    while ( GetMessage ( &msg,NULL,0,0 ) )

    {

        TranslateMessage ( &msg );

        DispatchMessage ( &msg );

    }

    return msg.wParam;

}

void DrawPanel ( HDC hdc ) //绘制游戏面板

{

    int x,y;

    RECT rect;

    for ( y=0; y

    {

        for ( x=0; x

        {

            //计算方块的边框范围

            rect.top=y*CELL+1;

            rect.bottom= ( y+1 ) *CELL-1;

            rect.left=x*CELL+1;

            rect.right= ( x+1 ) *CELL-1;

            FrameRect ( hdc,&rect, ( HBRUSH ) GetStockObject ( BLACK_BRUSH ) );

        }

    }

}

void DoDownShift ( HDC hdc ) //下移

{

    if ( NULL==block ) return;

    //判断是否到达底部

    if ( IsTouchBottom ( hdc ) ) //到底部

    {

        //消行处理

        ClearRow ( hdc );

        ExportBlock(); //输出下一个方块

    }

    cur_top++;

    RefreshPanel ( hdc );

}

void DoLeftShift ( HDC hdc ) //左移

{

    int x,y;

    if ( NULL==block ) return;

    if ( 0==cur_left ) return;

    if ( cur_top=0; y-- ) //从底行开始扫描

    {

        //判断第一个实心方块在面板上邻接的下方方格是否为实心,是就代表已经到达底部

        for ( x=0; x

        {

            if ( * ( block+y*width_block+x ) )

            {

                if ( cur_top+y+1=0; k-- )

            {

                for ( j=0; j

                {

                    g_panel[k+1][j]=g_panel[k][j];

                }

            }

            i=i+1;

            count++;

        }

    }

    //最高级别为9级,所以分数极限为(9+1)*SCORE_LEVEL_INC-1

    if ( score>=10*SCORE_LEVEL_INC-1 ) return;

    //加分规则:消除行数,1行加10分,2行加15分,3行加20分,4行加30分

    switch ( count )

    {

    case 1:

        score+=10;

        break;

    case 2:

        score+=15;

        break;

    case 3:

        score+=20;

        break;

    case 4:

        score+=30;

        break;

    }

    int temp_level=score/SCORE_LEVEL_INC;

    if ( temp_level>level )

    {

        level=temp_level;

        //撤销当前计时器,然后重设

        if ( timer_id ) KillTimer ( hwnd,ID_TIMER );

        timer_id=SetTimer ( hwnd,ID_TIMER,interval_base-level*interval_unit,NULL );

    }

    system ( "cls" );

    printf ( "score: %d, level: %d ",score,level );

}

void RefreshPanel ( HDC hdc ) //刷新面板

{

    int x,y;

    RECT rect;

    HBRUSH h_bSolid= ( HBRUSH ) GetStockObject ( GRAY_BRUSH ),

                     h_bEmpty= ( HBRUSH ) GetStockObject ( WHITE_BRUSH );

    if ( NULL==block ) return;

    //先刷屏

    for ( y=0; y

    {

        for ( x=0; x

        {

            //为避免刷掉方块的边框,rect范围必须比边框范围小1

            rect.top=y*CELL+2;

            rect.bottom= ( y+1 ) *CELL-2;

            rect.left=x*CELL+2;

            rect.right= ( x+1 ) *CELL-2;

            if ( g_panel[y][x] )

                FillRect ( hdc,&rect,h_bSolid );

            else

                FillRect ( hdc,&rect,h_bEmpty );

        }

    }

    //再定位方块

    for ( y=0; y

    {

        for ( x=0; x

        {

            if ( * ( block+y*width_block+x ) ) //实心

            {

                rect.top= ( y+cur_top ) *CELL+2;

                rect.bottom= ( y+cur_top+1 ) *CELL-2;

                rect.left= ( x+cur_left ) *CELL+2;

                rect.right= ( x+cur_left+1 ) *CELL-2;

                FillRect ( hdc,&rect,h_bSolid );

            }

        }

    }

}

bool ExportBlock() //输出方块

{

    int sel;

    if ( block )

    {

        free ( block ); //释放之前分配的内存

        block=NULL;

    }

    sel=rand() %7;

    switch ( sel )

    {

    case 0: //水平条

        width_block=4;

        height_block=1;

        block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );

        * ( block+0 ) =1; //可以理解为*(block+0*width_block+0)=1,即第一行的第一个方格,下面同理

        * ( block+1 ) =1; //*(block+0*width_block+1)=1

        * ( block+2 ) =1; //*(block+0*width_block+2)=1

        * ( block+3 ) =1; //*(block+0*width_block+3)=1

        cur_top=0-height_block;

        cur_left= ( COLS-width_block ) /2;

        break;

    case 1: //三角

        width_block=3;

        height_block=2;

        block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );

        * ( block+0 ) =0; //可以理解为*(block+0*width_block+0)=0,即第一行的第一个方格,下面同理

        * ( block+1 ) =1; //*(block+0*width_block+1)=1

        * ( block+2 ) =0; //*(block+0*width_block+2)=0

        * ( block+3 ) =1; //*(block+1*width_block+0)=1,第二行开始

        * ( block+4 ) =1; //*(block+1*width_block+1)=1

        * ( block+5 ) =1; //*(block+1*width_block+2)=1

        cur_top=0-height_block;

        cur_left= ( COLS-width_block ) /2;

        break;

    case 2: //左横折

        width_block=3;

        height_block=2;

        block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );

        * ( block+0 ) =1; //可以理解为*(block+0*width_block+0)=1,下面同理

        * ( block+1 ) =0; //*(block+0*width_block+1)=0

        * ( block+2 ) =0; //*(block+0*width_block+2)=0

        * ( block+3 ) =1; //*(block+1*width_block+0)=1

        * ( block+4 ) =1; //*(block+1*width_block+1)=1

        * ( block+5 ) =1; //*(block+1*width_block+2)=1

        cur_top=0-height_block;

        cur_left= ( COLS-width_block ) /2;

        break;

    case 3: //右横折

        width_block=3;

        height_block=2;

        block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );

        * ( block+0 ) =0; //可以理解为*(block+0*width_block+0)=0,下面同理

        * ( block+1 ) =0; //*(block+0*width_block+1)=0

        * ( block+2 ) =1; //*(block+0*width_block+2)=1

        * ( block+3 ) =1; //*(block+1*width_block+0)=1

        * ( block+4 ) =1; //*(block+1*width_block+1)=1

        * ( block+5 ) =1; //*(block+1*width_block+2)=1

        cur_top=0-height_block;

        cur_left= ( COLS-width_block ) /2;

        break;

    case 4: //左闪电

        width_block=3;

        height_block=2;

        block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );

        * ( block+0 ) =1; //可以理解为*(block+0*width_block+0)=1,下面同理

        * ( block+1 ) =1; //*(block+0*width_block+1)=1

        * ( block+2 ) =0; //*(block+0*width_block+2)=0

        * ( block+3 ) =0; //*(block+1*width_block+0)=0

        * ( block+4 ) =1; //*(block+1*width_block+1)=1

        * ( block+5 ) =1; //*(block+1*width_block+2)=1

        cur_top=0-height_block;

        cur_left= ( COLS-width_block ) /2;

        break;

    case 5: //右闪电

        width_block=3;

        height_block=2;

        block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );

        * ( block+0 ) =0; //可以理解为*(block+0*width_block+0)=0,下面同理

        * ( block+1 ) =1; //*(block+0*width_block+1)=1

        * ( block+2 ) =1; //*(block+0*width_block+2)=1

        * ( block+3 ) =1; //*(block+1*width_block+0)=1

        * ( block+4 ) =1; //*(block+1*width_block+1)=1

        * ( block+5 ) =0; //*(block+1*width_block+2)=0

        cur_top=0-height_block;

        cur_left= ( COLS-width_block ) /2;

        break;

    case 6: //石头

        width_block=2;

        height_block=2;

        block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );

        * ( block+0 ) =1; //可以理解为*(block+0*width_block+0)=1,下面同理

        * ( block+1 ) =1; //*(block+0*width_block+1)=1

        * ( block+2 ) =1; //*(block+1*width_block+0)=1

        * ( block+3 ) =1; //*(block+1*width_block+1)=1

        cur_top=0-height_block;

        cur_left= ( COLS-width_block ) /2;

        break;

    }

    return block!=NULL;

}

LRESULT CALLBACK WndProc ( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )

{

    HDC hdc;

    PAINTSTRUCT ps;

    //TCHAR szBuffer[1024];

    switch ( message )

    {

    case WM_CREATE:

        MoveWindow ( hwnd,400,10,CELL*COLS+8,CELL*ROWS+32,FALSE ); //补齐宽度和高度

        srand ( time ( NULL ) );

        ExportBlock();

        timer_id=SetTimer ( hwnd,ID_TIMER,interval_base-level*interval_unit,NULL );

        return 0;

    case WM_TIMER:

        hdc=GetDC ( hwnd );

        DoDownShift ( hdc );

        ReleaseDC ( hwnd,hdc );

        return 0;

    case WM_KEYDOWN:

        hdc=GetDC ( hwnd );

        switch ( wParam )

        {

        case VK_LEFT: //左移

            if ( !isPause ) DoLeftShift ( hdc );

            break;

        case VK_RIGHT: //右移

            if ( !isPause ) DoRightShift ( hdc );

            break;

        case VK_UP: //转向

            if ( !isPause ) DoRedirection ( hdc );

            break;

        case VK_DOWN: //加速

            if ( !isPause ) DoAccelerate ( hdc );

            break;

        case VK_SPACE: //暂停

            isPause=!isPause;

            if ( isPause )

            {

                if ( timer_id ) KillTimer ( hwnd,ID_TIMER );

                timer_id=0;

            }

            else

            {

                timer_id=SetTimer ( hwnd,ID_TIMER,interval_base-level*interval_unit,FALSE );

            }

            break;

        }

        ReleaseDC ( hwnd,hdc );

        return 0;

    case WM_PAINT:

        hdc=BeginPaint ( hwnd,&ps );

        DrawPanel ( hdc ); //绘制面板

        RefreshPanel ( hdc ); //刷新

        EndPaint ( hwnd,&ps );

        return 0;

    case WM_DESTROY:

        if ( block ) free ( block );

        if ( timer_id ) KillTimer ( hwnd,ID_TIMER );

        PostQuitMessage ( 0 );

        return 0;

    }

    return DefWindowProc ( hwnd,message,wParam,lParam );

}



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


    图片新闻

    实验室药品柜的特性有哪些
    实验室药品柜是实验室家具的重要组成部分之一,主要
    小学科学实验中有哪些教学
    计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
    实验室各种仪器原理动图讲
    1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
    高中化学常见仪器及实验装
    1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
    微生物操作主要设备和器具
    今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
    浅谈通风柜使用基本常识
     众所周知,通风柜功能中最主要的就是排气功能。在

    专题文章

      CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭