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

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

📁 具有一定的人工智能的俄罗斯方块源码
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
                    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 + -