搭建VC2010 开发环境,创建《C语言实现俄罗斯方块游戏》教程


  • 申明:游戏来源于《C语言实现俄罗斯方块》

搭建VC2010 开发环境

  • 请参照: 《安装及配置 VC2010 的详细步骤》

安装 Visual C++ 2010 Express

先安装VC2010中文版,再接着安装SP1补丁包。

  • VC2010 中文版
下载地址:https://pan.baidu.com/s/1IBaNrOtdx3b7wz7nq7BeEA
提取码:7cou
  • SP1 补丁包
下载地址:https://pan.baidu.com/s/1JK-InWFnURSmNlucyoy3hQ提取码:d5ei

安装EasyX

  • https://easyx.cn/easyx
  • 点击安装按钮即可。

C语言实现俄罗斯方块

  • 这位坛友的《C语言实现俄罗斯方块》游戏代码
    ==注意: 在代码前面需要添加取消Unicode宏定义和添加tchar.h头文件,完整代码如下:
#undef UNICODE
#undef _UNICODE
#include <tchar.h>
#include<graphics.h>
#include<stdio.h>
#include<time.h>
#include<conio.h> //kbhit()int score = 0;    //总分
int rank = 0;  //等级#define BLOCK_COUNT 5
#define BLOCK_WIDTH 5
#define BLOCK_HEIGHT 5#define UNIT_SIZE 20  //小方块宽度#define START_X 130      //方块降落框,方块降落起始位置
#define START_Y 30#define KEY_UP 87     //用户操作
#define KEY_LEFT 65
#define KEY_RIGHT 68
#define KEY_DOWN 83
#define KEY_SPACE 32#define MinX 30     //游戏左上角位置
#define MinY 30
int speed = 500;   //方块降落速度int NextIndex = -1;        //下一个方块
int BlockIndex = -1;       //当前方块typedef enum {        //方块朝向BLOCK_UP,BLOCK_RIGHT,BLOCK_LEFT,BLOCK_DOWN
}block_dir_t;typedef enum {     //方块移动方向MOVE_DOWN,MOVE_LEFT,MOVE_RIGHT
}move_dir_t;//方块颜色
int color[BLOCK_COUNT] = {GREEN,CYAN,MAGENTA,YELLOW,BROWN
};
int visit[30][15];  //访问数组visit[i][j] = 1表示该位置有方块
int markColor[30][15];  //对应位置颜色
int block[BLOCK_COUNT * 4][BLOCK_WIDTH][BLOCK_HEIGHT] = {// | 形方块{ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },// L 形方块{ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },// 田 形方块{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },// T 形方块{ 0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 },// Z 形方块{ 0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 },{ 0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0 },
};/**************************** 功能:欢迎页面* 输入:*     无* 返回:*      无**************************/
void welcome() {//1.初始化画布initgraph(550, 660);system("pause");//2.设置窗口标题HWND window = GetHWnd();//获得窗口,获得当前窗口SetWindowText(window, _T("俄罗斯方块  小明来喽"));   //设置标题//3.设置游戏初始页面setfont(40, 0, _T("微软雅黑"));     //设置文本的字体样式(高,宽(0表示自适应),字体)setcolor(WHITE);  // 设置颜色outtextxy(205, 200, _T("俄罗斯方法"));setfont(20, 0, _T("楷体"));setcolor(WHITE);   // 设置颜色outtextxy(175, 300, _T("编程,从俄罗斯方块开始"));Sleep(3000);
}/**************************** 功能:初始化游戏场景* 输入:*       无* 返回:*      无**************************/
void initGameSceen() {char str[16]; //存放分数//1.清屏cleardevice();//2.画场景rectangle(27, 27, 336, 635);   //方块降落框外框rectangle(29, 29, 334, 633);   //方块降落框内框rectangle(370, 50, 515, 195);  //方块提示框setfont(24, 0, _T("楷体"));      //写“下一个”setcolor(LIGHTGRAY);    //灰色outtextxy(405, 215, _T("下一个:"));setcolor(RED);                 //写分数outtextxy(405, 280, _T("分数:"));//按指定格式,将score写入strsprintf_s(str, 16, "%d", score);//这里设置字符集为多字符,保证outtextxy可以写出变量strouttextxy(415, 310, str);outtextxy(405, 375, _T("等级:")); //等级//按指定格式,将rank写入strsprintf_s(str, 16, "%d", rank);//这里设置字符集为多字符,保证outtextxy可以写出变量strouttextxy(415, 405, str);setcolor(LIGHTBLUE);    //操作说明outtextxy(390, 475, "操作说明:");outtextxy(390, 500, "↑: 旋转");outtextxy(390, 525, "↓: 下降");outtextxy(390, 550, "←: 左移");outtextxy(390, 575, "→: 右移");outtextxy(390, 600, "空格: 暂停");
}/****************************************** 功能:清空方块提示框里的方块* 输入:*     无* 返回:*      无****************************************/
void clearBlock() {setcolor(BLACK);setfont(23, 0, "楷体");for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {int x = 391 + j * UNIT_SIZE;int y = 71 + i * UNIT_SIZE;outtextxy(x, y, "■");}}
}/****************************************** 功能:清除降落过程中的方块* 输入:*      x,y - 方块的坐标(二维数组左上角位置)*       block_dir_t - 方块方向* 返回:*     无****************************************/
void clearBlock(int x, int y, block_dir_t blockDir) {setcolor(BLACK);// setfont(23, 0, "楷体");int id = BlockIndex * 4 + blockDir;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[id][i][j] == 1) {int x2 = x + j * UNIT_SIZE;int y2 = y + i * UNIT_SIZE;outtextxy(x2, y2, "■");}}}
}/****************************************** 功能:在提示框 与 降落框的起始位置画方块* 输入:*      x,y - 方块的坐标(二维数组左上角位置)* 返回:*       无****************************************/
void drawBlock(int x, int y) {setcolor(color[NextIndex]);setfont(23, 0, "楷体");for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[NextIndex * 4][i][j] == 1) {int x2 = x + j * UNIT_SIZE;int y2 = y + i * UNIT_SIZE;outtextxy(x2, y2, "■");}}}
}/******************************************功能:绘制下降过程中的方块*输入:*        x,y - 方块的坐标(二维数组左上角位置)*       block_dir_t - 方块方向* 返回:*     无****************************************/
void drawBlock(int x, int y, block_dir_t dir) {setcolor(color[BlockIndex]);setfont(23, 0, "楷体");int id = BlockIndex * 4 + dir;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[id][i][j] == 1) {//擦除该方块的第i行第j列outtextxy(x + j * UNIT_SIZE, y + i * UNIT_SIZE, "■");}}}
}/******************************************功能:方块提示框中产生新方块*输入:*       无*返回:*       无****************************************/
void nextblock() {clearBlock();//产生随机数,随机选择方块srand((unsigned)time(NULL));    //使用时间函数的返回值,来作为随机种子NextIndex = rand() % BLOCK_COUNT;   //产生0~5的随机数drawBlock(391, 71);
}/******************************************功能:判断在指定位置向指定方向是否可以移动*输入:*        x,y - 方块位置*      moveDir - 下一步想要移动的方向*       blockDir - 当前方块的方向* 返回:*     true - 可以移动*        false - 不可以移动****************************************/
bool moveable(int x0, int y0, move_dir_t moveDir, block_dir_t blockDir) {//计算方块左上角在30×15的游戏区位置(第多少行, 第多少列)int x = (y0 - MinY) / UNIT_SIZE;int y = (x0 - MinX) / UNIT_SIZE;int ret = 1;int id = BlockIndex * 4 + blockDir;if (moveDir == MOVE_DOWN) {for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//向下不能运动的条件:实心方块已经达到底部(x+i+1==30),或者底部已有方块   if (block[id][i][j] == 1 &&(x + i + 1 == 30 || visit[x + i + 1][y + j] == 1)) {ret = 0;}}}}else if (moveDir == MOVE_LEFT) {for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//向左不能运动的条件:实心方块已经达到左边界(y+j==0),或者左边已有方块if (block[id][i][j] == 1 &&(y + j <= 0 || visit[x + i][y + j - 1] == 1)) {ret = 0;}}}}else if (moveDir == MOVE_RIGHT) {for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//向下不能运动的条件:实心方块已经达到右边界(y+j+1>=15),或者右边已有方块if (block[id][i][j] == 1 &&(y + j + 1 >= 15 || visit[x + i][y + j + 1] == 1)) {ret = 0;}}}}return ret;
}/******************************功能:检测游戏是否结束*输入:*      无* 返回:*      无*****************************/
void failCheck() {//游戏结束条件是顶部新被绘制出的方块就要“固化”,顶部新绘制的方块方向朝上,运动方向朝下if (!moveable(START_X, START_Y, MOVE_DOWN, (block_dir_t)BLOCK_UP)) {setcolor(WHITE);setfont(45, 0, "隶体");outtextxy(75, 300, "Game Over!");Sleep(1000);system("pause");closegraph();exit(0);}
}/*************************** 功能:延时等待* 输入:** 返回:*      无*************************/
void wait(int interval) {int count = interval / 10;for (int i = 0; i < count; ++i) {Sleep(10);//如果休眠期间用户有按键,则结束休眠if (_kbhit()) {return;}}
}/****************************************** 功能:判断当前方块是否可以向指定方向旋转* 输入:*       x,y - 方块位置(二维数组坐标)*        dir - 方块旋转方向* 返回:*       true - 可以旋转*        false - 不可以旋转****************************************/
bool rotatable(int x, int y, block_dir_t dir) {//首先判断是否可以继续向下移动if (!moveable(x, y, MOVE_DOWN, dir)) {return false;}int x2 = (y - MinY) / UNIT_SIZE;int y2 = (x - MinX) / UNIT_SIZE;int id = BlockIndex * 4 + dir;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {//不能旋转条件:左右边界越界或者已有方块“阻挡”if (block[id][i][j] == 1 && (y2 + j < 0 || y2 + j >= 15 || visit[x2 + i][y2 + j] == 1)) {return false;}}}return true;
}/****************************************** 功能:* 输入:** 返回:*       无****************************************/
void mark(int x, int y, block_dir_t dir) {int id = BlockIndex * 4 + dir;int x2 = (y - MinY) / UNIT_SIZE;int y2 = (x - MinX) / UNIT_SIZE;for (int i = 0; i < BLOCK_HEIGHT; ++i) {for (int j = 0; j < BLOCK_WIDTH; ++j) {if (block[id][i][j] == 1) {visit[x2 + i][y2 + j] = 1;markColor[x2 + i][y2 + j] = color[BlockIndex];}}}
}/****************************************** 功能:读取用户操作,时时更新降落的方块* 输入:*     无* 返回:*      无****************************************/
void move() {int x = START_X;  //方块起始位置int y = START_Y;int k = 0;block_dir_t blockDir = (block_dir_t)BLOCK_UP;int curSpeed = speed;    //定义当前方块降落速度//读取用户操作前判断游戏是否结束failCheck();//持续向下降落while (1) {int curSpeed = speed;  //定义当前方块降落速度//清除方块clearBlock(x, k + y, blockDir);//判断选择的方向if (_kbhit()) {int key = _getch();if (key == KEY_SPACE) {system("pause");}else if (key == KEY_UP) {block_dir_t nextDir = (block_dir_t)((blockDir + 1) % 4);if (rotatable(x, y + k, nextDir)) {blockDir = nextDir;}}else if (key == KEY_LEFT) {if (moveable(x, y + k + 20, MOVE_LEFT, blockDir)) {x -= UNIT_SIZE;}}else if (key == KEY_RIGHT) {if (moveable(x, y + k + 20, MOVE_RIGHT, blockDir)) {x += UNIT_SIZE;}}else if (key == KEY_DOWN) {curSpeed = 50;}}k += 20;//绘制方块drawBlock(x, y + k, blockDir);//休眠wait(curSpeed);//方块的固化处理,方块固定后结束循环,当前一个方块的move执行完毕if (!moveable(x, y + k, MOVE_DOWN, blockDir)) {mark(x, y + k, blockDir);break;}}
}/******************************************功能:绘制刚从顶部降落的方块,更新提示框内的方块,调用方块降落函数move()*输入:*        无* 返回:*      无****************************************/
void newblock() {BlockIndex = NextIndex;//绘制刚从顶部下降的方块drawBlock(START_X, START_Y);//让新出现方块暂停一会Sleep(200);//右上角区域绘制下一个方块nextblock();//方块降落move();
}/****************************************** 功能:消除第i行,并把上面的行都往下移* 输入:*     无* 返回:*      无****************************************/
void down(int x) {for (int i = x; i > 0; --i) {for (int j = 0; j < 15; ++j) {if (visit[i - 1][j] == 1) {visit[i][j] = 1;markColor[i][j] = markColor[i - 1][j];setcolor(markColor[i][j]);outtextxy(20 * j + MinX, 20 * i + MinY, "■");}else {visit[i][j] = 0;setcolor(BLACK);outtextxy(20 * j + MinX, 20 * i + MinY, "■");}}}//清除最顶层方格setcolor(BLACK);for (int j = 0; j < 15; ++j) {visit[0][j] = 0;outtextxy(20 * j + MinX, MinY, "■");}
}/****************************************** 功能:更新分数* 输入:*        无* 返回:*      无****************************************/
void addScore(int lines) {char str[32];score += lines * 10;sprintf_s(str, 32, "%d", score);setcolor(RED);outtextxy(415, 310, str);}/************************** 功能:更新等级* 输入:*      无* 返回:*      无*************************/
void updateGrade() {//更新等级//假设50分一级rank = score / 50;char str[32];sprintf_s(str, 32, "%d", rank);setcolor(RED);outtextxy(415, 405, str);//更新速度if (speed <= 100) {speed = 100;}else {speed = 500 - rank * 20;}
}/************************** 功能:检查是否有满行方块* 输入:*       无* 返回:*      无*************************/
void check() {int i, j;int clearLines = 0;for (i = 29; i >= 0; i--) {// 检查第i行有没有满for (j = 0; j < 15 && visit[i][j]; j++);//执行到此处时,有两种情况:// 1. 第i行没有满,即表示有空位 此时 j<15// 2. 第i行已满了,此时 j>=15if (j >= 15) {// 此时,第i行已经满了,就需要消除第i行down(i);  //消除第i行,并把上面的行都下移i++;  // 因为最外层的循环中有 i--, 所以我们先i++, 使得下次循环时,再把这一行检查一下clearLines++;}}// 更新分数addScore(clearLines);// 更新等级(更新等级提示,更新速度)updateGrade();
}int main() {welcome();initGameSceen();//产生新方块nextblock();//    system("pause");Sleep(800);//初始化访问数组memset(visit, 0, sizeof(visit));while (1) {newblock();//消除满行,并更新分数和速度check();}system("pause");closegraph();return 0;
}

具体创建方法和步骤

  1. 新建项目


2. 创建Win32控制台应用程序
3. 下一步


4. 选择控制台应用程序空项目

5.在资源文件文件夹上面鼠标右键,一次选择添加-新建项

5. 选择C++文件,输入文件名称,不需要添加后缀

6. 添加代码

复制粘贴上面的完整代码。如果使用原作者的代码需要添加取消Unicode的宏定义以及添加tchar.h头文件。


7. 添加完代码后,VC2010程序会自动加载外部依赖项,等待加载完后,点击运行调试图标按键。


8,调试窗口,界面是黑的,按任意键,开始进入游戏


8. 游戏开始后,键盘需要切换为大写输入模式,也就是CapsLk按键,才能进行游戏操控。
9. 按键:A S W D还有空格按键,

  • 控制按键的相关宏定义,可以根据个人电脑的键盘自行设置。
#define KEY_UP 87        //用户操作
#define KEY_LEFT 65
#define KEY_RIGHT 68
#define KEY_DOWN 83
#define KEY_SPACE 32

搭建VC2010 开发环境,创建《C语言实现俄罗斯方块游戏》教程相关推荐

  1. golang ide 环境搭建_golang 开发环境 配置 go语言 liteIDE

    Mac: * 下载go安装包 ** 通过源码编译安装需要先安装go1.4 wget https://studygolang.com/dl/golang/go1.10.3.src.tar.gz tar ...

  2. vscode搭建php开发环境

    文章目录 前言 一.准备工作? 二.安装phpstudy和vscode 1.进入官网,下载相应的版本 2.安装插件 3 安装php插件: 总结 前言 搭建php开发环境需要下载vscode和phpst ...

  3. 从零开始使用 Webpack 搭建 Vue3 开发环境

    从零开始使用 Webpack 搭建 Vue3 开发环境 前情提要 从零开始使用 Webpack 搭建 Vue 开发环境 创建项目 首先需要创建一个空目录,在该目录打开命令行,执行 npm init - ...

  4. apache目录 vscode_VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)

    VsCode搭建Java开发环境(Spring Boot项目创建.运行.调试) 安装如下两个主要扩展即可,这两个扩展已关联java项目开发主要使用的maven.springboot等所需要的扩展. 开 ...

  5. Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目(Windows平台)...

    原地址:http://www.cnblogs.com/allenzheng/archive/2012/11/10/2762379.html 一.搭建Android开发环境 准备工作:下载Eclipse ...

  6. RH850从0搭建Autosar开发环境【1】- 如何创建Davinci Configurator配置工程

    文章目录 前言 一.如何开始Davinci Configurator配置? 前言 在开始下面步骤之前,我们需要Vector公司的两个license即:Davinci Developer与Davinci ...

  7. 初学者如何搭建React开发环境并且创建react项目

    搭建React开发环境 1.搭建前提 2.下载node.js和cnpm 3.安装react环境 4.创建react项目 输入命令 如下显示成功 5.运行reactDemo文件 6.错误示范 1.搭建前 ...

  8. 我的Go+语言初体验——iPad上搭建Go+开发环境(ish版)

    目录 欢迎来到用iPad来学习Go+之旅 一.在 iPad 安装 Go+ 前的准备 1. iSH Shell 的作用 2. 安装 iSH Shell 3. 在 iSH 里安装一些常用软件 apk 命令 ...

  9. Visual Studio Code搭建TypeScript开发环境

    转载 http://www.cnblogs.com/sunjie9606/p/5945540.html 使用Visual Studio Code搭建TypeScript开发环境 1.TypeScrip ...

  10. 【Tools】Visual Studio 2019搭建Qt开发环境

    00. 目录 文章目录 00. 目录 01. 概述 02. Visual Studio 2019安装 03. Qt6安装 04. qt-vsaddin插件下载 05. qt-vsaddin插件安装 0 ...

最新文章

  1. Java的知识点28——线程的生命周期
  2. boost::spirit模块实现罗马数字解析器(演示符号表)的测试程序
  3. 【学习排序】 Learning to Rank中Pointwise关于PRank算法源码实现
  4. 【小工具分享】 - vscode注释自动生成
  5. Query-digest-UI监控慢查询,以及此工具的改进版
  6. 一个低时延高吞吐的日志方案设计-2021年6月4日
  7. (六)Docker简介
  8. 实训41 2018.6.2
  9. 水仙花数c语言程序解析,C语言求水仙花数代码解析
  10. STM32的Bootloader实现
  11. Fedora 11的新特征和简易安置教程
  12. 1、XML 简介,2、JSON 教程
  13. mysql数据库备份sql语句_mysql用户管理、常用sql语句及数据库的备份
  14. php sns 源码,全网首发-LaySNS高仿资源网源码免费分享
  15. 墨尔本大学计算机科学要求,墨尔本大学计算机科学
  16. Footprint Analytics:多角度理解Layer 2生态:概念、扩容方案及代表项目
  17. Latex特殊符号、公式、颜色整合
  18. NOIP2015跳石头【二分答案(最小值最大化) | 贪心】
  19. 从0开发游戏引擎之引擎Win32平台的Platform类实现
  20. html圆形分成六份,在ai里怎么把一个圆平均分成几份

热门文章

  1. java 跨站脚本攻击_XSS(跨站脚本攻击)漏洞解决方案
  2. spring 项目中设置maven镜像源
  3. 无线通信与编码_新型OFDM波形集_使用MATLAB仿真实现UFMC并与OFDM作对比_含实现代码
  4. Android Binder机制
  5. minecraft java文件夹_Minecraft游戏下载 文件结构说明
  6. java模拟器.apk_java游戏模拟器安卓版下载-java模拟器apk下载 v2.2.0 安卓版-IT猫扑网...
  7. 网络书店可行性分析报告
  8. 两相四线步进电机的驱动
  9. 安卓手机如何复制粘贴不重叠_多台电脑安卓手机跨设备复制粘贴利器——Clipbrd...
  10. 杭州/北京内推 | 阿里达摩院招聘视觉生成方向学术实习生(人才计划)