[C++] 纯文本查看 复制代码
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#define W 14 //游戏区域宽度
#define H 20 //游戏区域高度
#define W1 6 //右边状态栏宽度
#define BSIZE 25 //游戏方格边长
#define Y1 6 //放置照片底端的纵坐标
#define Y2 12 //分数显示栏顶端纵坐标
#define Y3 15 //等级显示栏顶端纵坐标
#define Y4 7 //帮助栏顶端纵坐标
#define Cur_x W/2-1 //游戏方块初始状态左上角横坐标
#define Cur_y 1 //初始状态左上角纵坐标
#define BgColor RGB(0xF5,0xF5,0xDC) //米色
#define FgColor RGB(255,153,204) //粉红
#define RED RGB(255,0,0)
#define ORANGE RGB(255,97,0)
#define YELLOW RGB(255,153,18)
#define GREEN RGB(34,139,34)
#define CYAN RGB(128,42,42)
#define LIGHT_BLUE RGB(65,105,225) //天蓝色
#define PURPLE RGB(255,0,255)
#define MS_NEWBLOCK WM_USER+1 // 消息ID,产生新的【方块】
int score=0,level=0,level_step=100; //分数等级以及每等级所需分数的定义及初始化
int top=H-1; //最顶端的纵坐标
int x,y; //方块当前位置的横坐标及纵坐标
int cur_boxnum,next_boxnum; //cur_boxnum是当前方块编号,next_boxnum是下一个方块编号
struct BOARD
{
int var; //状态,1代表已被占用,0代表未被占用
int color; //颜色
}board[H][W]; //定义游戏主板,H行N列
struct BLOCK
{
int a[4][2]; //定义方块形状的数组,每行为方块左上角坐标
int color; //方块颜色
int next; //下一个方块的号码
};
struct BLOCK block[19]=
{ //初始化各个游戏方块
{1,1,1,2,1,3,2,3,RED,1},
{0,2,1,2,2,2,0,3,RED,2},
{0,1,1,1,1,2,1,3,RED,3},
{2,1,0,2,1,2,2,2,RED,0},
{1,1,1,2,0,3,1,3,ORANGE,5},
{0,1,0,2,1,2,2,2,ORANGE,6},
{1,1,2,1,1,2,1,3,ORANGE,7},
{0,2,1,2,2,2,2,3,ORANGE,4},
{1,1,0,2,1,2,2,2,YELLOW,9},
{1,1,1,2,2,2,1,3,YELLOW,10},
{0,2,1,2,2,2,1,3,YELLOW,11},
{1,1,0,2,1,2,1,3,YELLOW,8},
{1,1,1,2,2,2,2,3,GREEN,13},
{1,2,2,2,0,3,1,3,GREEN,12},
{2,1,1,2,2,2,1,3,CYAN,15},
{0,2,1,2,1,3,2,3,CYAN,14},
{1,0,1,1,1,2,1,3,LIGHT_BLUE,17},
{0,2,1,2,2,2,3,2,LIGHT_BLUE,16},
{1,1,2,1,1,2,2,2,PURPLE,18},
};
void Paint(HDC hdc,HPEN hpen) //此函数用于初始化界面
{
int i,j;
HPEN hpen1; //定义画笔,用于绘制分隔线
HBRUSH hbrush=CreateSolidBrush(BgColor); //定义画刷并赋初值,画刷颜色采用背景色
hpen1=CreatePen(PS_DASHDOTDOT,3,FgColor); //给画笔赋初值,颜色为前景色,线宽为3,双点划线
SelectObject(hdc,hpen1); //选择画笔
MoveToEx(hdc,W*BSIZE,0,NULL); //将光标移动到(W*BSIZE,0)处
LineTo(hdc,W*BSIZE,H*BSIZE); //从光标所在位置画线到(W*BSIZE,H*BSIZE)处
DeleteObject(hpen1); //删除之前所选用的画笔
SelectObject(hdc,hpen); //重新选择画笔
SelectObject(hdc,hbrush); //选择画刷
for(i=1;i<H-1;i++) //绘制游戏区域方格线
for(j=1;j<W-1;j++)
Rectangle(hdc,j*BSIZE,i*BSIZE,(j+1)*BSIZE,(i+1)*BSIZE);
for(i=1;i<5;i++) //绘制右边状态栏游戏预览区域方格线
for(j=W+1;j<W+W1-1;j++)
Rectangle(hdc,j*BSIZE,i*BSIZE,(j+1)*BSIZE,(i+1)*BSIZE);
Rectangle(hdc,(W+1)*BSIZE,Y2*BSIZE,(W+W1-1)*BSIZE,(Y2+2)*BSIZE); //绘制分数栏方格线
Rectangle(hdc,(W+1)*BSIZE,Y3*BSIZE,(W+W1-1)*BSIZE,(Y3+2)*BSIZE); //绘制等级栏方格线
Rectangle(hdc,(W+1)*BSIZE,Y4*BSIZE,(W+W1-1)*BSIZE,(Y4+4)*BSIZE); //绘制帮助栏方格线
TextOut(hdc,(W+2)*BSIZE,(Y2+0.2)*BSIZE,TEXT("分 数"),8); //输出文字
TextOut(hdc,(W+2)*BSIZE,(Y3+0.2)*BSIZE,TEXT("等 级"),8); //同上
DeleteObject(hpen); //删除画笔
DeleteObject(hbrush); //删除画刷
}
void ShowScore(HDC hdc) //显示分数的函数
{
TCHAR score_str[4]; //定义字符串用于保存分数值
wsprintf(score_str,TEXT("%3d"),score); //将数字score转换成字符串后保存到score_str之中
TextOut(hdc,(W+2.5)*BSIZE,(Y2+1.2)*BSIZE,score_str,3); //在游戏板上显示分数
}
void ShowLevel(HDC hdc) //显示等级的,具体同上
{
TCHAR level_str[4];
wsprintf(level_str,TEXT("%3d"),level);
TextOut(hdc,(W+2.5)*BSIZE,(Y3+1.2)*BSIZE,level_str,3);
}
void ShowHelp(HDC hdc) //显示帮助的,该函数只在初始化界面时调用
{
TCHAR help1[]=TEXT("↑ - 旋转"),
help2[]=TEXT("↓ - 下移"),
help3[]=TEXT("← - 左移"),
help4[]=TEXT("→ - 右移");
TextOut(hdc,(W+1.8)*BSIZE,(Y4+0.2)*BSIZE,help1,9);
TextOut(hdc,(W+1.8)*BSIZE,(Y4+1.2)*BSIZE,help2,9);
TextOut(hdc,(W+1.8)*BSIZE,(Y4+2.2)*BSIZE,help3,9);
TextOut(hdc,(W+1.8)*BSIZE,(Y4+3.2)*BSIZE,help4,9);
}
void EraseBox(HDC hdc,HPEN hpen,int x,int y,int num) //清除(x,y)处编号为num,的方块
{
int i;
HBRUSH hbrush=CreateSolidBrush(BgColor);
SelectObject(hdc,hpen);
SelectObject(hdc,hbrush);