XP系统下用VC实现俄罗斯方块游戏

c语言easyx输出文字_告别黑框框——用C语言Easyx图形库实现图形界面 很早以前就接触到了Easyx图形库,当时感叹还有这么简单的C图形库供我们使用。后开用Easyx做过推箱子、图形界面钢琴等等简单的小游戏。今天给大家介绍一下Easyx图形库。Easyx图形库是针对C++的图形库,也可以帮助C语言初学者快速上手图形和游戏编程,给初学者带来 编程的乐趣,享受开发程序的魅力,让写程序更有成就感。 比如,可以用 VC + EasyX 很快的用几何图形画一个房子,或者一辆移... 阅读详情


源文件名为t1.cpp

效果图如下所示


源代码如下:


#include <iostream>
#include<windows.h>
#include <vector>
#include <mmsystem.h>
#include<stdio.h>
using namespace std;


#define GameW 10
#define GameH 20
const int CtrlLeft = GameW*2+4 + 3;


struct Point {
    Point(){}
    Point(int x, int y) {_x = x, _y = y;}
    int _x, _y;
};


HANDLE g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE g_hInput  = GetStdHandle(STD_INPUT_HANDLE);


Point g_ptCursor(0,0);
BOOL isChecking = FALSE;
BOOL g_bGameOver = FALSE;
int g_nGameBack[GameH][GameW], Case;
int nowKeyInfo = -1;
int g_nDiff = 1;
int g_nLife = 2;
int g_nScore = 0;


void SetCursor(COORD cd) {
    SetConsoleCursorPosition(g_hOutput, cd);
}
void SetCursor(int x, int y){
    COORD cd = {x, y};
    SetCursor(cd);
}
void SetBlockCursor(int x, int y){
    COORD cd = {2*x + 2, y + 1};
    SetCursor(cd);
}


void SetBack(int x, int y, BOOL bk) {
    SetBlockCursor(x, y);
    if (bk)
        printf("%s", "■");
    else
        printf(" ");
}


bool Out(int x, int y) {
    return x < 0 || y < 0 || x >= GameW || y >= GameH;
}


struct xBlock {
public:
    int len;
    int nowRotateID;
    BOOL mask[4][4][4];
    static vector <xBlock> List;


    xBlock() { len = 0; }
    xBlock(int l, char *str) {
        int i, j, k;
        len = l;
        memset(mask, FALSE, sizeof(mask));
        for(i = 0; i < l; i++) {
            for(j = 0; j < l; j++) {
                mask[0][i][j] = str[i*l + j] - '0';
            }
        }
        for(k = 1; k < 4; k++) {
            for(i = 0; i < len; i++) {
                for(j = 0; j < len; j++) {
                    mask[k][i][j] = mask[k-1][j][len-1-i];
                }
            }
        }
        nowRotateID = rand() % 4;
    }


    void rotate() {
        nowRotateID ++;
        if (nowRotateID >= 4)
            nowRotateID = 0;
    }


    BOOL getUnit(int x, int y, int roID) {
        if (roID == -1) {
            roID = nowRotateID;
        }
        return mask[roID][y][x];
    }
};


vector <xBlock> xBlock::List;


class Block {
public:
    int x, y;
    int ID;
    xBlock bk;


    void reset(xBlock *pbk) {
        bk = *pbk;


        x = 4, y = 0;
        ID = ++ Case;


        if(collide(0,0)) {
            lifeDown();
        }
        draw();
       
        *pbk = xBlock::List[rand() % xBlock::List.size()];
    }
   
    void lifeDown() {
        int i, j;
        for(i = 0; i < GameH; i++) {
            for(j = 0; j < GameW; j++) {
                SetBack(j, i, TRUE);
                Sleep(10);
            }
        }
        if(g_nLife) {
            g_nLife --;
            for(i = g_nLife; i < 6; i++) {
                SetCursor(CtrlLeft + i, 15);
                printf("%c", ' ');
            }
            for(i = GameH-1; i >= 0; i--) {
                for(j = GameW-1; j >= 0; j--) {
                    SetBack(j, i, FALSE);
                    Sleep(10);
                    g_nGameBack[i][j] = 0;
                }
            }
        }else {
            g_bGameOver = TRUE;
        }
    }


    void erase() {
        int i, j;
        for(i = 0; i < bk.len; i++) {
            for(j = 0; j < bk.len; j++) {
                if (bk.getUnit(j, i, -1)) {
                    if(!Out(j+x, i+y) && g_nGameBack[i+y][j+x]) {
                        SetBack(j+x, i+y, FALSE);
                        g_nGameBack[i+y][j+x] = 0;
                    }
                }
            }
        }
    }
    void draw() {
        int i, j;
        for(i = 0; i < bk.len; i++) {
            for(j = 0; j < bk.len; j++) {
                if (bk.getUnit(j, i, -1)) {
                    if(!Out(j+x, i+y) && !g_nGameBack[i+y][j+x]) {
                        SetBack(j+x, i+y, TRUE);
                        g_nGameBack[i+y][j+x]  = ID;
                    }
                }
            }
        }
    }
    void draw(int x, int y) {
        int i, j;
        for(i = 0; i < 4; i++) {
            for(j = 0; j < 4; j++) {
                SetCursor(x + 2*j, y + i);
                if (bk.getUnit(j, i, -1)) {   
                    printf("%s", "■");
                }else
                    printf(" ");
            }
        }
    }
    bool collide(int dx, int dy, int roID = -1) {
        int i, j;
        for(i = 0; i < bk.len; i++) {
            for(j = 0; j < bk.len; j++) {
                if (bk.getUnit(j, i, roID)) {
                    Point ptPos(j + x + dx, i + y + dy);
                    if(Out(ptPos._x, ptPos._y)
                    || g_nGameBack[ptPos._y][ptPos._x] && ID != g_nGameBack[ptPos._y][ptPos._x]) {
                        return TRUE;
                    }
                }
            }
        }
        return FALSE;
    }


    void rotate(int nTimes = 1) {
        int nextro = (bk.nowRotateID + nTimes) % 4;
        if(collide(0, 0, nextro)) {
            return ;
        }
        Beep(12000, 50);
        erase();
        bk.nowRotateID = nextro;
        draw();
    }


    BOOL changepos(int dx, int dy) {
        if(collide(dx, dy)) {
            return FALSE;
        }
        erase();
        x += dx;
        y += dy;
        draw();
        return TRUE;
    }
};


void GameInit() {
    CONSOLE_CURSOR_INFO cursor_info;
    cursor_info.bVisible = FALSE;
    cursor_info.dwSize   = 100;
    SetConsoleCursorInfo(g_hOutput, &cursor_info);
    xBlock::List.push_back(xBlock(3, "010111000"));
    xBlock::List.push_back(xBlock(3, "110110000"));
    xBlock::List.push_back(xBlock(3, "111001000"));
    xBlock::List.push_back(xBlock(3, "111100000"));
    xBlock::List.push_back(xBlock(3, "110011000"));
    xBlock::List.push_back(xBlock(3, "011110000"));
    xBlock::List.push_back(xBlock(4, "1000100010001000"));
}


void DrawFrame(int x, int y, int nWidth, int nHeight) {
    int i;
    for(i = 0; i < nWidth; i++) {
        SetCursor(x + 2*i + 2, y);
        printf("%s", "一");
        SetCursor(x + 2*i + 2, y + nHeight+1);
        printf("%s", "┄");
    }
    for(i = 0; i < nHeight; i++) {
        SetCursor(x, y + i + 1);
        printf("%s", "┆");
        SetCursor(x + nWidth*2+2, y + i + 1);
        printf("%s", "┆");
    }       
    SetCursor(x, y);
    printf("%s", "┌");   
    SetCursor(x, y + nHeight+1);
    printf("%s", "└");
    SetCursor(x + nWidth*2+2, y);
    printf("%s", "┐");   
    SetCursor(x + nWidth*2+2, y + nHeight+1);
    printf("%s", "┘");
}


void MissionInit() {
    memset(g_nGameBack, FALSE, sizeof(g_nGameBack));
    Case = 1;
    int i;
    DrawFrame(0, 0, GameW, GameH);
    DrawFrame(GameW*2+4, 0, 4, GameH);
    SetCursor(CtrlLeft, 2);
    printf("Next");
   
    SetCursor(CtrlLeft, 8);
    printf("Speed");
    for(i = 0; i < g_nDiff; i++) {
        SetCursor(CtrlLeft + i, 9);
        printf("%c", 1);
    }


    SetCursor(CtrlLeft, 11);
    printf("Score");
    SetCursor(CtrlLeft, 12);
    printf("%d", g_nScore);


    SetCursor(CtrlLeft, 14);
    printf("Life");
    for(i = 0; i < g_nLife; i++) {
        SetCursor(CtrlLeft + i, 15);
        printf("%c", 3);
    }


    SetCursor(CtrlLeft-1, 19);
    printf("by LY");
    SetCursor(CtrlLeft-1, 20);
    printf("hacker");
}


void Check() {
    isChecking = TRUE;
    int i, j, k;
    vector <int> line;
    for(i = 0; i < GameH; i++) {
        for(j = 0; j < GameW; j++) {
            if(!g_nGameBack[i][j])
                break;
        }
        if(j == GameW) {
            line.push_back(i);
        }
    }
    if(line.size()) {
        int nCount = 7;
        while(nCount --) {
            for(i = 0; i < line.size(); i++) {
                for(j = 0; j < GameW; j++) {
                    SetBack(j, line[i], nCount&1);
                }
            }
            Sleep(70);
        }
        for(i = 0; i < line.size(); i++) {
            for(j = 0; j < GameW; j++) {
                g_nGameBack[line[i]][j] = 0;
            }
        }


        for(i = 0; i < GameW; i++) {
            int next = GameH-1;
            for(j = GameH-1; j >= 0; j--) {
                for(k = next; k >= 0; k--) {
                    if(g_nGameBack[k][i])
                        break;
                }
                next = k - 1;
                BOOL is = (k >= 0);
                SetBack(i, j, is);
                g_nGameBack[j][i] = is;
            }
        }


        g_nScore += 2*line.size()-1;
        SetCursor(CtrlLeft, 12);
        printf("%d", g_nScore);


        if( g_nScore >= g_nDiff * g_nDiff * 10) {
            if(g_nDiff <= 6)
                g_nDiff ++;
        }
        if( g_nScore >= 50 * (g_nLife+1)) {
            if(g_nLife <= 6)
                g_nLife ++;
        }
    }


    isChecking = FALSE;
}
int main() {
    Block* obj = new Block();
    Block* buf = new Block();
   


    BOOL bCreateNew = FALSE;
    int nTimer = GetTickCount();
    int LastKeyDownTime = GetTickCount();




    GameInit();
    MissionInit();
   
    buf->bk = xBlock::List[rand() % xBlock::List.size()];
    while(1) {
        if(!bCreateNew) {
            bCreateNew = TRUE;
            obj->reset(&buf->bk);
            if(g_bGameOver)
                break;
            buf->draw(CtrlLeft - 1, 4);
        }
        if (GetTickCount() - nTimer >= 1000 / g_nDiff) {
            nTimer = GetTickCount();
            if (!obj->collide(0, 1))
                obj->changepos(0, 1);
            else {
                Check();
                bCreateNew = FALSE;
            }
        }
        if (GetTickCount() - LastKeyDownTime >= 100) {
            if(FALSE == isChecking) {
                LastKeyDownTime = GetTickCount();
                if (GetAsyncKeyState(VK_UP)) {
                    obj->rotate();
                }
                if (GetAsyncKeyState(VK_LEFT)) {
                    obj->changepos(-1, 0);
                }
                if (GetAsyncKeyState(VK_RIGHT)) {
                    obj->changepos(1, 0);
                }
                if (GetAsyncKeyState(VK_DOWN)) {
                    if( FALSE == obj->changepos(0, 2) )
                        obj->changepos(0, 1);
                }
            }
        }
    }
    SetCursor(8, 10);
    printf("Game Over");


    SetCursor(0, GameH+3);
    printf("按ESC键退出游戏");


    while(1) {
        if (GetAsyncKeyState(VK_ESCAPE))
            break;
    }
    return 0;
}


eaxyX专栏-下载与安装 eaxyX专栏-下载与安装 很多小伙伴都学过c语言 但是 在学完c语言之后还是一直刷题 其实c语言也是可以做出很漂亮的图形界面的 接下来我会给大家出一下图形界面的专题 介绍c++的图形库easyX 从下载和安装 到基本的应用以及比较高级的应用 最后一起做出比较精美的图形界面 向先介绍一下easyX 来自百度百科: EasyX 是针对 C/C++ 的图形库 可以帮助使用C/C++语言的程序员快速上手图形和游戏编程 比如,可以用 VC + EasyX 很快的用几何图形画一个房子 或者一辆移动的小车 可以编写俄 阅读详情

相关推荐

C语言版俄罗斯方块(基于EASYX库)

这是用C语言写出来的俄罗斯方块,基于EASYX图形库,编译器VC++6.0,有兴趣的可以下来看看。

一位老码农的编程简史

话说前些日子在微博上看到一个“10年码龄的老码农”,掐指一算自己从95年接触计算机编程似乎也达到这个标准了,于是突然来了兴致就加入了这个群。这个群真可谓藏龙卧虎,从DOS时期的第一代程序员,到Windows时期的第二代程序员,再到目前互联网时期的第三代程序员,很多重量级的大牛都云集与此,比如简晶、蒋涛、周爱民,会员数在一周内已经达到250人以上,码龄最长的高达25年。看着一帮前辈和同道者们谈论人生...

云计算? 321

俄罗斯方块游戏(vc6.0)

游戏有上下左右四个键控制,设置有不同的难度。

vc6.0用c语言,基于VC 6.0使用C语言实现俄罗斯方块

本文实例为大家分享了C语言实现俄罗斯方块的具体代码,供大家参考,具体内容如下裸写的俄罗斯方块的代码,有意见或者想征用,直接评论留言即可。效果如下:代码:/***************************************************************//*俄罗斯方块的实现* 基于VC 6.0 编译链接即可运行* 已实现的功能:* 1、初步的规划及背景图案的显示* 2、...

weixin_42329733的博客 335

俄罗斯方块VC6.0的源代码,绝对的经典

俄罗斯方块VC6.0的源代码,绝对的经典俄罗斯方块VC6.0的源代码,绝对的经典

俄罗斯方块小游戏(VC6.0)

这是一个在VC6.0工具上实现的简单俄罗斯方块游戏。里面大体功能都有实现。

基于VC++6.0开发俄罗斯方块(三)

游戏主窗体的设计: 1.打印游戏的界面; 2)绘制俄罗斯方块; 3)打印俄罗斯方块;

weixin_44566643的博客 2081

一个有趣的电脑桌面游戏

相信很多人都没玩过 相信很多人都没玩过 相信很多人都没玩过

你所不知道的Windows XP的5个小秘密

Windows XP已经推出已经接近6年,大家已经再熟悉不过了,那么你知道下面5个XP中的秘密吗?或者,知道几个?     1.3D弹珠台无敌秘籍     启动游戏后在键盘上敲入“hidden test”(不含引号),然后你就会发现弹珠会跟着你的鼠标指针而移动,想撞哪撞哪,想拿多高分都不是问题啦。另外在游戏中按下“H”可进入高分榜,看一看自己的得分,哇10亿分!按下“R”...

weixin_34038652的博客 186

VC++ 6.0 C语言实现俄罗斯方块详细教程

主要为大家介绍了VC++ 6.0 C语言实现俄罗斯方块详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

从X86到ARM:全面解析服务器CPU架构的演变与未来趋势

本文深入解析了服务器CPU架构从X86到ARM的演变历程与未来趋势。文章从CISC与RISC两种设计哲学切入,分析了X86凭借生态建立的帝国地位及其面临的功耗挑战,并重点阐述了ARM架构凭借其卓越的能效比优势,正从移动端向数据中心市场发起冲击。未来,异构计算、软硬协同与专用芯片将成为服务器CPU发展的核心方向。

gold的博客 1127

VC实现俄罗斯方块的基本功能

游戏设计思路: 俄罗斯方块游戏设计的主要步骤为以下10个方面: (1)游戏界面的设计。 (2)俄罗斯方块的造型。 (3)俄罗斯方块的旋转。 (4)俄罗斯方块的运动情况(包括向左,向右和向下)。 (5)俄罗斯方块的自动消行功能。 (6)游戏级别的自由选择。 (7)游戏速度的自由选择。 (8)游戏得分的计算。 (9)游戏菜单选项的设计及功能实现。 (10)游戏的背景音乐及特效。 2.4运用的控件和

linus_Robot的博客 4984

Windows-Anaconda3+TensorFlow安装教程

测试环境:win10-64位和win7-64位 (系统必须是64位,因为TensorFlow目前只支持64位) 一、安装Anaconda3 1.下载Anaconda3 Anaconda官网链接:link 这里我们选择Windows版本,python3.6-version-64位,如下图所示。 2.下载完成之后,点击安装Anaconda3 注意:安装过程中要选择添加环境变量,如图 待安装完成...

DoctorCuiLab的博客 3086

c语言循环写回合制小游戏_告别黑框框——用C语言Easyx图形库实现图形界面

很早以前就接触到了Easyx图形库,当时感叹还有这么简单的C图形库供我们使用。后开用Easyx做过推箱子、图形界面钢琴等等简单的小游戏。今天给大家介绍一下Easyx图形库。Easyx图形库是针对C++的图形库,也可以帮助C语言初学者快速上手图形和游戏编程,给初学者带来 编程的乐趣,享受开发程序的魅力,让写程序更有成就感。 比如,可以用 VC + EasyX 很快的用几何图形画一个房子,或者一辆移...

weixin_39628343的博客 1085

【电击防护篇】电击防护技术详解:从人体效应到接地系统全解析

本文系统讲解了电击防护的关键知识,包括电流对人体的影响(如30mA是心室颤动阈值)、人体电阻特性(700Ω-6100Ω)以及电气接触防护措施。重点分析了TT、TN和IT三大接地系统的结构特点与应用场景,强调TN-S系统最安全,IT系统供电连续性最佳。详细介绍了漏电保护器(RCD)的工作原理与选型指南,建议人身防护选用30mA高灵敏度RCD。文章通过对比表总结三大系统的安全性、成本及适用场景,为电气安全设计提供实用参考。

2301_81299416的博客 1743

Unity类银河战士恶魔城学习总结(P162 Improve skeleton提升敌人的效果)

为敌人添加了快慢刀

suzh1qian的博客 572

【EasyX】 使用说明

基本的概念温习easyx!

xiaodaidaiPromax_2024 2057

Harmony:C# 动态代码补丁的5大秘密武器

Harmony 是一个开源库,它允许你在运行时修改托管代码(即使用 .NET 或 Mono 编译的语言编写的应用程序)。它通过利用 AOP(面向切面编程)的思想,可以在不重新编译代码的情况下添加、替换或修改方法的行为。这对于游戏模组(Modding)、插件开发以及调试工具非常有用。安装 Harmony要使用 Harmony,你需要首先安装它。Harmony 作为一个 NuGet 包,可以直接通过 Visual Studio 的 NuGet 包管理器进行安装。安装步骤打开 Visual Studio。

java专栏 1191

EasyX图片库相关介绍

常量 值 颜色BLACK 0 黑BLUE 0xAA0000 蓝GREEN 0x00AA00 绿CYAN 0xAAAA00 青RED 0x0000AA 红MAGENTA 0xAA00AA 紫BROWN 0x0055AA 棕LIGHTGRAY 0xAAAAAA 浅灰DARKGRAY 0x555555 深灰LIGHTBLUE 0xFF5555 亮蓝LIGHTGREEN 0x55FF55 亮绿LIGHTCYAN 0xFFFF55 亮青。

2301_79807099的博客 1249

Spring AI 实战:如何使用 MCP Server 搭建 MCP 天气查询服务

MCP(Model Context Protocol)是 Anthropic 提出的一种开放协议,它定义了AI 模型与外部世界交互的标准方式。通俗地说:大模型本身只拥有训练数据中的知识,它不知道今天的天气、无法查询你的数据库、不能调用你的内部 API。MCP 就是解决这个问题的"桥梁"——它让模型能够发现并使用外部工具(Tools),就像人用手去操作工具一样。角色职责对应依赖MCP Server暴露工具(Tool),供模型调用MCP Client连接 Server,让模型发现和使用工具本文我们先聚焦。

SmartSi 760

【技术科普】破解政务跨系统数据壁垒!亘川一网统管平台多源数据同步技术解析

本文解析亘川一网统管平台多源数据同步技术,针对政务跨系统数据壁垒难题,介绍组件的数据采集、校验、审计留痕等核心能力,结合营商环境项目落地案例,对比传统开发模式差异,讲解开源组件的实践价值,为政务项目开发者提供落地参考。

weixin_67440240的博客 635

【EasyX】快速入门——静态图形篇

EasyX 是针对 C++ 的图形库,可以帮助 C/C++ 初学者快速上手图形和游戏编程。比如,可以基于 EasyX 图形库很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习图形学的各种算法,等等。于是就有了这个 EasyX 库。如果您刚开始学 C 语言,或者您是一位教 C 语言的老师,再或者您在教计算机图形学,那么这个库一定会让您兴奋的。

2301_80224556的博客 1386

手把手教你完成YOLOv10 PySide6目标检测界面搭建,使用Qt6设计YOLOv10检测系统,前台系统+后台管理系统开发实战,可用于大论文凑工作量或毕设必备,全网最详细教程

手把手教你完成YOLOv10 PySide6目标检测界面搭建,使用Qt6设计YOLOv10检测系统,前台系统+后台管理系统开发实战,可用于大论文凑工作量或毕设必备,全网最详细教程

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1733

VC++ 6.0 C语言实现俄罗斯方块教程

今天把我之前写的大作业分享一下吧,并教你们如何实现,希望你们看了前面的教程也能自己写一个。 1.要先下载一个 graphics.h 的头文件来绘图。 2.初始化窗口:initgraph(x, y);这是先创建一个窗口的函数,以左上角为(0,0),向右为x轴,向下为y轴,其中x表示长x个单位,y表示宽y个单位。 3.关闭图像窗口:closegraph();结束时用来关闭用的。 4.按任意键继

2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

基于VC++6.0开发俄罗斯方块(一)

俄罗斯方块游戏开发 1.系统功能设计; 2.头文件; 3.宏定义; 4.全局变量; 5.函数声明;

weixin_44566643的博客 1764

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Ubuntu下用shell脚本实现俄罗斯方块游戏
下一篇: kl25开发板基于Kinetis Design Studio 3.0.0 IDE软件下的七色灯
hacker_num1
博客等级 码龄9年 11粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值