俄罗斯方块-C语言-完整代码

效果图如下
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#ifndef _DAY7_H
#define _DAY7_H
#include<windows.h>
#include<time.h>
#include<stdbool.h>
#include<conio.h>//控制台输入输出函数getch通过键盘进行的操作
//游戏区域位置设计
#define COL_BEGIN 2
#define COL_END 14
#define ROW_BEGIN 4
#define ROW_END 26

HANDLE Output;//控制台输出句柄

//存储游戏相关数据的结构体
typedef struct TetrisManager//俄罗斯管理
{
   
    unsigned int pool[28];//游戏池
    int x;//当前方块的x坐标,左上角坐标
    int y;//
    int type[3];//当前,下一个,下下一个方块的类型
    int orientation[3];//当前,下一个,下下一个方块的旋转状态

    //左边栏
    unsigned score;//得分
    unsigned erasedTotal;//消行总数
    unsigned erasedCount[4];//消几行数
    unsigned tetrisTotal;//目前出现方块总数
    unsigned tetrisCount[7];//目前出现各种方块数

    bool dead;//挂
}Manager;//结构体别名

//构造存储游戏控制相关数据的结构体
typedef struct  TetrisControl
{
   

    bool pause;//暂停
    bool clockwise;//旋转方向;顺时针方向为ture
    int  direction;//移动方向:0向左移动 1向右移动
    //游戏池内每格的颜色
    //此版本是彩色的,仅用游戏池数据无法存储颜色
    int color[28][16];
}Control;//Control是结构体别名

//初始状态的游戏池
//每个元素表示游戏池的一行
//两端各置两个1,底部两行全部为1,便于进行碰撞
//这样一来游戏池的宽度为12列 共16列
//当某个元素为OXFFFF时,说明该行已经填满
//顶部4行用于给方块,不显示
//底部2行不显示,显示出来的游戏池高度为22行
static const unsigned int gs_uInitialTetrisPool[28]=
{
   
    0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,
    0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,
    0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,
    0XC003,0XC003,0XC003,0XC003,0XC003,0XFFFF,0XFFFF
     //C003 1100 0000 0000 0011

};

//7种方块的4种旋转状态(4位一行)
static const unsigned int TetrisTable[7][4]=
{
   
    {
    0x00f0, 0x2222,0x00f0,0x2222 },//I
    {
    0x0072, 0x0262,0x0270,0x0232 },//T
    {
    0x0223, 0x0074,0x0622,0x0170 },//L
    {
    0x0226, 0x0470,0x0322,0x0071 },//J
    {
    0x0063, 0x0264,0x0063,0x0264 },//Z
    {
    0x006c, 0x0462,0x006c,0x0462 },//S
    {
    0x0660, 0x0660,0x0660,0x0660 },//O
};

//函数声明
void printPoolBorder();//显示游戏池边界
void gotoxyWithFullwidth(short x,short y);//全角显示鼠标定位函数
void printPrompting();//显示按键提示信息
void printScore(const Manager *manager);

void intiGame(Manager* manager,Control*control);//初始化游戏
void startGame(Manager *manager,Control *control);
void printNextTetris(const Manager *manager);
void printTetrisPool(const Manager *manager,Control *control);//显示游戏池
void initTetris(Manager *manager);//初始化方块
void insertTetris(Manager *manager);//插入方块
bool checkCollision(const Manager *manager);//检测碰撞
void setPoolColor(const Manager *manager,Control *control);
void printCurrentTetris(const Manager *manager,const Control *control);
void removeTetris(Manager *manager);//移除当前方块
void moveDownTetris(Manager *manager, Control *control);//向下移动方块
void runGame(Manager *manager, Control *control);//运行游戏
void horzMoveTetris(Manager *manager, Control *control);//水平移动方块
void keydownControl(Manager *manager, Control *control,int key);//按键按下控制
void rotateTetris(Manager *manager, Control *control);//旋转方块
void dropDownTetris(Manager *manager, Control *control);//方块直接落地
bool ifPlayAgain();//是否重玩
bool checkErasing(Manager *manager, Control *control);//消行检测
#endif // _DAY7_H


#include <stdio.h>
#include <stdlib.h>
#include"day7.h"

int main()
{
   
    Manager manager;
    Control control;
    intiGame(&manager,&control);//初始化游戏
    do
    {
   
        printPrompting();//按键提示信息
        printPoolBorder();//游戏池

        runGame(&manager,&control);
        if(ifPlayAgain())
        {
   
          SetConsoleTextAttribute(Output,0x07);
          system("cls") ;//清屏
          startGame(&manager,&control);//从新开始游戏
        }

      else
            break;
    }while(1);
       intiGame(&manager,&control);//初始化游戏
       CloseHandle(Output);
    return 0;
}

//初始化游戏
void intiGame(Manager* manager,Control*control)
{
   
   Output=GetStdHandle(STD_OUTPUT_HANDLE);
   //定义光标隐藏变量并初始化
   CONSOLE_CURSOR_INFO info;
   info.bVisible=FALSE;//FAlse为光标隐藏
   info.dwSize=1;//光标亮度为1-100
   //设置光标隐藏
   SetConsoleCursorInfo(Output
  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个简单的C语言实现俄罗斯方块游戏代码,仅供参考: ```c #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <time.h> #include <windows.h> #define WIDTH 10 // 地图宽度 #define HEIGHT 20 // 地图高度 #define SIZE 4 // 方块大小 // 方块类型 enum BlockType { I_BLOCK, J_BLOCK, L_BLOCK, O_BLOCK, S_BLOCK, T_BLOCK, Z_BLOCK }; // 方块结构体 struct Block { int x[SIZE]; // 方块的x坐标 int y[SIZE]; // 方块的y坐标 int type; // 方块类型 int dir; // 方块的方向(0-3) }; // 地图数组 int map[HEIGHT][WIDTH]; // 方块数组 struct Block blocks[] = { { {0, 1, 2, 3}, {0, 0, 0, 0}, I_BLOCK, 0 }, { {0, 1, 2, 2}, {0, 0, 0, 1}, J_BLOCK, 0 }, { {0, 1, 2, 2}, {0, 0, 0, 1}, L_BLOCK, 0 }, { {0, 1, 0, 1}, {0, 0, 1, 1}, O_BLOCK, 0 }, { {1, 2, 0, 1}, {0, 0, 1, 1}, S_BLOCK, 0 }, { {0, 1, 2, 1}, {0, 0, 0, 1}, T_BLOCK, 0 }, { {0, 1, 1, 2}, {0, 0, 1, 1}, Z_BLOCK, 0 } }; // 随机生成一个方块 struct Block generateBlock() { struct Block block = blocks[rand() % 7]; for (int i = 0; i < SIZE; i++) { block.x[i] += WIDTH / 2 - 1; block.y[i] += 1; } return block; } // 判断方块是否可以移动 int canMove(struct Block block, int dx, int dy) { for (int i = 0; i < SIZE; i++) { int x = block.x[i] + dx; int y = block.y[i] + dy; if (x < 0 || x >= WIDTH || y < 0 || y >= HEIGHT || map[y][x]) { return 0; } } return 1; } // 移动方块 void moveBlock(struct Block *block, int dx, int dy) { if (canMove(*block, dx, dy)) { for (int i = 0; i < SIZE; i++) { block->x[i] += dx; block->y[i] += dy; } } } // 旋转方块 void rotateBlock(struct Block *block) { int dir = block->dir; block->dir = (dir + 1) % 4; int x = block->x[1]; int y = block->y[1]; int dx, dy; for (int i = 0; i < SIZE; i++) { dx = block->x[i] - x; dy = block->y[i] - y; block->x[i] = x + dy; block->y[i] = y - dx; } if (!canMove(*block, 0, 0)) { block->dir = dir; for (int i = 0; i < SIZE; i++) { dx = block->x[i] - x; dy = block->y[i] - y; block->x[i] = x - dy; block->y[i] = y + dx; } } } // 将方块放入地图 void putBlock(struct Block block) { for (int i = 0; i < SIZE; i++) { map[block.y[i]][block.x[i]] = block.type + 1; } } // 消除满行 void clearLines() { int count = 0; for (int i = HEIGHT - 1; i >= 0; i--) { int flag = 1; for (int j = 0; j < WIDTH; j++) { if (!map[i][j]) { flag = 0; break; } } if (flag) { count++; for (int k = i; k > 0; k--) { for (int j = 0; j < WIDTH; j++) { map[k][j] = map[k - 1][j]; } } for (int j = 0; j < WIDTH; j++) { map[0][j] = 0; } i++; } } } // 绘制地图 void drawMap() { system("cls"); for (int i = 0; i < HEIGHT; i++) { for (int j = 0; j < WIDTH; j++) { if (map[i][j]) { printf("[]"); } else { printf(" "); } } printf("\n"); } } int main() { srand(time(NULL)); struct Block block = generateBlock(); int score = 0; while (1) { drawMap(); if (_kbhit()) { char ch = _getch(); switch (ch) { case 'a': moveBlock(&block, -1, 0); break; case 'd': moveBlock(&block, 1, 0); break; case 's': moveBlock(&block, 0, 1); break; case 'w': rotateBlock(&block); break; case 'q': exit(0); break; } } if (!canMove(block, 0, 1)) { putBlock(block); clearLines(); score += 10; block = generateBlock(); if (!canMove(block, 0, 0)) { break; } } else { moveBlock(&block, 0, 1); } Sleep(100); } printf("Game over! Your score is %d.\n", score); return 0; } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值