俄罗斯方块(经典版)块

记住登录一个月发表随想还能输入:200字该用户最新代码编程随想&by by by by by by [c++]代码库/*
* 作者:did0602
* 出自:http://www.oschina.net/code/snippet_88
#include &windows.h&
#include &stdio.h&
#include &time.h&
#define CELL 20
#define ROWS 25
#define COLS 15
//升级所需分数值
#define SCORE_LEVEL_INC 80
#define ID_TIMER 1
/////////////////全局变量/////////////////////////////
//保存窗口句柄
int score=0;
int level=0;
int interval_unit=25;
//随级数递增的时间间隔增量
int interval_base=300;
//时间间隔基量
//保存当前的时间间隔,用于加速操作
int cur_left,cur_
//记录方块当前的位置
int width_block,height_ //方块的宽带和高度
bool isPause=
//暂停标识
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" );
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=WndP
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hI
wc.hIcon=LoadIcon ( NULL,IDI_APPLICATION );
wc.hCursor=LoadCursor ( NULL,IDC_ARROW );
wc.hbrBackground= ( HBRUSH ) GetStockObject ( WHITE_BRUSH );
wc.lpszMenuName=NULL;
wc.lpszClassName=szAppN
if ( !RegisterClass ( &wc ) )
printf ( "RegisterClass occur errors!" );
hwnd=CreateWindow ( szAppName,TEXT ( "Teris Demo" ),
WS_OVERLAPPEDWINDOW,
hInstance,
ShowWindow ( hwnd,SW_SHOW );
UpdateWindow ( hwnd );
while ( GetMessage ( &msg,NULL,0,0 ) )
TranslateMessage ( &msg );
DispatchMessage ( &msg );
return msg.wP
void DrawPanel ( HDC hdc )
//绘制游戏面板
for ( y=0; y&ROWS; y++ )
for ( x=0; x&COLS; 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 )
//判断是否到达底部
if ( IsTouchBottom ( hdc ) )
//消行处理
ClearRow ( hdc );
ExportBlock();
//输出下一个方块
cur_top++;
RefreshPanel ( hdc );
void DoLeftShift ( HDC hdc )
if ( NULL==block )
if ( 0==cur_left )
if ( cur_top&0 ) //方块没有完整显示前,不能左移
for ( y=0; y&height_ y++ )
for ( x=0; x&width_ x++ )
//从左边开始扫描,获取该行最左边的实心方格块
if ( * ( block+y*width_block+x ) )
//判断当前方格在面板上面左边一个方格是否为实心,是就代表不能再左移
if ( g_panel[cur_top+y][cur_left+x-1] )
//只判断最左边的一个实心方格,之后直接扫描下一行
cur_left--;
RefreshPanel ( hdc );
void DoRightShift ( HDC hdc )
if ( NULL==block )
if ( COLS-width_block==cur_left )
if ( cur_top&0 )
//方块完整显示前不能右移
for ( y=0; y&height_ y++ )
for ( x=width_block-1; x&=0; x-- )
//从右边开始扫描,获取该行最右边的实心方格块
if ( * ( block+y*width_block+x ) )
//判断当前方格在面板上右边一个方格是否为实心,是就代表不能再右移
if ( g_panel[cur_top+y][cur_left+x+1] )
//只判断最右边的一个实心方格
cur_left++;
RefreshPanel ( hdc );
void DoRedirection ( HDC hdc )
//改变方向
byte * temp=NULL;
if ( NULL==block )
if ( cur_top&0 )
//方块完整显示前不能转向
temp= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
for ( i=0; i&width_ i++ )
for ( j=0; j&height_ j++ )
//temp[i][j]=block[height_block-j-1][i];
* ( temp+i*height_block+j ) =* ( block+ ( height_block-j-1 ) *width_block+i );
//给方块重新定位
int incHeight=width_block-height_
int incWidth=height_block-width_
int temp_cur_top=cur_top-incHeight/2;
int temp_cur_left=cur_left-incWidth/2;
//system("cls");
//printf("temp_top=%d, temp_left=%d",temp_cur_top,temp_cur_left);
//判断当前空间是否足够让方块改变方向
int max_len=max ( width_block,height_block );
//防止下标访问越界
if ( temp_cur_top+max_len-1&=ROWS||temp_cur_left&0||temp_cur_left+max_len-1&=COLS )
free ( temp );
//退出前必须先释放内存
for ( i=0; i&max_ i++ )
for ( j=0; j&max_ j++ )
//转向所需的空间内有已被占用的实心方格存在,即转向失败
if ( g_panel[temp_cur_top+i][temp_cur_left+j] )
free ( temp );
//退出前必须先释放内存
//把临时变量的值赋给block,只能赋值,而不能赋指针值
for ( i=0; i&height_ i++ )
for ( j=0; j&width_ j++ )
//block[i][j]=temp[i][j];
* ( block+i*width_block+j ) =* ( temp+i*width_block+j );
//全局变量重新被赋值
cur_top=temp_cur_
cur_left=temp_cur_
width_block=height_
height_block=i;
free ( temp );
//释放为临时变量分配的内存
RefreshPanel ( hdc );
void DoAccelerate ( HDC hdc )
if ( NULL==block )
if ( IsTouchBottom ( hdc ) )
//消行处理
ClearRow ( hdc );
ExportBlock();
cur_top++;
RefreshPanel ( hdc );
bool IsTouchBottom ( HDC hdc )
if ( NULL==block )
if ( ROWS==cur_top+height_block )
//固定方块
for ( i=0; i&height_ i++ )
for ( j=0; j&width_ j++ )
if ( * ( block+i*width_block+j ) ) g_panel[cur_top+i][cur_left+j]=1;
for ( y=height_block-1; y&=0; y-- )
//从底行开始扫描
//判断第一个实心方块在面板上邻接的下方方格是否为实心,是就代表已经到达底部
for ( x=0; x&width_ x++ )
if ( * ( block+y*width_block+x ) )
if ( cur_top+y+1&0 )
if ( g_panel[cur_top+y+1][cur_left+x] )
//判断是否gameover
if ( cur_top&=0 )
if ( timer_id )
KillTimer ( hwnd,ID_TIMER );
timer_id=0;
MessageBox ( hwnd,TEXT ( "游戏结束" ),TEXT ( "MSG" ),MB_OK|MB_ICONEXCLAMATION );
SendMessage ( hwnd,WM_CLOSE,0,0 );
//固定方块
for ( i=0; i&height_ i++ )
for ( j=0; j&width_ j++ )
if ( * ( block+i*width_block+j ) ) g_panel[cur_top+i][cur_left+j]=1;
void ClearRow ( HDC hdc )
int i,j,k;
int count=0;
//消行次数
//消行处理
for ( i=ROWS-1; i&=0; i-- )
for ( j=0; j&COLS; j++ )
if ( !g_panel[i][j] )
if ( isFilled )
for ( j=0; j&COLS; j++ )
g_panel[i][j]=0;
//所有方块往下移
for ( k=i-1; k&=0; k-- )
for ( j=0; j&COLS; j++ )
g_panel[k+1][j]=g_panel[k][j];
//最高级别为9级,所以分数极限为(9+1)*SCORE_LEVEL_INC-1
if ( score&=10*SCORE_LEVEL_INC-1 )
//加分规则:消除行数,1行加10分,2行加15分,3行加20分,4行加30分
switch ( count )
score+=10;
score+=15;
score+=20;
score+=30;
int temp_level=score/SCORE_LEVEL_INC;
if ( temp_level&level )
level=temp_
//撤销当前计时器,然后重设
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 )
//刷新面板
HBRUSH h_bSolid= ( HBRUSH ) GetStockObject ( GRAY_BRUSH ),
h_bEmpty= ( HBRUSH ) GetStockObject ( WHITE_BRUSH );
if ( NULL==block )
for ( y=0; y&ROWS; y++ )
for ( x=0; x&COLS; 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 );
FillRect ( hdc,&rect,h_bEmpty );
//再定位方块
for ( y=0; y&height_ y++ )
for ( x=0; x&width_ 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()
//输出方块
if ( block )
free ( block );
//释放之前分配的内存
block=NULL;
sel=rand() %7;
switch ( sel )
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_
cur_left= ( COLS-width_block ) /2;
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_
cur_left= ( COLS-width_block ) /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_
cur_left= ( COLS-width_block ) /2;
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_
cur_left= ( COLS-width_block ) /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 ) =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_
cur_left= ( COLS-width_block ) /2;
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_
cur_left= ( COLS-width_block ) /2;
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_
cur_left= ( COLS-width_block ) /2;
return block!=NULL;
LRESULT CALLBACK WndProc ( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )
PAINTSTRUCT
//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 );
case WM_TIMER:
hdc=GetDC ( hwnd );
DoDownShift ( hdc );
ReleaseDC ( hwnd,hdc );
case WM_KEYDOWN:
hdc=GetDC ( hwnd );
switch ( wParam )
case VK_LEFT:
if ( !isPause ) DoLeftShift ( hdc );
case VK_RIGHT:
if ( !isPause ) DoRightShift ( hdc );
case VK_UP:
if ( !isPause ) DoRedirection ( hdc );
case VK_DOWN:
if ( !isPause ) DoAccelerate ( hdc );
case VK_SPACE:
isPause=!isP
if ( isPause )
if ( timer_id ) KillTimer ( hwnd,ID_TIMER );
timer_id=0;
timer_id=SetTimer ( hwnd,ID_TIMER,interval_base-level*interval_unit,FALSE );
ReleaseDC ( hwnd,hdc );
case WM_PAINT:
hdc=BeginPaint ( hwnd,&ps );
DrawPanel ( hdc );
//绘制面板
RefreshPanel ( hdc );
EndPaint ( hwnd,&ps );
case WM_DESTROY:
if ( block ) free ( block );
if ( timer_id ) KillTimer ( hwnd,ID_TIMER );
PostQuitMessage ( 0 );
return DefWindowProc ( hwnd,message,wParam,lParam );
}[代码运行效果截图]分享到:更多
if( timer_id )
KillTimer ( hwnd,ID_TIMER );
timer_id=0;
MessageBox ( hwnd,TEXT ("游戏结束"),TEXT ("MSG"),MB_OK|MB_ICONEXCLAMATION );
SendMessage ( hwnd,WM_CLOSE,0,0 );
开头的判断语句改为if( cur_top&=0 && nTime == 0)
下一行添加
nTime = 1;
这样就不会出现WM_CLOSE还未被窗口过程处理便再次判断gameover了回复评论共19 条评论
发表评论:评论须知:1、评论每次加2分,每天上限为30;2、请文明用语,共同创建干净的技术交流环境;3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。俄罗斯方块高清版,俄罗斯方块高清版小游戏,4399小游戏
分类:&&|&&大小:0.01M&&|&&日期:
请记住本站网址 ,点击,方便下次再玩。
左右移动变换方向快速下降
方向←→键控制移动,↑变换方向,↓快速下降。
游戏加载完成后,点击PLAY → 选择关卡 → OK,即可进入游戏。
消除所有砖块。
请记住本站网址 ,点击,方便下次再玩。 《俄罗斯方块高清版》小游戏由4399用户提供。
相关游戏推荐
精彩专题推荐
12345678910
12345678910
文明办网文明上网举报电话:&|&举报邮箱:&||
Copyright & 2004 -
All Rights Reserved. 四三九九网络股份有限公司&版权所有
微信扫一扫关注4399小游戏俄罗斯方块专题介绍:俄罗斯方块上手极其简单,但是要熟练地掌握其中的操作与摆放技巧,难度却不低。作为家喻户晓老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法相比的。4399俄罗斯方块Flash小游戏专题,给你最纯正的味道!
俄罗斯方块手机游戏推荐
俄罗斯方块小游戏排行
第 1 页 / 共 2 页
作品版权归作者所有,如果侵犯了您的版权,请,本站将在3个工作日内删除。温馨提示:抵制不良游戏,拒绝盗版游戏,注意自我保护,谨防受骗上当,适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活
| | |||||&关注:
||||&法律顾问:北京盛峰律师事务所
文明办网文明上网举报电话:&|&举报邮箱:&||
Copyright & 2004 -
All Rights Reserved. 四三九九网络股份有限公司 版权所有HTML5/CSS3简易版俄罗斯方块游戏 | HTML5资源教程

我要回帖

更多关于 游戏俄罗斯方块免费下载 的文章

 

随机推荐