)發布一個Java寫的俄羅斯方塊源碼 演算法簡單(300行) 注釋詳細

來源:互聯網
上載者:User

轉自:http://topic.csdn.net/u/20100612/03/A8D7B257-4385-4BB8-82FF-4A51AC3BD810.html

 

import java.awt.*;<br />import java.awt.event.ActionEvent;<br />import java.awt.event.ActionListener;<br />import java.awt.event.KeyEvent;<br />import java.awt.event.KeyListener;<br />import javax.swing.*;<br />import javax.swing.Timer;</p><p>public class Tetris extends JFrame {<br /> public Tetris() {<br /> Tetrisblok a = new Tetrisblok();<br /> addKeyListener(a);<br /> add(a);<br /> }</p><p> public static void main(String[] args) {<br /> Tetris frame = new Tetris();<br /> JMenuBar menu = new JMenuBar();<br /> frame.setJMenuBar(menu);<br /> JMenu game = new JMenu("遊戲");<br /> JMenuItem newgame = game.add("新遊戲");<br /> JMenuItem pause = game.add("暫停");<br /> JMenuItem goon = game.add("繼續");<br /> JMenuItem exit = game.add("退出");<br /> JMenu help = new JMenu("協助");<br /> JMenuItem about = help.add("關於");<br /> menu.add(game);<br /> menu.add(help);<br /> frame.setLocationRelativeTo(null);<br /> frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br /> frame.setSize(220, 275);<br /> frame.setTitle("Tetris內測版");<br /> // frame.setUndecorated(true);<br /> frame.setVisible(true);<br /> frame.setResizable(false);</p><p> }<br />}</p><p>// 建立一個俄羅斯方塊類<br />class Tetrisblok extends JPanel implements KeyListener {</p><p> // blockType 代表方塊類型<br /> // turnState代表方塊狀態<br /> private int blockType;<br /> private int score = 0;</p><p> private int turnState;</p><p> private int x;</p><p> private int y;</p><p> private int i = 0;</p><p> int j = 0;<br /> int flag = 0;<br /> // 定義已經放下的方塊x=0-11,y=0-21;<br /> int[][] map = new int[13][23];</p><p> // 方塊的形狀 第一組代表方塊類型有S、Z、L、J、I、O、T 7種 第二組 代表旋轉幾次 第三四組為 方塊矩陣<br /> private final int shapes[][][] = new int[][][] {<br /> // i<br /> { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },<br /> { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },<br /> { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },<br /> { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },<br /> // s<br /> { { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },<br /> { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },<br /> { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },<br /> { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } },<br /> // z<br /> { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },<br /> { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },<br /> { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },<br /> { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } },<br /> // j<br /> { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },<br /> { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },<br /> { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },<br /> { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },<br /> // o<br /> { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },<br /> { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },<br /> { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },<br /> { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },<br /> // l<br /> { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },<br /> { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },<br /> { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },<br /> { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },<br /> // t<br /> { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },<br /> { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },<br /> { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },<br /> { 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } };</p><p> // 產生新方塊的方法<br /> public void newblock() {<br /> blockType = (int) (Math.random() * 1000) % 7;<br /> turnState = (int) (Math.random() * 1000) % 4;<br /> x = 4;<br /> y = 0;<br /> if (gameover(x, y) == 1) {</p><p> newmap();<br /> drawwall();<br /> score = 0;<br /> JOptionPane.showMessageDialog(null, "GAME OVER");<br /> }<br /> }</p><p> // 畫圍牆<br /> public void drawwall() {<br /> for (i = 0; i < 12; i++) {<br /> map[i][21] = 2;<br /> }<br /> for (j = 0; j < 22; j++) {<br /> map[11][j] = 2;<br /> map[0][j] = 2;<br /> }<br /> }</p><p> // 初始化地圖<br /> public void newmap() {<br /> for (i = 0; i < 12; i++) {<br /> for (j = 0; j < 22; j++) {<br /> map[i][j] = 0;<br /> }<br /> }<br /> }</p><p> // 初始化構造方法<br /> Tetrisblok() {<br /> newblock();<br /> newmap();<br /> drawwall();<br /> Timer timer = new Timer(1000, new TimerListener());<br /> timer.start();<br /> }</p><p> // 旋轉的方法<br /> public void turn() {<br /> int tempturnState = turnState;<br /> turnState = (turnState + 1) % 4;<br /> if (blow(x, y, blockType, turnState) == 1) {<br /> }<br /> if (blow(x, y, blockType, turnState) == 0) {<br /> turnState = tempturnState;<br /> }<br /> repaint();<br /> }</p><p> // 左移的方法<br /> public void left() {<br /> if (blow(x - 1, y, blockType, turnState) == 1) {<br /> x = x - 1;<br /> }<br /> ;<br /> repaint();<br /> }</p><p> // 右移的方法<br /> public void right() {<br /> if (blow(x + 1, y, blockType, turnState) == 1) {<br /> x = x + 1;<br /> }<br /> ;<br /> repaint();<br /> }</p><p> // 下落的方法<br /> public void down() {<br /> if (blow(x, y + 1, blockType, turnState) == 1) {<br /> y = y + 1;<br /> delline();<br /> }<br /> ;<br /> if (blow(x, y + 1, blockType, turnState) == 0) {<br /> add(x, y, blockType, turnState);<br /> newblock();<br /> delline();<br /> }<br /> ;<br /> repaint();<br /> }</p><p> // 是否合法的方法<br /> public int blow(int x, int y, int blockType, int turnState) {<br /> for (int a = 0; a < 4; a++) {<br /> for (int b = 0; b < 4; b++) {<br /> if (((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x<br /> + b + 1][y + a] == 1))<br /> || ((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x<br /> + b + 1][y + a] == 2))) {</p><p> return 0;<br /> }<br /> }<br /> }<br /> return 1;<br /> }</p><p> // 消行的方法<br /> public void delline() {<br /> int c = 0;<br /> for (int b = 0; b < 22; b++) {<br /> for (int a = 0; a < 12; a++) {<br /> if (map[a][b] == 1) {</p><p> c = c + 1;<br /> if (c == 10) {<br /> score += 10;<br /> for (int d = b; d > 0; d--) {<br /> for (int e = 0; e < 11; e++) {<br /> map[e][d] = map[e][d - 1];</p><p> }<br /> }<br /> }<br /> }<br /> }<br /> c = 0;<br /> }<br /> }</p><p> // 判斷你掛的方法<br /> public int gameover(int x, int y) {<br /> if (blow(x, y, blockType, turnState) == 0) {<br /> return 1;<br /> }<br /> return 0;<br /> }</p><p> // 把當前添加map<br /> public void add(int x, int y, int blockType, int turnState) {<br /> int j = 0;<br /> for (int a = 0; a < 4; a++) {<br /> for (int b = 0; b < 4; b++) {<br /> if (map[x + b + 1][y + a] == 0) {<br /> map[x + b + 1][y + a] = shapes[blockType][turnState][j];<br /> }<br /> ;<br /> j++;<br /> }<br /> }<br /> }</p><p> // 畫方塊的的方法<br /> public void paintComponent(Graphics g) {<br /> super.paintComponent(g);<br /> // 畫當前方塊<br /> for (j = 0; j < 16; j++) {<br /> if (shapes[blockType][turnState][j] == 1) {<br /> g.fillRect((j % 4 + x + 1) * 10, (j / 4 + y) * 10, 10, 10);<br /> }<br /> }<br /> // 畫已經固定的方塊<br /> for (j = 0; j < 22; j++) {<br /> for (i = 0; i < 12; i++) {<br /> if (map[i][j] == 1) {<br /> g.fillRect(i * 10, j * 10, 10, 10);</p><p> }<br /> if (map[i][j] == 2) {<br /> g.drawRect(i * 10, j * 10, 10, 10);</p><p> }<br /> }<br /> }<br /> g.drawString("score=" + score, 125, 10);<br /> g.drawString("抵制不良遊戲,", 125, 50);<br /> g.drawString("拒絕盜版遊戲。", 125, 70);<br /> g.drawString("注意自我保護,", 125, 90);<br /> g.drawString("謹防受騙上當。", 125, 110);<br /> g.drawString("適度遊戲益腦,", 125, 130);<br /> g.drawString("沉迷遊戲傷身。", 125, 150);<br /> g.drawString("合理安排時間,", 125, 170);<br /> g.drawString("享受健康生活。", 125, 190);<br /> }</p><p> // 鍵盤監聽<br /> public void keyPressed(KeyEvent e) {<br /> switch (e.getKeyCode()) {<br /> case KeyEvent.VK_DOWN:<br /> down();<br /> break;<br /> case KeyEvent.VK_UP:<br /> turn();<br /> break;<br /> case KeyEvent.VK_RIGHT:<br /> right();<br /> break;<br /> case KeyEvent.VK_LEFT:<br /> left();<br /> break;<br /> }</p><p> }</p><p> // 無用<br /> public void keyReleased(KeyEvent e) {<br /> }</p><p> // 無用<br /> public void keyTyped(KeyEvent e) {<br /> }</p><p> // 定時器監聽<br /> class TimerListener implements ActionListener {<br /> public void actionPerformed(ActionEvent e) {</p><p> repaint();<br /> if (blow(x, y + 1, blockType, turnState) == 1) {<br /> y = y + 1;<br /> delline();<br /> }<br /> ;<br /> if (blow(x, y + 1, blockType, turnState) == 0) {</p><p> if (flag == 1) {<br /> add(x, y, blockType, turnState);<br /> delline();<br /> newblock();<br /> flag = 0;<br /> }<br /> flag = 1;<br /> }<br /> ;<br /> }<br /> }<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.