fork(1) download
  1. /* package whatever; // don't place package name! */
  2. import java.awt.*;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.awt.event.KeyEvent;
  6. import java.awt.event.KeyListener;
  7. import javax.swing.*;
  8. import javax.swing.Timer;
  9.  
  10. public class Tetris extends JFrame {
  11. public Tetris() {
  12. Tetrisblok a = new Tetrisblok();
  13. addKeyListener(a);
  14. add(a);
  15. }
  16.  
  17. public static void main(String[] args) {
  18. Tetris frame = new Tetris();
  19. JMenuBar menu = new JMenuBar();
  20. frame.setJMenuBar(menu);
  21. JMenu game = new JMenu("游戏");
  22. JMenuItem newgame = game.add("新游戏");
  23. JMenuItem pause = game.add("暂停");
  24. JMenuItem goon = game.add("继续");
  25. JMenuItem exit = game.add("退出");
  26. JMenu help = new JMenu("帮助");
  27. JMenuItem about = help.add("关于");
  28. menu.add(game);
  29. menu.add(help);
  30. frame.setLocationRelativeTo(null);
  31. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  32. frame.setSize(220, 275);
  33. frame.setTitle("Tetris内测版");
  34. // frame.setUndecorated(true);
  35. frame.setVisible(true);
  36. frame.setResizable(false);
  37.  
  38. }
  39. }
  40.  
  41. // 创建一个俄罗斯方块类
  42. class Tetrisblok extends JPanel implements KeyListener {
  43.  
  44. // blockType 代表方块类型
  45. // turnState代表方块状态
  46. private int blockType;
  47. private int score = 0;
  48.  
  49. private int turnState;
  50.  
  51. private int x;
  52.  
  53. private int y;
  54.  
  55. private int i = 0;
  56.  
  57. int j = 0;
  58. int flag = 0;
  59. // 定义已经放下的方块x=0-11,y=0-21;
  60. int[][] map = new int[13][23];
  61.  
  62. // 方块的形状 第一组代表方块类型有S、Z、L、J、I、O、T 7种 第二组 代表旋转几次 第三四组为 方块矩阵
  63. private final int shapes[][][] = new int[][][] {
  64. // i
  65. { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
  66. { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
  67. { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
  68. { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
  69. // s
  70. { { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  71. { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
  72. { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  73. { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } },
  74. // z
  75. { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  76. { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
  77. { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  78. { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } },
  79. // j
  80. { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
  81. { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  82. { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
  83. { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
  84. // o
  85. { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  86. { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  87. { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  88. { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
  89. // l
  90. { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
  91. { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  92. { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
  93. { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
  94. // t
  95. { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  96. { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
  97. { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  98. { 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } };
  99.  
  100. // 生成新方块的方法
  101. public void newblock() {
  102. blockType = (int) (Math.random() * 1000) % 7;
  103. turnState = (int) (Math.random() * 1000) % 4;
  104. x = 4;
  105. y = 0;
  106. if (gameover(x, y) == 1) {
  107.  
  108. newmap();
  109. drawwall();
  110. score = 0;
  111. JOptionPane.showMessageDialog(null, "GAME OVER");
  112. }
  113. }
  114.  
  115. // 画围墙
  116. public void drawwall() {
  117. for (i = 0; i < 12; i++) {
  118. map[i][21] = 2;
  119. }
  120. for (j = 0; j < 22; j++) {
  121. map[11][j] = 2;
  122. map[0][j] = 2;
  123. }
  124. }
  125.  
  126. // 初始化地图
  127. public void newmap() {
  128. for (i = 0; i < 12; i++) {
  129. for (j = 0; j < 22; j++) {
  130. map[i][j] = 0;
  131. }
  132. }
  133. }
  134.  
  135. // 初始化构造方法
  136. Tetrisblok() {
  137. newblock();
  138. newmap();
  139. drawwall();
  140. Timer timer = new Timer(1000, new TimerListener());
  141. timer.start();
  142. }
  143.  
  144. // 旋转的方法
  145. public void turn() {
  146. int tempturnState = turnState;
  147. turnState = (turnState + 1) % 4;
  148. if (blow(x, y, blockType, turnState) == 1) {
  149. }
  150. if (blow(x, y, blockType, turnState) == 0) {
  151. turnState = tempturnState;
  152. }
  153. repaint();
  154. }
  155.  
  156. // 左移的方法
  157. public void left() {
  158. if (blow(x - 1, y, blockType, turnState) == 1) {
  159. x = x - 1;
  160. }
  161. ;
  162. repaint();
  163. }
  164.  
  165. // 右移的方法
  166. public void right() {
  167. if (blow(x + 1, y, blockType, turnState) == 1) {
  168. x = x + 1;
  169. }
  170. ;
  171. repaint();
  172. }
  173.  
  174. // 下落的方法
  175. public void down() {
  176. if (blow(x, y + 1, blockType, turnState) == 1) {
  177. y = y + 1;
  178. delline();
  179. }
  180. ;
  181. if (blow(x, y + 1, blockType, turnState) == 0) {
  182. add(x, y, blockType, turnState);
  183. newblock();
  184. delline();
  185. }
  186. ;
  187. repaint();
  188. }
  189.  
  190. // 是否合法的方法
  191. public int blow(int x, int y, int blockType, int turnState) {
  192. for (int a = 0; a < 4; a++) {
  193. for (int b = 0; b < 4; b++) {
  194. if (((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x
  195. + b + 1][y + a] == 1))
  196. || ((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x
  197. + b + 1][y + a] == 2))) {
  198.  
  199. return 0;
  200. }
  201. }
  202. }
  203. return 1;
  204. }
  205.  
  206. // 消行的方法
  207. public void delline() {
  208. int c = 0;
  209. for (int b = 0; b < 22; b++) {
  210. for (int a = 0; a < 12; a++) {
  211. if (map[a][b] == 1) {
  212.  
  213. c = c + 1;
  214. if (c == 10) {
  215. score += 10;
  216. for (int d = b; d > 0; d--) {
  217. for (int e = 0; e < 11; e++) {
  218. map[e][d] = map[e][d - 1];
  219.  
  220. }
  221. }
  222. }
  223. }
  224. }
  225. c = 0;
  226. }
  227. }
  228.  
  229. // 判断你挂的方法
  230. public int gameover(int x, int y) {
  231. if (blow(x, y, blockType, turnState) == 0) {
  232. return 1;
  233. }
  234. return 0;
  235. }
  236.  
  237. // 把当前添加map
  238. public void add(int x, int y, int blockType, int turnState) {
  239. int j = 0;
  240. for (int a = 0; a < 4; a++) {
  241. for (int b = 0; b < 4; b++) {
  242. if (map[x + b + 1][y + a] == 0) {
  243. map[x + b + 1][y + a] = shapes[blockType][turnState][j];
  244. }
  245. ;
  246. j++;
  247. }
  248. }
  249. }
  250.  
  251. // 画方块的的方法
  252. public void paintComponent(Graphics g) {
  253. super.paintComponent(g);
  254. // 画当前方块
  255. for (j = 0; j < 16; j++) {
  256. if (shapes[blockType][turnState][j] == 1) {
  257. g.fillRect((j % 4 + x + 1) * 10, (j / 4 + y) * 10, 10, 10);
  258. }
  259. }
  260. // 画已经固定的方块
  261. for (j = 0; j < 22; j++) {
  262. for (i = 0; i < 12; i++) {
  263. if (map[i][j] == 1) {
  264. g.fillRect(i * 10, j * 10, 10, 10);
  265.  
  266. }
  267. if (map[i][j] == 2) {
  268. g.drawRect(i * 10, j * 10, 10, 10);
  269.  
  270. }
  271. }
  272. }
  273. g.drawString("score=" + score, 125, 10);
  274. g.drawString("抵制不良游戏,", 125, 50);
  275. g.drawString("拒绝盗版游戏。", 125, 70);
  276. g.drawString("注意自我保护,", 125, 90);
  277. g.drawString("谨防受骗上当。", 125, 110);
  278. g.drawString("适度游戏益脑,", 125, 130);
  279. g.drawString("沉迷游戏伤身。", 125, 150);
  280. g.drawString("合理安排时间,", 125, 170);
  281. g.drawString("享受健康生活。", 125, 190);
  282. }
  283.  
  284. // 键盘监听
  285. public void keyPressed(KeyEvent e) {
  286. switch (e.getKeyCode()) {
  287. case KeyEvent.VK_DOWN:
  288. down();
  289. break;
  290. case KeyEvent.VK_UP:
  291. turn();
  292. break;
  293. case KeyEvent.VK_RIGHT:
  294. right();
  295. break;
  296. case KeyEvent.VK_LEFT:
  297. left();
  298. break;
  299. }
  300.  
  301. }
  302.  
  303. // 无用
  304. public void keyReleased(KeyEvent e) {
  305. }
  306.  
  307. // 无用
  308. public void keyTyped(KeyEvent e) {
  309. }
  310.  
  311. // 定时器监听
  312. class TimerListener implements ActionListener {
  313. public void actionPerformed(ActionEvent e) {
  314.  
  315. repaint();
  316. if (blow(x, y + 1, blockType, turnState) == 1) {
  317. y = y + 1;
  318. delline();
  319. }
  320. ;
  321. if (blow(x, y + 1, blockType, turnState) == 0) {
  322.  
  323. if (flag == 1) {
  324. add(x, y, blockType, turnState);
  325. delline();
  326. newblock();
  327. flag = 0;
  328. }
  329. flag = 1;
  330. }
  331. ;
  332. }
  333. }
  334. }
Compilation error #stdin compilation error #stdout 0.05s 4386816KB
stdin
Standard input is empty
compilation info
Main.java:10: error: class Tetris is public, should be declared in a file named Tetris.java
public class Tetris extends JFrame {
       ^
1 error
stdout
Standard output is empty