JAVA俄罗斯方块源代码
经典俄罗斯方块代码(转javascript代码)

经典俄罗斯⽅块代码(转javascript代码)在⽹上发现⼀篇60⾏javascript超经典俄罗斯⽅块代码,值得学习,转为Delphi如下,有详细注释,不再另讲解:unit Block_Unit;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.ExtCtrls;typeTBlockForm = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);procedure FormCreate(Sender: TObject);procedure FormPaint(Sender: TObject);privateprocedure WMMyKey(var Msg: TWMKeyDown); message WM_KEYDOWN;publicend;typeTIntArr=array of TArray<Integer>;type TBlock=recordx,y,s:Integer;fk:array [0..3] of Integer;//fk记录⽅块,4X4⼆进制矩阵end;varBlockForm: TBlockForm;Map:array of Integer;Tetris: TIntArr= [[$6600],//⽅块,⼆进制数据显⽰⽅块[$2222, $0f00],//I型[$c600, $2640],//Z型[$6c00, $4620],//反Z型[$4460, $2e0, $6220, $740],//L型[$2260, $0e20, $6440, $4700], //反L型[$2620, $720, $2320, $2700]]; //T型;pos,bak:TBlock;//pos当前⽅块数据,bak备份当前⽅块数据dia:TArray<Integer>;rs:TResourceStream;procedure Rotate(r:Integer);procedure GameStart;procedure UpdateMap(b:Boolean);function HaveBlock:Boolean;procedure BlockMove(r:Integer);implementationuses Vcl.Imaging.jpeg;varGreen,Red:TJPEGImage;{$R *.dfm}{此游戏的核⼼思路是⽤⼆进制来记录整个界⾯的变化,每个⽅块设定为4X4的⼆进制矩阵,整个游戏界⾯设定为10列、22⾏。
俄罗斯方块代码

1./*2.*虚拟的单个方格类,控制方格的颜色3.*/4.class RussiaBox implements Cloneable5.{6. private boolean isColor;7.8. public RussiaBox(boolean isColor)9. {10. this.isColor = isColor;11. }12. /*13. *设置颜色14. */15. public void setColor(boolean isColor)16. {17. this.isColor=isColor;18. }19. /*20. *返回颜色21. */22. public boolean isColorBox()23. {24. return isColor;25. }26. /*27. * @see ng.Object#clone()28. */29. public Object clone()30. {31. Object o = null;32. try33. {34. o=super.clone();35. }catch(CloneNotSupportedException e)36. {37. e.printStackTrace();38. }39. return o;40. }41.}42./*43. * 游戏中方块显示的画布类44. */45.import java.awt.*;46.import java.awt.event.*;47.import javax.swing.*;48.import javax.swing.border.*;49.50.class GameCanvas extends JPanel51.{52. private RussiaBox [][]boxes;53. private int rows = 20 , cols = 12;54. private static GameCanvas canvas=null;55. private int boxWidth, boxHeight;//默认为零需要调用fanning函数设置56. private Color blockColor = Color.RED, bgColor = new Color(0,204,204);57. private EtchedBorder border=new EtchedBorder(EtchedBorder.RAISED,Color.WHITE, new Color(148, 145, 140)) ;58.59. /*60. *采用单件模式,构造函数私有61. */62. private GameCanvas()63. {64. boxes = new RussiaBox[rows][cols];65.66. for(int i = 0; i < boxes.length; i ++)67. for(int j = 0; j<boxes[i].length; j ++)68. boxes[i][j] = new RussiaBox(false);69.70. setBorder(border);71. }72. /*73. *获得GameCanvas实例74. */75. public static GameCanvas getCanvasInstance()76. {77. if(canvas == null)78. canvas = new GameCanvas();79.80. return canvas;81. }82. /*83. *设置画布的背景色84. */85. public void setBgColor(Color bgColor)86. {87. this.bgColor = bgColor;88. }89. /*90. * 获得画布的背景色91. */92. public Color getBgColor()93. {94. return bgColor;95. }96. /*97. *设置方块的颜色98. */99. public void setBlockColor(Color blockColor) 100. {101. this.blockColor = blockColor; 102. }103. /*104. *方块的颜色105. */106. public Color getBlockColor()107. {108. return blockColor;109. }110. /*111. *设置画布中方块的行数112. */113. public void setRows(int rows)114. {115. this.rows = rows;116. }117. /*118. *得到画布中方块的行数119. */120. public int getRows()121. {122. return rows;123. }124. /*125. *设置画布中方块的列数126. */127. public void setCols(int cols)128. {129. this.cols = cols;130. }131. /*132. *得到画布中方块的列数133. */134. public int getCols()135. {136. return cols;137. }138. /*139. *得到row行,col列的方格140. */141. public RussiaBox getBox(int row, int col)142. {143. if(row >= 0 && row < rows && col >= 0 && col < cols) 144. return boxes[row][col];145.146. else147. return null;148. }149. /*150. *在画布中绘制方块151. */152. public void paintComponent(Graphics g)153. {154. super.paintComponent(g);155.156. fanning();157. for(int i = 0; i < boxes.length; i ++)158. for(int j = 0; j < boxes[i].length; j ++)159. {160. Color color = boxes[i][j].isColorBox() ? blockCo lor : bgColor;161. g.setColor(color);162. g.fill3DRect(j * boxWidth, i * boxHeight , boxWi dth , boxHeight , true);163. }164. }165. /*166. *清除第row行167. */168. public void removeLine(int row)169. {170. for(int i = row; i > 0; i --)171. for(int j = 0; j < cols; j ++)172. {173. boxes[i][j] = (RussiaBox)boxes[i-1][j].clone();174. }175. }176. /*177. *重置为初始时的状态178. */179. public void reset()180. {181. for(int i = 0; i < boxes.length; i++)182. for(int j = 0 ;j < boxes[i].length; j++)183. {184. boxes[i][j].setColor(false);185. }186. repaint();187. }188. /*189. * 根据窗体的大小自动调整方格的大小190. */191. public void fanning()192. {193. boxWidth = getSize().width / cols;194. boxHeight = getSize().height / rows;195. }196.197.}198./*199. * 方块类200. */201.class RussiaBlock extends Thread202.{203. private int style,y,x,level;204. private boolean moving,pausing;205. private RussiaBox boxes[][];206. private GameCanvas canvas;207.208. public final static int ROWS = 4;209. public final static int COLS = 4;210. public final static int BLOCK_KIND_NUMBER = 7;211. public final static int BLOCK_STATUS_NUMBER = 4; 212. public final static int BETWEEN_LEVELS_TIME = 50; 213. public final static int LEVEL_FLATNESS_GENE = 3; 214.216. *方块的所有风格及其不同的状态217. */218. public final static int[][] STYLES = {// 共28种状态219. {0x0f00, 0x4444, 0x0f00, 0x4444}, // 长条型的四种状态220. {0x04e0, 0x0464, 0x00e4, 0x04c4}, // 'T'型的四种状态221. {0x4620, 0x6c00, 0x4620, 0x6c00}, // 反'Z'型的四种状态222. {0x2640, 0xc600, 0x2640, 0xc600}, // 'Z'型的四种状态223. {0x6220, 0x1700, 0x2230, 0x0740}, // '7'型的四种状态224. {0x6440, 0x0e20, 0x44c0, 0x8e00}, // 反'7'型的四种状态225. {0x0660, 0x0660, 0x0660, 0x0660}, // 方块的四种状态226. };227. /*228. *构造函数229. */230. public RussiaBlock(int y,int x,int level,int style) 231. {232.233. this.y = y;234. this.x = x;235. this.level = level;236. moving = true;237. pausing = false;238. this.style = style;239.240. canvas = GameCanvas.getCanvasInstance();241.242. boxes = new RussiaBox[ROWS][COLS];243. int key = 0x8000;244. for(int i = 0; i < boxes.length; i++)245. for(int j = 0; j < boxes[i].length; j++)246. {247. boolean isColor = ( (style & key) != 0 ); 248. boxes[i][j] = new RussiaBox(isColor);249. key >>= 1;250. }251. display();252. }253. /*254. *线程的 run方法控制放块的下落及下落速度255. */256. public void run()258. while(moving)259. {260. try261. {262. sleep( BETWEEN_LEVELS_TIME * (RussiaBlocksGame.MAX_LEV EL - level + LEVEL_FLATNESS_GENE) );263. if(!pausing)264. moving = ( moveTo(y + 1,x) && moving ); 265. }catch(InterruptedException e)266. {267. e.printStackTrace();268. }269. }270. }271. /*272. *暂停移动273. */274. public void pauseMove()275. {276. pausing = true;277. }278. /*279. *从暂停状态恢复280. */281. public void resumeMove()282. {283. pausing = false;284. }285.286. /*287. *停止移动288. */289. public void stopMove()290. {291. moving = false;292. }293./*294. *向左移一格295. */296. public void moveLeft()297. {298. moveTo(y , x - 1);299. }301. *向右移一格302. */303. public void moveRight()304. {305. moveTo(y , x + 1);306. }307. /*308. *向下移一格,返回与其他几个不同,为了一键到底309. */310. public boolean moveDown()311. {312. if(moveTo(y + 1, x))313. return true;314. else315. return false;316. }317. /*318. *移到newRow,newCol位置319. */320. public synchronized boolean moveTo(int newRow, int newCol )321. {322. //erase();//必须在判断前进行擦除,否则isMoveable将产生错误行为323.324. if(!moving || !isMoveable(newRow,newCol))325. {326. display();327. return false;328. }329. y = newRow;330. x = newCol;331. display();332. canvas.repaint();333. return true;334. }335. /*336. *判断能否移到newRow,newCol位置337. */338. private boolean isMoveable(int newRow, int newCol) 339. {340. erase();341. for(int i = 0; i < boxes.length; i ++)342. for(int j = 0; j< boxes[i].length; j ++ )343. {344. if( boxes[i][j].isColorBox() )345. {346. RussiaBox box = canvas.getBox(newRow + i, newC ol + j);347. if(box == null || box.isColorBox())348. return false;349. }350. }351. return true;352. }353. /*354. *通过旋转变为下一种状态355. */356. public void turnNext()357. {358. int newStyle = 0;359. for(int i = 0; i < STYLES.length; i ++)360. for(int j = 0 ;j < STYLES[i].length; j++)361. {362. if(style == STYLES[i][j])363. {364. newStyle = STYLES[i][(j + 1)%BLOCK_STATUS_NUMB ER];365. break;366. }367. }368. turnTo(newStyle);369. }370. /*371. *通过旋转变能否变为newStyle状态372. */373. private synchronized boolean turnTo(int newStyle) 374. {375. //erase();//擦除之后在判断isTurnNextAble376. if(!moving || !isTurnable(newStyle))377. {378. display();379. return false;380. }381.382. style=newStyle;383. int key = 0x8000;384.385. for(int i = 0; i < boxes.length; i ++)386. for(int j = 0 ;j < boxes[i].length; j++)387. {388. boolean isColor = ((key & style) != 0 );389. boxes[i][j].setColor(isColor);390. key >>=1;391. }392. display();393. canvas.repaint();394. return true;395. }396. /*397. *判断通过旋转能否变为下一种状态398. */399. private boolean isTurnable(int newStyle)400. {401. erase();402. int key = 0x8000;403. for(int i = 0; i< boxes.length; i++)404. for(int j=0; j<boxes[i].length; j++)405. {406. if((key & newStyle) != 0)407. {408. RussiaBox box = canvas.getBox(y + i, x + j);409. if(box == null || box.isColorBox())410. return false;411. }412. key >>= 1;413. }414. return true;415. }416. /*417. *擦除当前方块(只是设置isColor属性,颜色并没有清除,为了判断能否移动之用)418. */419. private void erase()420. {421. for(int i = 0; i < boxes.length; i ++)422. for(int j = 0; j< boxes[i].length; j ++ )423. {424. if( boxes[i][j].isColorBox() )425. {426. RussiaBox box = canvas.getBox( y + i, x + j);427. if(box != null)428. box.setColor(false);429. }430. }431. }432. /*433. *显示当前方块(其实只是设置Color属性,在调用repaint方法时才真正显示)434. */435. private void display()436. {437. for(int i = 0; i < boxes.length; i ++)438. for(int j = 0;j< boxes[i].length ; j ++)439. {440. if(boxes[i][j].isColorBox())441. {442. RussiaBox box = canvas.getBox( y + i, x + j); 443. if(box != null)444. box.setColor( true );445. }446. }447. }448.}449./*450. * 控制面板类451. */452.import java.awt.*;453.import java.awt.event.*;454.import javax.swing.*;455.import javax.swing.border.*;456.457.class ControlPanel extends JPanel458.{459. private TipBlockPanel tipBlockPanel;460. private JPanel tipPanel,InfoPanel,buttonPanel;461. private final JTextField levelField,scoreField;462. private JButton playButton,pauseButton,stopButton, 463. turnHarderButton,turnEasilyButton; 464. private EtchedBorder border=new EtchedBorder(EtchedBorde r.RAISED,Color.WHITE, new Color(148, 145, 140)) ;465.466. private RussiaBlocksGame game;467. private Timer timer;468.469. public ControlPanel(final RussiaBlocksGame game) 470. {471. this.game = game;472. /*473. *图形界面部分474. */475. setLayout(new GridLayout(3,1,0,4));476.477. tipBlockPanel = new TipBlockPanel();478. tipPanel = new JPanel( new BorderLayout() );479. tipPanel.add( new JLabel("Next Block:") , BorderLayout.N ORTH );480. tipPanel.add( tipBlockPanel , BorderLayout.CENTER ); 481. tipPanel.setBorder(border);482.483. InfoPanel = new JPanel( new GridLayout(4,1,0,0) ); 484. levelField = new JTextField(""+RussiaBlocksGame.DEFAULT_ LEVEL);485. levelField.setEditable(false);486. scoreField = new JTextField("0");487. scoreField.setEditable(false);488. InfoPanel.add(new JLabel("Level:"));489. InfoPanel.add(levelField);490. InfoPanel.add(new JLabel("Score:"));491. InfoPanel.add(scoreField);492. InfoPanel.setBorder(border);493.494. buttonPanel = new JPanel(new GridLayout(5,1,0,0)); 495. playButton = new JButton("Play");496. pauseButton = new JButton("Pause");497. stopButton = new JButton("Stop");498. turnHarderButton = new JButton("Turn harder");499. turnEasilyButton = new JButton("Turn easily");500.501. buttonPanel.add(playButton);502. buttonPanel.add(pauseButton);503. buttonPanel.add(stopButton);504. buttonPanel.add(turnHarderButton);505. buttonPanel.add(turnEasilyButton);506. buttonPanel.setBorder(border);507.508. addKeyListener(new ControlKeyListener());//添加510. add(tipPanel);511. add(InfoPanel);512. add(buttonPanel);513. /*514. *添加事件监听器515. */516. playButton.addActionListener(517. new ActionListener()518. {519. public void actionPerformed(ActionEvent event) 520. {521. game.playGame();522. requestFocus();//让ControlPanel重新获得焦点以响应键盘事件523. }524. });525.526. pauseButton.addActionListener(527. new ActionListener()528. {529. public void actionPerformed(ActionEvent event) 530. {531. if(pauseButton.getText().equals("Pause"))532. game.pauseGame();533. else534. game.resumeGame();535. requestFocus();//让ControlPanel重新获得焦点以响应键盘事件536. }537. }538. );539. stopButton.addActionListener(540. new ActionListener()541. {542. public void actionPerformed(ActionEvent event) 543. {544. game.stopGame();545. requestFocus();//让ControlPanel重新获得焦点以响应键盘事件546. }547. });548. turnHarderButton.addActionListener(549. new ActionListener()551. public void actionPerformed(ActionEvent event) 552. {553. int level = 0;554. try{555. level = Integer.parseInt(levelField.getText());556. setLevel(level + 1);557. }catch(NumberFormatException e)558. {559. e.printStackTrace();560. }561. requestFocus();//让ControlPanel重新获得焦点以响应键盘事件562. }563. });564. turnEasilyButton.addActionListener(565. new ActionListener()566. {567. public void actionPerformed(ActionEvent event) 568. {569. int level = 0;570. try{571. level = Integer.parseInt(levelField.getText());572. setLevel(level - 1);573. }catch(NumberFormatException e)574. {575. e.printStackTrace();576. }577. requestFocus();//让ControlPanel重新获得焦点以响应键盘事件578. }579. });580. /*581. * 时间驱动程序,每格500毫秒对level,score值进行更新582. */583. timer = new Timer(500,584. new ActionListener()585. {586. public void actionPerformed(ActionEvent event) 587. {588. scoreField.setText(""+game.getScore());589. game.levelUpdate();591. }592. );593. timer.start();594. }595. /*596. * 设置预显方块的样式597. */598. public void setBlockStyle(int style)599. {600. tipBlockPanel.setStyle(style);601. tipBlockPanel.repaint();602. }603. /*604. * 重置,将所有数据恢复到最初值605. */606. public void reset()607. {608. levelField.setText(""+RussiaBlocksGame.DEFAULT_LEVEL);609. scoreField.setText("0");610. setPlayButtonEnabled(true);611. setPauseButtonLabel(true);612. tipBlockPanel.setStyle(0);613. }614.615. /*616. *设置playButton是否可用617. */618. public void setPlayButtonEnabled(boolean enable) 619. {620. playButton.setEnabled(enable);621. }622.623. /*624. *设置pauseButton的文本625. */626. public void setPauseButtonLabel(boolean pause)627. {628. pauseButton.setText( pause ? "Pause" : "Rusume" ); 629. }630.631. /*632. *设置方块的大小,改变窗体大小时调用可自动调整方块到合适的尺寸633. */634. public void fanning()635. {636. tipBlockPanel.fanning();637. }638. /*639. *根据level文本域的值返回当前的级别640. */641. public int getLevel()642. {643. int level = 0;644. try645. {646. level=Integer.parseInt(levelField.getText()); 647. }catch(NumberFormatException e)648. {649. e.printStackTrace();650. }651. return level;652. }653. /*654. * 设置level文本域的值655. */656. public void setLevel(int level)657. {658. if(level > 0 && level <= RussiaBlocksGame.MAX_LEVEL)659. levelField.setText("" + level);660. }661. /*662. * 内部类为预显方块的显示区域663. */664. private class TipBlockPanel extends JPanel665. {666. private Color bgColor = Color.darkGray,667. blockColor = Color.lightGray;668. private RussiaBox [][]boxes = new RussiaBox[RussiaBloc k.ROWS][RussiaBlock.COLS];669. private int boxWidth, boxHeight,style;670. private boolean isTiled = false;671.672. /*673. * 构造函数674. */675. public TipBlockPanel()676. {677. for(int i = 0; i < boxes.length; i ++)678. for(int j = 0; j < boxes[i].length; j ++)679. {680. boxes[i][j]=new RussiaBox(false);681. }682. style = 0x0000;683. }684. /*685. * 构造函数686. */687. public TipBlockPanel(Color bgColor, Color blockColor)688. {689. this();690. this.bgColor = bgColor;691. this.blockColor = blockColor;692. }693. /*694. * 设置方块的风格695. */696. public void setStyle(int style)697. {698. this.style = style;699. repaint();700. }701.702. /*703. * 绘制预显方块704. */705. public void paintComponent(Graphics g)706. {707. super.paintComponent(g);708.709. int key = 0x8000;710.711. if(!isTiled)712. fanning();713. for(int i = 0; i < boxes.length; i ++)714. for(int j = 0; j<boxes[i].length ;j ++)715. {716. Color color = (style & key) != 0 ? blockColor : bgColor;717. g.setColor(color);718. g.fill3DRect(j * boxWidth, i * boxHeight, boxWidt h, boxHeight, true);719. key >>=1;720. }721. }722. /*723. *设置方块的大小,改变窗体大小时调用可自动调整方块到合适的尺寸724. */725.726. public void fanning()727. {728. boxWidth = getSize().width / RussiaBlock.COLS; 729. boxHeight = getSize().height /RussiaBlock.ROWS; 730. isTiled=true;731. }732. }733. /*734. *内部类键盘键听器,响应键盘事件735. */736. class ControlKeyListener extends KeyAdapter {737. public void keyPressed(KeyEvent ke)738. {739. if (!game.isPlaying()) return;740.741. RussiaBlock block = game.getCurBlock();742. switch (ke.getKeyCode()) {743. case KeyEvent.VK_DOWN:744. block.moveDown();745. break;746. case KeyEvent.VK_LEFT:747. block.moveLeft();748. break;749. case KeyEvent.VK_RIGHT:750. block.moveRight();751. break;752. case KeyEvent.VK_UP:753. block.turnNext();754. break;755. case KeyEvent.VK_SPACE://一键到底756. while(block.moveDown())757. {758. }759. break;760. default:761. break;762. }763. }764. }765.}766./*767. * 主游戏类768. */769.import java.awt.*;770.import java.awt.event.*;771.import javax.swing.*;772.773.public class RussiaBlocksGame extends JFrame774.{775. public final static int PER_LINE_SCORE = 100;//消去一行得分776. public final static int PER_LEVEL_SCORE = PER_LINE_SCORE* 20;//升一级需要的分数777. public final static int DEFAULT_LEVEL = 5;//默认级别778. public final static int MAX_LEVEL = 10;//最高级别779. private int score=0,curLevelScore = 0;//总分和本级得分780.781. private GameCanvas canvas;782. private ControlPanel controlPanel;783. private RussiaBlock block;784.785. private int style = 0;786. boolean playing = false;787.788. private JMenuBar bar;789. private JMenu gameMenu,controlMenu,windowStyleMenu,inform ationMenu;790. private JMenuItem newGameItem,setBlockColorItem,setBgColo rItem,791. turnHardItem,turnEasyItem,exitItem;792. private JMenuItem playItem,pauseItem,resumeItem,stopIte m;793. private JRadioButtonMenuItem windowsRadioItem,motifRadi oItem,metalRadioItem;794. private JMenuItem authorItem,helpItem;795. private ButtonGroup buttonGroup;796. /*797. * 构造函数798. */799. public RussiaBlocksGame(String title)800. {801. super(title);802.803. setSize(300,400);804. Dimension scrSize=Toolkit.getDefaultToolkit().getScreen Size();805. setLocation((scrSize.width-getSize().width)/2,(scrSize.height-getSize().height)/2);806.807. createMenu();808. Container container=getContentPane();809. container.setLayout(new BorderLayout());810.811. canvas = GameCanvas.getCanvasInstance();812. controlPanel = new ControlPanel(this);813.814. container.add(canvas,BorderLayout.CENTER);815. container.add(controlPanel,BorderLayout.EAST); 816.817. addWindowListener(818. new WindowAdapter()819. {820. public void windowClosing(WindowEvent event)821. {822. stopGame();823. System.exit(0);824. }825. }826. );827.828. addComponentListener(829. new ComponentAdapter()830. {831. public void componentResized(ComponentEvent event) 832. {833. canvas.fanning();834. }835. }837. canvas.fanning();838. setVisible(true);839. }840. /*841. * 判断游戏是否正在进行842. */843. public boolean isPlaying()844. {845. return playing;846. }847. /*848. * 开始游戏并设置按钮和菜单项的可用性849. */850. public void playGame()851. {852. play();853. controlPanel.setPlayButtonEnabled(false); 854. playItem.setEnabled(false);855. }856. /*857. * 暂停游戏858. */859. public void pauseGame()860. {861. if(block != null) block.pauseMove(); 862. controlPanel.setPauseButtonLabel(false); 863. pauseItem.setEnabled(false);864. resumeItem.setEnabled(true);865. }866. /*867. * 从暂停中恢复游戏868. */869. public void resumeGame()870. {871. if(block != null) block.resumeMove(); 872. controlPanel.setPauseButtonLabel(true); 873. pauseItem.setEnabled(true);874. resumeItem.setEnabled(false);875. }876. /*877. * 停止游戏878. */879. public void stopGame()881. if(block != null) block.stopMove(); 882. playing = false;883. controlPanel.setPlayButtonEnabled(true); 884. controlPanel.setPauseButtonLabel(true); 885. playItem.setEnabled(true); 886. }887. /*888. * 得到当前级别889. */890. public int getLevel()891. {892. return controlPanel.getLevel();893. }894. /*895. * 设置当前级别,并更新控制面板的显示896. */897. public void setLevel(int level)898. {899. if(level>0&&level<11)900. controlPanel.setLevel(level);901. }902. /*903. * 得到当前总分数904. */905. public int getScore()906. {907. if(canvas != null)908. return score;909. return 0;910. }911. /*912. * 得到本级得分913. */914. public int getCurLevelScore()915. {916. if(canvas != null)917. return curLevelScore;918. return 0;919. }920. /*921. * 更新等级922. */923. public void levelUpdate()925. int curLevel = getLevel();926. if(curLevel < MAX_LEVEL && curLevelScore >= PER_LEVEL_ SCORE)927. {928. setLevel(curLevel + 1);929. curLevelScore -= PER_LEVEL_SCORE;930. }931. }932. /*933. * 获得当前得方块934. */935. public RussiaBlock getCurBlock() {936. return block;937. }938. /*939. * 开始游戏940. */941. private void play()942. {943. playing=true;944. Thread thread = new Thread(new Game());945. thread.start();946. reset();947. }948. /*949. * 重置950. */951. private void reset()952. {953. controlPanel.reset();954. canvas.reset();955. score = 0;956. curLevelScore = 0;957. }958. /*959. * 宣告游戏结束960. */961. private void reportGameOver()962. {963. JOptionPane.showMessageDialog(this,"Game over!"); 964. }965. /*966. * 创建菜单968. private void createMenu()969. {970. gameMenu = new JMenu("Game");971. newGameItem = new JMenuItem("New Game");972. setBlockColorItem = new JMenuItem("Set Block Color...") ;973. setBgColorItem = new JMenuItem("Set BackGround Color...");974. turnHardItem = new JMenuItem("Turn Harder");975. turnEasyItem = new JMenuItem("Turn Easily");976. exitItem = new JMenuItem("Exit");977. gameMenu.add(newGameItem);978. gameMenu.add(setBlockColorItem);979. gameMenu.add(setBgColorItem);980. gameMenu.add(turnHardItem);981. gameMenu.add(turnEasyItem);982. gameMenu.add(exitItem);983.984. controlMenu = new JMenu("Control");985. playItem = new JMenuItem("Play");986. pauseItem = new JMenuItem("Pause");987. resumeItem = new JMenuItem("Resume");988. stopItem = new JMenuItem("Stop");989. controlMenu.add(playItem);990. controlMenu.add(pauseItem);991. controlMenu.add(resumeItem);992. controlMenu.add(stopItem);993.994. windowStyleMenu = new JMenu("WindowStyle");995. buttonGroup = new ButtonGroup();996. windowsRadioItem = new JRadioButtonMenuItem("Windows") ;997. motifRadioItem = new JRadioButtonMenuItem("Motif"); 998. metalRadioItem = new JRadioButtonMenuItem("Mentel",true);999. windowStyleMenu.add(windowsRadioItem);1000. buttonGroup.add(windowsRadioItem);1001. windowStyleMenu.add(motifRadioItem);1002. buttonGroup.add(motifRadioItem);1003. windowStyleMenu.add(metalRadioItem);1004. buttonGroup.add(metalRadioItem);1005.1006. informationMenu = new JMenu("Information");1007. authorItem = new JMenuItem("Author:Fuliang"); 1008. helpItem = new JMenuItem("Help");1009. informationMenu.add(authorItem);1010. informationMenu.add(helpItem);1011.1012. bar = new JMenuBar();1013. bar.add(gameMenu);1014. bar.add(controlMenu);1015. bar.add(windowStyleMenu);1016. bar.add(informationMenu);1017.1018. addActionListenerToMenu();1019. setJMenuBar(bar);1020. }1021. /*1022. * 添加菜单响应1023. */1024. private void addActionListenerToMenu()1025. {1026. newGameItem.addActionListener(new ActionListener() { 1027. public void actionPerformed(ActionEvent ae) { 1028. stopGame();1029. reset();1030. setLevel(DEFAULT_LEVEL);1031. }1032. });1033.1034. setBlockColorItem.addActionListener(new ActionListener() {1035. public void actionPerformed(ActionEvent ae) { 1036. Color newBlockColor =1037. JColorChooser.showDialog(RussiaBlocksGame.this ,1038. "Set color for block", canvas.getBlock Color());1039. if (newBlockColor != null)1040. canvas.setBlockColor(newBlockColor);1041. }1042. });1043.1044. setBgColorItem.addActionListener(new ActionListener() {1045. public void actionPerformed(ActionEvent ae) { 1046. Color newBgColor =1047. JColorChooser.showDialog(RussiaBlocksGame.this ,"Set color for block",1048. canvas.getBgColor()); 1049. if (newBgColor != null)1050. canvas.setBgColor(newBgColor);1051. }1052. });1053.1054. turnHardItem.addActionListener(new ActionListener() { 1055. public void actionPerformed(ActionEvent ae) { 1056. int curLevel = getLevel();1057. if (curLevel < MAX_LEVEL) setLevel(curLevel + 1); 1058. }1059. });1060.1061. turnEasyItem.addActionListener(new ActionListener() { 1062. public void actionPerformed(ActionEvent ae) { 1063. int curLevel = getLevel();1064. if (curLevel > 1) setLevel(curLevel - 1);1065. }1066. });1067.1068. exitItem.addActionListener(new ActionListener() { 1069. public void actionPerformed(ActionEvent ae) { 1070. System.exit(0);1071. }1072. });1073. playItem.addActionListener(new ActionListener() { 1074. public void actionPerformed(ActionEvent ae) { 1075. playGame();1076. }1077. });1078.1079. pauseItem.addActionListener(new ActionListener() { 1080. public void actionPerformed(ActionEvent ae) { 1081. pauseGame();1082. }1083. });1084.1085. resumeItem.addActionListener(new ActionListener() { 1086. public void actionPerformed(ActionEvent ae) { 1087. resumeGame();1088. }1089. });。
俄罗斯方块完整源代码

//不多说,直接可以拷贝下面的东西,就可以运行。
package day04;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.applet.*;import ng.String.*;import ng.*;import java.io.*;public class ERSBlock extends JPanel implements ActionListener,KeyListener//应该是继承JPanel{static Button but[] = new Button[6];static Button noStop = new Button("取消暂停"); static Label scoreLab = new Label("分数:");static Label infoLab = new Label("提示:");static Label speedLab = new Label("级数:");static Label scoreTex = new Label("0");static Label infoTex = new Label(" ");static Label speedTex = new Label("1");static JFrame jf = new JFrame();static MyTimer timer;static ImageIcon icon=new ImageIcon("resource/Block.jpg");static JMenuBar mb = new JMenuBar();static JMenu menu0 = new JMenu("游戏 ");static JMenu menu1 = new JMenu("帮助 ");static JMenuItem mi0 = new JMenuItem("新游戏"); static JMenuItem mi1 = new JMenuItem("退出");static JMenuItem mi1_0 = new JMenuItem("关于"); static JDialog dlg_1;static JTextArea dlg_1_text = new JTextArea(); static int startSign= 0;//游戏开始标志 0 未开始 1 开始 2 暂停static String butLab[] = {"开始游戏","重新开始","降低级数","提高级数","游戏暂停","退出游戏"};static int game_body[][] = new int[19][10];static int game_sign_x[] = new int[4];//用于记录4个方格的水平位置static int game_sign_y[] = new int[4];//用于记录4个方格的垂直位置static boolean downSign = false;//是否落下static int blockNumber = 1;//砖块的编号static int gameScore = 0;//游戏分数static int speedMark = 1;public static void main(String args[]) {ERSBlock myBlock = new ERSBlock();mb.add(menu0);mb.add(menu1);menu0.add(mi0);menu0.add(mi1);menu1.add(mi1_0);jf.setJMenuBar(mb);myBlock.init();jf.add(myBlock);jf.setSize(565,501);jf.setResizable(false);jf.setTitle("俄罗斯方块");jf.setIconImage(icon.getImage());jf.setLocation(200,100);jf.show();timer = new MyTimer(myBlock); //启动线程timer.setDaemon(true);timer.start();timer.suspend();}public void init(){setLayout(null);for(int i = 0;i < 6;i++){but[i] = new Button(butLab[i]);add(but[i]);but[i].addActionListener(this);but[i].addKeyListener(this);but[i].setBounds(360,(240 + 30 * i),160,25); }add(scoreLab);add(scoreTex);add(speedLab);add(speedTex);add(infoLab);add(infoTex);add(scoreLab);scoreLab.setBounds(320,15,30,20); scoreTex.setBounds(360,15,160,20); scoreTex.setBackground(Color.white); speedLab.setBounds(320,45,30,20); speedTex.setBounds(360,45,160,20); speedTex.setBackground(Color.white);but[1].setEnabled(false);but[4].setEnabled(false);infoLab.setBounds(320,75,30,20); infoTex.setBounds(360,75,160,20); infoTex.setBackground(Color.white); noStop.setBounds(360,360,160,25); noStop.addActionListener(this); noStop.addKeyListener(this);mi0.addActionListener(this);mi1.addActionListener(this);mi1_0.addActionListener(this);num_csh_game();rand_block();}public void actionPerformed(ActionEvent e){if(e.getSource() == but[0])//开始游戏{startSign = 1;infoTex.setText("游戏已经开始!");but[0].setEnabled(false);but[1].setEnabled(true);but[4].setEnabled(true);timer.resume();}if(e.getSource() == but[1]||e.getSource() == mi0)//重新开始游戏{startSign = 0;gameScore = 0;timer.suspend();num_csh_restart();repaint();rand_block();scoreTex.setText("0");infoTex.setText("新游戏!");but[0].setEnabled(true);but[1].setEnabled(false);but[4].setEnabled(false);}if(e.getSource() == but[2])//降低级数 {infoTex.setText("降低级数!"); speedMark--;if(speedMark <= 1){speedMark = 1;infoTex.setText("已经是最低级数!"); }speedTex.setText(speedMark + ""); }if(e.getSource() == but[3])//提高级数 {infoTex.setText("提高级数!");speedMark++;if(speedMark >= 9){speedMark = 9;infoTex.setText("已经是最高级数!"); }speedTex.setText(speedMark + ""); }if(e.getSource() == but[4])//游戏暂停 {this.add(noStop);this.remove(but[4]);infoTex.setText("游戏暂停!"); timer.suspend();}if(e.getSource() == noStop)//取消暂停 {this.remove(noStop);this.add(but[4]);infoTex.setText("继续游戏!"); timer.resume();}if(e.getSource() == but[5]||e.getSource() == mi1)//退出游戏{jf.dispose();}if(e.getSource() == mi1_0)//退出游戏{dlg_1 = new JDialog(jf,"关于");try{FileInputStream io = new FileInputStream("resource/guanyu.txt");//得到路径byte a[] = new byte[io.available()];io.read(a);io.close();String str = new String(a);dlg_1_text.setText(str);}catch(Exception g){}dlg_1_text.setEditable(false);dlg_1.add(dlg_1_text);dlg_1.pack();dlg_1.setResizable(false);dlg_1.setSize(200, 120);dlg_1.setLocation(400, 240);dlg_1.show();}}public void rand_block()//随机产生砖块{int num;num = (int)(Math.random() * 6) + 1;//产生0~6之间的随机数blockNumber = num;switch(blockNumber){case 1: block1(); blockNumber = 1; break;case 2: block2(); blockNumber = 2; break;case 3: block3(); blockNumber = 3; break;case 4: block4(); blockNumber = 4; break;case 5: block5(); blockNumber = 5; break;case 6: block6(); blockNumber = 6; break;case 7: block7(); blockNumber = 7; break;}}public void change_body(int blockNumber)//改变砖块状态{dingwei();if(blockNumber == 1&&downSign == false)//变换长条2种情况{if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[3] <= 16)//说明长条是横着的{if(game_body[game_sign_y[0] - 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[3] + 2][game_sign_x[3] - 2] != 2){num_csh_game();game_body[game_sign_y[0] - 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] + 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] + 2][game_sign_x[3] - 2] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] >= 1&&game_sign_x[3] <= 7)//说明长条是竖着的{if(game_body[game_sign_y[0] +1][game_sign_x[0]-1] != 2&&game_body[game_sign_y[3] -2][game_sign_x[3] + 2] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]]=1;game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 3&&downSign == false)//变换转弯1有4种情况{if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] == game_sign_x[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] >= 1){if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;= 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] <= 17){if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;= 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[1] == game_sign_x[2]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[0] == game_sign_y[1]&&game_sign_x[3] <= 8){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1]= 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[0] == game_sign_x[3]) {if(game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3]][game_sign_x[3] + 2] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3]][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 4&&downSign == false)//变换转弯2有4种情况{if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[3] <= 7){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3]][game_sign_x[3] + 2] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3]][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[1] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[2]) {if(game_body[game_sign_y[1]][game_sign_x[1] + 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0]] = 1;game_body[game_sign_y[1]][game_sign_x[1] + 2] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[0] >= 2){if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[0] == game_sign_y[2]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[0] <= 16){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] != 2&&game_body[game_sign_y[2]][game_sign_x[2] - 2] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] = 1;game_body[game_sign_y[2]][game_sign_x[2] - 2] = 1;game_body[game_sign_y[3]][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 5&&downSign == false)//变换转弯3有4种情况{if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[2] == game_sign_x[3]&&game_sign_y[0] == game_sign_y[1]&&game_sign_x[1] >= 2){if(game_body[game_sign_y[0] + 1][game_sign_x[0] -1] != 2&&game_body[game_sign_y[1]][game_sign_x[1] -2] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1] - 2] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[1]&&game_sign_y[0] <= 16){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[2] == game_sign_y[3]) {if(game_body[game_sign_y[0] + 1][game_sign_x[0] -1] != 2&&game_body[game_sign_y[2]][game_sign_x[2] +2] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2]][game_sign_x[2] + 2] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[2] == game_sign_x[3]){if(game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 6&&downSign == false)//变换两层砖块1的2种情况{if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[0] >= 2){if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] -1 ] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[3] <= 17){if(game_body[game_sign_y[0]][game_sign_x[0] + 2] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] + 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] + 2] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] + 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 7&&downSign == false)//变换两层砖块2的2种情况{if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] <= 16){if(game_body[game_sign_y[0]][game_sign_x[0] + 2] != 2&&game_body[game_sign_y[1] - 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] + 2] = 1;game_body[game_sign_y[1] - 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[2] <= 17)if(game_body[game_sign_y[0] + 1][game_sign_x[0] -1] != 2&&game_body[game_sign_y[1]][game_sign_x[1] -2] != 2&&game_body[game_sign_y[2] + 1][game_sign_x[2] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1] - 2] = 1;game_body[game_sign_y[2] + 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3]][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}}public void num_csh_game()//数组清零for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 2){game_body[i][j] = 2;}else{game_body[i][j] = 0;}}}}public void num_csh_restart()//重新开始时数组清零 {for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++)game_body[i][j] = 0;}}}public void keyTyped(KeyEvent e){}public void keyPressed(KeyEvent e){if(e.getKeyCode() == KeyEvent.VK_DOWN&&startSign == 1)//处理下键{this.down();}if(e.getKeyCode() == KeyEvent.VK_LEFT&&startSign == 1)//处理左键{this.left();}if(e.getKeyCode() == KeyEvent.VK_RIGHT&&startSign== 1)//处理右键{this.right();}if(e.getKeyCode() == KeyEvent.VK_UP&&startSign== 1)//处理上键转换{this.change_body(blockNumber);}if(startSign == 0){infoTex.setText("游戏未开始或已结束!");}}public void keyReleased(KeyEvent e){}public void paint(Graphics g){g.setColor(Color.black);g.fill3DRect(0,0,300,450,true);for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 1){g.setColor(Color.blue);g.fill3DRect(30*j,30*(i-4),30,30,true); }if(game_body[i][j] == 2){g.setColor(Color.magenta);g.fill3DRect(30*j,30*(i-4),30,30,true); }}}}public void left()//向左移动{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_x[k] == 0||game_body[game_sign_y[k]][game_sign_x[k] - 1] == 2){sign = 1;}}if(sign == 0&&downSign == false){num_csh_game();for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k] - 1] = 1; }infoTex.setText("向左移动!");repaint();}}public void right()//向右移动{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_x[k] == 9||game_body[game_sign_y[k]][game_sign_x[k] + 1] == 2){sign = 1;}}if(sign == 0&&downSign == false){num_csh_game();for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k] + 1] = 1; }infoTex.setText("向右移动!");repaint();}}public void down()//下落{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_y[k] == 18||game_body[game_sign_y[k] + 1][game_sign_x[k]] == 2){sign = 1;downSign = true;changeColor();cancelDW();getScore();if(game_over() == false){rand_block();repaint();}}}if(sign == 0){num_csh_game();for(int k = 0;k < 4;k++){game_body[game_sign_y[k] + 1][game_sign_x[k]] = 1;}infoTex.setText("游戏进行中!");repaint();}}public boolean game_over()//判断游戏是否结束{int sign=0;for(int i = 0;i < 10;i++){if(game_body[4][i] == 2){sign = 1;}}if(sign == 1){infoTex.setText("游戏结束!");changeColor();repaint();startSign = 0;timer.suspend();return true;}elsereturn false;}public void getScore()//满行消除方法{for(int i = 0;i < 19;i++){int sign = 0;for(int j = 0;j < 10;j++){if(game_body[i][j] == 2){sign++;}}if(sign == 10){gameScore += 100;scoreTex.setText(gameScore+"");infoTex.setText("恭喜得分!");for(int j = i;j >= 1;j--){for(int k = 0;k < 10;k++){game_body[j][k] = game_body[j - 1][k];}}}}}public void changeColor()//给已经落下的块换色{downSign = false;for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k]] = 2; }}public void dingwei()//确定其位置{int k = 0;cancelDW();for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 1){game_sign_x[k] = j;game_sign_y[k] = i;k++;}}}}public void cancelDW()//将定位数组初始化{for(int k = 0;k < 4;k++){game_sign_x[k] = 0;game_sign_y[k] = 0;}}public void block1()//长条{game_body[0][4] = 1;game_body[1][4] = 1;game_body[2][4] = 1;game_body[3][4] = 1;}public void block2()//正方形{game_body[3][4] = 1;game_body[3][5] = 1;game_body[2][5] = 1;}public void block3()//3加1(下) {game_body[1][4] = 1;game_body[2][4] = 1;game_body[3][4] = 1;game_body[3][5] = 1;}public void block4()//3加1(中) {game_body[1][4] = 1;game_body[2][4] = 1;game_body[3][4] = 1;game_body[2][5] = 1;}public void block5()//3加1(上) {game_body[1][4] = 1;game_body[2][4] = 1;game_body[1][5] = 1;}public void block6()//转折1 {game_body[1][5] = 1;game_body[2][5] = 1;game_body[2][4] = 1;game_body[3][4] = 1;}public void block7()//转折2 {game_body[1][4] = 1;game_body[2][4] = 1;game_body[2][5] = 1;game_body[3][5] = 1;}}//定时线程class MyTimer extends Thread {ERSBlock myBlock;public MyTimer(ERSBlock myBlock){this.myBlock = myBlock;}public void run(){while(myBlock.startSign == 1){try{sleep((10-myBlock.speedMark + 1)*100);myBlock.down();}catch(InterruptedException e){}}}}。
基于Java的俄罗斯方块的设计和实现(含源文件)

姓 名
学号
专 业
指导教师
摘 要
俄罗斯方块作为一款风靡全球的多样化终端游戏,经久不衰。俄罗斯方块简单的基本游戏规则是旋转、移动,游戏自动随机输出7种形状的方块,经旋转后可形成28种形状,方块堆叠在一起,排列成完整的一行或多行消除得分,积分达到一定程度会自动提升级别。该游戏上手简单、老少皆宜、家喻户晓。
2 系统的
对系统的需求分析就是用户和开发人员在“系统必须做什么”这个问题上实现相互理解,达到共识,从而形成双方认可的软件产品的需求规格。这样有利于提高软件开发过程中的能见度,便于对软件开发过程的控制与管理,便于采用工程化的模式开发软件,从而达到提高软件的质量,为开发人员、维护人员、管理人员之间的交流、协作提供便捷。作为工作成果的原始依据,系统的需求分析可以向潜在用户传递软件功能、性能的需求,使其能够判断该软件是否符合自己的需求。
游戏形状需求:用数组作为存储方块28种状态的数据结构,即长条形、Z字形、反Z形、田字形、7字形、反7形、T字型一共7种形状的向4个方向的旋转变形,各个方块要能实现它的任意变形,可设为顺时针变形或逆时针变形,一般为逆时针变形。方块的可否翻转需要加以判断,以防止其翻转越界。
键盘处理事件需求:方块下落时,可通过键盘方向键(上键、下键、左键、右键)或字母键I、K、J、L对下落方块进行向上(旋转变形)、向下(加速下落)、向左移动、向右移动。
鼠标处理事件需求:通过点击菜单栏中相应的菜单项或控制面板内的按钮,可以实现游戏的开始、结束、暂停、继续、提高等级、降低等级,预显方块形状的显示,分数、等级的显示,以及游戏帮助、颜色变换等功能。
显示需求:当方块填满一行时可以消行,剩余未填满的行逐次向下移动并统计分数。当达到一定分数的时候,会增加相应的等级。当方块充满主界面的每一行,方块不能再下落时,提示“Game Over”的字样。
俄罗斯方块源代码

C语言俄罗斯方块源代码Vc6.0编译通过#include<windows.h>#include<stdio.h>#include<time.h>#include<stdlib.h>#include<malloc.h>#include<conio.h>#define MAP_WIDTH10#define MAP_HEIGHT20#define BLOCKM"■"#define BKBLOCK"□"#define OUTSTD GetStdHandle(STD_OUTPUT_HANDLE)typedef int(*PFUN)(void *pData);void ShowMapArray(int map[MAP_HEIGHT][MAP_WIDTH]);//生成方块int xyIsInarrBlock(int arrBlock[4][2], int x, int y) //有返回1 没有返回0 {int i;for (i = 0;i<4;i++)if (arrBlock[i][0] == x && arrBlock[i][1] == y)return 1;return 0;}void GetTransBlocks(int arrBlock[4][2])//坐标模式4*4方块{int nTmp, x, y;int nCount = 1;int i;int nMinx = 0, nMiny = 0;memset(arrBlock, 0, 8 * sizeof(int));while (nCount < 4){nTmp = rand() % nCount;x = arrBlock[nTmp][0];y = arrBlock[nTmp][1];nTmp = rand() % 4;switch (nTmp){case 0:x--;break;case 1:y--;break;case 2:x++;break;case 3:y++;break;}if (xyIsInarrBlock(arrBlock, x, y))continue;arrBlock[nCount][0] = x;arrBlock[nCount][1] = y;if (nMinx > x)nMinx = x;if (nMiny > y)nMiny = y;nCount++;}for (i = 0;i<4;i++){if (nMinx < 0)arrBlock[i][0] -= nMinx;if (nMiny < 0)arrBlock[i][1] -= nMiny;}}//旋转void Ratat(int arrBlock[4][2], int Direct) // driect 1 顺时针方向旋转,-1 逆时针方向旋转{int i;int nMinx, nMiny;int nTmp;for (i = 0;i<4;i++){nTmp = arrBlock[i][0];arrBlock[i][0] = arrBlock[i][1] * (-1)*Direct;arrBlock[i][1] = nTmp*Direct;if (i == 0){nMinx = arrBlock[i][0];nMiny = arrBlock[i][1];}else{if (nMinx > arrBlock[i][0])nMinx = arrBlock[i][0];if (nMiny > arrBlock[i][1])nMiny = arrBlock[i][1];}}for (i = 0;i<4;i++){if (nMinx < 0)arrBlock[i][0] -= nMinx;if (nMiny < 0)arrBlock[i][1] -= nMiny;}}void gotoxy(int x, int y){COORD pos = { x,y };SetConsoleCursorPosition(OUTSTD, pos);}void showxy(int x, int y, int bShow){COORD pos = { x * 2 + 2,y + 2 };SetConsoleCursorPosition(OUTSTD, pos);if (bShow)printf(BLOCKM);elseprintf(BKBLOCK);}void DisShowCursor(){CONSOLE_CURSOR_INFO cci;GetConsoleCursorInfo(OUTSTD, &cci);cci.bVisible = FALSE;SetConsoleCursorInfo(OUTSTD, &cci);}int CheckBlockPlace(int map[MAP_HEIGHT][MAP_WIDTH], int x, int y, int block[4][2], int bShow) //判断位置是否可用{int i;if (x < 0 || y < 0 || x >= MAP_WIDTH || y >= MAP_HEIGHT)return 0;for (i = 0;i<4;i++){if (map[y + block[i][1]][x + block[i][0]] == 1 && bShow)return 0;if (y + block[i][1] >= MAP_HEIGHT || x + block[i][0] >= MAP_WIDTH)return 0;}return 1;}int ShowBlock(int x, int y, int block[4][2], int bShow){int i;for (i = 0;i<4;i++)showxy(block[i][0] + x, block[i][1] + y, bShow);return 1;}void LoadMap(int map[MAP_HEIGHT][MAP_WIDTH]){int i, j;DisShowCursor();system("cls");printf("----------------俄罗斯方块v0.1--------------");printf("\n\n");for (i = 0;i<MAP_HEIGHT;i++){printf(" ");for (j = 0;j<MAP_WIDTH;j++){if (map[i][j])printf(BLOCKM);elseprintf(BKBLOCK);}printf("\n");}gotoxy(MAP_WIDTH * 2 + 6, 4);printf("按s开始\n");gotoxy(MAP_WIDTH * 2 + 6, 5);printf("Next:");gotoxy(MAP_WIDTH * 2 + 6, 12);printf("分数:");}int gameDown(int map[MAP_HEIGHT][MAP_WIDTH], int blockxy[4][2], int nSec, PFUN OnFun, void *pOnData){int i, j, k;int nSelect;int x = 3, y = 0;static int maxy = 20;int missrow = 0;int xsum = 0;while (1){nSelect = OnFun(pOnData);if (nSelect){switch (nSelect){case 75:{if (CheckBlockPlace(map, x - 1, y, blockxy, 1))x--;}break;case 72:{Ratat(blockxy, 1);if (!CheckBlockPlace(map, x, y, blockxy, 1)){Ratat(blockxy, -1);}}break;case 77:{if (CheckBlockPlace(map, x + 1, y, blockxy, 1))x++;}break;}}else{if (CheckBlockPlace(map, x, y, blockxy, 1)){ShowBlock(x, y, blockxy, 1);Sleep(nSec);if (CheckBlockPlace(map, x, y + 1, blockxy, 1)){ShowBlock(x, y, blockxy, 0);y++;}else{for (i = 0;i<4;i++){map[y + blockxy[i][1]][x + blockxy[i][0]] = 1;}if (y < maxy)maxy = y;break;}}elsereturn -1;}}for (i = maxy;i<MAP_HEIGHT;i++){xsum = 0;for (j = 0;j<MAP_WIDTH;j++){xsum += map[i][j];}if (xsum == MAP_WIDTH){for (k = i;k >= maxy;k--)for (j = 0;j<MAP_WIDTH;j++)map[k][j] = map[k - 1][j];missrow++;LoadMap(map);}}return missrow;}// help functionvoid ShowMapArray(int map[MAP_HEIGHT][MAP_WIDTH]){int i, j;for (i = 0;i<MAP_HEIGHT;i++){COORD pos = { MAP_WIDTH * 2,i };SetConsoleCursorPosition(OUTSTD, pos);for (j = 0;j<MAP_WIDTH;j++){printf("%d", map[i][j]);}}}int GetInfo(void *pData){while (kbhit()){char ch1 = getch();if (ch1 < 0){ch1 = getch();}return ch1;}while (kbhit())getch();return 0;}int main(){int map[MAP_HEIGHT][MAP_WIDTH] = { 0 };int blockarrnow[4][2] = { 0 }, blockarrnext[4][2] = { 0 };int ch, nRe, i, j, nScro = 0, nSpeed = 300;BOOL bRun = TRUE;LoadMap(map);srand((unsigned)time(NULL));while (bRun){if (kbhit()){ch = getch();}if (ch == 's' || ch == 'S'){GetTransBlocks(blockarrnow);while (bRun){GetTransBlocks(blockarrnext);ShowBlock(MAP_WIDTH + 2, 5, blockarrnext, 1);nRe = gameDown(map, blockarrnow, nSpeed, GetInfo, NULL);for (i = 0;i<4;i++){blockarrnow[i][0] = blockarrnext[i][0];blockarrnow[i][1] = blockarrnext[i][1];}for (i = 0;i <= 4;i++)for (j = 0;j <= 4;j++){gotoxy(MAP_WIDTH * 2 + 4 + j * 2, 7 + i);printf(" ");}if (nRe < 0){bRun = FALSE;break;}else{nScro += (nRe * 100);gotoxy(MAP_WIDTH * 2 + 11, 12);printf("%d", nScro);}}}}return 0;}Vs2015 编译运行配图。
俄罗斯方块ABAP代码

*------------------------------------------------------------*
* 3.2) buttons
*------------------------------------------------------------*
* function z_nbcsh_delay .
* *"------------------------------------------------------------
* *" importing
* *" value(delay) type f default 1
* *"------------------------------------------------------------
AT PF23. "F7 ROTATE转
PERFORM fig_rotate."图形旋转
PERFORM out.
PERFORM f_call_rfc_wait.
AT PF24. "F8 RIGHT右
START-OF-SELECTION.
PERFORM init_figures."初始化方块子程序
PERFORM init_stakan."初始化图形界面子程序
PERFORM put_next_fig."下一个方块子程序
SET PF-STATUS 'STATUS_0'.
DATA: stakan TYPE c OCCURS 0,
stakan_fig LIKE stakan,
C语言编程俄罗斯方块的算法及源代码

//俄罗斯方块#include "stdio.h"#include "conio.h"#include "stdlib.h"#include "windows.h"#include "time.h"#define N 17#define M 13#define K 19int s[N][M]={{0,0,0},{0,0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}, {1},{1,0,0,1},{1,1,1,1,1,1,0,1,1,0,0,1,1}};/*当前状态*/inta[K][3][3]={{0,2,0,2,2,2},{0,2,0,2,2,0,0,2},{0,2,0,0,2,2,0,2},{2,2,2,0,2},{2,2,2,0,0,2 ,0},{2,0,0,2,2,2},{2,0,0,2,0,0,2,2},{0,0,2,0,0,2,0,2,2},{0,0,2,2,2,2},{2,2,2,2,0,0}, {2,2,0,0,2,0,0,2,0},{0,2,2,0,2,0,0,2,0},{{2},{2},{2}},{2,2,2},{2,2,0,2,2,0},{2,0,0,2,2,0,0,2},{0,0,2,0,2,2,0,2},{2,2,0,0,2,2},{0,2,2,2,2,0}};void Disp(){int i,j;for(i=0;i<N;i++){for(j=0;j<M;j++)printf("%c",s[i][j]?48+s[i][j]:' ');printf("┃\n");}printf("━━━━━━━━");printf("\n\n操作说明:A-->左移,D-->右移,W-->变形,ESC-->退出\n");}void Down(){int i,j,k;for(j=0;j<M;j++)if(s[N-1][j]==2)break;/*判断是否在下边界*/if(j<M)/*若方块在下边界则将方块由2变1;因为用两种不同的符号,容易判断方块是否“着陆”及左右移动时,是否碰壁*/{for(i=0;i<N;i++)for(j=0;j<M;j++)if(s[i][j]==2)s[i][j]=1;for(i=N-1;i>=0;i--){for(j=0;j<M;j++)//判断第i行是否有空格if(s[i][j]==0)break;if(j==M)/*若第i行没空格消去第i行*/for(k=i++-1;k>=0;k--)//?for(j=0;j<M;j++)s[k+1][j]=s[k][j];}return;}for(i=0;i<N-1;i++){for(j=0;j<M;j++)if(s[i][j]==2)if(s[i+1][j]!=0&&s[i+1][j]!=2)break;/*方块下方不空说明触到1了退出内循环*/ if(j<M)break;/*方块下方不空退出外循环*/}if(i<N-1||j<M){for(i=0;i<N;i++)//若已触到1则将方块由 2变1*/for(j=0;j<M;j++)if(s[i][j]==2)s[i][j]=1;for(i=N-1;i>=0;i--){for(j=0;j<M;j++)if(s[i][j]==0)break;//判断第i行是否有空格if(j==M)/*若第i行没空格消去第i行*/for(k=i++-1;k>=0;k--)for(j=0;j<M;j++)s[k+1][j]=s[k][j];}return;}for(i=N-1;i>=0;i--)for(j=0;j<M;j++)if(s[i][j]==2)s[i+1][j]=s[i][j],s[i][j]=0;/*方块下移*/}void Right(){int i,j;for(i=0;i<N;i++)if(s[i][M-1]==2)return;/* 已经在右边界退出 */for(i=0;i<N;i++)for(j=0;j<M-1;j++)if(s[i][j]==2)if(s[i][j+1]!=0&&s[i][j+1]!=2)return;/* 方块右方不空,即方块右边有1 退出 */ for(j=M-2;j>=0;j--)for(i=0;i<N;i++)if(s[i][j]==2)s[i][j+1]=s[i][j],s[i][j]=0;/* 方块右移 */}void Left(){int i,j;for(i=0;i<N;i++)if(s[i][0]==2)return;/* 已经在左边界退出 */for(i=0;i<N;i++)for(j=1;j<M;j++)if(s[i][j]==2)if(s[i][j-1]!=0&&s[i][j-1]!=2)return;/* 方块左方不空退出 */ for(j=1;j<M;j++)for(i=0;i<N;i++)if(s[i][j]==2)s[i][j-1]=s[i][j],s[i][j]=0;/* 方块左移 */}int Have()/*判断是否有可移动方块,没有返回1,否则返回0*/{int i,j;for(i=0;i<N;i++)for(j=1;j<M;j++)if(s[i][j]==2)return 0;return 1;}int Add()/*随机生成方块*/{int t,x;/*生成两随机数t和x分别作为第t种方块和第x位置出现*/int i,j;srand((unsigned int)time(NULL));t=rand()%K;x=rand()%(M-3);if(x<0) x=-x%(M-3);//?for(i=0;i<3;i++)for(j=x;j<x+3;j++)//把生成的方块存到初状态中s[i][j]=a[t][i][j-x];}void bianxing(int t,int n){int i,j,k,m,x,y;for(i=0;i<N;i++)//首先扫描是否有移动方块;及方块变形前的位置“行、列”{m=-1;for(j=0;j<M;j++)if(s[i][j]==2){m=i,x=j,y=i;break;//y,x记录所在行、列;并退出内循环}if(m!=-1)//m!=-1证明有移动方块break;//退出外循环}if(m!=-1)//m!=-1证明有移动方块{if(x+3>M||y+3>N) return;//判断是否有可变形空间,没有就返回for(i=y;i<y+3;i++)//判断是否有3*3的变形空间,没有就返回for(j=x;j<x+3;j++)if(s[i][j]==1) return;/*擦除当前移动方块;因为上面判断3*3的移动空间,是从上面开始扫描,遇到第一个小格子时,依他为基点向右下方扫描是否有3*3的空间;显然只进行下面的变形--存储是不行的;如:002002022-->2220020时,显然前面的方格倒数第二个2,留在了3*3变形空间的外面,输出图形将多一个格子,所以要在变形-->存储操作前进行擦除操作*/for(i=y;i<y+3;i++)for(j=0;j<M;j++)if(s[i][j]==2)s[i][j]=0;//变形并把它存储到当前状态中if(t<=3&&t>=0){static int h1;if(h1>n)h1=0;for(i=y;i<y+3;i++)//把方块存储到当前状态中for(j=x;j<x+3;j++)s[i][j]=a[h1][i-y][j-x];h1++;}else if(t<=11&&t>=4){static int h2=4;if(h2>n)h2=4;for(i=y;i<y+3;i++)//把方块存储到当前状态中for(j=x;j<x+3;j++)s[i][j]=a[h2][i-y][j-x];h2++;}else if(t<=13&&t>=12){static int h3=12;if(h3>n)h3=12;for(i=y;i<y+3;i++)//把方块存储到当前状态中for(j=x;j<x+3;j++)s[i][j]=a[h3][i-y][j-x];h3++;}else if(t<=18&&t>=15){static int h4=15;if(h4>n)h4=0;for(i=y;i<y+3;i++)//把方块存储到当前状态中for(j=x;j<x+3;j++)s[i][j]=a[h4][i-y][j-x];h4++;}}void main(){char c;int i=0,t;char str[][50]={" ((`'-\"``\"\"-'`))"," ) - - ( "," / (o _ o) \ "," \ ( 0 ) /"," _'-.._'='_..-'_ "," /`;#'#'#.-.#'#'#;`\ "," \_)) '#' ((_/ "," #. ☆ Game ☆ # "," '#. Over! .#' "," / '#. .#' \ "," _\ \'#. .#'/ /_"," (((___) '#' (___) ",""};system("color 0a");while(1)/*判断是否有按键,没有循环输出i,否则停,conio.h*/{if(!kbhit())/*kbhit用来判断是否有按键输入,若有按键返回非零值,否则返回零;没有按键时c被赋予一个“非操作键值”,它将一直下移;有按键是调用getch函数,读取键值*/c='2';elsec=getch();if(c=='p')//停止键;按任意键可解除停止getch();system("CLS");/*清屏,TC用clrscr();,VC用system("CLS");*/if(Have())//Have()判断是否有可移动方块,没有返回1,否则返回0t=Add();switch(c){case 'a':Left();break; /*左移*/case 'd':Right();break; /*右移*/case 27: system("pause");return; /*按Esc(=27)另存后退出*/default:;}//变形if(c=='w')if(t>=0&&t<=3) bianxing(t,3);else if(t>=4&&t<=11) bianxing(t,11);else if(t==12||t==13) bianxing(t,13);else if(t>=15&&t<=18) bianxing(t,18);c='2';Down();//判断方块的停、走和消除//判断顶层是否有1 有:游戏结束for(i=0;i<M;i++)if(s[0][i]==1){system("CLS");i=0;while(1){if(strlen(str[i])==0)break;printf("%s\n",str[i++]);}system("pause");exit(0);}Disp();//刷屏Sleep(500);/*睡眠ms,windows.h*/}}***********************************************************。
俄罗斯方块-C语言-完整代码

int y; SetConsoleTextAttribute(Output,0xf0);
for(y=4;y<26;y++) {
//两条纵线 gotoxyWithFullwidth(10,y-3);//鼠标定位
gotoxyWithFullwidth(10,y-3);//鼠标定位 printf("%2s"," "); gotoxyWithFullwidth(23,y-3);//鼠标定位 printf("%2s"," "); }
bool dead;//挂 }Manager;//结构体别名
//构造存储游戏控制相关数据的结构体 typedef struct TetrisControl {
bool pause;//暂停 bool clockwise;//旋转方向;顺时针方向为ture int direction;//移动方向:0向左移动 1向右移动 //游戏池内每格的颜色 //此版本是彩色的,仅用游戏池数据无法存储颜色 int color[28][16]; }Control;//Control是结构体别名
//初始状态的游戏池 //每个元素表示游戏池的一行 //两端各置两个1,底部两行全部为1,便于进行碰撞 //这样一来游戏池的宽度为12列 共16列 //当某个元素为OXFFFF时,说明该行已经填满 //顶部4行用于给方块,不显示 //底部2行不显示,显示出来的游戏池高度为22行 static const unsigned int gs_uInitialTetrisPool[28]= {
效果图如下
俄罗斯方块-C语言-完整代码
#ifndef _DAY7_H #define _DAY7_H #include<windows.h> #include<time.h> #include<stdbool.h> #include<conio.h>//控制台输入输出函数getch通过键盘进行的操作 //游戏区域位置设计 #define COL_BEGIN 2 #define COL_END 14 #define ROW_BEGIN 4 #define ROW_END 26
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
不多说,,直接可以拷贝下面的东西,然后记得把那个BLOCK的名字改成你自己的类名,这个很关键哦,不然是错的可别怪我,呵呵~~import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.applet.*;import ng.String.*;import ng.*;import java.io.*;public class Block extends JPanel implements ActionListener,KeyListener//应该是继承JPanel{static Button but[] = new Button[6];static Button noStop = new Button("取消暂停");static Label scoreLab = new Label("分数:");static Label infoLab = new Label("提示:");static Label speedLab = new Label("级数:");static Label scoreTex = new Label("0");static Label infoTex = new Label(" ");static Label speedTex = new Label("1");static JFrame jf = new JFrame();static MyTimer timer;static ImageIcon icon=new ImageIcon("resource/Block.jpg");static JMenuBar mb = new JMenuBar();static JMenu menu0 = new JMenu("游戏 ");static JMenu menu1 = new JMenu("帮助 ");static JMenuItem mi0 = new JMenuItem("新游戏");static JMenuItem mi1 = new JMenuItem("退出");static JMenuItem mi1_0 = new JMenuItem("关于");static JDialog dlg_1;static JTextArea dlg_1_text = new JTextArea();static int startSign = 0;//游戏开始标志 0 未开始 1 开始 2 暂停static String butLab[] = {"开始游戏","重新开始","降低级数","提高级数","游戏暂停","退出游戏"};static int game_body[][] = new int[19][10];static int game_sign_x[] = new int[4];//用于记录4个方格的水平位置static int game_sign_y[] = new int[4];//用于记录4个方格的垂直位置static boolean downSign = false;//是否落下static int blockNumber = 1;//砖块的编号static int gameScore = 0;//游戏分数static int speedMark = 1;public static void main(String args[]){Block myBlock = new Block();mb.add(menu0);mb.add(menu1);menu0.add(mi0);menu0.add(mi1);menu1.add(mi1_0);jf.setJMenuBar(mb);myBlock.init();jf.add(myBlock);jf.setSize(565,501);jf.setResizable(false);jf.setTitle("俄罗斯方块");jf.setIconImage(icon.getImage());jf.setLocation(200,100);jf.show();timer = new MyTimer(myBlock); //启动线程timer.setDaemon(true);timer.start();timer.suspend();}public void init(){setLayout(null);for(int i = 0;i < 6;i++){but[i] = new Button(butLab[i]);add(but[i]);but[i].addActionListener(this);but[i].addKeyListener(this);but[i].setBounds(360,(240 + 30 * i),160,25); }add(scoreLab);add(scoreTex);add(speedLab);add(speedTex);add(infoLab);add(infoTex);add(scoreLab);scoreLab.setBounds(320,15,30,20);scoreTex.setBounds(360,15,160,20);scoreTex.setBackground(Color.white);speedLab.setBounds(320,45,30,20);speedTex.setBounds(360,45,160,20);speedTex.setBackground(Color.white);but[1].setEnabled(false);but[4].setEnabled(false);infoLab.setBounds(320,75,30,20);infoTex.setBounds(360,75,160,20);infoTex.setBackground(Color.white);noStop.setBounds(360,360,160,25);noStop.addActionListener(this);noStop.addKeyListener(this);mi0.addActionListener(this);mi1.addActionListener(this);mi1_0.addActionListener(this);num_csh_game();rand_block();}public void actionPerformed(ActionEvent e){if(e.getSource() == but[0])//开始游戏{startSign = 1;infoTex.setText("游戏已经开始!");but[0].setEnabled(false);but[1].setEnabled(true);but[4].setEnabled(true);timer.resume();}if(e.getSource() == but[1]||e.getSource() == mi0)//重新开始游戏 {startSign = 0;gameScore = 0;timer.suspend();num_csh_restart();repaint();rand_block();scoreTex.setText("0");infoTex.setText("新游戏!");but[0].setEnabled(true);but[1].setEnabled(false);but[4].setEnabled(false);}if(e.getSource() == but[2])//降低级数{infoTex.setText("降低级数!");speedMark--;if(speedMark <= 1){speedMark = 1;infoTex.setText("已经是最低级数!");}speedTex.setText(speedMark + "");}if(e.getSource() == but[3])//提高级数{infoTex.setText("提高级数!");speedMark++;if(speedMark >= 9){speedMark = 9;infoTex.setText("已经是最高级数!");}speedTex.setText(speedMark + "");}if(e.getSource() == but[4])//游戏暂停{this.add(noStop);this.remove(but[4]);infoTex.setText("游戏暂停!");timer.suspend();}if(e.getSource() == noStop)//取消暂停{this.remove(noStop);this.add(but[4]);infoTex.setText("继续游戏!");timer.resume();}if(e.getSource() == but[5]||e.getSource() == mi1)//退出游戏 {jf.dispose();}if(e.getSource() == mi1_0)//退出游戏{dlg_1 = new JDialog(jf,"关于");try{FileInputStream io = new FileInputStream("resource/guanyu.txt");//得到路径byte a[] = new byte[io.available()];io.read(a);io.close();String str = new String(a);dlg_1_text.setText(str);}catch(Exception g){}dlg_1_text.setEditable(false);dlg_1.add(dlg_1_text);dlg_1.pack();dlg_1.setResizable(false);dlg_1.setSize(200, 120);dlg_1.setLocation(400, 240);dlg_1.show();}}public void rand_block()//随机产生砖块{int num;num = (int)(Math.random() * 6) + 1;//产生0~6之间的随机数blockNumber = num;switch(blockNumber){case 1: block1(); blockNumber = 1; break;case 2: block2(); blockNumber = 2; break;case 3: block3(); blockNumber = 3; break;case 4: block4(); blockNumber = 4; break;case 5: block5(); blockNumber = 5; break;case 6: block6(); blockNumber = 6; break;case 7: block7(); blockNumber = 7; break;}}public void change_body(int blockNumber)//改变砖块状态{dingwei();if(blockNumber == 1&&downSign == false)//变换长条2种情况{if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[3] <= 16)//说明长条是横着的{if(game_body[game_sign_y[0] - 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[3] + 2][game_sign_x[3] - 2] != 2){num_csh_game();game_body[game_sign_y[0] - 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] + 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] + 2][game_sign_x[3] - 2] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] >= 1&&game_sign_x[3] <= 7)//说明长条是竖着的{if(game_body[game_sign_y[0] + 1][game_sign_x[0]-1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3] + 2] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]]=1;game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 3&&downSign == false)//变换转弯1有4种情况{if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] == game_sign_x[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] >= 1){if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] <= 17){if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[1] == game_sign_x[2]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[0] == game_sign_y[1]&&game_sign_x[3] <= 8){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[0] == game_sign_x[3]){if(game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3]][game_sign_x[3] + 2] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3]][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 4&&downSign == false)//变换转弯2有4种情况{if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[3] <= 7){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3]][game_sign_x[3] + 2] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3]][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[1] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[2]){if(game_body[game_sign_y[1]][game_sign_x[1] + 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] !=2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0]] = 1;game_body[game_sign_y[1]][game_sign_x[1] + 2] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[0] >= 2){if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[0] == game_sign_y[2]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[0] <= 16){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] != 2&&game_body[game_sign_y[2]][game_sign_x[2] - 2] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] = 1;game_body[game_sign_y[2]][game_sign_x[2] - 2] = 1;game_body[game_sign_y[3]][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 5&&downSign == false)//变换转弯3有4种情况{if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[2] == game_sign_x[3]&&game_sign_y[0] == game_sign_y[1]&&game_sign_x[1] >= 2){if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[1]][game_sign_x[1] - 2] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1] - 2] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[1]&&game_sign_y[0] <= 16){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[2] == game_sign_y[3]){if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[2]][game_sign_x[2] + 2] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2]][game_sign_x[2] + 2] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[2] == game_sign_x[3]){if(game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 6&&downSign == false)//变换两层砖块1的2种情况{if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[0] >= 2){if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] -1 ] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[3] <= 17){if(game_body[game_sign_y[0]][game_sign_x[0] + 2] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] + 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] + 2] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] + 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 7&&downSign == false)//变换两层砖块2的2种情况{if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] <= 16){if(game_body[game_sign_y[0]][game_sign_x[0] + 2] != 2&&game_body[game_sign_y[1] - 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] + 2] = 1;game_body[game_sign_y[1] - 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[2] <= 17){if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[1]][game_sign_x[1] - 2] != 2&&game_body[game_sign_y[2] + 1][game_sign_x[2] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1] - 2] = 1;game_body[game_sign_y[2] + 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3]][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}}public void num_csh_game()//数组清零{for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 2){game_body[i][j] = 2;}else{game_body[i][j] = 0;}}}}public void num_csh_restart()//重新开始时数组清零{for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){game_body[i][j] = 0;}}}public void keyTyped(KeyEvent e){}public void keyPressed(KeyEvent e){if(e.getKeyCode() == KeyEvent.VK_DOWN&&startSign == 1)//处理下键 {this.down();}if(e.getKeyCode() == KeyEvent.VK_LEFT&&startSign == 1)//处理左键 {this.left();}if(e.getKeyCode() == KeyEvent.VK_RIGHT&&startSign == 1)//处理右键 {this.right();}if(e.getKeyCode() == KeyEvent.VK_UP&&startSign == 1)//处理上键转换 {this.change_body(blockNumber);}if(startSign == 0){infoTex.setText("游戏未开始或已结束!");}}public void keyReleased(KeyEvent e){}public void paint(Graphics g){g.setColor(Color.black);g.fill3DRect(0,0,300,450,true);for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 1){g.setColor(Color.blue);g.fill3DRect(30*j,30*(i-4),30,30,true);}if(game_body[i][j] == 2){g.setColor(Color.magenta);g.fill3DRect(30*j,30*(i-4),30,30,true);}}}}public void left()//向左移动{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_x[k] == 0||game_body[game_sign_y[k]][game_sign_x[k] - 1] == 2){sign = 1;}}if(sign == 0&&downSign == false){num_csh_game();for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k] - 1] = 1;}infoTex.setText("向左移动!");repaint();}}public void right()//向右移动{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_x[k] == 9||game_body[game_sign_y[k]][game_sign_x[k] + 1] == 2){sign = 1;}}if(sign == 0&&downSign == false){num_csh_game();for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k] + 1] = 1;}infoTex.setText("向右移动!");repaint();}}public void down()//下落{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_y[k] == 18||game_body[game_sign_y[k] + 1][game_sign_x[k]] == 2){sign = 1;downSign = true;changeColor();cancelDW();getScore();if(game_over() == false){rand_block();repaint();}}}if(sign == 0){num_csh_game();for(int k = 0;k < 4;k++){game_body[game_sign_y[k] + 1][game_sign_x[k]] = 1; }infoTex.setText("游戏进行中!");repaint();}}public boolean game_over()//判断游戏是否结束{int sign=0;for(int i = 0;i < 10;i++){if(game_body[4][i] == 2){sign = 1;}}if(sign == 1){infoTex.setText("游戏结束!");changeColor();repaint();startSign = 0;timer.suspend();return true;}elsereturn false;}public void getScore()//满行消除方法{for(int i = 0;i < 19;i++){int sign = 0;for(int j = 0;j < 10;j++){if(game_body[i][j] == 2){sign++;}}if(sign == 10){gameScore += 100;scoreTex.setText(gameScore+"");infoTex.setText("恭喜得分!");for(int j = i;j >= 1;j--){for(int k = 0;k < 10;k++){game_body[j][k] = game_body[j - 1][k];}}}}}public void changeColor()//给已经落下的块换色{downSign = false;for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k]] = 2; }}public void dingwei()//确定其位置{int k = 0;cancelDW();for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 1){game_sign_x[k] = j;game_sign_y[k] = i;k++;}}}}public void cancelDW()//将定位数组初始化{for(int k = 0;k < 4;k++){game_sign_x[k] = 0;game_sign_y[k] = 0;}}public void block1()//长条{game_body[0][4] = 1;game_body[1][4] = 1;game_body[2][4] = 1;game_body[3][4] = 1;}public void block2()//正方形{game_body[3][4] = 1;game_body[2][4] = 1;game_body[3][5] = 1;game_body[2][5] = 1;}public void block3()//3加1(下){game_body[1][4] = 1;game_body[2][4] = 1;game_body[3][4] = 1;game_body[3][5] = 1;}public void block4()//3加1(中){game_body[1][4] = 1;game_body[2][4] = 1;game_body[3][4] = 1;game_body[2][5] = 1;}public void block5()//3加1(上){game_body[1][4] = 1;game_body[2][4] = 1;game_body[3][4] = 1;game_body[1][5] = 1;}public void block6()//转折1{game_body[1][5] = 1;game_body[2][5] = 1;game_body[2][4] = 1;game_body[3][4] = 1;}public void block7()//转折2{game_body[1][4] = 1;game_body[2][4] = 1;game_body[2][5] = 1;game_body[3][5] = 1;}}//定时线程class MyTimer extends Thread{Block myBlock;public MyTimer(Block myBlock){this.myBlock = myBlock;}public void run(){while(myBlock.startSign == 1){try{sleep((10-myBlock.speedMark + 1)*100);myBlock.down();}catch(InterruptedException e){}}}}。