JAVA——俄罗斯方块

package Tetris_JCoder;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;

public class Tetris extends JFrame{

    public Tetris() {
        Block NewBlock = new Block();
        addKeyListener(NewBlock);
        add(NewBlock);
    }

    public static void main(String[] args) {
        Tetris window = new Tetris();
        JMenuBar menu = new JMenuBar();
        window.setJMenuBar(menu);
        JMenu game = new JMenu("Game...");
        JMenu help = new JMenu("Help...");
        JMenuItem newgame = game.add("NewGame");
        JMenuItem about = help.add("About");
        menu.add(game);
        menu.add(help);
        window.setLocation(100,100);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(600,600);
        window.setTitle("Tetris By-J_Coder");
        window.setVisible(true);
        window.setResizable(false);
    }
}

class Block extends JPanel implements KeyListener {
    static int diff = 500;
    Timer timer = new Timer(diff, new TimerListener());
    static int isST = 1;
    Block() {
        ANewBlock();
        init();
        walls();
        timer = new Timer(diff, new TimerListener());
        timer.start();
    }

    static int type = -1;
    static int dirc = -1;
    static int nowX;
    static int nowY;
    static int secT;
    static int secD;
    static int score = 0;
    static int flag = 0;
    static int mmp[][] = new int[50][50];
    static String stp = "";
    static int boxes[][][]  = {
            { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
              { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
              { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
              { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },//shape I
            { { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
              { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
              { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
              { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } },//shape S
            { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
              { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
              { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
              { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } },//shape Z
            { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
              { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
              { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
              { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },//shape J
            { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
              { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
              { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
              { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },//shape L
            { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
              { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
              { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
              { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },//shape O
            { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
              { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
              { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
              { 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } //shape T
    };
    public void init() {
        for(int i = 0;i < 50;i ++) {
            for(int j = 0;j < 50;j ++) {
                mmp[i][j] = 0;
            }
        }
    }

    public void walls() {
        for(int i = 0;i < 12;i ++) {
            mmp[i][21] = -1;
        }
        for (int i = 0;i < 22;i ++) {
            mmp[11][i] = -1;
            mmp[0][i] = -1;
        }
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int j = 0; j < 16; j ++) {
            if (boxes[type][dirc][j] == 1) {
                g.fillRect((j % 4 + nowX + 1) * 20, (j / 4 + nowY) * 20, 20, 20);
            }
        }
        for (int j = 0; j < 22; j ++) {
            for (int i = 0; i < 12; i ++) {
                if (mmp[i][j] == 1) {
                    g.fillRect(i * 20, j * 20, 20, 20);
                }
                if (mmp[i][j] == -1) {
                    g.drawRect(i * 20, j * 20, 20, 20);
                }
            }
        }
        Font f1 = new Font(null,Font.PLAIN,18);
        Font f2= new Font(null,Font.PLAIN,30);
        g.setFont(f1);
        g.drawString("Press up button to change the shape", 250, 200);
        g.drawString("Press left button to move left", 250, 225);
        g.drawString("Press right button to move right", 250, 250);
        g.drawString("Press down button to drop faster", 250, 275);
        g.drawString("Press ‘P‘ to pause/continue the game", 250, 300);
        //g.drawString("Press ‘K‘ to speed-up", 250, 325);
        //g.drawString("Press ‘L‘ to speed-down", 250, 350);
        g.drawString("Happy game,happy life !", 350, 375);
        g.drawString("Code changes the world !", 350, 400);
        g.setFont(f2);
        g.setColor(Color.RED);
        g.drawString(stp,60,150);
        g.setColor(Color.BLACK);
        g.drawString("Score : " + score, 20, 480);
        g.drawRect(240, 0, 100, 100);
        g.setFont(f1);
        g.drawString("NEXT",270,120);
        for (int j = 0; j < 16; j ++) {
            if (boxes[secT][secD][j] == 1) {
                g.fillRect(240 + (j % 4 + 1) * 20,20 + (j / 4) * 20, 20, 20);
            }
        }
    }

    public void keyPressed(KeyEvent e) {
        switch(e.getKeyCode()) {
            case KeyEvent.VK_DOWN:
                moveDown();
                break;
            case KeyEvent.VK_UP:
                shapeChange();
                break;
            case KeyEvent.VK_RIGHT:
                moveRight();
                break;
            case KeyEvent.VK_LEFT:
                moveLeft();
                break;
            case KeyEvent.VK_P:
                if(isST == 1) {timer.stop();stp = "PAUSED";}
                else {timer.start();stp = "";}
                isST = -isST;
                repaint();
                break;
                /*
            case KeyEvent.VK_K: //  speed on
                if(diff > 50) {diff -= 50;}
                break;
            case KeyEvent.VK_L: //  speed off
                if(diff < 1000) {diff += 50;}
                break;
                */
        }
    }

    public void moveLeft() {
        if (isOK(nowX - 1,nowY) == 1) {
            nowX --;
        }
        repaint();
    }

    public void moveRight() {
        if (isOK(nowX + 1,nowY) == 1) {
            nowX ++;
        }
        repaint();
    }

    public void moveDown() {
        int OK = isOK(nowX, nowY + 1);
        if (OK == 1) {
            nowY ++;
            dltLine();
        }
        else {
            addToMap(nowX,nowY);
            ANewBlock();
            dltLine();
        }
        repaint();
    }

    public void shapeChange(){
        int t = dirc;
        dirc ++;
        dirc %= 4;
        int OK = isOK(nowX,nowY);
        //System.out.println(OK);
        if(OK == 0) {
            dirc = t;
        }
        repaint();
    }

    public void keyReleased(KeyEvent e) {}
    public void keyTyped(KeyEvent e) {}

    public void ANewBlock() {
        if(gameover() != 0) {
            init();
            walls();

            if(score <= 1000) {
                JOptionPane.showMessageDialog(null, "You are so weak !","Game Over",JOptionPane.PLAIN_MESSAGE);
            }
            else if(score <= 10000) {
                JOptionPane.showMessageDialog(null, "Just so so !","Game Over",JOptionPane.PLAIN_MESSAGE);
            }
            else if(score <= 100000) {
                JOptionPane.showMessageDialog(null, "Nice Work !","Game Over",JOptionPane.PLAIN_MESSAGE);
            }
            else if(score <= 1000000) {
                JOptionPane.showMessageDialog(null, "You are awesome !","Game Over",JOptionPane.PLAIN_MESSAGE);
            }
            else if(score <= 10000000) {
                JOptionPane.showMessageDialog(null, "Incredible !","Game Over",JOptionPane.PLAIN_MESSAGE);
            }
            else {
                JOptionPane.showMessageDialog(null, "What a crazy man !","Game Over",JOptionPane.PLAIN_MESSAGE);
            }
            score = 0;
        }
        if(type == -1 && dirc == -1) {
            type = (int)(Math.random() * 10000) % 7;
            dirc = (int)(Math.random() * 10000) % 4;
            secT = (int)(Math.random() * 10000) % 7;
            secD = (int)(Math.random() * 10000) % 4;
        }
        else {
            type = secT;
            dirc = secD;
            secT = (int)(Math.random() * 10000) % 7;
            secD = (int)(Math.random() * 10000) % 4;
        }
        nowX = 4;nowY  = 0;
    }

    public void addToMap(int x, int y) {
        int k = 0;
        for (int i = 0; i < 4; i ++) {
            for (int j = 0; j < 4; j ++) {
                if (mmp[x + j + 1][y + i] == 0) {
                    mmp[x + j + 1][y + i] = boxes[type][dirc][k];
                }
                k ++;
            }
        }
    }

    public int isOK(int x,int y) {
        for (int i = 0; i < 4; i ++) {
            for (int j = 0; j < 4; j ++) {
                if (((boxes[type][dirc][i * 4 + j] == 1) && (mmp[x + j + 1][y + i] == 1))
                        || ((boxes[type][dirc][i * 4 + j] == 1) && (mmp[x + j + 1][y + i] == -1))) {
                    return 0;
                }
            }
        }
        return 1;
    }

    public int gameover() {
        int ans = 0;
        for(int i =1;i<= 10;i ++) {
            ans += mmp[i][1];
        }
        return ans;
    }

    public void dltLine() {
        int t = 0;
        int lines = 0;
        for (int j = 0; j < 22; j ++) {
            for (int i = 0; i < 12; i ++) {
                if (mmp[i][j] == 1) {
                    t ++;
                    if (t == 10) {
                        lines ++;
                        for (int k = j; k > 0; k --) {
                            for (int p = 0; p < 11; p ++) {
                                mmp[p][k] = mmp[p][k - 1];
                            }
                        }
                    }
                }
            }
            t = 0;
        }
        if(lines == 1) {score += 100;}
        else if(lines == 2) {score += 300;}
        else if(lines == 3) {score += 600;}
        else if(lines == 4) {score += 1000;}

    }

    class TimerListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            repaint();
            //System.out.println("t");
            int OK = isOK(nowX, nowY + 1);
            if(OK == 1) {
                nowY ++;
                dltLine();
            }
            else {
                if(flag == 1) {
                    addToMap(nowX,nowY);
                    dltLine();
                    ANewBlock();
                    flag = 0;
                }
                flag = 1;
            }
        }
    }

}

原文地址:https://www.cnblogs.com/love-fromAtoZ/p/9704116.html

时间: 2024-10-26 12:42:02

JAVA——俄罗斯方块的相关文章

java俄罗斯方块

代码如下 <span style="font-size:18px;">package com.model; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.*; impo

Java 俄罗斯方块

参照网上小翼的教程做的.由于ps能力不足,所以没有实现换皮肤的功能,其他功能都实现了. 下载地址:http://download.csdn.net/detail/woshiwanghao_hi/8542165

【新蜂】俄罗斯方块说明书

项目名:java俄罗斯方块NEO 版本 v 0.8 日期:2016-11-15 1.引言 1前言 俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事.究其历史,俄罗斯方块最早还是出现在 PC 机上,而我国的用户都是通过红白机了解.喜欢上它的.对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而随着游戏的发展,游戏内容日益丰富,游戏功能日益完善,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所. 2可行性

JAVA上百实例源码以及开源项目

简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬.向往!此时此景,笔者只专注Android.Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能.编辑音乐软件的朋友,这款实例会对你有所帮助.Calendar万年历 1个目标文件EJ

【第八周】【新蜂站会】3

组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块 -> 项目名称:java俄罗斯方块NEO 时间:2016.11.15 我们的项目正式更名为 java俄罗斯方块NEO了.   总任务: 1,数据库显示模块. 2,等级窗口模块. 3,版权信息模块. 4,新的文字UI. 5,新的方块等图片UI. 6,游戏结束后的请输入大名窗口. 7,等级系统. 8,与等级系统配套的下一级经验条,经验条慢则升级. 9,制定新任务. 10,隐藏任务. 今日完成任务:做了部

【第六周】【新蜂站会】

http:https://git.coding.net/Boxer_/homework.git ssh:[email protected]:Boxer_/homework.git 小组名称:新蜂 组长:武志远 组成员:宫成荣 谢孝淼 杨柳 李峤 项目名称:Java俄罗斯方块 站会时间:11.2 总任务: 1,数据库显示模块. 2,本地记录模块, 3,俄罗斯方块主模块 4,按钮窗口模块 5,下一个窗口模块 6,等级窗口模块, 7,分数窗口模块. 8,版权信息模块. 每日任务: 1,利用xml解决硬

【记录】2016年5月

[5月的记录帖] 开篇明义: 一直拖沓太多,自己也有一种得过且过的心思,养了些坏习惯,总是容易自我感动,而后便纵情娱乐,生活不止娱乐. 没有干货,憋了半天也憋不出东西来,一点点的记录下. 时间安排 学习 锻炼  娱乐 ===============================<第一周>=================================== ==============================第1天===================================

【第九周】站会1

组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块 -> 项目名称:java俄罗斯方块NEO 时间:2016.11.21 我们的项目正式更名为 java俄罗斯方块NEO了.   总任务: 1,数据库显示模块. 2,等级窗口模块. 3,版权信息模块. 4,新的文字UI. 5,新的方块等图片UI. 6,游戏结束后的请输入大名窗口. 7,等级系统. 8,与等级系统配套的下一级经验条,经验条慢则升级. 9,制定新任务. 10,隐藏任务. 今日完成任务:等级系

Beta 发布的相关评论

1. 礼物挑选小工具 飞天小女警      这个项目的创意独具匠心,贴近实际,令人耳目一新,网站的页面也是玫红色的,配色让人感到很温馨,对礼物的筛选方式很有趣,使用的记录特殊日子的方法来提醒自己挑选礼物,想法很新颖.软件搭建到了服务器上,若界面能更优化一点就好了,而且字体的颜色和界面的颜色太过相近,有点让人看不清晰.2. 在线考试系统 金州勇士       在线考试系统围绕学生的日常生活将传统的考试和信息化办公结合到了一切,很实用,是广大学生所喜闻乐见的,而且搭建到了服务器上,实现自由访问,这点