C++实现俄罗斯方块源码分享(Windows编程),有图形界面

更新时间:2023-06-24 11:27:28 阅读: 评论:0

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);              //初始化新积⽊

本文发布于:2023-06-24 11:27:28,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1052689.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:游戏   区域   绘制
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图