c++:俄罗斯方块
这个代码比贪吃蛇难一些,花的时间久一些,同样,还是会有一些bug,请求大佬们查错
文章目录
“前置代码”们
前置数据
//头文件 #include<bits/stdc++.h> #include<windows.h> #include<conio.h> //常量 #define _for(i,a,b) for(int i=a;i<b;i++) //重定义for #define handle GetStdHandle(STD_OUTPUT_HANDLE) //标准输出句柄
前置函数
1. 控制台窗口初始化函数
去翻译了下 初始化 被译为了 initialize
∴ 这个函数长这样void Initialize(){ cursor(0); //把光标隐藏(下面有解释) system("color f0"); //用cmd里的color指令把控制台设为白底黑字 RECT rect; HWND hwnd=GetForegroundWindow(); //返回前台窗回的句柄 GetWindowRect(hwnd,&rect); //得到窗口的位置 //修改窗口的位置,这行代码就是将窗口移动到左上角(不改变窗口大小) MoveWindow(hwnd,0,0,rect.right-rect.left,rect.bottom-rect.top,TRUE); system("mode con cols=90 lines=30"); //将窗口大小设定为宽90字符高30字符 }
2. 光标定位函数和颜色函数
void gotoxy(double x,int y){//光标定位 COORD pos; //定义一个坐标 pos.X=2*x; //设置X,因为一个中文是两个字符,所以*2 pos.Y=y; //设置Y SetConsoleCursorPosition(handle,pos); //设置坐标位置 } void color(int a){//颜色 SetConsoleTextAttribute(handle,a);//修改 }
3. 延迟输出函数
void print(const char a[],int interval){ //传入文字和输出间隔(ms) int len=strlen(a); //获得文字长度 _for(i,0,len){ //循环输出 printf("%c",a[i]); Sleep(interval); //暂停interval时间,Sleep来自于Window.h,可以把函数暂停一会儿(ms) } }
4. 光标显示与隐藏
因为运行时还有一个光标在闪闪闪看着不舒服,所以就有了这么一个东西
void cursor(bool a){ CONSOLE_CURSOR_INFO CursorInfo;//创建一个光标变量 GetConsoleCursorInfo(handle, &CursorInfo);//获取光标 CursorInfo.bVisible = a;//将光标显示状态设为 a SetConsoleCursorInfo(handle, &CursorInfo);//设置光标 }
5. enter()
这玩意说白了就是个广告
void enter(){ print("本游戏由 AichiStudio爱知工作室(http://aichistudio.space) 制作",50); Sleep(1000); }
这太容易了,就不解释了,反正也就是个广告
功能代码
对方块的定义
因为算法不方便也不好搞,就打表了
const bool blocks[8][4][5][5]={//定义方块,1表示有方块,0表示没有
{//第一种,T型方块
{
{1, 1, 1},
{0, 1, 0}
},{
{0, 1},
{1, 1},
{0, 1}
},{
{0, 1, 0},
{1, 1, 1}
},{
{1, 0},
{1, 1},
{1, 0}
}
},{//第二种,O型方块
{
{1, 1},
{1, 1}
},{
{1, 1},
{1, 1}
},{
{1, 1},
{1, 1}
},{
{1, 1},
{1, 1}
}
},{//第三种,I型方块
{
{1, 1, 1, 1},
},{
{1},
{1},
{1},
{1}
},{
{1, 1, 1, 1},
},{
{1},
{1},
{1},
{1}
}
},{//第四种,J型方块
{
{1, 1, 1},
{0, 0, 1}
},{
{0, 1},
{0, 1},
{1, 1}
},{
{1, 0, 0},
{1, 1, 1}
},{
{1, 1},
{1, 0},
{1, 0}
}
},{//第五种,L型方块
{
{1, 1, 1},
{1, 0, 0}
},{
{1, 1},
{0, 1},
{0, 1}
},{
{0, 0, 1},
{1, 1, 1}
},{
{1, 0},
{1, 0},
{1, 1}
}
},{//第六种,S型方块
{
{0, 1, 1},
{1, 1, 0}
},{
{1, 0},
{1, 1},
{0, 1}
},{
{0, 1, 1},
{1, 1, 0}
},{
{1, 0},
{1, 1},
{0, 1}
}
},{//第七种,Z型方块
{
{1, 1, 0},
{0, 1, 1},
},{
{0, 1},
{1, 1},
{1, 0}
},{
{1, 1, 0},
{0, 1, 1},
},{
{0, 1},
{1, 1},
{1, 0}
}
}
};
对数据的定义
int block_x,block_y;//坐标,方块的位置
int block_type;//方块的种类
int block_direction;//方块的朝向
int block_color;//方块的颜色
bool block[4][4];//现在的方块
bool gamemap[30][30];//游戏地图
int nextblock,score;//下一个方块和分数
方块构造
构造
void createblock(){
block_type=nextblock;//设置方块种类
srand(time(NULL));//设置随机数种子
nextblock=rand()%7;//设置下一个方块
nextblock_print();//在右上角绘制下一个方块
//方块赋值
_for(i,0,4){
_for(j,0,4){
block[i][j]=blocks[block_type][0][i][j];
}
}
block_x=12;//设置方块X
block_y=-2;//设置方块Y,让它从上面慢慢滑下
block_direction=0;//方块朝向设为0,向上
srand(rand());//设置随机数种子
block_color=rand()%14+1;//设置方块颜色
}
输出“下一个方块”
void nextblock_print(){
srand(rand());//设置随机数种子
int clr=rand()%14+1;//随机输出的颜色
_for(i,0,3)//遍历方块
_for(j,0,4){
gotoxy(j+30,i+6);//光标定位
if(blocks[nextblock][0][i][j])//如果这部分有方块
color(clr);//设置颜色
else color(0);//否则颜色设为黑色
printf("■");//输出
}
}
方块的移动
void block_move(int direction){//传入 方向
_for(i,0,4)//对这个方块进行循环遍历
_for(j,0,4){
//当方块某部分的Y+1>=0(表示这个部分在地图内,不然会数组越界)且方向是向下
if(block_y+i+1>=0&&direction==1\
//如果在方块这部分的下面在地图里有方块或这部分已经到达底部,结束方块
&&(gamemap[block_y+i+1][block_x+j]||block_y+i+1>24)&&block[i][j]/*表示方块的这部分有东西*/){
block_over();
return;//返回
}
//当方块某部分的Y>=0(同样表示这个部分在地图内)且方向向左
else if(block_y+i>0&&direction==2\
//如果在方块这部分的左边在地图里有方块或者超出边界,不执行移动
&&(gamemap[block_y+i][block_x+j-1]||block_x+j-1<0)&&block[i][j])
return;
//当方块的某部分Y>=0(依旧表示这部分在地图内)且方向向右
else if(block_y+i>=0&&direction==3\
//如果在方块的这部分的右边在地图里有方块或超出边界,不执行移动
&&(gamemap[block_y+i][block_x+j+1]||block_x+j+1>24)&&block[i][j])
return;
}
//如果本次移动没有问题,那么先清除原来显示的方块
clean_block();
//判断方向并进行移动
if(direction==1)block_y++;
else if(direction==2)block_x--;
else if(direction==3)block_x++;
//输出移动后的方块
block_print();
}
方块转向
void block_turn(){
//检测转向是否合法
int temp=block_direction+1;
if(temp==4)temp=0;
_for(i,0,4)//遍历
_for(j,0,4)
if((gamemap[block_y+i][block_x+j]\
//如果这转向后会与其他方块重合
||block_x+j>24||0>block_x+j||block_y+i>24)\
//或超出边界
&&blocks[block_type][temp][i][j])//并且方块的这一部分有东西
return;//取消转向
//如果转向合法,则先清空原有方块
clean_block();
//转向
block_direction++;
if(block_direction==4)block_direction=0;
_for(i,0,4)//赋值方块
_for(j,0,4)
block[i][j]=blocks[block_type][block_direction][i][j];
block_print();//绘制方块
}
终结方块
void block_over(){
//将方块加入地图
_for(i,0,4)
_for(j,0,4)
if(block[i][j])
gamemap[i+block_y][j+block_x]=1;
map_test();//对地图进行检测
createblock();//构造方块
score+=4;//分数加 4
}
检测地图
void map_test(){
bool t=1;//临时变量
int subnum=0,verlen[30]={};//可以消除的行数和每一列的高度
_for(i,0,25){
t=1;//变量每次都定为1
_for(j,0,25){
if(!gamemap[i][j])t=0;//如果i行j列没有方块,则不能消除
if(gamemap[j][i])verlen[i]++;//如果j列i行有方块,则这一列的高度++
if(i==0&&gamemap[0][j])gameover();//如果第一行有方块,则游戏结束
}
if(t)subnum++;//如果这一行都有方块,则subnum++
}
if(subnum){//如果有一行可以消除
memset(gamemap,0,sizeof(gamemap));//清空地图
_for(i,0,25)//共25列
for(int j=24;j>=24-verlen[i]+subnum+1;j--)//倒序循环24-verlen[i]行
gamemap[j][i]=1;//第j行i列有方块
score+=subnum*200;//添加分数
}
//重新输出地图
_for(i,0,25)
_for(j,0,25){
gotoxy(j,i);
if(gamemap[i][j])color(7);
else color(0);
printf("■");
}
}
绘制与清除方块
清除方块
void clean_block(){
color(0);//将颜色定为黑色
_for(i,0,4)//遍历
_for(j,0,4)
if(block[i][j]&&block_x+j>=0&&block_y+i>=0&&block_x+j<=24&&block_y+i<=24){//如果这部分在地图内
gotoxy(block_x+j,block_y+i);//光标定位
printf("■");//输出
}
}
绘制方块
void block_print(){
color(block_color);//颜色设为方块的颜色
_for(i,0,4)//遍历
_for(j,0,4)
if(block_y+i>=0&&block_x+j>=0&&block_x+j<=24&&block[i][j]){//如果这部分在地图内且这部分有东西
gotoxy(block_x+j,block_y+i);//光标定位
printf("■");//绘制
}
}
gameover()函数
void gameover(){
system("cls&color f0");
//制作界面
gotoxy(19,10);printf("GAME OVER");
if(score<100){gotoxy(19,12);printf("SCORE: %d",score);}//分数只有两位就放在中间输出
else if(score<1000){gotoxy(19,12);printf("SCORE:%d",score);}//有三位就删去一个空格
else if(score<10000){gotoxy(18,12);printf("SCORE: %d",score);}//如果有四位就...
gotoxy(19,14);printf("按 R 重玩");
//就是把分数放在中间
while(_kbhit());//将积累的按键事件清空
char k=getch();//暂停并读取一个键值(可以理解为请按任意键退出)
if((k=='r'||k=='R')){//如果按的是 R 就重启游戏
score=0;
main_interface();
}
exit(0);//退出
}
主界面
void main_interface(){
system("cls&title 俄罗斯方块c++版");//清屏并设置标题
//构造界面,这里不多解释
gotoxy(28, 3);printf(" 下一个方块");
gotoxy(28,12);printf(" SCORE: %d",score);
gotoxy(28,14);printf(" S加速向下");
gotoxy(28,15);printf("");
gotoxy(28,16);printf(" A左旋转 D右旋转");
gotoxy(28,17);printf("");
gotoxy(28,18);printf(" Q暂停 R重玩");
gotoxy(28,19);printf("");
gotoxy(28,20);printf(" F打开Aichi网站");
_for(i,0,26){gotoxy(27,i);printf("|");}
//构造地图
color(0);
_for(i,0,5)
_for(j,0,6){
gotoxy(j+29,i+5);
printf("■");
}
_for(i,0,25){
_for(j,0,25){
gotoxy(j,i);printf("■");
}
}
color(240);
int tim=0;//计时器
bool running=1;//表示是否正在运行
srand(time(NULL));
nextblock=rand()%7;//生成下一个方块
Sleep(2000);//等待2秒,让随机数种子发生变化
createblock();//构造方块
while(1){//循环
if(tim==18){//时间达到900毫秒
block_move(1);//向下移动
gotoxy(28,12);color(240);printf(" SCORE: %d",score);//输出分数
tim=0;//计时器归零
}
if(_kbhit()){//如果键盘被按下
char k=_getch();//读取键码
if((k=='w'||k=='W')&&running){//如果 W 被按下,那么进行转向
block_turn();
}else if((k=='a'||k=='A')&&running){//如果 A 被按下,那么向左移动
block_move(2);
}else if((k=='d'||k=='D')&&running){//如果 D 被按下,那么向右移动
block_move(3);
}else if((k=='s'||k=='S')&&running){//如果 S 被按下,那么向下移动
block_move(1);
}else if((k=='p'||k=='P'))//如果 P 被按下,那么 暂停 或 继续
running=!running;//将状态切换
else if((k=='f'||k=='F')){//如果 F 被按下
system("explorer.exe http://aichistudio.space");//打开网站
running=0;//暂停
}else if((k=='r'||k=='R')){//如果 R 被按下
//重启游戏
score=0;
main_interface();
}
}
Sleep(50);//等待50ms
if(running)tim++;//如果正在运行,计时器累加
}
}
主函数
int main(){
Initialize();//初始化
enter();//启动界面
main_interface();//主界面
return 0;
}
完整代码
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
#define _for(i,a,b) for(int i=a;i<b;i++)
#define handle GetStdHandle(STD_OUTPUT_HANDLE)
using namespace std;
//----------数据定义----------
const bool blocks[8][4][5][5]={//定义方块,1表示有方块,0表示没有
{//第一种,T型方块
{
{1, 1, 1},
{0, 1, 0}
},{
{0, 1},
{1, 1},
{0, 1}
},{
{0, 1, 0},
{1, 1, 1}
},{
{1, 0},
{1, 1},
{1, 0}
}
},{//第二种,O型方块
{
{1, 1},
{1, 1}
},{
{1, 1},
{1, 1}
},{
{1, 1},
{1, 1}
},{
{1, 1},
{1, 1}
}
},{//第三种,I型方块
{
{1, 1, 1, 1},
},{
{1},
{1},
{1},
{1}
},{
{1, 1, 1, 1},
},{
{1},
{1},
{1},
{1}
}
},{//第四种,J型方块
{
{1, 1, 1},
{0, 0, 1}
},{
{0, 1},
{0, 1},
{1, 1}
},{
{1, 0, 0},
{1, 1, 1}
},{
{1, 1},
{1, 0},
{1, 0}
}
},{//第五种,L型方块
{
{1, 1, 1},
{1, 0, 0}
},{
{1, 1},
{0, 1},
{0, 1}
},{
{0, 0, 1},
{1, 1, 1}
},{
{1, 0},
{1, 0},
{1, 1}
}
},{//第六种,S型方块
{
{0, 1, 1},
{1, 1, 0}
},{
{1, 0},
{1, 1},
{0, 1}
},{
{0, 1, 1},
{1, 1, 0}
},{
{1, 0},
{1, 1},
{0, 1}
}
},{//第七种,Z型方块
{
{1, 1, 0},
{0, 1, 1},
},{
{0, 1},
{1, 1},
{1, 0}
},{
{1, 1, 0},
{0, 1, 1},
},{
{0, 1},
{1, 1},
{1, 0}
}
}
};
int block_x,block_y;//坐标,方块的位置
int block_type;//方块的种类
int block_direction;//方块的朝向
int block_color;//方块的颜色
bool block[4][4];//现在的方块
bool gamemap[30][30];//游戏地图
int nextblock,score;//下一个方块和分数
//----------函数定义----------
void gotoxy(double x,int y);
void color(int a);
void print(const char a[],int interval);
void main_interface();
void enter();
void Initialize();
void cursor(bool a);
void createblock();
void nextblock_print();
void block_move();
void block_print();
void block_turn();
void block_over();
void clean_block();
void map_test();
void gameover();
//----------函数书写----------
void cursor(bool a){
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);
CursorInfo.bVisible = a;
SetConsoleCursorInfo(handle, &CursorInfo);
}
void Initialize(){
cursor(0); //把光标隐藏(下面有解释)
system("color f0"); //用cmd里的color指令把控制台设为白底黑字
RECT rect;
HWND hwnd=GetForegroundWindow(); //返回前台窗回的句柄
GetWindowRect(hwnd,&rect); //得到窗口的位置
//修改窗口的位置,这行代码就是将窗口移动到左上角(不改变窗口大小)
MoveWindow(hwnd,0,0,rect.right-rect.left,rect.bottom-rect.top,TRUE);
system("mode con cols=90 lines=30"); //将窗口大小设定为宽90字符高30字符
}
void gotoxy(double x,int y){//光标定位
COORD pos; //定义一个坐标
pos.X=2*x; //设置X,因为一个中文是两个字符,所以*2
pos.Y=y; //设置Y
SetConsoleCursorPosition(handle,pos); //设置坐标位置
}
void color(int a){//颜色
SetConsoleTextAttribute(handle,a);//修改
}
void print(const char a[],int interval){ //传入文字和输出间隔(ms)
int len=strlen(a); //获得文字长度
_for(i,0,len){ //循环输出
printf("%c",a[i]);
Sleep(interval); //暂停interval时间,Sleep来自于Window.h,可以把函数暂停一会儿(ms)
}
}
void enter(){
print("本游戏由 AichiStudio爱知工作室(http://aichistudio.space) 制作",50);
Sleep(1000);
}
void createblock(){
block_type=nextblock;//设置方块种类
srand(time(NULL));//设置随机数种子
nextblock=rand()%7;//设置下一个方块
nextblock_print();//在右上角绘制下一个方块
//方块赋值
_for(i,0,4){
_for(j,0,4){
block[i][j]=blocks[block_type][0][i][j];
}
}
block_x=12;//设置方块X
block_y=-2;//设置方块Y,让它从上面慢慢滑下
block_direction=0;//方块朝向设为0,向上
srand(rand());//设置随机数种子
block_color=rand()%14+1;//设置方块颜色
}
void nextblock_print(){
srand(rand());//设置随机数种子
int clr=rand()%14+1;//随机输出的颜色
_for(i,0,3)//遍历方块
_for(j,0,4){
gotoxy(j+30,i+6);//光标定位
if(blocks[nextblock][0][i][j])//如果这部分有方块
color(clr);//设置颜色
else color(0);//否则颜色设为黑色
printf("■");//输出
}
}
void map_test(){
bool t=1;//临时变量
int subnum=0,verlen[30]={};//可以消除的行数和每一列的高度
_for(i,0,25){
t=1;//变量每次都定为1
_for(j,0,25){
if(!gamemap[i][j])t=0;//如果i行j列没有方块,则不能消除
if(gamemap[j][i])verlen[i]++;//如果j列i行有方块,则这一列的高度++
if(i==0&&gamemap[0][j])gameover();//如果第一行有方块,则游戏结束
}
if(t)subnum++;//如果这一行都有方块,则subnum++
}
if(subnum){//如果有一行可以消除
memset(gamemap,0,sizeof(gamemap));//清空地图
_for(i,0,25)//共25列
for(int j=24;j>=24-verlen[i]+subnum+1;j--)//倒序循环24-verlen[i]行
gamemap[j][i]=1;//第j行i列有方块
score+=subnum*200;//添加分数
}
//重新输出地图
_for(i,0,25)
_for(j,0,25){
gotoxy(j,i);
if(gamemap[i][j])color(7);
else color(0);
printf("■");
}
}
void block_over(){
//将方块加入地图
_for(i,0,4)
_for(j,0,4)
if(block[i][j])
gamemap[i+block_y][j+block_x]=1;
map_test();//对地图进行检测
createblock();//构造方块
score+=4;//分数加 4
}
void block_move(int direction){//传入 方向
_for(i,0,4)//对这个方块进行循环遍历
_for(j,0,4){
//当方块某部分的Y+1>=0(表示这个部分在地图内,不然会数组越界)且方向是向下
if(block_y+i+1>=0&&direction==1\
//如果在方块这部分的下面在地图里有方块或这部分已经到达底部,结束方块
&&(gamemap[block_y+i+1][block_x+j]||block_y+i+1>24)&&block[i][j]/*表示方块的这部分有东西*/){
block_over();
return;//返回
}
//当方块某部分的Y>=0(同样表示这个部分在地图内)且方向向左
else if(block_y+i>0&&direction==2\
//如果在方块这部分的左边在地图里有方块或者超出边界,不执行移动
&&(gamemap[block_y+i][block_x+j-1]||block_x+j-1<0)&&block[i][j])
return;
//当方块的某部分Y>=0(依旧表示这部分在地图内)且方向向右
else if(block_y+i>=0&&direction==3\
//如果在方块的这部分的右边在地图里有方块或超出边界,不执行移动
&&(gamemap[block_y+i][block_x+j+1]||block_x+j+1>24)&&block[i][j])
return;
}
//如果本次移动没有问题,那么先清除原来显示的方块
clean_block();
//判断方向并进行移动
if(direction==1)block_y++;
else if(direction==2)block_x--;
else if(direction==3)block_x++;
//输出移动后的方块
block_print();
}
void block_turn(){
//检测转向是否合法
int temp=block_direction+1;
if(temp==4)temp=0;
_for(i,0,4)//遍历
_for(j,0,4)
if((gamemap[block_y+i][block_x+j]
//如果这转向后会与其他方块重合
||block_x+j>24||0>block_x+j||block_y+i>24)\
//或超出边界
&&blocks[block_type][temp][i][j])//并且方块的这一部分有东西
return;//取消转向
//如果转向合法,则先清空原有方块
clean_block();
//转向
block_direction++;
if(block_direction==4)block_direction=0;
_for(i,0,4)//赋值方块
_for(j,0,4)
block[i][j]=blocks[block_type][block_direction][i][j];
block_print();//绘制方块
}
void block_print(){
color(block_color);//颜色设为方块的颜色
_for(i,0,4)//遍历
_for(j,0,4)
if(block_y+i>=0&&block_x+j>=0&&block_x+j<=24&&block[i][j]){//如果这部分在地图内且这部分有东西
gotoxy(block_x+j,block_y+i);//光标定位
printf("■");//绘制
}
}
void clean_block(){
color(0);//将颜色定为黑色
_for(i,0,4)//遍历
_for(j,0,4)
if(block[i][j]&&block_x+j>=0&&block_y+i>=0&&block_x+j<=24&&block_y+i<=24){//如果这部分在地图内
gotoxy(block_x+j,block_y+i);//光标定位
printf("■");//输出
}
}
void gameover(){
system("cls&color f0");
//制作界面
gotoxy(19,10);printf("GAME OVER");
if(score<100){gotoxy(19,12);printf("SCORE: %d",score);}//分数只有两位就放在中间输出
else if(score<1000){gotoxy(19,12);printf("SCORE:%d",score);}//有三位就删去一个空格
else if(score<10000){gotoxy(18,12);printf("SCORE: %d",score);}//如果有四位就...
gotoxy(19,14);printf("按 R 重玩");
//就是把分数放在中间
while(_kbhit());//将积累的按键事件清空
char k=getch();//暂停并读取一个键值(可以理解为请按任意键退出)
if((k=='r'||k=='R')){//如果按的是 R 就重启游戏
score=0;
main_interface();
}
exit(0);//退出
}
void main_interface(){
system("cls&title 俄罗斯方块c++版");//清屏并设置标题
//构造界面,这里不多解释
gotoxy(28, 3);printf(" 下一个方块");
gotoxy(28,12);printf(" SCORE: %d",score);
gotoxy(28,14);printf(" S加速向下");
gotoxy(28,15);printf("");
gotoxy(28,16);printf(" A左旋转 D右旋转");
gotoxy(28,17);printf("");
gotoxy(28,18);printf(" Q暂停 R重玩");
gotoxy(28,19);printf("");
gotoxy(28,20);printf(" F打开Aichi网站");
_for(i,0,26){gotoxy(27,i);printf("|");}
//构造地图
color(0);
_for(i,0,5)
_for(j,0,6){
gotoxy(j+29,i+5);
printf("■");
}
_for(i,0,25){
_for(j,0,25){
gotoxy(j,i);printf("■");
}
}
color(240);
int tim=0;//计时器
bool running=1;//表示是否正在运行
srand(time(NULL));
nextblock=rand()%7;//生成下一个方块
Sleep(2000);//等待2秒,让随机数种子发生变化
createblock();//构造方块
while(1){//循环
if(tim==18){//时间达到900毫秒
block_move(1);//向下移动
gotoxy(28,12);color(240);printf(" SCORE: %d",score);//输出分数
tim=0;//计时器归零
}
if(_kbhit()){//如果键盘被按下
char k=_getch();//读取键码
if((k=='w'||k=='W')&&running){//如果 W 被按下,那么进行转向
block_turn();
}else if((k=='a'||k=='A')&&running){//如果 A 被按下,那么向左移动
block_move(2);
}else if((k=='d'||k=='D')&&running){//如果 D 被按下,那么向右移动
block_move(3);
}else if((k=='s'||k=='S')&&running){//如果 S 被按下,那么向下移动
block_move(1);
}else if((k=='p'||k=='P'))//如果 P 被按下,那么 暂停 或 继续
running=!running;//将状态切换
else if((k=='f'||k=='F')){//如果 F 被按下
system("explorer.exe http://aichistudio.space");//打开网站
running=0;//暂停
}else if((k=='r'||k=='R')){//如果 R 被按下
//重启游戏
score=0;
main_interface();
}
}
Sleep(50);//等待50ms
if(running)tim++;//如果正在运行,计时器累加
}
}
int main(){
Initialize();//初始化
enter();//启动界面
main_interface();//主界面
return 0;
}
From AichiStudio爱知工作室,
网站:http://aichistudio.space
**QQ交流群:[1032103456](http://shang.qq.com/wpa/qunwpa?idkey=057e58f1b40bec3f845e205