java實現簡單的俄羅斯方塊
更新時間:2022年01月18日 15:06:50 作者:後物
這篇文章主要為大家詳細介紹了java實現簡單的俄羅斯方塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了java實現簡單俄羅斯方塊的具體代碼,供大家參考,具體內容如下
結合網上的資料剛做完課程設計,具體代碼如下:
public class TetrisPanel extends JPanel{ ? ? private final int[][] map = new int[13][23];// map[列號][行號]。真正的方塊區(qū)是:21行*10列。邊框(2列,1行) ? ? // 方塊的形狀: ? ? // 第一維代表方塊類型(包括7種:S、Z、L、J、I、O、T) ? ? // 第二`在這里插入代碼片`維代表旋轉次數 ? ? // 第三四維代表方塊矩陣 ? ? // shapes[type][turnState][i] i--> block[i/4][i%4] ? ? int[][][] shapes = new int[][][] { ? ? ? ? ? ? /* ? ? ? ? ? ? ?* 模板 { {0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0}, {0,0,0,0,0,0,0,0, 0,0,0,0, ? ? ? ? ? ? ?* 0,0,0,0}, {0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0}, {0,0,0,0,0,0,0,0, 0,0,0,0, ? ? ? ? ? ? ?* 0,0,0,0} } ? ? ? ? ? ? ?*/ ? ? ? ? ? ? // I ? ? ? ? ? ? { { 1, 1, 1, 1, ? ? ? ? ? ? ? ? 0, 0, 0, 0, ? ? ? ? ? ? ? ? 0, 0, 0, 0, ? ? ? ? ? ? ? ? 0, 0, 0, 0 }, ? ? ? ? ? ? ? { 0, 1, 0, 0, ? ? ? ? ? ? ? ? 0, 1, 0, 0, ? ? ? ? ? ? ? ? 0, 1, 0, 0, ? ? ? ? ? ? ? ? 0, 1, 0, 0 }, ? ? ? ? ? ? ? { 1, 1, 1, 1, ? ? ? ? ? ? ? ? 0, 0, 0, 0, ? ? ? ? ? ? ? ? 0, 0, 0, 0, ? ? ? ? ? ? ? ? 0, 0, 0, 0 }, ? ? ? ? ? ? ? { 0, 1, 0, 0, ? ? ? ? ? ? ? ? 0, 1, 0, 0, ? ? ? ? ? ? ? ? 0, 1, 0, 0, ? ? ? ? ? ? ? ? 0, 1, 0, 0 } }, ? ? ? ? ? ? // S ? ? ? ? ? ? { { 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, 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 } }, ? ? ? ? ? ? // Z 第3行: shapes[2][2][] ? ? ? ? ? ? { { 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 } }, ? ? ? ? ? ? // J ? ? ? ? ? ? { { 0, 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 } }, ? ? ? ? ? ? // O ? ? ? ? ? ? { { 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, 1, 1, 0, ? ? ? ? ? ? ? ? 0, 1, 1, 0, ? ? ? ? ? ? ? ? 0, 0, 0, 0, ? ? ? ? ? ? ? ? 0, 0, 0, 0 } }, ? ? ? ? ? ? // L ? ? ? ? ? ? { { 0, 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 } }, ? ? ? ? ? ? // T ? ? ? ? ? ? { { 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 }, ? ? ? ? ? ? ? { 0, 0, 0, 0, ? ? ? ? ? ? ? ? 1, 1, 1, 0, ? ? ? ? ? ? ? ? 0, 1, 0, 0, ? ? ? ? ? ? ? ? 0, 0, 0, 0 }, ? ? ? ? ? ? ? { 0, 1, 0, 0, ? ? ? ? ? ? ? ? 0, 1, 1, 0, ? ? ? ? ? ? ? ? 0, 1, 0, 0, ? ? ? ? ? ? ? ? 0, 0, 0, 0 } } }; ? ? private int type; ? ? private int turnState; ? ? private int x, y;// 當前塊的位置---左上角的坐標 ? ? private int score = 0; ? ? TimerListener listener1 = new TimerListener(); ? ?//監(jiān)聽器 ? ? Timer timer = new Timer(1000, listener1); ?//定時器 ? ? public TetrisPanel() { ? ? ? ? newGame(); ? ? ? ? nextBlock(); ? ? ? ? timer.start(); ? ? } ? ? void newGame() { ? ? ? ? // 初始化游戲地圖 ? ? ? ? for (int i = 0; i < 12; i++) { ?//列 ? ? ? ? ? ? for (int j = 0; j < 21; j++) { ?//行 ? ? ? ? ? ? ? ? if (i == 0 || i == 11) {// 邊框 ? ? ? ? ? ? ? ? ? ? map[i][j] = 1; ?//透明度 ? ? ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? ? ? map[i][j] = 0; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? map[i][21] = 1; ? ? ? ? } ? ? ? ? score = 0; ? ? } ? ? void nextBlock() { ? ? ? ? type = (int) (Math.random() * 1000) % 7; // 總共七種類型 ? ? ? ? turnState = (int) (Math.random() * 1000) % 4; // 總共四種轉換方法 ? ? ? ? x = 3; ? //起始下落坐標 ? ? ? ? y = 0; ? ? ? ? if (crash(x, y, type, turnState) == 0) { ? ? ? ? ? ? timer.stop(); ? ? ? ? ? ? int op = JOptionPane.showConfirmDialog(null, ? ? ? ? ? ? ? ? ? ? "Game Over!...再來一局嗎?!","提示",JOptionPane.YES_NO_OPTION); ? ? ? ? ? ? if (op == JOptionPane.YES_OPTION) { ? ? ? ? ? ? ? ? newGame(); ? ? ? ? ? ? ? ? listener1 = new TimerListener(); ? ? ? ? ? ? ? ? Timer timer = new Timer(1000, listener1); ? ? ? ? ? ? ? ? timer.start(); ? ? ? ? ? ? } else if (op == JOptionPane.NO_OPTION) { ? ? ? ? ? ? ? ? System.exit(0); ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? void down() { ? ? ? ? if (crash(x, y + 1, type, turnState) == 0) {// 判斷當前塊往下落一格后是否和地圖存在填充塊完全重合---注意實參:y+1 ? ? ? ? ? ? add(x, y, type, turnState);// 把該塊加到地圖---形成堆積塊 ? ? ? ? ? ? nextBlock(); ? ? ? ? } else { ? ? ? ? ? ? y++; ? ? ? ? } ? ? ? ? repaint(); ? ?//刷新頁面 ? ? } ? ? void left() { ? ? ? ? if (x >= 0) { ? ? ? ? ? ? x -= crash(x - 1, y, type, turnState); ? ? ? ? } ? ? ? ? repaint(); ? ? } ? ? void right() { ? ? ? ? if (x < 8) { ? ? ? ? ? ? x += crash(x + 1, y, type, turnState); ? ? ? ? } ? ? ? ? repaint(); ? ? } ? ? void turn() { ? ? ? ? if (crash(x, y, type, (turnState + 1) % 4) == 1) { ? ? ? ? ? ? turnState = (turnState + 1) % 4; ? ? ? ? } ? ? ? ? repaint(); ? ? } ? ? // 讓一個塊堆積,其實是把當前塊中的填充塊信息記錄到map[][]中 ? ? private void add(int x, int y, int type, int turnState) { ? ? ? ? for (int a = 0; a < 4; a++) { ? ? ? ? ? ? for (int b = 0; b < 4; b++) { ? ? ? ? ? ? ? ? if (shapes[type][turnState][a * 4 + b] == 1) { ? ? ? ? ? ? ? ? ? ? map[x + b + 1][y + a] = 1; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? tryDelLine(); ? ? } ? ? // 消塊 ? ? private void tryDelLine() { ? ? ? ? // 從上往下,一行行依次遍歷,如果某一行的map[i][j]值全是1,則把這一行消掉---上一行往下落 ? ? ? ? for (int b = 0; b < 21; b++) { ? ? ? ? ? ? int c = 1; ? ? ? ? ? ? for (int a = 0; a < 12; a++) { ? ? ? ? ? ? ? ? c &= map[a][b]; ? ? ? ? ? ? } ? ? ? ? ? ? if (c == 1) {// 全是1--下落一行 ? ? ? ? ? ? ? ? score += 10; ? ? ? ? ? ? ? ? for (int d = b; d > 0; d--) { ? ? ? ? ? ? ? ? ? ? for (int e = 0; e < 11; e++) { ? ? ? ? ? ? ? ? ? ? ? ? map[e][d] = map[e][d - 1]; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? private int crash(int x, int y, int blockType, int turnState) { ? ? ? ? for (int a = 0; a < 4; a++) { ? ? ? ? ? ? for (int b = 0; b < 4; b++) { ? ? ? ? ? ? ? ? if ((shapes[blockType][turnState][a * 4 + b] & map[x + b + 1][y + a]) == 1) {// 和填充塊或框架重合,都算碰撞 ? ? ? ? ? ? ? ? ? ? return 0; // 碰撞了---方塊的填充塊和地圖中的填充塊完全重合 ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? return 1;// 沒有碰撞 ? ? } ? ? // 表現層 ? ? @Override ? ? public void paint(Graphics g) { ? ? ? ? super.paint(g);// 清除殘影 ? ? ? ? // 畫當前塊 ? ? ? ? for (int j = 0; j < 16; j++) { ? ? ? ? ? ? if (shapes[type][turnState][j] == 1) { ? ? ? ? ? ? ? ? g.setColor(Color.green); ? ? ? ? ? ? ? ? g.fillRect((j % 4 + x + 1) * 30, (j / 4 + y) * 30, 30, 30); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? // 畫地圖(整個游戲的方塊區(qū)和邊框) ? ? ? ? for (int i = 0; i < 12; i++) { ? ? ? ? ? ? for (int j = 0; j < 22; j++) { ? ? ? ? ? ? ? ? if (map[i][j] == 1) { ? ? ? ? ? ? ? ? ? ? g.setColor(Color.black); ? ?//邊框,墻體 ? ? ? ? ? ? ? ? ? ? g.fillRect(i * 30, j * 30, 30, 30);// 填充 ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? // 顯示分數,同時為版面美觀,在界面上再加點東西 ? ? ? ? // 畫方塊區(qū)右側部分 ? ? ? ? g.setColor(Color.blue); ? ? ? ? g.setFont(new Font("aa", Font.BOLD, 26)); ? ? ? ? g.drawString("score : " + score, 395, 100); ? ? ? ? //畫游戲區(qū)的線格 ? ? ? ? for (int i = 1; i < 11; i++) { ? ? ? ? ? ? for (int j = 0; j < 21; j++) { ? ? ? ? ? ? ? ? g.setColor(Color.CYAN); ? ? ? ? ? ? ? ? g.drawRect(i * 30, j * 30, 30, 30); ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? class TimerListener extends KeyAdapter implements ActionListener { ? ? ? ? @Override ? ? ? ? public void keyPressed(KeyEvent e) { ? ? ? ? ? ? switch (e.getKeyCode()) { ? ? ? ? ? ? ? ? case KeyEvent.VK_DOWN: ? ? ? ? ? ? ? ? case KeyEvent.VK_S: ? ? ? ? ? ? ? ? ? ? down(); ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case KeyEvent.VK_LEFT: ? ? ? ? ? ? ? ? case KeyEvent.VK_A: ? ? ? ? ? ? ? ? ? ? left(); ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case KeyEvent.VK_RIGHT: ? ? ? ? ? ? ? ? case KeyEvent.VK_D: ? ? ? ? ? ? ? ? ? ? right(); ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case KeyEvent.VK_UP: ? ? ? ? ? ? ? ? case KeyEvent.VK_W: ? ? ? ? ? ? ? ? ? ? turn(); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? @Override ? ? ? ? public void actionPerformed(ActionEvent e) { ? ? ? ? ? ? down(); ? ? ? ? } ? ? } }
public class Tetris extends JFrame { ? ? static JButton button1 = new JButton("重來"); ? ? static JButton button2 = new JButton("暫停"); ? ? static JButton button3 = new JButton("退出"); ? ? static int flag = 0; ? ? Tetris(){ ? ? ? ? setTitle("俄羅斯方塊"); ? ? ? ? setVisible(true); ? ? ? ? setLocation(450, 100); ? ? ? ? setDefaultCloseOperation(EXIT_ON_CLOSE); ? ? ? ? setSize(550, 697); ? ? ? ? setResizable(false); ? ? ? ? setFocusable(true); ?//表明此 Component 是否可以獲得焦點 ? ? } ? ? public static void main(String[] args) { ? ? ? ? Tetris te = new Tetris(); ? ? ? ? TetrisPanel tp = new TetrisPanel(); ? ? ? ? te.add(tp); ? ? ? ? button1.setBounds(390,300,120,40); ? ? ? ? button2.setBounds(390,390,120,40); ? ? ? ? button3.setBounds(390,480,120,40); ? ? ? ? button1.setFocusable(false); ? ? ? ? button2.setFocusable(false); ? ? ? ? tp.add(button1); ? ? ? ? tp.add(button2); ? ? ? ? tp.add(button3); ? ? ? ? tp.setLayout(null); ? ? ? ? te.addKeyListener(tp.listener1); // 讓框架來監(jiān)聽鍵盤 ? ? ? ? button1.addActionListener(e -> { ? ? ? ? ? ? if(e.getSource() == button1){ ? ? ? ? ? ? ? ? tp.timer.stop(); ? ? ? ? ? ? ? ? int a = JOptionPane.showConfirmDialog(null, "確定要重新開始嗎?","提示",JOptionPane.YES_NO_OPTION); ? ? ? ? ? ? ? ? if(a == JOptionPane.YES_OPTION){ ? ? ? ? ? ? ? ? ? ? button2.setText("暫停"); ? ? ? ? ? ? ? ? ? ? tp.timer.start(); ? ? ? ? ? ? ? ? ? ? tp.newGame(); ? ? ? ? ? ? ? ? ? ? tp.nextBlock(); ? ? ? ? ? ? ? ? }else if(a == JOptionPane.NO_OPTION){ ? ? ? ? ? ? ? ? ? ? System.exit(0); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? button2.addActionListener(e -> { ? ? ? ? ? ? if(e.getSource() == button2){ ? ? ? ? ? ? ? ? if(flag == 0){ ? ? ? ? ? ? ? ? ? ? button2.setText("繼續(xù)游戲"); ? ? ? ? ? ? ? ? ? ? tp.timer.stop(); ? ? ? ? ? ? ? ? ? ? flag = 1; ? ? ? ? ? ? ? ? }else if(flag == 1){ ? ? ? ? ? ? ? ? ? ? button2.setText("暫停"); ? ? ? ? ? ? ? ? ? ? tp.timer.start(); ? ? ? ? ? ? ? ? ? ? flag = 0; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? button3.addActionListener(e -> { ? ? ? ? ? ? if(e.getSource() == button3){ ? ? ? ? ? ? ? ? tp.timer.stop(); ? ? ? ? ? ? ? ? int a = JOptionPane.showConfirmDialog(null,"確定要退出游戲嗎?","退出",JOptionPane.YES_NO_OPTION); ? ? ? ? ? ? ? ? if(a == JOptionPane.YES_OPTION){ ? ? ? ? ? ? ? ? ? ? System.exit(0); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? }); ? ? } }
代碼實現效果如下:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Java 創(chuàng)建動態(tài)類和查看方法列表信息的實例
這篇文章主要介紹了 Java 創(chuàng)建動態(tài)類和查看方法列表信息的實例的相關資料,需要的朋友可以參考下2017-06-06SpringBoot通過源碼探究靜態(tài)資源的映射規(guī)則實現
這篇文章主要介紹了SpringBoot通過源碼探究靜態(tài)資源的映射規(guī)則實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05