[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 ) return; //方块没有完整显示前,不能左移

for ( y=0; y

{

for ( x=0; x

{

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

{

//判断当前方格在面板上面左边一个方格是否为实心,是就代表不能再左移

if ( g_panel[cur_top+y][cur_left+x-1] ) return;

break; //只判断最左边的一个实心方格,之后直接扫描下一行

}

}

}

cur_left--;

RefreshPanel ( hdc );

}

void DoRightShift ( HDC hdc ) //右移

{

int x,y;

if ( NULL==block ) return;

if ( COLS-width_block==cur_left ) return;

if ( cur_top<0 ) return; //方块完整显示前不能右移

for ( y=0; 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] ) return;

break; //只判断最右边的一个实心方格

}

}

}

cur_left++;

RefreshPanel ( hdc );

}

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

{

int i,j;

byte * temp=NULL;

if ( NULL==block ) return;

if ( cur_top<0 ) return; //方块完整显示前不能转向

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

for ( i=0; i

{

for ( j=0; 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_block;

int incWidth=height_block-width_block;

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 ); //退出前必须先释放内存

return;

}

for ( i=0; i

{

for ( j=0; j

{

//转向所需的空间内有已被占用的实心方格存在,即转向失败

if ( g_panel[temp_cur_top+i][temp_cur_left+j] )

{

free ( temp ); //退出前必须先释放内存

return;

}

}

}

//把临时变量的值赋给block,只能赋值,而不能赋指针值

for ( i=0; i

{

for ( j=0; j

{

//block[i][j]=temp[i][j];

* ( block+i*width_block+j ) =* ( temp+i*width_block+j );

}

}

//全局变量重新被赋值

cur_top=temp_cur_top;

cur_left=temp_cur_left;

//交换

i=width_block;

width_block=height_block;

height_block=i;

free ( temp ); //释放为临时变量分配的内存

RefreshPanel ( hdc );

}

void DoAccelerate ( HDC hdc ) //加速

{

if ( NULL==block ) return;

if ( IsTouchBottom ( hdc ) )

{

//消行处理

ClearRow ( hdc );

ExportBlock();

}

cur_top++;

RefreshPanel ( hdc );

}

bool IsTouchBottom ( HDC hdc )

{

int x,y;

int i,j;

if ( NULL==block ) return false;

if ( ROWS==cur_top+height_block )

{

//固定方块

for ( i=0; i

{

for ( j=0; j

{

if ( * ( block+i*width_block+j ) ) g_panel[cur_top+i][cur_left+j]=1;

}

}

return true;

}

for ( y=height_block-1; y>=0; y-- ) //从底行开始扫描

{

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

for ( x=0; x

{

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

{

if ( cur_top+y+1<0 ) return false;

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

{

for ( j=0; j

{

if ( * ( block+i*width_block+j ) ) g_panel[cur_top+i][cur_left+j]=1;

}

}

return true;

}

}

}

}

return false;

}

void ClearRow ( HDC hdc ) //消行

{

int i,j,k;

int count=0; //消行次数

bool isFilled;

//消行处理

for ( i=ROWS-1; i>=0; i-- )

{

isFilled=true;

for ( j=0; j

{

if ( !g_panel[i][j] )

{

isFilled=false;

break;

}

}

if ( isFilled )

{

for ( j=0; j

{

g_panel[i][j]=0;

}

//所有方块往下移

for ( k=i-1; k>=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 );

}

俄罗斯方块java代码_俄罗斯方块源代码相关推荐

  1. 小翼java_小翼俄罗斯方块java代码

    [实例简介] 感谢小翼的java学习视频教程,个人感觉讲的非常好. 小翼的俄罗斯方块工程项目代码.自己对着视频教学敲的,有些地方对原作者的代码思路有改动.项目完成90%,还有些许功能没有加入进去.下载 ...

  2. 给定下面的java代码_则运行_会产生类型的异常_JavaSE_笔试题_单选选择题

    JavaSE_笔试题_单选选择题1 1. 下面哪一种描述是正确的()? A:abstract修饰符可修饰字段.方法和类. B:抽象方法的body部分必须用一对大括号{}包住. C:声明抽象方法,大括号 ...

  3. 双表查询java代码_多表增删改查

    [java]代码库package com.ww.service; import java.lang.reflect.Array; import java.sql.Connection; import ...

  4. 有趣的java代码_【有趣】这段java代码太古怪

    首先呢,来一段java代码来开点胃.等等等等,耍我呢,这是java代码? \u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0063\u006c\u0061\u0 ...

  5. 基础贴吧java代码_原来你是这样的JAVA[01]-基础一瞥

    1.Java是什么呢? Java不仅是一门语言,而且是一个完整的平台,有一个庞大的库,其中包含了很多可重用的代码和一个提供安全性.跨操作系统的可移植性以及自动垃圾收集等服务的执行环境. 2.JDK 和 ...

  6. 连连看java代码_连连看 - java代码库 - 云代码

    [java]代码库/* * To change this license header, choose License Headers in Project Properties. * To chan ...

  7. 关联规则java代码_重量挖掘关联规则挖掘方法,哪个大神可以将以下伪代码转换为Java代码?...

    重量挖掘关联规则挖掘方法,哪个大神可以将以下伪代码转换为Java代码? 10 改进的加权关联规则算法的基本步骤与Apriori算法相似: 首先找到加权支持度不小于用户指定的最小加权支持度的所有频繁项集 ...

  8. amd cpu不能在cmd环境下运行java代码_「我们一起学Java02」JDK、JRE、JVM简介,Java开发平台的搭建...

    Hello,各位头条的读者大家好!接下来一段时间小编将和大家一起学习Java,"我们一起学Java"专题将会持续更新,欢迎大家关注.这里是"我们一起学Java" ...

  9. amd cpu不能在cmd环境下运行java代码_如何在Windows10中配置java的JDK环境

    今天给大家分享一下如何配置java的JDK环境.操作步骤如下: 1.下载好 jdk 的安装文件,我下载的是 jdk-10.0.1_windows-x64_bin.exe 这个版本的安装文件: 2.使用 ...

最新文章

  1. laya 自定义组件加载错误:显示空白
  2. [转]在Javascript中闭包(Closure)
  3. 提升【百度网盘】下载速度
  4. 小李飞刀:用python刷题ing....
  5. 预处理指令pragma常见用法集锦(#pragma once、#pragma comment和#pragma warning)
  6. Java中的return this
  7. IT管理人才必备的十大能力(转)
  8. fedora下一些问题的解决方案汇总
  9. 论文趣读:人工智能里程碑?回顾2015年登上Nature的DQN(全文翻译+批注)
  10. restfulframework详解
  11. linux下开源电子设计软件
  12. C#生成PDF格式的合同文件
  13. UE4编辑器ToolBar扩展
  14. 超立方体及其可视化(Processing)
  15. layer.js 贤心制作的弹出层插件-不仅仅是弹层
  16. #217-[哈希]好人卡
  17. 为什么神经元有数千个突触,一个新皮质中的序列记忆理论(HTM算法基础)
  18. python爬虫二十四:js逆向破解(一)
  19. javaweb项目,配置servlet后报错:java.lang.ClassCastException: cannot be cast to class javax.servlet.Servlet
  20. 汇桔宝时代:重新定义互联网营销与流量格局!

热门文章

  1. iPhone越狱开发环境搭建
  2. Redis(3)-高可用与集群
  3. pcm vlc 文件_VLC播放pcm
  4. 初识ElasticSearch(5) -批量操作之bulk | 条件查询 | 其它查询
  5. Win11网络延迟太高怎么办?
  6. Free software是什么?
  7. 关于QTableWidget中单元格的合并
  8. 【持续更新】计算机类PDF整理
  9. Spring Boot教程(十二)整合elk(1)
  10. 夯实Java基础(面向对象)