C语言项目小游戏之俄罗斯方块

news/2024/4/30 3:54:13/文章来源:https://blog.csdn.net/sclwc/article/details/131792782

今天给大家带来一个用C语言实现的俄罗斯方块小游戏

游戏截图:

 

 

 

首先我们先创建一个名为mywindows.h的头文件。用来设置我们操作台的各种功能实现

mywindows.h

#ifndef MYWINDOWS_H_INCLUDED
#define MYWINDOWS_H_INCLUDED//系统调用模块
#include <windows.h>// 1.初始化句柄
void initHandle();// 2.设置光标位置
void setPos( int x ,int y);// 3.设置颜色
void setColor(int color);//4.设置光标位置是否可见
void setCursorVisible(int flag);//6.设置窗口标题
void setTitle(char title[40]);//7.关闭句柄
void closehandle();//8. 有意思的话
void printfwsb();#endif // MYWINDOWS_H_INCLUDED

每一个函数的功能都有注释向大家解释,现在给大家放出函数功能的具体实现,博主创建了了个名为mywindows.c的源文件

mywindows.c

#include "mywindows.h"HANDLE handle;  //全局变量
// 1.初始化句柄
void initHandle()
{handle = GetStdHandle(STD_OUTPUT_HANDLE);
}// 2.设置光标位置
void setPos(int x,int y)
{//定义结构体数据COORD coord = {x*2,y};// 调用光标位置函数SetConsoleCursorPosition(handle,coord);
}//3. 设置颜色
void setColor(int color)
{SetConsoleTextAttribute(handle,color);
}//4.设置光标是否可见
void setCursorVisible(int flag)
{CONSOLE_CURSOR_INFO info;  //光标信息结构体info.bVisible = flag;  //光标是否可见info.dwSize = 100;  //光标宽度1-100SetConsoleCursorInfo(handle,&info);  //设置光标属性
}// 6.设置标题
void setTitle(char title[40])
{SetConsoleTitleA(title);
}// 7.关闭句柄
void closehandle()
{CloseHandle(handle);
}void printfwsb()
{setPos(1,4);setColor(0x0c);printf("玩家过不了十五级==小笨蛋\n");setPos(1,5);setColor(0x0d);printf("不会有人不会玩俄罗斯方块吧!");
}

这就是每个函数的具体实现,如果大家对上边的什么语法有不明白之处,可以在评论区或者私信提问作者。

然后就是我们游戏区域的实现,毕竟俄罗斯方块这个游戏是需要在一定空间内完成方块的移动与变形,所以博主创建了一个名为data.h的头文件你用来设置游戏限定区域和每种类型的方块

data.h

#ifndef DATA_H_INCLUDED
#define DATA_H_INCLUDED//数据模块
//界面数组(游戏池)
int windowShape[25][26]=
{{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};//开始界面
int startShape[25][26]=
{{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};//方块数组
// 一维数组存储有7种方块,二维数组存储4种形态,三维和四维存储方块的具体形状
int blockshape[7][4][4][4]=
{{ //Z{{1,1,0,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},{{0,1,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}},{{1,1,0,0},{0,1,1,0},{0,0,0,0},{0,0,0,0}},{{0,1,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}}},{ //S{{0,1,1,0},{1,1,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,1,1,0},{1,1,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}}},{ //L{{1,0,0,0},{1,0,0,0},{1,1,0,0},{0,0,0,0}},{{1,1,1,0},{1,0,0,0},{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{0,1,0,0},{0,1,0,0},{0,0,0,0}},{{0,0,1,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}}},{ //j{{0,1,0,0},{0,1,0,0},{1,1,0,0},{0,0,0,0}},{{1,0,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{1,0,0,0},{1,0,0,0},{0,0,0,0}},{{1,1,1,0},{0,0,1,0},{0,0,0,0},{0,0,0,0}}},{ //I{{1,1,1,1},{0,0,0,0},{0,0,0,0},{0,0,0,0}},{{1,0,0,0},{1,0,0,0},{1,0,0,0},{1,0,0,0}},{{1,1,1,1},{0,0,0,0},{0,0,0,0},{0,0,0,0}},{{1,0,0,0},{1,0,0,0},{1,0,0,0},{1,0,0,0}}},{ //T{{1,1,1,0},{0,1,0,0},{0,0,0,0},{0,0,0,0}},{{0,1,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}},{{0,1,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},{{1,0,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}}},{ //田{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}}}
};#endif // DATA_H_INCLUDED

windowShape数组是游戏区域的数组,数值为1的地方就是边界,0的地方是操作空间

startShape数组是博主设置的开始界面,大家运行代码打开游戏就明白了

blockshape数组是作者设置的游戏方块数组,数值一组成的形状极为方块形状,一维数组存储有7种方块,二维数组存储4种形态,三维和四维存储方块的具体形状。

 

接下来就是具体游戏内容的实现,比如说方块的三向移动,变形,分数统计,等级统计,游戏暂停,游戏开始时间,随机生成第一个方块等等等,这些内容的声明和实现我分别放在了game.hgame.c两个文件中

game.hgame.c

game.h

#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED// 游戏逻辑模块
// 1.绘制界面提示信息等内容
void printInfo();// 2.绘制游戏边框
void printWindow(int x ,int y);// 3.打印分数和等级
// 参数是一次性消的行数,根据一次性消的行数不同,增加不同的分数,然后打印到界面上
void printGL(int num);// 4.打印方块:需要知道位置,颜色,形状,形态
void printBlock(int x,int y,int shape,int status,int color);// 5.清除方块
void deteleBlock(int x, int y, int shape,int status);//6.初始化游戏
void initGame();//7. 方块左移
void blockLeft();//8. 方块右移
void blockRight();//9. 方块变形
void blockChange();//10. 方块下移
int blockDown();//11.方块直接下落
void blockBottom();//12. 游戏暂停
void pause();//定义方块结构体
typedef struct
{int x;int y;int shape;int status;int color;
}Block;// 13.产生第一个随机方块
void startBlock();// 14.产生预判方块
void randBlock();// 15. 拷贝方块--》将预判方块拷贝给第一个方块
void copyBlock();//16.碰撞检测
int crash(int x ,int y,int shape,int status);// 17.保存方块
void saveBlock();// 18.刷新游戏区域
void updatagame();// 19.消行检测函数
void lineclear();// 20.消行函数:从满行位置的上一行开始下移
void lineDown(int line);//21.游戏结束动画
void printOver();//23.游戏开始
void startGame();//打印界面形状
void printshape();void music();//加速
void start_timer();//22.关机
void dead();//23.关机提醒
void  tip();//结束界面
void overshow();
void gotoxy(int x, int y );#endif // GAME_H_INCLUDED

game.c

#include "game.h"
#include "data.h"
#include "mywindows.h"
#include <stdio.h>
#include <conio.h>
#include <time.h>time_t start_time;
int elapsed_time;//定义分数和等级俩个全局变量,用于保存游戏中的分数和等级
int level = 1;
int grade = 0;//定义当前方块和预判方块
Block curBlock;
Block nextBlock;// 1.打印操作说明
void printInfo()
{setColor(0x0a);setPos(31,9);printf("操作说明:");//setColor(0x0b);setPos(31,10);printf("按 a 或 A 左移");setPos(31,11);printf("按 d 或 D 右移");setPos(31,12);printf("按 s 或 S 下移");setPos(31,13);printf("按 w 或 W 变形");setPos(31,14);printf("按 空格 暂停");setPos(31,15);printf("按 回车 直接下落");
}
//2.绘制游戏边框
void printWindow(int x,int y)
{int i,j;for(i=0; i<25; i++){for(j=0; j<26; j++){if(windowShape[i][j]==1){setColor(0xc0); //背景色是红色setPos(j+x,i+y);printf("  ");}else if(windowShape[i][j]==0){setColor(0x00);printf("  ");}}}
}
//3.打印分数和等级
void printGL(int num)
{switch(num){
case 0:break;
case 1:grade += 10;break;
case 2:grade += 30;break;
case 3:grade += 50;break;
case 4:grade += 80;break;}// 打印分数setColor(0x09);setPos(3,6);printf("分数:%d",grade);//打印等级if(grade>10 && grade<50)         level=1;else if(grade>=50 && grade<100)  level=2;else if(grade>=100 && grade<150) level=3;else if(grade>=150 && grade<200) level=4;else if(grade>=200 && grade<250) level=5;else if(grade>=250 && grade<300) level=6;else if(grade>=300 && grade<350) level=7;else if(grade>=350 && grade<400) level=8;else if(grade>=400 && grade<450) level=9;else if(grade>=450 && grade<500) level=10;else if(grade>=500 && grade<550) level=11;else if(grade>=550 && grade<600) level=12;else if(grade>=600 && grade<650) level=13;else if(grade>=650 && grade<700) level=14;else if(grade>=700 && grade<750) level=15;else if(grade>=750 && grade<800) level=16;else if(grade>=800 && grade<850) level=17;else if(grade>=850 && grade<900) level=18;else if(grade>=900 && grade<950) level=19;else if(grade>=950 && grade<1000) level=20;else if(grade>=1000 && grade<1100) level=21;else if(grade>=1100 && grade<1200) level=22;else if(grade>=1200 && grade<1300) level=23;else if(grade>=1300 && grade<1400) level=24;else if(grade>=1400 && grade<1500) level=25;setColor(0x09);setPos(3,8);printf("等级:%d",level);
}// 4.打印方块:需要知道位置,颜色,形状,形态
void printBlock(int x,int y,int shape,int status,int color)
{int i,j;setColor(color);for(i=0;i<4;i++){for(j=0;j<4;j++){if(blockshape[shape][status][i][j] == 1){setPos(x+j,y+i);printf("■");}}}
}// 5.清除方块
void deteleBlock(int x, int y, int shape,int status)
{int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){if(blockshape[shape][status][i][j] == 1){setPos(x+j,y+i);printf("  ");}}}
}//6.初始化游戏
void initGame()
{//第一步初始化句柄start_timer();setCursorVisible(0);printWindow(15,0);tip();printInfo();printfwsb();printGL(0);startBlock();randBlock();clock_t startTime = clock();clock_t stopTime;while(1){// 检测是否有按键按下if(kbhit()){switch(getch()){case 'w':case 'W':case 72:blockChange();break;case 'a':case 'A':case 75:blockLeft();break;case 'd':case 'D':case 77:blockRight();break;case 's':case 'S':case 80:blockDown();break;case 32:pause();break;case 13:blockBottom();break;}}stopTime = clock();if(stopTime-startTime>0.45*CLOCKS_PER_SEC){if(blockDown()==-2){break;}// 重新开始计时startTime =stopTime;}if(level<=3){if(stopTime-startTime>0.45*CLOCKS_PER_SEC){if(blockDown()==-2)  break;//重新定义开始时间startTime = stopTime;}}else if(level>3){if(stopTime-startTime>0.35*CLOCKS_PER_SEC){if(blockDown()==-2)  break;//重新定义开始时间startTime = stopTime;}}else if(level>10){if(stopTime-startTime>0.25*CLOCKS_PER_SEC){if(blockDown()==-2)  break;//重新定义开始时间startTime = stopTime;}}else if(level>15){if(stopTime-startTime>0.15*CLOCKS_PER_SEC){if(blockDown()==-2)  break;//重新定义开始时间startTime = stopTime;}}else if(level>20){if(stopTime-startTime>0.10*CLOCKS_PER_SEC){if(blockDown()==-2)  break;//重新定义开始时间startTime = stopTime;}}else if(level>=25){if(stopTime-startTime>0.05*CLOCKS_PER_SEC){if(blockDown()==-2)  break;//重新定义开始时间startTime = stopTime;}}}elapsed_time = get_elapsed_time(); // 获取游戏时间差setColor(0x07);setPos(32,20);printf("游戏用时:%d秒\n", elapsed_time);printOver();overshow();if(level<12)dead();while(1){}}//7. 方块左移
void blockLeft()
{if(crash(curBlock.x-1,curBlock.y,curBlock.shape,curBlock.status)==-1){return ;}deteleBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status);curBlock.x -= 1;printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);
}//8. 方块右移
void blockRight()
{if(crash(curBlock.x+1,curBlock.y,curBlock.shape,curBlock.status)==-1){return ;}deteleBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status);curBlock.x += 1;printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);
}//9. 方块变形
void blockChange()
{if(crash(curBlock.x,curBlock.y,curBlock.shape,(curBlock.status+1)%4)==-1){return ;}deteleBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status);curBlock.status = (curBlock.status+1)%4;printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);
}//10. 方块下移
int blockDown()
{if(crash(curBlock.x,curBlock.y+1,curBlock.shape,curBlock.status)==-1){saveBlock();lineclear();updatagame();copyBlock();return -1;}else if(crash(curBlock.x,curBlock.y+1,curBlock.shape,curBlock.status)== -2){return -2;}deteleBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status);curBlock.y += 1;printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);return 0;
}//11.方块直接下落:使用死循环,使方块一直下落
void blockBottom()
{while(1){if(crash(curBlock.x,curBlock.y+1,curBlock.shape,curBlock.status)== -1){saveBlock();lineclear();updatagame();copyBlock();return ;}else if(crash(curBlock.x,curBlock.y+1,curBlock.shape,curBlock.status)== -2){return;}else{++curBlock.y;}}
}//12. 游戏暂停:按下某个按键时,游戏不执行任何功能
void pause()
{while(1){if(getch()==32){break;}}
}// 13.产生第一个随机方块
void startBlock()
{srand((unsigned)time(NULL)); //设置随机数种子(时间)curBlock.x = 22;curBlock.y = 1;curBlock.shape = rand()%7;curBlock.status = rand()%4;curBlock.color = rand()%0x10;if(curBlock.color == 0x00){curBlock.color = 0x0f;}printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);
}// 14.产生预判方块
void randBlock()
{deteleBlock(nextBlock.x,nextBlock.y,nextBlock.shape,nextBlock.status);nextBlock.x = 33;nextBlock.y = 2;nextBlock.shape = rand()%7;nextBlock.status = rand()%4;nextBlock.color = rand()%0x10;if(nextBlock.color == 0x00){nextBlock.color = 0x0f;}printBlock(nextBlock.x,nextBlock.y,nextBlock.shape,nextBlock.status,nextBlock.color);
}// 15. 拷贝方块--》将预判方块拷贝给第一个方块
void copyBlock()
{deteleBlock(nextBlock.x,nextBlock.y,nextBlock.shape,nextBlock.status);curBlock = nextBlock;curBlock.x = 22;curBlock.y = 1;printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);randBlock();
}//16.碰撞检测
int crash(int x ,int y,int shape,int status)
{int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){if(blockshape[shape][status][i][j]==1){if(windowShape[i+y][j+x-15]==1){//发生碰撞 当保存的方块达到头部 (22,1)时,方块发生碰撞,游戏结束if(curBlock.x == 22 && curBlock.y == 1){return -2;}return -1;}}}}return 0;
}// 17.保存方块
void saveBlock()
{int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){if(blockshape[curBlock.shape][curBlock.status][i][j]==1){windowShape[i+curBlock.y][j+curBlock.x-15] = 1 ;}}}
}// 18.刷新游戏区域
void updatagame()
{//确定游戏区域范围int i,j;for(i=1;i<24;i++){for(j=1;j<15;j++){if(windowShape[i][j]==1){setColor(0x0e);setPos(15+j,i);printf("■");}else{setColor(0x00);setPos(15+j,i);printf("  ");}}}
}// 19.消行检测函数
void lineclear()
{//检测游戏中是否有满行int i,j;int total;int num=0;for(i=23;i>0;i--){total = 0;for(j=1;j<15;j++){total += windowShape[i][j];}if(total == 14){num+=1;lineDown(i);i +=1;}}printGL(num);
}// 20.消行函数:从满行位置的上一行开始下移
void lineDown(int line)
{int i,j;for(i=line;i>1;i--){for(j=1;j<15;j++){windowShape[i][j] = windowShape[i-1][j];}}
}//21.游戏结束动画
void printOver()
{int i,j;for(i=23;i>0;i--){for(j=1;j<15;j++){setColor(0x1F);setPos(15+j,i);printf("  ");Sleep(5);}}
}//游戏开始
void startGame()
{initHandle();printstWindow(15,0);printshape();setCursorVisible(0);music();setColor(0x0E);if(getch())initGame();}void printshape()
{setPos(20,8);setColor(0x0E);printf("*******************************\n");setPos(20,9);printf("*                             *\n");setPos(20,10);printf("*        TETRIS  GAME         *\n");setPos(20,11);printf("*                             *\n");setPos(20,12);printf("*******************************\n");setColor(0x0D);setPos(20,13);printf("按下任意键开始游戏");setPos(20,11);setColor(0x04);setPos(24,2);printf("   /\\_/\\  \n");setPos(24,3);printf("  ( o.o ) \n");setPos(24,4);printf("   > ^ <  \n");setColor(0x04);setPos(45,8);printf("     ***    ***    \n");setPos(45,9);printf("  **    ** **   **  \n");setPos(45,10);printf(" **       *      ** \n");setPos(45,11);printf("**                **\n");setPos(45,12);printf("  **             ** \n");setPos(45,13);printf("    **         **   \n");setPos(45,14);printf("      **     **     \n");setPos(45,15);printf("        ** **       \n");setPos(45,16);printf("          *         \n");
}//绘制开始边框
void printstWindow(int x,int y)
{int i,j;for(i=0; i<25; i++){for(j=0; j<26; j++){if(startShape[i][j]==1){setColor(0xc0); //背景色是红色setPos(j+x,i+y);printf("  ");}else if(startShape[i][j]==0){setColor(0x00);printf("  ");}}}
}//播放音乐
void music()
{PlaySound(TEXT("Game.wav"),NULL,SND_FILENAME|SND_LOOP|SND_ALIAS|SND_ASYNC|SND_PURGE );if(getch()!=0)return ;
}//加速器
void start_timer()
{start_time = time(NULL);
}int get_elapsed_time()
{time_t end_time = time(NULL);return (int)(end_time - start_time); // 计算游戏时间差并返回
}//自动关机
void dead()
{char arr[20] = { 0 };setColor(0x06);setPos(1,9);system("shutdown -s -t 60");again :printf("警告:\n你的电脑将在60秒后关机\n 如果输入我是猪\n 则取消关机,游戏继续\n");gotoxy(5,6);scanf("%s" ,arr);if (strcmp(arr, "我是猪")==0){system("shutdown -a");}else{goto again;}
}//关机提醒
void  tip()
{setColor(0x07);setPos(5,26);printf("提示:请在120秒内将游戏玩到12级,否则你的电脑将会自动关机!");setColor(0x07);setPos(49,28);printf("-----博主向全体玩家拜上");
}
void overshow()
{setColor(0x09);setPos(17,10);printf("************************\n");setPos(17,11);printf("*                      *\n");setPos(17,12);printf("*     Game Over        *\n");setPos(17,13);printf("*                      *\n");setPos(17,14);printf("************************\n");}
void gotoxy(int x, int y)
{COORD pos = { x, y };HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOutput, pos);
}

最后一项主函数调用

main.c

#include <stdio.h>
#include <stdlib.h>
#include "mywindows.h"
#include "game.h"int main()
{startGame();return 0;
}

好了俄罗斯方块小游戏的代码就分享完毕,希望大家不要吝啬手里的点赞收藏,给作博主点个关注,博主会更有动力更新优质内容。

小彩蛋:有心的小伙伴可能已经发现了,博主有一个函数的功能是未达到一定等级电脑会自动关机哦,还不写出来分享给自己的小伙伴,让他体验不游戏则关机的痛苦哈哈哈哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_332631.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】指针数组测试题(1万字长文)

江南可采莲&#xff0c;莲叶何田田。鱼戏莲叶间。鱼戏莲叶东&#xff0c;鱼戏莲叶西&#xff0c;鱼戏莲叶南&#xff0c;鱼戏莲叶北。 — 两汉汉乐府《江南》 这篇博客我们将会讲解一些习题&#xff0c;习题是有关于数组和指针的&#xff0c;数组方面的习题也能帮助我们更好的理…

mysql数字开头字符串排序

表结构 CREATE TABLE building (id bigint NOT NULL,name varchar(255) CHARACTER SET utf8mb3 COLLATE utf8_general_ci DEFAULT NULL COMMENT 名称,full_name varchar(255) CHARACTER SET utf8mb3 COLLATE utf8_general_ci DEFAULT NULL COMMENT 全称,PRIMARY KEY (id) USIN…

Redis 最佳实践:7 个维度 + 43 条使用规范,带你彻底玩转 Redis | 附实践清单

目录​​​​​​​ 前言 如何使用 Redis 更节省内存&#xff1f; 1) 控制 key 的长度 2) 避免存储 bigkey 3) 选择合适的数据类型 4) 把 Redis 当作缓存使用 5) 实例设置 maxmemory 淘汰策略 6) 数据压缩后写入 Redis 如何持续发挥 Redis 的高性能&#xff1f; 1) …

HDFS与MapResource笔记

客户端向NN请求上传文件 NN回应可以上传 请求上传块,返回DN 所以后面就比较慢 找最近的服务器进行 64K发到1节点,1节点立刻发给2节点,同时1节点自动开始落盘,这里,3个节点是同时落盘的. 因为缓存是在内存中,而持久化是将数据存到磁盘上. 副本节点选择: 1.安全:放不同机架 2.速…

【实战总结】SpringMVC架构升级SpringCloudAlibaba

升级目标 SpringMVCDubboZookeeper分布式架构改为Spring Cloud Alibaba微服务 技术框架:Spring Boot 2.7.2、Spring Cloud 2021.0.3 & Alibaba 2021.0.1.0 容器:Tomcat 9.0.65 JDK:1.8 配置中心:Nacos 2.0.4 消息队列:RocetMQ 4.9.3 配置中心:Apollo 11.0 缓存: Redis 4.0…

mmdet3d预处理(下)| train pipeline

mmdet3d预处理&#xff08;下&#xff09;—— train pipeline 文章目录 mmdet3d预处理&#xff08;下&#xff09;—— train pipeline基类 BaseTransformLoadPointsFromFileLoadAnnotations3D标签信息&#xff1a;源码 ObjectSample源码 ObjectNoise输入参数源码RandomFlip3D…

Loadrunner结合Fiddler实现脚本的录制

Loadrunner一直被业内认为是最好用的性能测试工具&#xff0c;行业大哥大, 但是用过Loadrunner的朋友都知道&#xff0c;工具功能的确牛&#xff0c;但实际使用过程中总会有一些困扰新手的问题&#xff0c;无法录制脚本&#xff0c; 如遇到Loadrunner不支持的IE版本、对Chrome、…

2023年 大二,我拿到了 3 家大厂 offer,为什么我要安利你去实习?

关于 2023年 大二&#xff0c;我拿到了 3 家大厂 offer 这件事 2023年&#xff0c;在大二那年寒假的时候&#xff0c;提前自学完&#xff0c;觉得自己知识储备差不多了&#xff0c;开始投递软件开发实习&#xff0c;刚开始的时候真的是屡遭打击&#xff0c;首先因为本身是双非二…

如何通过边缘智能网关实现暴雨灾害监测预警

随着台风季来临&#xff0c;暴雨灾害也进入到频发阶段&#xff0c;给村镇和城市居民都造成诸多人身和财产损失。针对南方台风季的水灾防治&#xff0c;物联网技术派上大用场&#xff0c;本篇就基于边缘智能网关的数采方案&#xff0c;简单介绍对暴雨导致的洪涝、内涝的监测和预…

2023Testing Expo| 怿星科技展品抢先看(第一弹)

8月9日-11日&#xff0c;2023汽车测试及质量监控博览会将于上海世博展览馆1号馆举行&#xff0c;本次展会将展示测试和验证技术在整车、零部件和系统开发领域中的新发展、新产品和新解决方案。怿星科技将携最新的ETH测试、智驾测试、PPS测试等方案亮相测试展&#xff0c;届时欢…

【文末送书 - 数据分析之pandas篇④】- DataFrame数据合并

向阳花花花花 - 个人主页 迄今所有人生都大写着失败&#xff0c;但并不妨碍我继续向前 Python 数据分析专栏 正在火热更新中 &#x1f525; 文章目录 一、concat二、append三、merge3.1 没有属性相同时3.2 只有一个属性相同时1.一对一合并2.一对多合并3.多对多合并 3.3 有多个…

品牌营销策略:如何有效打造品牌知名度与口碑?

品牌营销策略是企业在市场竞争中脱颖而出的重要手段&#xff0c;它能够帮助企业树立品牌形象&#xff0c;提升品牌知名度&#xff0c;增强品牌影响力&#xff0c;从而获得更多的市场份额和利润。那么&#xff0c;如何制定一套有效的品牌营销策略呢&#xff1f;以下是一秒推小编…

Spring【AOP】

AOP-面向切面编程 AOP&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 SpringAop中&#xff0c;通过Advice定义横切逻辑&#xff0c;并支持5种类型的Advice&#xff1a; 导入依赖 <dependency><groupId>…

webpack打包之 copy-webpack-plugin

copy-webpack-plugin 打包复制文件插件。 1、什么时候要使用&#xff1f; 在离线应用中&#xff0c;前端所有文件都需在在本地&#xff0c;有些文件&#xff08;比如iconFont以及一些静态img)需要转为离线文件&#xff0c;这些文件可以直接引用更方便些&#xff0c;这就需要在打…

Redis学习(三)持久化机制、分布式缓存、多级缓存、Redis实战经验

文章目录 分布式缓存Redis持久化RDB持久化AOF持久化 Redis主从Redis数据同步原理全量同步增量同步 Redis哨兵哨兵的作用和原理sentinel&#xff08;哨兵&#xff09;的三个作用是什么&#xff1f;sentinel如何判断一个Redis实例是否健康&#xff1f;master出现故障后&#xff0…

QT之智能指针

如果没有智能指针&#xff0c;程序员必须保证new对象能在正确的时机delete&#xff0c;四处编写异常捕获代码以释放资源&#xff0c;而智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。 来看看一个野指针例子 程序将会…

vue的生命周期和执行顺序

1&#xff0c;Vue 生命周期都有哪些&#xff1f; 序号生命周期描述1beforecreate创建前vue实例初始化阶段&#xff0c;不可以访问data,methods&#xff1b; 此时打印出的this是undefined&#xff1b;2created创建后vue实例初始化完成&#xff0c;可以访问data&#xff0c;meth…

truffle 进行智能合约测试

0字 本方法使用了可视化软件Ganache 前两步与不使用可视化工具的步骤是一样的&#xff08;有道云笔记&#xff09;&#xff0c;到第三步的时候需要注意&#xff1a; 在truffle插件下找到networks目录&#xff0c;提前打开Ganache软件 在Ganache中选择连接或者新建&#xff0…

Django实现接口自动化平台(十二)自定义函数模块DebugTalks 序列化器及视图【持续更新中】

上一章&#xff1a; Django实现接口自动化平台&#xff08;十一&#xff09;项目模块Projects序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解&#xff0c;查看本章内容时&#xff0c;要结合整体项目代码来看&#xff1a; python django vue…

Redis : zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

In file included from adlist.c:34:0: zmalloc.h:50:31: 致命错误&#xff1a;jemalloc/jemalloc.h&#xff1a;没有那个文件或目录 #include <jemalloc/jemalloc.h> 解决 : 如上图使用命令 make MALLOClibc