搭建VC2010 开发环境,创建《C语言实现俄罗斯方块游戏》教程
搭建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;
}
具体创建方法和步骤
- 新建项目
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语言实现俄罗斯方块游戏》教程相关推荐
- golang ide 环境搭建_golang 开发环境 配置 go语言 liteIDE
Mac: * 下载go安装包 ** 通过源码编译安装需要先安装go1.4 wget https://studygolang.com/dl/golang/go1.10.3.src.tar.gz tar ...
- vscode搭建php开发环境
文章目录 前言 一.准备工作? 二.安装phpstudy和vscode 1.进入官网,下载相应的版本 2.安装插件 3 安装php插件: 总结 前言 搭建php开发环境需要下载vscode和phpst ...
- 从零开始使用 Webpack 搭建 Vue3 开发环境
从零开始使用 Webpack 搭建 Vue3 开发环境 前情提要 从零开始使用 Webpack 搭建 Vue 开发环境 创建项目 首先需要创建一个空目录,在该目录打开命令行,执行 npm init - ...
- apache目录 vscode_VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)
VsCode搭建Java开发环境(Spring Boot项目创建.运行.调试) 安装如下两个主要扩展即可,这两个扩展已关联java项目开发主要使用的maven.springboot等所需要的扩展. 开 ...
- Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目(Windows平台)...
原地址:http://www.cnblogs.com/allenzheng/archive/2012/11/10/2762379.html 一.搭建Android开发环境 准备工作:下载Eclipse ...
- RH850从0搭建Autosar开发环境【1】- 如何创建Davinci Configurator配置工程
文章目录 前言 一.如何开始Davinci Configurator配置? 前言 在开始下面步骤之前,我们需要Vector公司的两个license即:Davinci Developer与Davinci ...
- 初学者如何搭建React开发环境并且创建react项目
搭建React开发环境 1.搭建前提 2.下载node.js和cnpm 3.安装react环境 4.创建react项目 输入命令 如下显示成功 5.运行reactDemo文件 6.错误示范 1.搭建前 ...
- 我的Go+语言初体验——iPad上搭建Go+开发环境(ish版)
目录 欢迎来到用iPad来学习Go+之旅 一.在 iPad 安装 Go+ 前的准备 1. iSH Shell 的作用 2. 安装 iSH Shell 3. 在 iSH 里安装一些常用软件 apk 命令 ...
- Visual Studio Code搭建TypeScript开发环境
转载 http://www.cnblogs.com/sunjie9606/p/5945540.html 使用Visual Studio Code搭建TypeScript开发环境 1.TypeScrip ...
- 【Tools】Visual Studio 2019搭建Qt开发环境
00. 目录 文章目录 00. 目录 01. 概述 02. Visual Studio 2019安装 03. Qt6安装 04. qt-vsaddin插件下载 05. qt-vsaddin插件安装 0 ...
最新文章
- Java的知识点28——线程的生命周期
- boost::spirit模块实现罗马数字解析器(演示符号表)的测试程序
- 【学习排序】 Learning to Rank中Pointwise关于PRank算法源码实现
- 【小工具分享】 - vscode注释自动生成
- Query-digest-UI监控慢查询,以及此工具的改进版
- 一个低时延高吞吐的日志方案设计-2021年6月4日
- (六)Docker简介
- 实训41 2018.6.2
- 水仙花数c语言程序解析,C语言求水仙花数代码解析
- STM32的Bootloader实现
- Fedora 11的新特征和简易安置教程
- 1、XML 简介,2、JSON 教程
- mysql数据库备份sql语句_mysql用户管理、常用sql语句及数据库的备份
- php sns 源码,全网首发-LaySNS高仿资源网源码免费分享
- 墨尔本大学计算机科学要求,墨尔本大学计算机科学
- Footprint Analytics:多角度理解Layer 2生态:概念、扩容方案及代表项目
- Latex特殊符号、公式、颜色整合
- NOIP2015跳石头【二分答案(最小值最大化) | 贪心】
- 从0开发游戏引擎之引擎Win32平台的Platform类实现
- html圆形分成六份,在ai里怎么把一个圆平均分成几份
热门文章
- java 跨站脚本攻击_XSS(跨站脚本攻击)漏洞解决方案
- spring 项目中设置maven镜像源
- 无线通信与编码_新型OFDM波形集_使用MATLAB仿真实现UFMC并与OFDM作对比_含实现代码
- Android Binder机制
- minecraft java文件夹_Minecraft游戏下载 文件结构说明
- java模拟器.apk_java游戏模拟器安卓版下载-java模拟器apk下载 v2.2.0 安卓版-IT猫扑网...
- 网络书店可行性分析报告
- 两相四线步进电机的驱动
- 安卓手机如何复制粘贴不重叠_多台电脑安卓手机跨设备复制粘贴利器——Clipbrd...
- 杭州/北京内推 | 阿里达摩院招聘视觉生成方向学术实习生(人才计划)