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

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

📁 具有一定的人工智能的俄罗斯方块源码
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
/* 俄罗斯方块人工智能版 */
/*导入类包*/
import java.awt.*;
import java.applet.*;
import java.awt.event .*;
/*创建一个从Applet派生并实现Runnable和ItemListener接口的用于被浏览器加载的类*/
public class WzbEluosi extends Applet implements Runnable,ItemListener
{
    final int GameStart = 0;  //游戏开始状态
    final int GameGoing = 1;  //游戏进行状态
    final int GameStop = 2;  //游戏暂停状态
    final int GameAuto = 3;  //游戏自动打状态
    int gamestate = GameStart;  //定义游戏初始状态
    private Image bgImage;  //这里声明bgImage和bg两个实例变量用来存储后台图画
    private Graphics bg;  //目的是为了采用双缓冲机制来解决屏幕的闪烁现象
    int width = 12;  //定义游戏一行的格子数
    int height = 20;  //定义游戏一列的格子数
    int frameX = 150;  //定义程序框架打印到屏幕上的x坐标
    int frameY = 30;  //定义程序框架打印到屏幕上的y坐标
    int frameSize = 20;  //定义程序框架的大小
    int[][] map = new int[31][38];  //定义一个储存布局的点阵数据的二维数组
    int x, y;  //方块的坐标
    int type, shape;  //当前方块的类型和形态
    int typeNext, shapeNext;  //下一个方块的类型和形态
    int level;  //等级,包含方块下落速度和方块自动上移的速度
    int scoreLevel;  //分数与等级的联系
    long score;  //记录分数
    int fallTime;  //方块下落一格的时间
    String ordinaryEasy;  //根据用户选择的难度判断方块是否自动上升的变量
    int blockUpTime;  //定义方块自动整体上移一格的时间
    byte upStyle;  //定义方块上移的两种方式
    int xBest;  //当前方块的最佳下落的x坐标
    int xBest2;  //下一个方块的最佳下落x坐标
    int shapeBest, shapeBest2;  //当前方块和下个一个方块的最佳形态
    int xblockDownMove,yblockDownMove;  //当前方块在下落完成后移动的最佳坐标
    int xblockDownMove2,yblockDownMove2;  //当前方块在下落完成后移动的最佳坐标
    int xAutoMoveTime;  //方块的自动移动一次的时间
    int autoSwitch;  //自动移动的类型转换
    int bug;  //一个郁闷了我很久的bug,熬了个通宵都没解决,感觉特莫名其妙,在做了多个测试之后,经过反复的思想斗争,最终用了一个不
负责的方法解决了T_T     
    final Color []colors = 
{Color.white,Color.red,Color.blue,Color.green,Color.magenta,Color.orange,Color.pink,Color.cyan,Color.darkGray};//颜色数组
    final byte [][][][]block =   //定义一个四维数组储存七种方块类型和方块四种形态的数据,一个方块存储在一个4*4正方形容器里
    {
        {
            {{1,0,0,0},{1,0,0,0},{1,0,0,0},{1,0,0,0}}, //形态1    ■
            {{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,1,1,1}}, //形态2    ■
            {{1,0,0,0},{1,0,0,0},{1,0,0,0},{1,0,0,0}}, //形态3    ■
            {{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,1,1,1}}  //形态4    ■
}
,
{
            {{0,0,0,0},{0,0,0,0},{1,1,0,0},{1,1,0,0}}, //形态1    
            {{0,0,0,0},{0,0,0,0},{1,1,0,0},{1,1,0,0}}, //形态2    ■■
            {{0,0,0,0},{0,0,0,0},{1,1,0,0},{1,1,0,0}}, //形态3    ■■
            {{0,0,0,0},{0,0,0,0},{1,1,0,0},{1,1,0,0}}  //形态4
}
,
{
            {{0,0,0,0},{0,0,0,0},{1,1,0,0},{0,1,1,0}}, //形态1 
            {{0,0,0,0},{0,1,0,0},{1,1,0,0},{1,0,0,0}}, //形态2    ■■
            {{0,0,0,0},{0,0,0,0},{1,1,0,0},{0,1,1,0}}, //形态3      ■■
            {{0,0,0,0},{0,1,0,0},{1,1,0,0},{1,0,0,0}}  //形态4
}
,
{
            {{0,0,0,0},{0,0,0,0},{0,1,1,0},{1,1,0,0}}, //形态1
            {{0,0,0,0},{1,0,0,0},{1,1,0,0},{0,1,0,0}}, //形态2      ■■
            {{0,0,0,0},{0,0,0,0},{0,1,1,0},{1,1,0,0}}, //形态3    ■■
            {{0,0,0,0},{1,0,0,0},{1,1,0,0},{0,1,0,0}}  //形态4
}
,
{
  
            {{0,0,0,0},{0,0,0,0},{1,0,0,0},{1,1,1,0}}, //形态1
            {{0,0,0,0},{1,1,0,0},{1,0,0,0},{1,0,0,0}}, //形态2    ■
            {{0,0,0,0},{0,0,0,0},{1,1,1,0},{0,0,1,0}}, //形态3    ■■■
            {{0,0,0,0},{0,1,0,0},{0,1,0,0},{1,1,0,0}}  //形态4
}
,
{
            {{0,0,0,0},{0,0,0,0},{0,0,1,0},{1,1,1,0}}, //形态1
            {{0,0,0,0},{1,0,0,0},{1,0,0,0},{1,1,0,0}}, //形态2        ■
            {{0,0,0,0},{0,0,0,0},{1,1,1,0},{1,0,0,0}}, //形态3    ■■■
            {{0,0,0,0},{1,1,0,0},{0,1,0,0},{0,1,0,0}}  //形态4
}
,
{
            {{0,0,0,0},{0,0,0,0},{1,1,1,0},{0,1,0,0}}, //形态1
            {{0,0,0,0},{0,1,0,0},{1,1,0,0},{0,1,0,0}}, //形态2    ■■■
            {{0,0,0,0},{0,0,0,0},{0,1,0,0},{1,1,1,0}}, //形态3      ■
            {{0,0,0,0},{1,0,0,0},{1,1,0,0},{1,0,0,0}}  //形态4
}
}; 


/*程序首次启动时首先自动调用的用于初始化的函数*/
    public void init()
    {
        reNew();  //初始化数据
        modeSelect();  //游戏开始前让用户选择模式
        bgImage = createImage(this.getSize().width, this.getSize().height);  //新建一个后台图像类变量
        bg = bgImage.getGraphics();  //得到当前图像的图形关联        
    }
    /*定义初始化数据的函数*/
    public void reNew()
    {
        blockUpTime = 0;  //初始化方块上移时间
        score = 0;  //初始化分数
        scoreLevel = 0;
        upStyle = (byte) (Math.random() * 2);  //随机给upStyle赋一个小于2的正整数值
        for (int j=0; j<height+4; j++)  //初始化屏幕布局数据
            for (int i=0; i<width; i++)
                map[j][i] = 0;
        typeNext = (int) (Math.random() * 7);  //初始化下一个方块类型
shapeNext = (int) (Math.random() * 4); //初始化下一个方块的形态
        nextBlockUpdate();  //更新下一个方块数据
    }  
    /*游戏开始前模式选择的函数*/
    public void modeSelect()
    {
        final Choice c = new Choice();  //定义一个下拉列表对象
        final CheckboxGroup cbg = new CheckboxGroup();  //定义一个单选按钮组对象
        final Checkbox cb3 = new Checkbox("困难",true,cbg);  //定义单选按钮对象1
        final Checkbox cb1 = new Checkbox("简单",true,cbg);  //定义单选按钮对象1
        final Checkbox cb2 = new Checkbox("普通",false,cbg);  //定义单选按钮对象2      
        final Button bt1 = new Button("开始游戏");  //定义一个按钮对象1
        final Button bt2 = new Button("    暂停    ");  //定义一个按钮对象2
        final Button bt3 = new Button("高手汪汪狗表演");  //定义一个按钮对象3
        final TextField tf1 = new TextField(String.valueOf(width),1);  //定义文本编辑区对象1
        final TextField tf2 = new TextField(String.valueOf(height),1);  //定义文本编辑区对象2
        final TextField tf3 = new TextField(String.valueOf(frameX),1);  //定义文本编辑区对象3
        final TextField tf4 = new TextField(String.valueOf(frameY),1);  //定义文本编辑区对象4
        final TextField tf5 = new TextField(String.valueOf(frameSize),1);  //定义文本编辑区对象5  
        Label lb1=new Label("行列格数");  //定义标签1
        Label lb2=new Label("框架坐标和大小");  //定义标签2       
        tf1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){}});  //监听文本编辑区1的对象
        tf2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){}});  //监听文本编辑区2的对象
        tf3.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){}});  //监听文本编辑区3的对象
        tf4.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){}});  //监听文本编辑区4的对象
        tf5.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){}});  //监听文本编辑区5的对象  
        c.add ("等级一");  //加入列表对象
        c.add ("等级二");
        c.add ("等级三");
        c.add ("等级四");
        c.add ("等级五");
        c.add ("等级六");
        c.add ("等级七");
        c.add ("等级八");
        c.add ("等级九");        
c.addItemListener(new ItemListener()  //建立下拉列表对象的监听者
        {
            public void itemStateChanged(ItemEvent e)
            {
                level = c.getSelectedIndex() + 1;  //获得用户选择的等级
                scoreLevel = 0;
                remove(c);remove(cb1);remove(cb2);remove(cb3);remove(bt1);remove(bt2);remove(bt3);//删除全部列表和按钮,再加入
全部列表和按钮
                remove(tf1);remove(tf2);remove(tf3);remove(tf4);remove(tf5);
                add(bt1);add(cb1);add(cb2);add(cb3);add(c);add(bt2);add(bt3);//作用是避免无法控制方块,,我测试了N次才解决这个
问题,当时郁闷了我N久,笨死
                add(tf1);add(tf2);add(tf3);add(tf4);add(tf5);
            }
        });

   cb1.addItemListener(new ItemListener()  //建立单选按钮1对象的监听者
        {
            public void itemStateChanged(ItemEvent e)  //按下单选按钮1时产生事件
            {
                ordinaryEasy = cbg.getSelectedCheckbox().getLabel();  //获得用户选择的难度
                remove(bt1); remove(cb1); remove(cb2); remove(cb3); remove(c); remove(bt2); remove(bt3); //删除全部列表和按钮
                add(bt1); add(cb1); add(cb2); add(cb3); add(c); add(bt2); add(bt3); //加入全部列表和按钮
            }
        });
        cb2.addItemListener(new ItemListener()  //建立单选按钮2对象的监听者
        {
            public void itemStateChanged(ItemEvent e)  //按下单选按钮2时产生事件
            {
                ordinaryEasy = cbg.getSelectedCheckbox().getLabel();  //获得用户选择的难度
                remove(bt1); remove(cb1); remove(cb2); remove(cb3); remove(c); remove(bt2); remove(bt2);  //删除全部列表和按
                add(bt1); add(cb1); add(cb2); add(cb3); add(c); add(bt2); add(bt3); //加入全部列表和按钮
            }
        });
        cb3.addItemListener(new ItemListener()  //建立单选按钮3对象的监听者
        {
            public void itemStateChanged(ItemEvent e)  //按下单选按钮3时产生事件
            {
                ordinaryEasy = cbg.getSelectedCheckbox().getLabel();  //获得用户选择的难度
                remove(bt1); remove(cb1); remove(cb2); remove(cb3); remove(c); remove(bt2); remove(bt2);  //删除全部列表和按
                add(bt1); add(cb1); add(cb2); add(cb3); add(c); add(bt2); add(bt3); //加入全部列表和按钮
            }
        });
        add(c);  //将下拉列表加入容器
        add(cb1);  //将单选按钮1加入容器
        add(cb2);  //将单选按钮2加入容器
        add(cb3);  //将单选按钮3加入容器
        add(bt1);  //将按钮1加入容器
        add(bt2);  //将按钮2加入容器
        add(bt3);  //将按钮3加入容器   
        add(lb1);  //将标签1加入容器
        add(tf1);  //将文本编辑区1加入容器
        add(tf2);  //将文本编辑区2加入容器
        add(lb2);  //将标签2加入容器
        add(tf3);  //将文本编辑区3加入容器
        add(tf4);  //将文本编辑区4加入容器
        add(tf5);  //将文本编辑区5加入容器
        bt1.addActionListener(new ActionListener()  //建立按钮1对象的监听者
        {
            public void actionPerformed(ActionEvent e)  //当用户按下按钮1产生的事件,是个内部类
            {
                level = c.getSelectedIndex() + 1;  //获得用户选择的等级
                ordinaryEasy = cbg.getSelectedCheckbox().getLabel();  //获得用户选择的难度
                try  //抛出一个异常
                {
                    width = Integer.parseInt(tf1.getText());  //得到文本编辑区1里的内容并赋给width
                    height = Integer.parseInt(tf2.getText());  //得到文本编辑区2里的内容并赋给height
                    frameX = Integer.parseInt(tf3.getText());  //得到文本编辑区3里的内容并赋给frameX
                    frameY = Integer.parseInt(tf4.getText());  //得到文本编辑区4里的内容并赋给frameY
                    frameSize = Integer.parseInt(tf5.getText());  //得到文本编辑区5里的内容并赋给frameSize
                }
                catch (Exception e2)  //捕获异常
                {
                }
                width = width < 5 ? 5 : width > 38 ? 38 : width;  //限定width的范围
                height = height < 5 ? 5 : height > 27 ? 27 : height;  //限定height的范围
                remove(bt2); remove(bt1); remove(cb1); remove(cb2); remove(cb3); remove(c); remove(tf1); remove(bt3); //删除
全部列表和按钮
                add(bt2); add(bt1); add(cb1); add(cb2); add(cb3); add(c); add(tf1); add(bt3);  //加入全部列表和按钮
                reNew();  //初始化所有数据
                gamestate = GameGoing;  //让游戏状态为进行中
                bt2.setLabel("    暂停    ");
                bt3.setLabel("高手汪汪狗表演");
            }
        });
bt2.addActionListener(new ActionListener()  //建立按钮2对象的监听者
        {
             public void actionPerformed(ActionEvent e)  //当用户按下按钮2产生的事件,是个内部类
             {
                if (gamestate == GameGoing || gamestate == GameAuto)
                {

⌨️ 快捷键说明

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