C++实现俄罗斯⽅块源码分享(Windows编程),有图形界⾯欢迎⼤家点评!
⼀、功能简介
1、键盘控制:上下左右键控制90度旋转积⽊,左右移动积⽊块,让积⽊块加快落下。
2、分数结算: 游戏区域中某⼀⾏格⼦全部由积⽊块填满,则该⾏会消失并成为玩家的得分,⼀次删除的⾏数越多,得分越多。
3、等级制度:初始等级为1级,分数每增加到10分后等级提升,游戏速度加快,等级提升后游戏区域清空。
4、游戏暂停:空格键盘暂停游戏,弹出消息框提⽰,按确认键继续。
5、游戏结束: 当积⽊块堆到区域最上⽅,弹出消息框提⽰游戏结束。
#本程序在Windows10系统下正常运⾏,在VS 2013英⽂版编译通过
⼆、运⾏⽰例
1、默认界⾯
2、升级功能
3、暂停功能
4、游戏结束
类名成员类别类型成员名描述
block 属性
int type积⽊的类型
int dir积⽊的⽅向
POINT []pt积⽊的位置
bool overlapflag重叠标志位
bool [][16]pregion指向游戏区域⽅法
bool down下落函数
void change旋转函数
void left左移函数
void right右移函数
unsigned int random随机函数
void tnext设置下⼀个函数
bool overlap判断重叠函数
三、源代码
//⽂件main.cpp
#include <windows.h> //使⽤WindowsAPI函数#include <stdlib.h> //使⽤随机数等
ps标尺快捷键#include "block.h" //积⽊对象的接⼝
#define row 16 //游戏区域的⾏数
#define column 10 //游戏区域的列数
#define size 20 //单个⽅块的⼤⼩
int score = 6; //游戏分数
TCHAR score_arr[5]; //使⽤wsprintf打印时的buffer
int level = 1; //游戏等级等级越⾼,速度越快
TCHAR level_arr[2]; //使⽤wsprintf打印时的buffer
int speed = 600; //游戏速度
static bool region[column][row]; //当前游戏区域
static bool nextregion[4][4]; //下⼀个积⽊提⽰区域
static block * pblock = NULL; //指向积⽊的指针
int del(HWND hwnd); //消⾏函数
void lvup(HWND); //等级提升函数
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //窗⼝回调函数
/*****************************************Windows主程序************************************************/
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
WNDCLASS game_cls; //新建游戏窗⼝类
HWND hgame; //游戏窗⼝句柄
MSG game_msg; //窗⼝消息
//以下为初始化窗⼝类的各个参数
game_cls.style = CS_HREDRAW | CS_VREDRAW; //窗⼝风格
game_cls.lpfnWndProc = WndProc; //窗⼝过程
game_cls.cbClsExtra = 0;
game_cls.cbWndExtra = 0;
game_cls.hInstance = hInstance; //当前窗⼝句柄
game_cls.hIcon = LoadIcon(NULL, IDI_APPLICATION); //窗⼝图标,使⽤默认
game_cls.hCursor = LoadCursor(NULL, IDC_ARROW); //⿏标样式
game_cls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //窗⼝背景画刷
game_cls.lpszMenuName = NULL; //窗⼝菜单,不使⽤菜单
game_cls.lpszClassName = TEXT("BaWin"); //窗⼝类名
//注册游戏窗⼝类
RegisterClass(&game_cls);
//创建窗⼝
hgame = CreateWindow(
TEXT("BaWin"), //传⼊窗⼝类名
TEXT("俄罗斯⽅块"), //设置窗⼝标题
WS_OVERLAPPEDWINDOW, //窗⼝风格
CW_USEDEFAULT, //初始化时x轴的位置
CW_USEDEFAULT, //初始化时y轴的位置
(column + column)*size, //窗⼝宽度
(row + 4)*size, //窗⼝⾼度
来姨妈可以吃药吗NULL, //⽗窗⼝句柄
NULL, //窗⼝菜单句柄
hInstance, //当前窗⼝的句柄
NULL);
假槟榔树
/
/显⽰窗⼝
ShowWindow(hgame, iCmdShow);
//更新窗⼝
UpdateWindow(hgame);
//进⼊消息循环
while (GetMessage(&game_msg, NULL, 0, 0))
{
TranslateMessage(&game_msg); //翻译消息
DispatchMessage(&game_msg); //分派消息
}
//程序结束,返回给系统程序将退出的消息
return game_msg.wParam;
}
/*******************************************回调函数***************************************************/
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
HDC hdc; //设备环境句柄
PAINTSTRUCT ps;
RECT rect;
//设置游戏区域的边界
static POINT border[] = { -1, -1, //当前游戏区域的边界
size* column + 1,size*row + 1 };
static POINT nextborder[] = { size* column + size, size, //“下⼀个”游戏区域的边界 border[1].x + size * 5, size * 5 };
static int nexttype = 0, //下⼀个⽅块的类型及⽅向
nextdir = 0;
switch (message) //对窗⼝消息处理
{
//窗⼝第⼀次创建
ca WM_CREATE:
hdc = GetDC(hwnd); //获取DC环境
pblock = new block(region, nexttype, nextdir); //初始化第⼀个积⽊
pblock->tnext(nexttype, nextdir, nextregion); //设置下⼀个积⽊
SetTimer(hwnd, 1, speed, NULL); //开启定时器
ReleaDC(hwnd, hdc); //释放DC
return 0;
//绘制客户区
ca WM_PAINT:
hdc = BeginPaint(hwnd, &ps); //获取客户区环境变量
//开始绘制客户区
GetClientRect(hwnd, &rect); //获取客户区
SetViewportOrgEx(hdc, 20, 20, NULL); //设置窗⼝原点
Rectangle(hdc, border[0].x, border[0].y, border[1].x, border[1].y); //绘制游戏区域的边界 TextOut(hdc, border[1].x + size, 0, //绘制“下⼀个”字符串
TEXT("下⼀个:"), 7);
TextOut(hdc, border[1].x + size, size * 6, //绘制“得分字符串
TEXT("得分:"), 5);
TextOut(hdc, border[1].x + size * 3, size * 6, //绘制分数
score_arr, wsprintf(score_arr,
TEXT("%d"), score));
TextOut(hdc, border[1].x + size, size * 7, //绘制“level”字符串
TEXT("level:"), 6);
TextOut(hdc, border[1].x + size * 3, size * 7, //绘制等级
level_arr, wsprintf(level_arr,
TEXT("%d"), level));
TextOut(hdc, border[1].x + size, size * 9 - 5, //绘制作者信息
TEXT("作者:"), 5);
TextOut(hdc, border[1].x + size, size * 10,
TEXT("物联⽹16-2"), 10);
TextOut(hdc, border[1].x + size, size * 11,
TEXT("郭义⾂:"), 6);
//换画笔,准备绘制⽅块
SelectObject(hdc, GetStockObject(BLACK_BRUSH)); //换画笔
SelectObject(hdc, GetStockObject(WHITE_PEN));
//绘制当前游戏区的⽅块
for (int x = 0; x < column; ++x)
{
for (int y = 0; y < row; ++y)
{
if (region[x][y])
{
Rectangle(hdc, x* size, y*size, (x + 1)*size, (y + 1)*size);
}
}
}
//绘制下⼀个游戏区域的⽅块
for (int x = 0; x < 4; ++x)
{
for (int y = 0; y < 4; ++y)
{
张柏芝父母if (nextregion[x][y])
{
Rectangle(hdc, nextborder[0].x + x * size, nextborder[0].y + y * size,
nextborder[0].x + (x + 1)*size, nextborder[0].y + (y + 1)*size);
}
幸福的定义
}
}
EndPaint(hwnd, &ps); //结束客户区的绘制
return 0;
//触发定时器
ca WM_TIMER:
if (!pblock->down()) //积⽊定时下落,若不能下落则执⾏以下语句 {
小说男男score += del(hwnd); //分数结算
if (score / 10 > level - 1) //若分数为10的倍数则等级提升
{
lvup(hwnd);
}
delete(pblock); //释放当前积⽊内存
pblock = new block(region, nexttype, nextdir); //初始化新积⽊
pblock->tnext(nexttype, nextdir, nextregion); //设置下⼀个积⽊
if (pblock->overlap()) //若新积⽊到达游戏区域顶端则游戏结束
{
KillTimer(hwnd, 1);
MessageBox(hwnd,
TEXT("游戏结束!!"),
TEXT("提⽰"), MB_OK);
}
}
InvalidateRect(hwnd, NULL, TRUE); //重绘客户区
return 0;
//⽅向键及暂停键(空格键)被按下
ca WM_KEYDOWN:
switch (wParam)不可能在一起
{
//空格键被按下
ca VK_SPACE:
KillTimer(hwnd, 1); //游戏暂停
MessageBox(hwnd,
TEXT("暂停,按确认键继续"),
TEXT("提⽰"), MB_OK);
SetTimer(hwnd, 1, speed, NULL); //游戏继续
break;
//左⽅向键被按下
ca VK_LEFT:
pblock->left(); //积⽊左移
InvalidateRect(hwnd, NULL, TRUE); //重绘客户区
break;
//右⽅向键被按下
ca VK_RIGHT:
pblock->right(); //积⽊右移
InvalidateRect(hwnd, NULL, TRUE); //重绘客户区
break;
//上⽅向键被按下
ca VK_UP:
pblock->change(); //积⽊旋转
InvalidateRect(hwnd, NULL, TRUE); //重绘客户区
break;loo是什么意思
//下⽅向键被按下
ca VK_DOWN:
while (pblock->down()); //积⽊加速下落
score += del(hwnd); //分数结算
if (score / 10 > level - 1) //若分数为10的倍数则等级提升
{
lvup(hwnd);
}
delete(pblock); //释放当前积⽊内存
pblock = new block(region, nexttype, nextdir); //初始化新积⽊