「已注销」 2023-01-05 03:35 采纳率: 100%
浏览 188
已结题

C语言编写俄罗斯方块出现问题

求博主们解答,不知道哪里错了,可以直接给更改方式,因为还不是很懂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 {}
}

img

 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.目标:我希望能改正我代码错误的地方,不是全部打乱了重写。谢谢

  • 写回答

5条回答 默认 最新

  • 於黾 2023-01-05 08:18
    关注

    你这代码完全没有修改的价值
    你应该引入一点面向对象的思想,方块是方块,坐标是坐标,把一个方块自身的坐标加上绝对坐标就变成实际坐标,而不是像你现在这样一个像素点一个像素点的去抹掉旧的填充新的
    if (latt[i][j] = 1)这里是赋值,改成==

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 1月17日
  • 已采纳回答 1月9日
  • 提问应符合社区要求 1月5日
  • 创建了问题 1月5日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。