俄罗斯方块源程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
org[2][0]=block[2][0] =10; org[2][1]=block[2][1] =1;
org[3][0]=block[3][0] =11; org[3][1]=block[3][1] =1;
break;
case 1:
// ****
org[0][0]=block[0][0] =9; org[0][1]=block[0][1] =0;
PSTR szCmdLine,//指向程序命令行参数的指针
int iCmdShow)//应用程序开始执行窗口时显示方式用int类型标志
{
static char AppName[]="ToyBrick";//定义一个静态字符数组保存字符串"ToyBrick"(机应用程序名)
HWND hwnd;//定义一个窗口句柄
break;
case 2:
//*
//**
// *
org[0][0]=block[0][0] =10; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =10; org[1][1]=block[1][1] =1;
org[2][0]=block[2][0] =11; org[2][1]=block[2][1] =1;
#define MS_DRAW WM_USER+2
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/*窗口过程处理*/
int WINAPI WinMain ( HINSTANCE hInstance,//当前实例句柄
HINSTANCE hPrevInstance,//前一实例句柄
DrawRect(hdc,l+3, t+3, r-3, b-3);
}
//函数DrawBlock:画【方块】
//参数:设备环境句柄和【方块】中四个【方格】在游戏区域中的位置
//每个【方块】由四个【方格】组成7种不同的形状
void DrawBlock (HDC hdc, int block[4][2])
InvalidateRect (hwnd, NULL, TRUE);
}
}
//产生随机数0~7,分别代表【方块】的7种形状
srand( (unsigned)time( NULL ) );
sel =rand()%7;
//【方块】形状初始化
//【方块】的形状由其每个【方格】的位置决定
//游戏区宽W=22,block[?][0]=9/10/11/12,block[?][1]=0/1/2
}
//函数DrawCell:画【方格】
//参数:设备环境句柄和【方格】的四角坐标
//每个方格由内外两个【正方形】(DrawCell)画成,使其有立体感
void DrawCell(HDC hdc, int l, int t, int r, int b)
{
DrawRect(hdc,l+1, t+1, r-1, b-1);
wndclass.lpszClassName=AppName;//应用程序名
wndclass.hIconSm=LoadIcon(NULL, IDI_APPLICATION);//为应用程序加载图标
if(!RegisterClassEx (&wndclass)) return FALSE; //注册一个窗口类
{ cells[0][i]=1; cells[W+1][i]=1; }
//将最底下一行【方格】置1,控制【方块】不超出游戏区域
for(i=0; i<W+2; i++) cells[i][H-1]=1;
//其他【方格】置0,游戏方块只能在这里移动
for(i=1; i<=W; i++)
for(j=0; j<H-1; j++)
org[2][0]=block[2][0] =10; org[2][1]=block[2][1] =1;
org[3][0]=block[3][0] =10; org[3][1]=block[3][1] =2;
break;
case 4:
//*
//*
//**
org[0][0]=block[0][0] =10; org[0][1]=block[0][1] =0;
static int org[4][2], block[4][2]; //【方块】
HDC hdc;
HPEN hpen;
PAINTSTRUCT ps;
switch (iMsg)
{
case WM_CREATE:
top=H-1;
//将第一列和最后一列【方格】置1,控制【方块】不超出游戏区域
for(i=0; i<H; i++)
block[i][0]*CELL, block[i][1]*CELL);
DeleteObject (hpen);
}
//函数Cover:清除原来位置的【方块】
//参数:设备环境句柄和待清除的【方块】
//清除【方块】即在该【方块】的每个【方块】处画一个正方形的黑块
void Cover (HDC hdc, int org[4][2])
iScreenWide/2-W*CELL/2, CELL,
(W+1)*CELL-8, H*CELL,
NULL, NULL,
hInstance,
NULL );
if(!hwnd) return FALSE; //没有获得窗口句柄,返回假
ShowWindow (hwnd,iCmdShow); //显示窗口
//这是一个Windows程序,简单的俄罗斯方块程序。最下面附有截图
//这是一个Win32 Application程序
// ToyBricks.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <windows.h>
#include <time.h>
#include <stdlib.h>
#define CELL 15//【方格】的边长(pix)
#define W 22//游戏区宽(22个【方格】边长)
#define H 30//游戏区高(30个【方格】边长)
#define MS_NEWBLOCK WM_USER+1//消息ID,产生新的【方块】
{
int i;
HPEN hpen;
hpen =CreatePen (PS_SOLID,1,RGB(255,255,255));
SelectObject (hdc,hpen);
for(i=0; i<4; i++)
DrawCell (hdc, (block[i][0]-1)*CELL, (block[i][1]-1)*CELL, //....
{
int i;
SelectObject (hdc, (HBRUSH)GetStockObject (BLACK_BRUSH));
for(i=0; i<4; i++)
Rectangle ( hdc, (org[i][0]-1)*CELL, (org[i][1]-1)*CELL, //.....
org[i][0]*CELL, org[i][1]*CELL);
while (GetMessage (&msg, NULL, 0, 0))//进入消息循环
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//函数DrawRact:画【正方形】
//参数:设备环境句柄和【正方形】的四角坐标
void DrawRect (HDC hdc, int l, int t, int r, int b)
{
MoveToEx (hdc, l, t, NULL);
LineTo (hdc, r, t);
LineTo (hdc, r, b);
LineTo (hdc, l, b);
LineTo (hdc, l,t);
//获取显示器分辨率的X值iScreenWide,将程序窗口置于屏幕中央
iScreenWide=GetSystemMetrics (SM_CXFULLSCREEN);
//创建窗口
hwnd =CreateWindow (AppName,
"俄罗斯方块",
WS_MINIMIZEBOX|WS_SYSMENU ,
wndclass.lpfnWndProc=WndProc;//窗口处理函数为WndProc
wndclass.cbClsExtra=0;//窗口类无扩展
wndclass.cbWndExtra=0;//窗口类实例没有扩展
wndclass.hInstance =hInstance;//当前实例句柄
wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);//窗口最小化图标为默认图标
MSG msg;//定义一消息结构体变量
WNDCLASSEX wndclass;//定义一窗口类结构变量,包含窗口类全部信息
int iScreenWide;//定义屏幕显示宽度
wndclass.cbSize=sizeof(wndclass);//窗口类对象大小
wndclass.style=CS_HREDRAW|CS_VREDRAW;//窗口类对象风格
{ lines=1; break; }
//若该行被填满,则将上一行的填充状态复制到该行,依此类推
//即从该行开始,所有的【方格】都下移一行
if(!lines)
{ for(j=1;j<W+1; j++)
for(k=i; k>=top; k--)
cells[j][k]=cells[j][k-1];
top++;
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//窗口当前光标为箭头光标
wndclass.hbrBackground=(HBRUSH)GetStockObject (BLACK_BRUSH);//获得当前背景设置为黑色
wndclass.lpszMenuName=NULL;//窗体菜单名为空
cells[i][j]=0;
return 0;
case MS_NEWBLOCK:
flag=0; // flag表示【方块】旋转了几次
for(i=top; i<H-1; i++)
{
lines =0;
//循环语句检查是否有某一行全部被【方格】都填满
for(j=1; j<=W+1; j++)
if(! cells[j][i])
org[3][0]=block[3][0] =11; org[3][1]=block[3][1] =2;
break;
case 3:
// *
//**
//*
org[0][0]=block[0][0] =11; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =11; org[1][1]=block[1][1] =1;
org[1][0]=block[1][0] =10; org[1][1]=block[1][1] =0;
org[2][0]=block[2][0] =11; org[2][1]=block[2][1] =0;
org[3][0]=block[3][0] =12; org[3][1]=block[3][1] =0;
UpdateWindow (hwnd); //更新窗口
MessageBox(hwnd,"开始游戏","开始",MB_OK);//显示Message
SendMessage(hwnd,MS_NEWBLOCK,0,0);//向当前窗口发送消息
SetTimer (hwnd, 1, 550,NULL);//设置下落时间
org[1][0]=block[1][0] =10; org[1][1]=block[1][1] =1;
}
//窗口过程函数WndProc
LRESULT CALLBACK WndProc ( HWND hwnd,
UINT iMsg,
WPARAM wParam,
LPARAM lParam )
{
int i,j,k,lines,r;
static int top, sel, flag;
static int cells[W+2][H];//控制游戏的【方格矩阵】
//这样【方块】初始位置在游戏区的最顶部的中央
switch(swk.baidu.coml)
{
case 0:
// **
// **
org[0][0]=block[0][0] =10; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =11; org[1][1]=block[1][1] =0;
org[3][0]=block[3][0] =11; org[3][1]=block[3][1] =1;
break;
case 1:
// ****
org[0][0]=block[0][0] =9; org[0][1]=block[0][1] =0;
PSTR szCmdLine,//指向程序命令行参数的指针
int iCmdShow)//应用程序开始执行窗口时显示方式用int类型标志
{
static char AppName[]="ToyBrick";//定义一个静态字符数组保存字符串"ToyBrick"(机应用程序名)
HWND hwnd;//定义一个窗口句柄
break;
case 2:
//*
//**
// *
org[0][0]=block[0][0] =10; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =10; org[1][1]=block[1][1] =1;
org[2][0]=block[2][0] =11; org[2][1]=block[2][1] =1;
#define MS_DRAW WM_USER+2
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/*窗口过程处理*/
int WINAPI WinMain ( HINSTANCE hInstance,//当前实例句柄
HINSTANCE hPrevInstance,//前一实例句柄
DrawRect(hdc,l+3, t+3, r-3, b-3);
}
//函数DrawBlock:画【方块】
//参数:设备环境句柄和【方块】中四个【方格】在游戏区域中的位置
//每个【方块】由四个【方格】组成7种不同的形状
void DrawBlock (HDC hdc, int block[4][2])
InvalidateRect (hwnd, NULL, TRUE);
}
}
//产生随机数0~7,分别代表【方块】的7种形状
srand( (unsigned)time( NULL ) );
sel =rand()%7;
//【方块】形状初始化
//【方块】的形状由其每个【方格】的位置决定
//游戏区宽W=22,block[?][0]=9/10/11/12,block[?][1]=0/1/2
}
//函数DrawCell:画【方格】
//参数:设备环境句柄和【方格】的四角坐标
//每个方格由内外两个【正方形】(DrawCell)画成,使其有立体感
void DrawCell(HDC hdc, int l, int t, int r, int b)
{
DrawRect(hdc,l+1, t+1, r-1, b-1);
wndclass.lpszClassName=AppName;//应用程序名
wndclass.hIconSm=LoadIcon(NULL, IDI_APPLICATION);//为应用程序加载图标
if(!RegisterClassEx (&wndclass)) return FALSE; //注册一个窗口类
{ cells[0][i]=1; cells[W+1][i]=1; }
//将最底下一行【方格】置1,控制【方块】不超出游戏区域
for(i=0; i<W+2; i++) cells[i][H-1]=1;
//其他【方格】置0,游戏方块只能在这里移动
for(i=1; i<=W; i++)
for(j=0; j<H-1; j++)
org[2][0]=block[2][0] =10; org[2][1]=block[2][1] =1;
org[3][0]=block[3][0] =10; org[3][1]=block[3][1] =2;
break;
case 4:
//*
//*
//**
org[0][0]=block[0][0] =10; org[0][1]=block[0][1] =0;
static int org[4][2], block[4][2]; //【方块】
HDC hdc;
HPEN hpen;
PAINTSTRUCT ps;
switch (iMsg)
{
case WM_CREATE:
top=H-1;
//将第一列和最后一列【方格】置1,控制【方块】不超出游戏区域
for(i=0; i<H; i++)
block[i][0]*CELL, block[i][1]*CELL);
DeleteObject (hpen);
}
//函数Cover:清除原来位置的【方块】
//参数:设备环境句柄和待清除的【方块】
//清除【方块】即在该【方块】的每个【方块】处画一个正方形的黑块
void Cover (HDC hdc, int org[4][2])
iScreenWide/2-W*CELL/2, CELL,
(W+1)*CELL-8, H*CELL,
NULL, NULL,
hInstance,
NULL );
if(!hwnd) return FALSE; //没有获得窗口句柄,返回假
ShowWindow (hwnd,iCmdShow); //显示窗口
//这是一个Windows程序,简单的俄罗斯方块程序。最下面附有截图
//这是一个Win32 Application程序
// ToyBricks.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <windows.h>
#include <time.h>
#include <stdlib.h>
#define CELL 15//【方格】的边长(pix)
#define W 22//游戏区宽(22个【方格】边长)
#define H 30//游戏区高(30个【方格】边长)
#define MS_NEWBLOCK WM_USER+1//消息ID,产生新的【方块】
{
int i;
HPEN hpen;
hpen =CreatePen (PS_SOLID,1,RGB(255,255,255));
SelectObject (hdc,hpen);
for(i=0; i<4; i++)
DrawCell (hdc, (block[i][0]-1)*CELL, (block[i][1]-1)*CELL, //....
{
int i;
SelectObject (hdc, (HBRUSH)GetStockObject (BLACK_BRUSH));
for(i=0; i<4; i++)
Rectangle ( hdc, (org[i][0]-1)*CELL, (org[i][1]-1)*CELL, //.....
org[i][0]*CELL, org[i][1]*CELL);
while (GetMessage (&msg, NULL, 0, 0))//进入消息循环
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//函数DrawRact:画【正方形】
//参数:设备环境句柄和【正方形】的四角坐标
void DrawRect (HDC hdc, int l, int t, int r, int b)
{
MoveToEx (hdc, l, t, NULL);
LineTo (hdc, r, t);
LineTo (hdc, r, b);
LineTo (hdc, l, b);
LineTo (hdc, l,t);
//获取显示器分辨率的X值iScreenWide,将程序窗口置于屏幕中央
iScreenWide=GetSystemMetrics (SM_CXFULLSCREEN);
//创建窗口
hwnd =CreateWindow (AppName,
"俄罗斯方块",
WS_MINIMIZEBOX|WS_SYSMENU ,
wndclass.lpfnWndProc=WndProc;//窗口处理函数为WndProc
wndclass.cbClsExtra=0;//窗口类无扩展
wndclass.cbWndExtra=0;//窗口类实例没有扩展
wndclass.hInstance =hInstance;//当前实例句柄
wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);//窗口最小化图标为默认图标
MSG msg;//定义一消息结构体变量
WNDCLASSEX wndclass;//定义一窗口类结构变量,包含窗口类全部信息
int iScreenWide;//定义屏幕显示宽度
wndclass.cbSize=sizeof(wndclass);//窗口类对象大小
wndclass.style=CS_HREDRAW|CS_VREDRAW;//窗口类对象风格
{ lines=1; break; }
//若该行被填满,则将上一行的填充状态复制到该行,依此类推
//即从该行开始,所有的【方格】都下移一行
if(!lines)
{ for(j=1;j<W+1; j++)
for(k=i; k>=top; k--)
cells[j][k]=cells[j][k-1];
top++;
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//窗口当前光标为箭头光标
wndclass.hbrBackground=(HBRUSH)GetStockObject (BLACK_BRUSH);//获得当前背景设置为黑色
wndclass.lpszMenuName=NULL;//窗体菜单名为空
cells[i][j]=0;
return 0;
case MS_NEWBLOCK:
flag=0; // flag表示【方块】旋转了几次
for(i=top; i<H-1; i++)
{
lines =0;
//循环语句检查是否有某一行全部被【方格】都填满
for(j=1; j<=W+1; j++)
if(! cells[j][i])
org[3][0]=block[3][0] =11; org[3][1]=block[3][1] =2;
break;
case 3:
// *
//**
//*
org[0][0]=block[0][0] =11; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =11; org[1][1]=block[1][1] =1;
org[1][0]=block[1][0] =10; org[1][1]=block[1][1] =0;
org[2][0]=block[2][0] =11; org[2][1]=block[2][1] =0;
org[3][0]=block[3][0] =12; org[3][1]=block[3][1] =0;
UpdateWindow (hwnd); //更新窗口
MessageBox(hwnd,"开始游戏","开始",MB_OK);//显示Message
SendMessage(hwnd,MS_NEWBLOCK,0,0);//向当前窗口发送消息
SetTimer (hwnd, 1, 550,NULL);//设置下落时间
org[1][0]=block[1][0] =10; org[1][1]=block[1][1] =1;
}
//窗口过程函数WndProc
LRESULT CALLBACK WndProc ( HWND hwnd,
UINT iMsg,
WPARAM wParam,
LPARAM lParam )
{
int i,j,k,lines,r;
static int top, sel, flag;
static int cells[W+2][H];//控制游戏的【方格矩阵】
//这样【方块】初始位置在游戏区的最顶部的中央
switch(swk.baidu.coml)
{
case 0:
// **
// **
org[0][0]=block[0][0] =10; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =11; org[1][1]=block[1][1] =0;