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

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 怎么实现输入一个要删除的数后删除后显示剩余数再输入再删除显示剩余数(语言-c语言)
  • ¥35 引用csv数据文件(4列1800行),通过高斯-赛德尔法拟合曲线,在选取(每五十点取1点)数据,求该数据点的曲率中心。
  • ¥20 程序只发送0X01,串口助手显示不正确,配置看了没有问题115200-8-1-no,如何解决?
  • ¥15 Google speech command 数据集获取
  • ¥15 vue3+element-plus页面崩溃
  • ¥15 像这种代码要怎么跑起来?
  • ¥15 安卓C读取/dev/fastpipe屏幕像素数据
  • ¥15 pyqt5tools安装失败
  • ¥15 mmdetection
  • ¥15 nginx代理报502的错误