📄 俄罗斯方块人工智能版.java
字号:
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 + -