俄罗斯方块,下落时只有一块会往下掉, 此外方向键移动时会卡顿

0

代码如下

#include <graphics.h>
#include <cmath>
#include <ctime>
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
#include <mmsystem.h>
#pragma comment (lib,"winmm.lib")

int cube[10][15];

struct Graph //19种变化的图形
{
int num[4][4];
}graph[19];

struct Fock //每一个图形的4个正方形的坐标
{
int x;
int y;
}focks[4];

//void playbgm(); //播放bgm
void gameinit();
void graphinit(); //将格子初始化
void newgraph(); //通过刷新函数 ,改变格子的颜色
void read(); //读取txt中方块的信息
bool Movedown(); //向下移动方块
void Moveleft(); //向左移动方块
void Moveright(); //向右移动方块
void creatfock(); //生成方块
void ChangeFock(); //改变方块的现状
void CleanFock(); //清除最下面一行
void GameOver(); //判断游戏是否结束

//void playbgm()
//{
// mciSendString(L"open ./bgm.wma", 0, 0, 0);
// mciSendString(L"play ./bgm.wma", 0, 0, 0);
// Sleep(3000);
// mciSendString(L"close ./bgm.wma", 0, 0, 0);
//}
void gameinit() //游戏初始化
{
initgraph(600, 540);
setbkcolor(BLACK);
//cleardevice();
for (int i = 0; i <= 360;)
{
setlinecolor(WHITE);
line(i,0,i,540);
i += 36;
}
for (int j = 0; j <= 540;)
{
setlinecolor(WHITE);
line(0, j, 360, j);
j += 36;
}
solidrectangle(360, 0, 600, 540);
settextcolor(BLACK);
settextstyle(36, 0,L"行楷");
setbkcolor(WHITE);
outtextxy(400, 20,L"俄罗斯方块");
settextstyle(15, 0, L"宋体");
RECT rec = { 400,75,500,500 };
drawtext(_T("【游戏说明】\n\n左右控制方向\n\n上键旋转\n\nf5:重新来一局\n\nesc:退出\n"), &rec, DT_WORDBREAK);
}
void graphinit()
{
for (int i = 0; i <= 9; i++)
{
for (int j = 0; j <= 14; j++)
cube[i][j] = 0;
}
}

void creatfock() //随机生成方块
{
srand(time(NULL));
int m = rand() % 19;
for(int k=0;k<4;k++)
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
{
if (graph[m].num[i][j] == 2)
{
focks[k].x = i+3;
focks[k].y = j;
cube[focks[k].x][focks[k].y] = 2;
}
}
}

void read() //读取文件中的格子
{
FILE* fp;
fopen_s(&fp,"D:\liu\daima\Teris\graph.txt", "r");
if (!fp)
{
printf("not open");
exit(-1);
}
else
{
for (int i = 0; i < 19; i++)
for(int j=0;j<4;j++)
for (int k = 0; k < 4; k++)
{
fscanf_s(fp, "%d", &graph[i].num[j][k]);
}
}
}
void newgraph()
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 15; j++)
{
if (cube[i][j] == 0)
{
setfillcolor(BLACK);
fillrectangle(36i,36j,36*(i+1),36*(j+1)); ///填充该格子
}
else if(cube[i][j]==2)
{
setfillcolor(RED);
fillrectangle(36 * i, 36 * j, 36 * (i + 1), 36 * (j + 1)); ///填充该格子
}
else
{
setfillcolor(BLUE);
fillrectangle(36 * i, 36 * j, 36 * (i + 1), 36 * (j + 1)); ///填充该格子
}
}
}
}

bool Movedown() //向下移动方块
{
for(int i=0;i<4;i++) ///判断是否触底
if (focks[i].y == 14)
{
for (int m = 0; m < 4; m++)
cube[focks[m].x][focks[m].y] = 1;
return 0;
}
for(int j=0;j<4;j++) ///判断下方有没有其他方块
if (cube[focks[j].x][focks[j].y + 1] == 1)
{
for (int n = 0; n < 4; n++)
cube[focks[n].x][focks[n].y] = 1;
return 0;
}
for (int k = 0; k < 4; k++)
cube[focks[k].x][focks[k].y] = 0;
for (int p= 0; p < 4; p++)
focks[p].y++;
for(int q=0;q<4;q++)
cube[focks[q].x][focks[q].y] = 2;
return 1;
}

void Moveleft() //向左移动方块
{
for (int i = 0; i < 4; i++)
if (focks[i].x <= 0)
return;
for (int j = 0; j < 4; j++)
if (cube[focks[j].x][focks[j].y - 1] == 1)
return;
for (int k = 0; k < 4; k++)
cube[focks[k].x][focks[k].y] = 0;
for (int p = 0; p < 4; p++)
focks[p].x--;
for (int q = 0; q < 4; q++)
cube[focks[q].x][focks[q].y] = 2;
}

void Moveright() //向右移动方块
{
for (int i = 0; i < 4; i++)
if (focks[i].x >= 9)
return;
for (int j = 0; j < 4; j++)
if (cube[focks[j].x][focks[j].y - 1] == 1)
return;
for (int k = 0; k < 4; k++)
cube[focks[k].x][focks[k].y] = 0;
for (int p = 0; p < 4; p++)
focks[p].x++;
for (int q = 0; q < 4; q++)
cube[focks[q].x][focks[q].y] = 2;
}

void ChangeFock() //改变方块的现状
{

}

void CleanFock() //清除最下面一行
{

}
void GameOver() //判断游戏是否结束
{
for(int p=0;p<4;p++)
if (focks[p].y <= 0)
{
system("pause");
settextcolor(RED);
settextstyle(36, 0, L"行楷");
outtextxy(150, 250, L"游戏结束");
}
}

int main()
{
int down_count=0;
graphinit();
gameinit();
read();
creatfock();
newgraph();
//playbgm();
while (1)
{
if (Movedown() == 0) //不能再往下移动
{
creatfock(); //创造新的方块
newgraph();
}
GameOver();
}

while (1)
{
int ch;
if((ch = _getch()) != 0x1B) //esc退出游戏
{
//if(ch==72)
if(ch==80) Movedown();
if(ch==75) Moveleft();
if(ch==77) Moveright();
}
if (Movedown() == 0) //不能再往下移动
{
creatfock(); //创造新的方块
newgraph();
}
if (down_count == 3)
{
if (Movedown() == 0) //不能再往下移动
{
creatfock(); //创造新的方块
newgraph();
down_count = 0;
}
}
else
down_count++;
Sleep(300);
newgraph();
FlushBatchDraw();
}
system("pause");
closegraph();
return 0;
}

ava
天道酬勤

2020-12-19

0

请先整理一下你的代码,删掉无关的内容(比如音乐播放、文件读取、空函数、无用的注释代码等),确保内容可以正常编译并体现出你的问题。

记得写清楚你的编译环境。

ava
慢羊羊

2020-12-20

0

我觉得,下次直接插入代码格式会更好,方便别人阅读。

例如:

public static void main(String args[]){
	System.out.println("演示");
}
ava
Hg qin

2020-12-20

技术讨论社区