⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 俄罗斯方块人工智能版.java

📁 具有一定的人工智能的俄罗斯方块源码
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
                xMoveMax = xCopy;          
                for (xCopy=0; xCopy<=xMoveMax; xCopy++)  //模拟方块的水平移动
                {
                    for (yCopy=0; moveFit(xCopy, yCopy+1); yCopy++){}  //模拟方块下落
                    xCopyCopy=xCopy;
                    
                    for(; moveFit(xCopy-1, yCopy); xCopy--){}  //模拟方块在底部的移动
                    xMoveMinDown = xCopy;
                    for(; moveFit(xCopy+1, yCopy); xCopy++){}
                    xMoveMaxDown = xCopy; 

for (xCopy=xMoveMinDown; xCopy<=xMoveMaxDown; xCopy++)
                    {
                        int yy=yCopy;
                        for(;moveFit(xCopy,yy);yy--)
                        {
                        }
                        if (yy < 1 && xCopy != xCopyCopy) continue;
                        for (int j=0; j<4; j++)  //保存模拟后的局面
                        {
                            for (int i=0; i<4; i++)
                            {
                                if (block[type][shape][j][i] == 1)  //一个方块存储在一个4*4正方形容器里,判断容器里这个位子是
否有小小方块
                                {
                                    map[yCopy+j][xCopy+i] = 9;  //将当前方块的坐标数据存储到布局的点阵里
                                }
                            }
                        }
                        reMoveRowNum = 0;  //模拟消行
                        for (int j=0; j<4; j++)
                        {
                            rowSmallBlockNum = 0;
                            for (int i=0; i<width; i++)
                            {
                                if (map[yCopy+j][i] != 0)  //判断地图布局上的此格是否有小方块
                                    rowSmallBlockNum++;
                                if (rowSmallBlockNum == width)  //判断当行格子是否填满了
                                {
                                    reMoveRowNum++;
                                }
                            }
                        }
                        topRowAll = 999;
                        emptyBlockNum = 0;
                        for (int i=0; i<width; i++)  //计算局面高度
                        {
                            for (topRowThis=0;topRowThis<height+4;topRowThis++)
                            {
                                if (map[topRowThis][i] != 0)
                                {
                                    break;
                                }
                            }
                            if (topRowThis < height + 3)  //计算空格子
                            {
                                for (int j=topRowThis+1; j<height+4; j++)
                                {
                                    if (map[j][i] == 0) //这儿是一个压在方块下的空的格子
                                    {
                                          emptyBlockNum++;
                                    }
                                }
                            }
                            if (topRowThis < topRowAll)
                                 topRowAll = topRowThis;
                        }
                        topRowAll += reMoveRowNum; 
   if(type == 0 && topRowAll > 5) emptyBlockNum=999;
                        //根据当前情况采取不同的进攻或防守策略
                        if (ordinaryEasy != "困难" && xCopy == xMoveMax && !hasEmptyBlock && topRowAll > 7 && reMoveRowNum < 
3) emptyBlockNum=999;                       
                        if (topRowAll*aRam[as] + reMoveRowNum*aRam[zc]  - emptyBlockNum*aRam[da]  + yCopy > valueMax)  //当前局面的评估方程
                        {
                            valueMax = topRowAll*aRam[as] + reMoveRowNum*aRam[zc]  - emptyBlockNum*aRam[da]  + yCopy;
                            if (xCopyCopy == xCopy)  //保存到当前最佳的下落方法的数据
                            {
                                 xBest2 = xCopy;
                            }
                            else
                            {
                                xBest2 = xCopyCopy;
                                yblockDownMove2 = yCopy;
                            }
                            shapeBest2 = shape;
                            xblockDownMove2 = xCopy;
                        }
                        for (int i=0; i<width; i++)  //恢复局面数据
                           for (int j=0; j<height+4; j++)
                                map[j][i] = mapCopy2[j][i];
                    }
                    xCopy= xCopyCopy;
                }
            }
        }
        for (int i=0; i<width; i++)  //恢复局面数据
            for (int j=0; j<height+4; j++)  
                map[j][i] = mapCopy[j][i];
        type = typeCopy;
        shape = shapeCopy;
        shapeNext = (int) (Math.random() * 4);  //初始化下一个方块形态
        shapeBest = shapeBestCopy;
        x = width / 2 - 1;  //初始化方块的坐标*/  
y = 0;
        bug = 0;  //bug结束
    }
 /*计算当前方块的最佳下落方法*/
    public void autoPlayCurrent()
    {
        int typeCopy = type;
        int shapeCopy = shape;
        int xCopy, yCopy, xMoveMin, xMoveMax;
        int xCopyCopy;
        int xMoveMinDown,xMoveMaxDown;
        int rowSmallBlockNum, reMoveRowNum;  //定义保存当行已有多少的方块的变量和保存一次共消去多少行的变量
        int topRowThis = 0, topRowAll;
        int emptyBlockNum;
        int valueMax = 0;
        yblockDownMove=0; 
        boolean hasEmptyBlock = false;
        for (int i=0; i<width; i++)  //计算空格子数目
        {
            for (topRowThis=0;topRowThis<height+4;topRowThis++)
            {
                if (map[topRowThis][i] != 0) break;
            }
            if (topRowThis < height + 3)
            {
                for (int j=topRowThis+1; j<height+4; j++)
                {
                    if (map[j][i] == 0) //这儿是一个压在方块下的空的格子
                    {
                        hasEmptyBlock = true;
                        break;
                    }
                }
            }
            if (hasEmptyBlock) break;
        }
        for (shape=0; shape<4; shape++)
        {
            for(xCopy = x; moveFit(xCopy-1,y); xCopy--){}  //计算方块的移动范围
            xMoveMin = xCopy;
            for(xCopy = x; moveFit(xCopy+1,y); xCopy++){}
            xMoveMax = xCopy;
            for (xCopy=xMoveMin; xCopy<=xMoveMax; xCopy++)  //模拟方块的水平移动
            {
                for (yCopy=y; moveFit(xCopy,yCopy+1); yCopy++)  //模拟方块下移
                {
                }
                xCopyCopy=xCopy;
                for(; moveFit(xCopy-1,yCopy); xCopy--){}  //计算方块在底部的移动范围
                xMoveMinDown = xCopy;
                for(; moveFit(xCopy+1,yCopy); xCopy++){}
                xMoveMaxDown = xCopy;
                for (xCopy=xMoveMinDown; xCopy<=xMoveMaxDown; xCopy++)  //模拟方块在底部的水平移动
                {
                    int yy=yCopy;
                    for(;moveFit(xCopy,yy);yy--)  //模拟方块上移
                    {
                    }
                    if (yy < 1 && xCopy != xCopyCopy) continue;
                    for (int j=0; j<4; j++)
                    {
                        for (int i=0; i<4; i++)
                        {
                            if (block[type][shape][j][i] == 1)  //一个方块存储在一个4*4正方形容器里,判断容器里这个位子是否有
小小方块
                            {
                                map[yCopy+j][xCopy+i] = 9;  //将当前方块的坐标数据存储到布局的点阵里
                            }
                        }
                    }
                    reMoveRowNum = 0;
                    for (int j=0; j<4; j++)  //计算当前下落方法可以消多少行
                    {
                        rowSmallBlockNum = 0;
                        for (int i=0; i<width; i++)
                        {
                            if (map[yCopy+j][i] != 0)  //判断地图布局上的此格是否有小方块
                                rowSmallBlockNum++;
                            if (rowSmallBlockNum == width)  //判断当行格子是否填满了
                            {
                                reMoveRowNum++;  //消去的行数自增
                            }
                        }
                    }
                    topRowAll = 999;
                    emptyBlockNum = 0;
                    for (int i=0; i<width; i++)  //计算局面高度
                    {
                        for (topRowThis=0;topRowThis<height+4;topRowThis++)
                        {
                            if (map[topRowThis][i] != 0)
                            {
                                break;
                            }
                        }
                        if (topRowThis < height + 3)  //计算空格子数
                        {
                            for (int j=topRowThis+1; j<height+4; j++)
                            {
                                if (map[j][i] == 0) //这儿是一个压在方块下的空的格子
                                    emptyBlockNum++;
                            }
                        }
                        if (topRowThis < topRowAll)
                            topRowAll = topRowThis;
                    }
                    topRowAll += reMoveRowNum; 

   //根据当前情况采取不同的进攻或防守策略
                    if (ordinaryEasy != "困难" && xCopy == xMoveMax && !hasEmptyBlock && topRowAll > 7 && reMoveRowNum < 3) 
emptyBlockNum=999;
                    if (topRowAll*aRam[as] + reMoveRowNum*aRam[ws] - emptyBlockNum*aRam[cx] + yCopy > valueMax)  //当前局面的评估方程
                    {
                        valueMax = topRowAll*aRam[as] + reMoveRowNum*aRam[ws] - emptyBlockNum*aRam[cx] + yCopy;
                        if (xCopyCopy == xCopy)  //保存当前方块的最佳下落方法的数据
                        {
                             xBest = xCopy;
                        }
                        else
                        {
                            xBest = xCopyCopy;
                            yblockDownMove = yCopy;
                        }
                        xblockDownMove = xCopy;
                        shapeBest = shape;
                    }
                    for (int j=0; j<4; j++)  //把刚才储存到布局里的点全部去除
                        for (int i=0; i<4; i++)
                            if (block[type][shape][j][i] == 1)
                                map[yCopy+j][xCopy+i] = 0;
                }
                xCopy= xCopyCopy;
            }
        }
        type = typeCopy;
        shape = shapeCopy;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -