📄 俄罗斯方块人工智能版.java
字号:
bt2.setLabel(" 继续 "); //设置按钮名称
bt3.setLabel("高手汪汪狗表演");
gamestate = GameStop; //设置游戏状态为暂停
}
else
if (gamestate == GameStop)
{
bt2.setLabel(" 暂停 "); //设置按钮名称
gamestate = GameGoing; //设置游戏状态为进行中
}
remove(bt2); remove(bt1); remove(cb1); remove(cb2); remove(cb3); remove(c); remove(bt3); //删除全部列表和按钮
add(bt2); add(bt1); add(cb1); add(cb2); add(cb3); add(c); add(bt3); //加入全部列表和按钮
}
});
bt3.addActionListener(new ActionListener() //建立按钮3对象的监听者
{
public void actionPerformed(ActionEvent e) //当用户按下按钮3产生的事件,是个内部类
{
if (gamestate == GameStart || gamestate == GameGoing)
{
bt3.setLabel("我是菜鸟我怕谁"); //设置按钮名称
autoSwitch = 0;
autoPlayCurrent(); //计算当前方块的最佳下落方法和坐标
gamestate = GameAuto; //设置游戏状态为自动
}
else
if (gamestate == GameAuto)
{
bt3.setLabel("高手汪汪狗表演"); //设置按钮名称
gamestate = GameGoing; //设置游戏状态为进行中
}
remove(bt3); remove(bt1); remove(cb1); remove(cb2); remove(cb3); remove(c); remove(bt2); //删除全部列表和按钮
add(bt3); add(bt1); add(cb1); add(cb2); add(cb3); add(c); add(bt2); //加入全部列表和按钮
}
});
}
public void itemStateChanged(ItemEvent e) //覆盖ItemListener接口中的抽象函数,抽象的函数必须要重新定义
{
}
/*程序调用init()之后自动调用这个函数*/
public void start()
{
Thread th = new Thread(this); //定义一个新的线程,控制方块下落
th.start(); //启动此线程
}
/*创建线程对象的实例时自动调用的一个抽象函数*/
public void run()
{
final int[] speed = {300000,300000,250000,150000,100000,80000,50000,20000,7000,0};
while (true) //设置个死循环
{
switch (gamestate) //根据游戏状态选择分支程序运行
{
case GameAuto :
if (((width > 20 || height < 6) && level == 9) || ordinaryEasy == "困难" || level == 9)
{
x = xBest;
shape = shapeBest;
}
if (xAutoMoveTime >= speed[level])
{
if (x < xBest) x++; //方块水平移动到最佳下落x坐标
if (x > xBest) x--;
if (shape != shapeBest) //方块变换成最佳形态
{
shape++;
if (shape == 4)
shape = 0;
}
xAutoMoveTime = 0;
}
if (xblockDownMove != xBest && y == yblockDownMove)
{
x = xblockDownMove; //方块下落完成时移动到最佳x坐标
}
xAutoMoveTime++; //方块自动移动时间自增
case GameGoing :
try //抛出一个异常
{ //暂停方块下落线程在一个等待时间内,这里是1ms
Thread.sleep(1); //这里必须要让线程暂停一下,不然autoPlay()方法的调用会对程序运行的速度影响非常大,暂停一
下又没有影响了
} //反正感觉莫名其妙,估计是线程时间片的问题吧,当时郁闷了我N久N久啊,苯死我拉,啊啊,不过后来又莫名其妙的解决了,
我真是个天才,哈哈
catch (Exception e) //捕获异常
{
}
if (ordinaryEasy == "普通" || ordinaryEasy == "困难") blockUpTime++; //方块自动上移时间自增
if (gamestate == GameAuto && x == xBest && shape == shapeBest)
{
int z = level < 9 ? 8 : 9;
if (fallTime > speed[z]) fallBlock(); //调用方块下落方法
}
else
if (fallTime > speed[level]) fallBlock(); //调用方块下落方法
fallTime++; //方块下落时间自增
repaint(); //刷新屏幕
break;
case GameStop :
break;
}
}
}
/*在Applet界面上进行相应的绘画动作的函数*/
public void paint(Graphics g)
{
bg.clearRect(0,0,getSize().width,getSize().height);
drawInfo(bg); //将程序的框架和基本信息存储到后台
if(gamestate == GameGoing || gamestate == GameStop || gamestate == GameAuto)
{
drawBlock(bg); //在后台绘制方块
drawNextBlock(bg); //在后台绘制下一个方块
}
g.drawImage(bgImage, 0, 0, this); //将后台存储的图画打印到屏幕上来
}
/*调用repaint()方法时自动调用此函数,因为原此函数会清屏,造成屏幕闪烁,所以要重写此函数*/
public void update(Graphics g)
{
paint(g); //调用paint方法
}
/*定义打印程序的框架和基本信息的函数*/
public void drawInfo(Graphics g)
{
if (scoreLevel > 9999) //计算等级
{
level++;
scoreLevel -= 10000;
}
if (level > 9) level = 9; //限定等级范围
g.setColor(Color.black); //设置颜色
g.drawRect(frameX-1, frameY-1, frameSize*width+1, frameSize*height+1); //绘制界面大方框
g.drawString("NEXT", frameX+frameSize*(width+1), frameY+25);
g.drawRect(frameX+frameSize*(width+1), frameY+25, 80, 80); //绘制显示下一个方块的方框
g.drawString("LEVEL", frameX+frameSize*(width+1), frameY+125);
g.drawRect(frameX+frameSize*(width+1), frameY+125, 80, 20); //绘制显示等级的方框
g.drawString(String.valueOf(level), frameX+frameSize*(width+1)+1, frameY+141); //绘制等级
g.drawString("SCORE", frameX+frameSize*(width+1), frameY+165);
g.drawRect(frameX+frameSize*(width+1), frameY+165, 80, 20); //绘制显示分数的方框
g.drawString(String.valueOf(score), frameX+frameSize*(width+1)+1, frameY+181); //绘制分数
g.drawString("操作:↑↓←→", frameX+frameSize*(width+1), frameY+250);
g.drawString("暂停:P", frameX+frameSize*(width+1), frameY+270);
g.drawString("作者:wzb32", frameX+frameSize*(width+1), frameY+305);
g.drawString("QQ:103168834", frameX+frameSize*(width+1), frameY+325);
g.drawString("Email:wzb32@qq.com", frameX+frameSize*(width+1), frameY+345);
g.drawString("版本:v1.00", frameX+frameSize*(width+1), frameY+365);
g.drawString("Copyright(C) 2007.11 - 2007.12", frameX+frameSize*(width+1), frameY+385);
for (int j=4; j<height+4; j++) //绘制所有静止的方块
for (int i=0; i<width; i++)
if (map[j][i] != 0) //判断屏幕布局方阵上的这个位子的数据是否为0
{
g.setColor(colors[map[j][i]]); //设置颜色
g.fill3DRect(frameX+i*frameSize, frameY+j*frameSize-4*frameSize, frameSize, frameSize, true); //画2个小小
方块,组成个小方块
g.fill3DRect(frameX+i*frameSize+1, frameY+j*frameSize+1-4*frameSize, frameSize-2, frameSize-2, true);
}
}
/*定义绘制方块的函数,一个方块由16个小方块组成,一个小方块由2个小小方块组成*/
public void drawBlock(Graphics g)
{
if (bug == 1) return; //不负责的处理掉一个让人莫名其妙的bug,怒
for (int j=0; j<4; j++)
{
for (int i=0; i<4; i++)
{
if (block[type][shape][j][i] == 1 && y+j > 3) //判断此格是否要绘制一个小小方块
{
g.setColor(colors[type+1]); //设定方块颜色
g.fill3DRect(frameX+x*frameSize+i*frameSize, frameY+y*frameSize+j*frameSize-4*frameSize, frameSize,
frameSize, true);
g.fill3DRect(frameX+x*frameSize+i*frameSize+1, frameY+y*frameSize+j*frameSize+1-4*frameSize, frameSize-2,
frameSize-2, true);
}
}
}
}
/*定义方块下落的函数*/
public void fallBlock()
{
if (!moveFit(x, y+1)) //判断方块将向下移动的一格是否能移动
{
fallOver(); //下落完成
if(ordinaryEasy == "困难")
{
if (blockUpTime > 3000000) blockAllUp(); //方块整体自动上移一格
}
else
if (blockUpTime > 6999999) blockAllUp(); //普通模式的方块自动上移
}
y++; //方块下落一格
fallTime=0;
}
/*定义方块下落完成的函数*/
public void fallOver()
{
for (int j=0; j<4; j++)
{
for (int i=0; i<4; i++)
{
if (block[type][shape][j][i] == 1) //一个方块存储在一个4*4正方形容器里,判断容器里这个位子是否有小小方块
{
map[y+j][x+i] = type + 1; //将当前方块的坐标数据存储到布局的点阵里
if (y + j < 5) gamestate = GameStart; //方块超出上界,游戏结束
}
}
}
if(gamestate == GameStart)
{
y--;
return;
}
RemoveRow(); //调用消行函数
if (gamestate == GameAuto)
{
switch (autoSwitch)
{
case 0:
type = typeNext; //将下一个方块类型覆盖当前方块类型
shape = shapeNext; //将下一个方块形态覆盖当前方块形态
x = width / 2 - 1; //初始化方块的坐标
y = 0;
autoPlayCurrent(); //计算当前方块的最佳下落方法
typeNext = type;
shapeNext = shape;
shapeBest2 = shapeBest;
xBest2 = xBest;
xblockDownMove2 = xblockDownMove;
yblockDownMove2 = yblockDownMove;
autoPlayNext(); //计算下一个方块的最佳下落方法
autoSwitch++;
break;
case 1:
shapeBest = shapeBest2;
xBest = xBest2;
xblockDownMove = xblockDownMove2;
yblockDownMove = yblockDownMove2;
nextBlockUpdate(); //更新下一个方块的数据
autoSwitch = 0;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -