首页 > 其他分享 >C语言写俄罗斯方块游戏

C语言写俄罗斯方块游戏

时间:2024-09-12 23:25:20浏览次数:10  
标签:游戏 方块 int currentBlock C语言 WIDTH BOARD block board

编写一个完整的俄罗斯方块游戏涉及到许多细节,包括方块的旋转、移动、消除行等。下面提供一个简化版的俄罗斯方块游戏实现,这个版本主要集中在游戏的核心逻辑上,并且为了简化,没有使用图形界面,而是通过控制台输出来显示游戏状态。

首先,我们需要定义一些基本的结构体来表示方块和游戏状态。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define BOARD_WIDTH 10
#define BOARD_HEIGHT 20
#define BOARD_X (BOARD_WIDTH / 2)
#define BOARD_Y 0

typedef struct {
    int x, y;
} Point;

typedef struct {
    int data;
    Point pos;
} Block;

// Define shapes of blocks
Block blocks[] = {
    {{1}, {BOARD_X, BOARD_Y}}, // I-shape block
    {{2}, {BOARD_X, BOARD_Y}}, // O-shape block
    {{3}, {BOARD_X, BOARD_Y}}, // T-shape block
    // Add other blocks here
};

int board[BOARD_HEIGHT][BOARD_WIDTH];

void initBoard() {
    for (int y = 0; y < BOARD_HEIGHT; ++y) {
        for (int x = 0; x < BOARD_WIDTH; ++x) {
            board[y][x] = 0;
        }
    }
}

void printBoard() {
    for (int y = 0; y < BOARD_HEIGHT; ++y) {
        for (int x = 0; x < BOARD_WIDTH; ++x) {
            if (board[y][x]) {
                printf("# ");
            } else {
                printf(". ");
            }
        }
        printf("\n");
    }
    printf("\n");
}

int canMove(Point newPos, Block block) {
    int x = newPos.x;
    int y = newPos.y;
    if (x < 0 || x >= BOARD_WIDTH || y >= BOARD_HEIGHT) return 0;
    if (board[y][x]) return 0;
    return 1;
}

void moveBlock(Block *block, Point delta) {
    Point newPos = {(block->pos.x + delta.x), (block->pos.y + delta.y)};
    if (canMove(newPos, *block)) {
        block->pos = newPos;
    }
}

int main() {
    initBoard();
    Block currentBlock = blocks[0]; // Select the first block as an example
    Point moveDown = {0, 1};
    Point moveLeft = {-1, 0};
    Point moveRight = {1, 0};
    
    while (1) {
        // Move the block down until it can't move anymore
        while (canMove(currentBlock.pos, currentBlock)) {
            moveBlock(&currentBlock, moveDown);
        }
        
        // Place the block on the board and create a new block
        board[currentBlock.pos.y][currentBlock.pos.x] = currentBlock.data;
        currentBlock = blocks[(rand() % 3)]; // Randomly select a new block
        
        // Clear the lines if any are full
        for (int y = BOARD_HEIGHT - 1; y > 0; --y) {
            int fullLine = 1;
            for (int x = 0; x < BOARD_WIDTH; ++x) {
                if (!board[y][x]) {
                    fullLine = 0;
                    break;
                }
            }
            if (fullLine) {
                // Shift lines down
                for (int yy = y; yy > 0; --yy) {
                    for (int x = 0; x < BOARD_WIDTH; ++x) {
                        board[yy][x] = board[yy-1][x];
                    }
                }
            }
        }
        
        printBoard();
    }

    return 0;
}

标签:游戏,方块,int,currentBlock,C语言,WIDTH,BOARD,block,board
From: https://blog.csdn.net/MAMA6681/article/details/142188159

相关文章

  • C语言实现一个24点游戏
    定义扑克牌的值,其中A=1或14(在这个上下文中我们通常认为A=1),J=11,Q=12,K=13。随机选择4张牌。使用递归算法来尝试所有可能的组合来达到24点。输出结果或提示玩家输入表达式。下面是一个简化版的示例代码,展示如何随机选取四张牌并检查是否能通过运算得到24。注意,这里的代码不包......
  • C语言数据类型、变量及数据类型的长度、取值范围
    文章目录一、数据类型介绍1.字符型2.整型3.浮点型4.布尔类型二、变量1.变量的创建2.变量的分类三、数据类型的长度(字节)1.sizeof操作符2.各种数据类型的长度3.sizeof中表达式不计算四、各种类型的取值范围1.signed和unsigned2.数据类型的取值范围五、整型提升练习1......
  • 汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推
    汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推①得物【八大职类】技术、供应链、产品、运营、设计、职能、商品研究、风控等大类【内推码】RTHEA59【一键内推】https://poizon.jobs.feishu.cn/s/iMo1482J②汤臣倍健【招聘岗位】营销类、市场......
  • 【C语言】浮点数在内存中的存储
    引言之前我们已经学习过 整数在内存中的存储,现在我们来学习浮点数在内存中的存储【整数存储】 ......
  • C语言简单编程题(思路+源码)
    C语言简单编程题(思路+源码)【一】题目一:1.字符串的逆序(如abcdef–>fedcba)思路:首先我们用strlen()函数来获得字符串的长度,用left来表示下标为零的元素,用right来表示最后一个字符的下标,创建第三个变量,交换第一个和最后一个的元素,再left++,right–,后面的依次类推。2.代码实......
  • 小白学懂C语言---分支循环语句(下)
    循环语句这章我们来谈谈三种循环语句(for循环,while循环,do-while循环)1.for循环for循环应该是平时用的比较多的一种,也是一种容易理解的循环。for循环语法:for(表达式1;表达式2;表达式3){ 语句}强调一下:1.表达式1表达式2表达式3,两两之间用;隔开,记住不要写成逗......
  • 剧本杀小程序开发,探索互联网剧本杀游戏体验
    经过几年的发展,剧本杀行业已经逐渐在消费市场中占据了一席之地,成为了最受消费者欢迎的娱乐休闲游戏模式之一,让越来越多的入局者赚的盆满钵满!在数字化发展的当下,线上游戏成为了一种流行趋势,不管是狼人杀还是剧本杀都逐渐走向了线上,成为大众新的社交游戏方式。剧本杀小程序的发展不仅......
  • 和平精英游戏启动错误?和平精英_323393.exe找不到入口的终极解决方案
    针对“和平精英游戏启动错误?和平精英_323393.exe找不到入口”的问题,这里提供一套终极解决方案,旨在帮助玩家快速定位问题根源并修复,从而恢复游戏的正常运行。终极解决方案1.检查系统文件完整性使用系统文件检查器(SFC):打开命令提示符(以管理员身份运行),输入sfc/scannow命令并......
  • 灵魂石幸存者风灵月影修改器:轻松上手,解锁游戏新境界的终极指南
    在《灵魂石幸存者》这款充满挑战与冒险的Roguelike动作游戏中,玩家需要不断地探索未知的世界,挑战强大的敌人,收集稀有的灵魂石以增强自身实力。然而,随着游戏难度的逐渐提升,许多玩家可能会感到力不从心,渴望一种能够打破常规、解锁新体验的方式。这时,风灵月影修改器便成为了众多玩......
  • 《黑神话:悟空》游戏启动时闪退弹窗“找不到msvcp100.dll”文件该怎么办?黑神话悟空游戏
    在启动《黑神话:悟空》时,若遇到闪退弹窗并提示“找不到msvcp100.dll”文件,别紧张。这可能是文件缺失造成的。您可以使用系统的修复工具尝试解决,或者从可靠来源获取该文件进行安装,有望解决此问题。本篇将为大家带来《黑神话:悟空》游戏启动时闪退弹窗“找不到msvcp100.dll”文件该......