错过了一个亿 发表于 2019-11-17 17:22

俄罗斯方块桌面版C++源码

本帖最后由 错过了一个亿 于 2019-11-18 13:22 编辑

大家玩过俄罗斯方块吗?
我相信,很多人都玩过。
但,谁又有源码呢?
在这里,我给大家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行N列

struct BLOCK
{
      int a; //定义方块形状的数组,每行为方块左上角坐标
      int color; //方块颜色
      int next; //下一个方块的号码
};

struct BLOCK block=
{//初始化各个游戏方块
      {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) //显示分数的函数
{
      TCHARscore_str; //定义字符串用于保存分数值
      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;
      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);

测试图:





有些网友反馈,说在vs上有错误....只想体验一下小时候的感觉...
解决办法:
1.查看是不是一个桌面程序这个项目(或解决方案)
2.如果实在不行(用DEV的朋友就重装一次吧)
用微软的,找比尔盖茨吧,我也没办法。。。
DEV编译器下载:http://cr2.197946.com/bianqiyiyaj.zip

blsn3548 发表于 2019-11-18 19:19

风乐清 发表于 2019-11-17 19:08
我在vs上有错误....280行

MessageBox(hwnd, __TEXT("准备好了吗"), __TEXT("开始"), MB_OK);

古老的传说 发表于 2019-11-17 19:02

记得玩这个还是20多年前

风乐清 发表于 2019-11-17 19:08

我在vs上有错误....280行

loveshy 发表于 2019-11-17 19:22

怎么启动啊,想玩玩回忆下童年

blsn3548 发表于 2019-11-18 19:17

MessageBox(hwnd, __TEXT("准备好了吗"), __TEXT("开始"), MB_OK);

chutzpah 发表于 2019-11-18 19:28

下载学习一下。

山河一号 发表于 2019-11-18 19:52

下载学习一下。

longtengwangan 发表于 2019-11-19 19:30

启动不了 可能是软件问题 编译不出来

腿长一米八 发表于 2019-11-20 19:49

学习一下
页: [1] 2
查看完整版本: 俄罗斯方块桌面版C++源码