求博主们解答,不知道哪里错了,可以直接给更改方式,因为还不是很懂C语言
1.用C语言的写俄罗斯方块(用结构体数组来定位坐标)(读取文件中方块的19种类别)(代码问题出在void FockChange()和oid Goal())
[](链接:https://pan.baidu.com/s/1d9nivc5HMKUkpMwnz54IMw?pwd=1111
提取码:1111)源码和文件都在
2.遇到了一些问题:
2.1方块间的转换没达到预期效果,出现了偏差
void FockChange()
{
//0-3,L型
if (graph_num == 0)
{
if (fock[0].j < 11 && fock[1].j < 11 && fock[2].j < 11 && fock[3].j < 11)//一重条件:不能越界
if (latt[fock[2].i][fock[2].j + 1] != 1 && latt[fock[2].i][fock[2].j + 2] != 1)//二重条件:不能混乱
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i++;//改变方块位置
fock[1].j++;
fock[2].i--; fock[2].j += 2;
fock[3].j--;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
else if (graph_num == 1)
{
if (latt[fock[1].i - 1][fock[1].j] != 1 && latt[fock[1].i - 1][fock[1].j-1] != 1
&& latt[fock[1].i + 1][fock[1].j+1] != 1)//二重条件:不能混乱
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i--;
fock[1].i--;
fock[2].j--;
fock[3].j++;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
else if (graph_num == 2)
{
if (fock[0].j > 0 && fock[1].j > 0 && fock[2].j > 0 && fock[3].j > 0)//一重条件:不能越界
if (latt[fock[4].i][fock[4].j - 2] != 1 && latt[fock[4].i][fock[4].j - 1] != 1)
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i++; fock[0].j++;
fock[1].i += 2; fock[1].j -= 2;
fock[2].i++; fock[2].j--;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
else if (graph_num == 3)
{
if (latt[fock[3].i - 2][fock[3].j] != 1 && latt[fock[3].i - 1][fock[3].j] != 1)
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i--;
fock[0].j--;
fock[1].i--;
fock[1].j++;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num -= 3;
}
}
//4有问题4-7,J型
else if (graph_num == 4)
{
if (fock[0].j > 0 && fock[1].j > 0 && fock[2].j > 0 && fock[3].j > 0)//一重条件:不能越界
if (latt[fock[2].i][fock[2].j - 2] != 1 && latt[fock[2].i][fock[2].j - 1] != 1)//二重条件:不能混乱
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i++; fock[0].j -= 2;
fock[1].j--;
fock[2].i--;
fock[2].j++;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
else if (graph_num == 5)
{
if (latt[fock[2].i - 1][fock[2].j] != 1 && latt[fock[2].i - 1][fock[2].j+1] != 1
&& latt[fock[2].i + 1][fock[2].j] != 1)//二重条件:不能混乱
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i--; fock[0].j++;
fock[1].i--; fock[1].j++;
fock[2].j--;
fock[3].j--;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
else if (graph_num == 6)
{
if (fock[0].j < 11 && fock[1].j < 11 && fock[2].j < 11 && fock[3].j < 11)//一重条件:不能越界
if (latt[fock[4].i][fock[4].j + 2] != 1 && latt[fock[4].i][fock[4].j + 1] != 1)//二重条件:不能混乱
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i++;
fock[1].i += 2; fock[1].j--;
fock[2].i++; fock[2].j++;
fock[3].j += 2;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
else if (graph_num == 7)
{
if (latt[fock[3].i - 2][fock[3].j] != 1 && latt[fock[3].i - 1][fock[3].j] != 1)//二重条件:不能混乱
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i--; fock[0].j++;
fock[1].i--; fock[1].j++;
fock[3].j -= 2;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num -= 3;
}
}
//9有问题8-11,T型
else if (graph_num == 8)
{
if (latt[fock[1].i - 1][fock[1].j] != 1 && latt[fock[1].i][fock[1].j + 1] != 1)//二重条件:不能混乱
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i--;
fock[1].i--; fock[1].j++;
fock[2].i--; fock[2].j++;
fock[3].j--;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num -= 3;
}
}
else if (graph_num == 9)
{
if (fock[0].j > 0 && fock[1].j > 0 && fock[2].j > 0 && fock[3].j > 0)//一重条件:不能越界
if (latt[fock[2].i][fock[2].j - 1] != 1)
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i++; fock[0].j--;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
else if (graph_num == 10)
{
if (fock[0].j > 0 && fock[1].j > 0 && fock[2].j > 0 && fock[3].j > 0)//一重条件:不能越界
if (latt[fock[2].i - 1][fock[2].j] != 1)
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i--; fock[0].j++;
fock[1].j--;
fock[2].j--;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
else if (graph_num == 11)
{
if (latt[fock[3].i][fock[3].j + 1] != 1)
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i++; fock[0].j--;
fock[1].j++;
fock[2].j++;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
//12-15,有错误,S型
else if (graph_num == 12)
{
if (fock[0].j > 0 && fock[1].j > 0 && fock[2].j > 0 && fock[3].j > 0)//一重条件:不能越界
if (latt[fock[3].i][fock[3].j - 2] != 1 && latt[fock[3].i][fock[3].j - 1] != 1)
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i++;
fock[1].j++;
fock[2].i++; fock[2].j -= 2;
fock[3].j--;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
else if (graph_num == 13)
{
if (latt[fock[2].i - 1][fock[2].j] != 1 && latt[fock[2].i + 1][fock[2].j] != 1)
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i--; fock[0].j++;
fock[1].j--;
fock[2].i--; fock[2].j += 2;
fock[3].j++;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
else if (graph_num == 14)
{
if (fock[0].j > 0 && fock[1].j > 0 && fock[2].j > 0 && fock[3].j > 0)//一重条件:不能越界
if (latt[fock[3].i][fock[3].j - 2] != 1 && latt[fock[3].i + 1][fock[3].j] != 1)
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i++; fock[0].j -= 2;
fock[2].i++; fock[1].j--;
fock[3].j--;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
else if (graph_num == 15)
{
if (latt[fock[2].i - 1][fock[2].j] != 1 && latt[fock[2].i][fock[2].j + 1] != 1)
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i--; fock[0].j++;
fock[2].i--; fock[1].j++;
fock[3].j++;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
else if (graph_num == 16)
{
if (fock[0].j < 11 && fock[1].j < 11 && fock[2].j < 11 && fock[3].j < 11 && fock[0].j > 0 && fock[1].j > 0 && fock[2].j > 0 && fock[3].j > 0)//一重条件:不能越界
if (latt[fock[3].i][fock[3].j - 1] != 1 && latt[fock[3].i][fock[3].j + 1] != 1 && latt[fock[3].i][fock[3].j + 2] != 1)//二重条件:不能混乱
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i += 3; fock[0].j--;//改变方块位置
fock[1].j += 2;
fock[2].i++; fock[2].j++;
fock[2].j += 2;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
//17-18,有错误,I型
else if (graph_num == 17)
{
if (fock[0].j < 11 && fock[1].j < 11 && fock[2].j < 11 && fock[3].j < 11 && fock[0].j > 0 && fock[1].j > 0 && fock[2].j > 0 && fock[3].j > 0)//一重条件:不能越界
if (latt[fock[2].i - 3][fock[3].j] != 1 && latt[fock[2].i - 2][fock[2].j] != 1 && latt[fock[2].i - 1][fock[2].j] != 1)//二重条件:不能混乱
{
for (int k = 0; k < 4; k++)//原有位置清零
latt[fock[k].i][fock[k].j] = 0;
fock[0].i -= 3; fock[0].j++;//改变方块位置
fock[1].j -= 2;
fock[2].i--; fock[2].j--;
fock[2].j -= 2;
for (int q = 0; q < 4; q++)
latt[fock[q].i][fock[q].j] = 2;
graph_num++;
}
}
//O型
else {}
}
2. 2统计得分和消行的函数有bug,调用时不能生成方块了
void Goal()
{
int record;
for (int i = 28; i > 0; i--)
{
for (int j = 0; j < 12; j++)
{
record = 0;
if (latt[i][j] = 1)
{
record++;
if (record == 12)
{
score++;//计分
for (int k = 0; k < 12; k++)//原有位置清零
{
latt[i][k] = 0;
}
latt[i][j] = latt[i--][j];//上一行覆盖下一行
}
}
}
}
char point[1000] = { "0" };
itoa(score, point, 10);//整数转字符
outtextxy(510, 150, point);
}
int main()
{
UI_StarView();
UI_GameView();
init_latt();//初始化网格二维数组
Read_Graph();//所有方块类型读取
initRandomNum();//随机生成方块
getFockx_y();//更新移动方块位置
draw_LattAndFocks();//绘制窗口
BeginBatchDraw();//刷新绘画窗口
int MoveDownCount = 0;
//方块移动操作
while (1) //while=1为死循环,使窗口不会结束
{
if (GetAsyncKeyState(VK_UP) & 0x8000)
FockChange();
if (GetAsyncKeyState(VK_LEFT) & 0x8000)//判断案件是否按下的函数<&0x8000为固定搭配>
MoveFockLeft();
if (GetAsyncKeyState(VK_RIGHT) & 0x8000)//可同时按下的异步函数
MoveFockRight();
Goal();
if (GetAsyncKeyState(VK_DOWN) & 0x8000)
if (MoveFockDown() == 0)//纵向移动
{
initRandomNum();//如果方块已固定,生成新随机图形
getFockx_y();
}
if (MoveDownCount == 3)
{
if (MoveFockDown() == 0)//纵向移动
{
initRandomNum();//如果方块已固定,生成新随机图形
getFockx_y();
}
MoveDownCount = 0;
}
else
{
MoveDownCount++;
}
Sleep(Sleep_time);
draw_LattAndFocks();//更新网格信息
FlushBatchDraw();
}
EndBatchDraw(
3.写代码的思路:构建一个28x12的网格游戏窗口和一个4x4的方块生成窗口,方块的生成和转换都要通过读取文件完成,将方块生成窗口有方块的地方通过循环转到网格里面对应。方块的移动通过循环判断是否碰壁(=1)来限制。
方块转换坐标核对了很多次,还是没有发现错误在哪里,记得分的函数不知道有没有写错
4.目标:我希望能改正我代码错误的地方,不是全部打乱了重写。谢谢