一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java俄羅斯方塊小游戲

Java俄羅斯方塊小游戲

2020-06-06 14:11qq_26525215 JAVA教程

這篇文章主要為大家詳細介紹了Java俄羅斯方塊小游戲,實現了俄羅斯的經典功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

去年就已經學了這個技術了,一直沒去寫,現在抽個時間寫了個俄羅斯方塊游戲。

只有簡單的新游戲,暫停,繼續,積分功能。簡單的實現了俄羅斯的經典功能。

不介紹了,有興趣的自己運行一下,后面貼出了圖片

代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
package cn.hncu;
 
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
 
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;
 
public class Tetris extends JFrame{
 public static void main(String[] args) {
 Tetris te = new Tetris();
 te.setVisible(true);
 //如果在界面中添加了編輯框等會搶占焦點的控件,則需要用下面的代碼
 //te.requestFocus(true);//讓游戲面板獲得焦點--搶到鍵盤的監聽
 }
 private TetrisPanel tp;
 JMenuItem itemPause;
 JMenuItem itemContinue;
 
 public Tetris() {
 this.setDefaultCloseOperation(EXIT_ON_CLOSE);
 this.setLocation(700, 200);
 this.setSize(220, 275);
 this.setResizable(false);
 tp = new TetrisPanel();
 this.getContentPane().add(tp);
 
 //添加菜單
 JMenuBar menubar = new JMenuBar();
 this.setJMenuBar(menubar);
 JMenu menuGame = new JMenu("游戲");
 menubar.add(menuGame);
 
 JMenuItem itemNew = new JMenuItem("新游戲");
 itemNew.setActionCommand("new");
 itemPause = new JMenuItem("暫停");
 itemPause.setActionCommand("pause");
 
 itemContinue = new JMenuItem("繼續");
 itemContinue.setActionCommand("continue");
 itemContinue.setEnabled(false);
 
 menuGame.add(itemNew);
 menuGame.add(itemPause);
 menuGame.add(itemContinue);
 
 MenuListener menuListener = new MenuListener();
 itemNew.addActionListener(menuListener);
 itemPause.addActionListener(menuListener);
 itemContinue.addActionListener(menuListener);
 
 
 //讓整個JFrame添加鍵盤監聽
 this.addKeyListener( tp.listener );
 }
 class MenuListener implements ActionListener{
 @Override
 public void actionPerformed(ActionEvent e) {
 //玩新游戲
 if(e.getActionCommand().equals("new")){
 tp.newGame();
 }
 if(e.getActionCommand().equals("pause")){
 timer.stop();
 itemContinue.setEnabled(true);
 itemPause.setEnabled(false);
 }
 if(e.getActionCommand().equals("continue")){
 timer.restart();
 itemContinue.setEnabled(false);
 itemPause.setEnabled(true);
 }
 }
 }
 
 private Timer timer;
 
 class TetrisPanel extends JPanel{
 // 方塊的形狀:
 // 第一維代表方塊類型(包括7種:S、Z、L、J、I、O、T)
 // 第二維代表旋轉次數
 // 第三四維代表方塊矩陣
 // shapes[type][turnState][i] i--> block[i/4][i%4]
 int shapes[][][] = new int[][][] {
 /*
 * 模板 { {0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0}, {0,0,0,0,0,0,0,0, 0,0,0,0,
 * 0,0,0,0}, {0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0}, {0,0,0,0,0,0,0,0,
 * 0,0,0,0, 0,0,0,0} }
 */
 // I (※把版本1中的橫條從第1行換到第2行)
 { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
 { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
 // S
 { { 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
 { 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0 } },
 // Z
 { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
 { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } },
 // J
 { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
 { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
 { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
 // O
 { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
 // L
 { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
 { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
 { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
 // T
 { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
 { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 { 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } }
 };
 
 private int blockType;//方塊類型
 private int turnState;//旋轉狀態
 private int x;//方塊的位置x--列的位置--列號
 private int y;//方塊的位置y--行的位置--行號
 
 private int map[][]=new int[13][23];//地圖:12列22行。為防止越界,數組開成:13列23行
 
 
 private int delay=1000;
 public TimerKeyLister listener=new TimerKeyLister();
 
 private int score=0;//分數
 
 public TetrisPanel(){
 newGame();
 nextBlock();
 //timer = new Timer(delay,listener);
 //timer.start();
 }
 
 public void newGame() {
 blockType = (int)(Math.random()*1000)%7;
 turnState = (int)(Math.random()*1000)%4;
 x=4;
 y=0;
 
 for( int i=0;i<12;i++){//走列
 for(int j=0;j<21;j++){//走行
 if(i==0 || i==11){//3為界面邊框的格
 map[i][j]=3;//按理只要用0和1以外的整數就可以,但這里用3有特殊作用--后面用
 }else{
 map[i][j]=0;
 }
 }
 map[i][21]=3;//3為界面邊框的格
 }
 
 if(timer!=null){
 timer.stop();
 }
 
 delay=1000;
 timer = new Timer(delay,listener);
 timer.start();
 }
 
 private void nextBlock() {
 blockType = (int)(Math.random()*1000)%7;
 turnState = (int)(Math.random()*1000)%4;
 x=4;
 y=0;
 //game Over
 if(crash(x,y,blockType,turnState)==0){
 timer.stop();
 int option = JOptionPane.showConfirmDialog(this,
 "Game Over!!,還敢來嗎...");
 if (option == JOptionPane.OK_OPTION) {
 newGame();
 } else if (option == JOptionPane.NO_OPTION) {
 System.exit(0);
 }
 }
 }
 
 private void down() {
 if( crash(x,y+1,blockType,turnState)==0 ){//注意,這里用y+1,是判斷塊往下掉一格后,map中對應位置是否為堆積塊或框架
 add(x,y,blockType,turnState);//把當前方塊的信息保存到地圖
 nextBlock();
 }else{
 y++;
 }
 repaint();
 }
 private void left() {
 if(x>=0){
 x -= crash(x-1,y,blockType,turnState);
 }
 repaint();
 }
 private void right() {
 if(x<8){
 x += crash(x+1,y,blockType,turnState);
 }
 repaint();
 }
 private void turn() {
 if(crash(x,y,blockType,(turnState+1)%4)==1 ){
 turnState = (turnState+1)%4;
 }
 repaint();
 }
 
 private void add(int x, int y, int blockType, int turnState) {
 for( int a=0; a<4; a++){
 for(int b=0; b<4; b++){
 if( shapes[blockType][turnState][a*4+b] ==1 ){
 map[x+b+1][y+a] = 1;
 }
 }
 }
 tryDelLine();
 }
 
 //消行
 private void tryDelLine(){
 for(int b=0;b<21;b++){
 int c=1;
 for(int a=0;a<12;a++){
 c &= map[a][b];//全部是1,c的結果才是1
 }
 if(c==1){//有一行需要消
 //依次往下移動一行
 for(int d=b; d>0; d--){
 for(int e=0;e<11;e++){
 map[e][d] = map[e][d-1];
 }
 }
 //加分
 score +=100;
 delay /=1.05;
 timer.setDelay(delay);
 }
 }
 
 }
 
 //參數例子: 4,3,2,3
 //判斷有無碰撞
 private int crash(int x, int y, int blockType, int turnState){
 for( int a=0; a<4; a++){
 for(int b=0; b<4; b++){
// if( (shapes[blockType][turnState][a*4+b]==1 && map[x+b+1][y+a] ==1) ||
// (shapes[blockType][turnState][a*4+b]==1 && map[x+b+1][y+a] ==3 ) ){
// }
 if( (shapes[blockType][turnState][a*4+b] & map[x+b+1][y+a]) ==1 ){
 return 0;//碰撞
 }
 }
 }
 return 1;//沒有碰撞
 }
 
 @Override
 public void paint(Graphics g) {
// blockType =6;
// turnState = 3;
// x=4;
// y=6;
 super.paint(g);//消除殘影
 
 g.setColor(new Color(153,51,205));
 //畫當前方塊
 for(int j=0;j<16;j++){
 if(shapes[blockType][turnState][j]==1){
 g.fillRect((j%4+x+1)*10, (j/4+y)*10, 10, 10);
 g.setColor(Color.cyan);
 g.drawRect((j%4+x+1)*10, (j/4+y)*10, 10, 10);
 g.setColor(new Color(153,51,205));
 }
 }
 
 //畫界面框架 以及 堆積塊---整個地圖
 g.setColor(Color.red);
 for( int i=0;i<12;i++){//走列
 for(int j=0;j<22;j++){//走行
 if(map[i][j]==3){
 g.drawRect(i*10, j*10, 10, 10);
 }else if(map[i][j]==1){
 g.fillRect(i*10, j*10, 10, 10);
 g.setColor(Color.GREEN);
 g.drawRect(i*10, j*10, 10, 10);
 g.setColor(Color.red);
 }
 }
 }
 
 //顯示分數,同時為版面美觀,在界面上再加點東西
 // 畫方塊區右側部分
 g.setColor(Color.red);
 g.setFont(new Font("aa", Font.BOLD, 11));
 g.drawString("score=" + score, 130, 20);
 
 g.setFont(new Font("aa", Font.PLAIN, 13));
 g.setColor(Color.blue);
 g.drawString("拒絕盜版游戲,", 125, 70);
 g.drawString("注意自我保護。", 125, 90);
 g.drawString("謹防受騙上當。", 125, 110);
 g.drawString("適度游戲益腦,", 125, 130);
 g.drawString("沉迷游戲傷身。", 125, 150);
 g.drawString("合理安排時間,", 125, 170);
 g.drawString("享受健康生活。", 125, 190);
 
 }
 
 class TimerKeyLister extends KeyAdapter implements ActionListener{
 @Override
 public void actionPerformed(ActionEvent e) {
 down();
 }
 
 @Override
 public void keyPressed(KeyEvent e) {
 switch(e.getKeyCode()){
 case KeyEvent.VK_DOWN:
 down(); break;
 case KeyEvent.VK_LEFT:
 left();break;
 case KeyEvent.VK_RIGHT:
 right();break;
 case KeyEvent.VK_UP:
 turn();break;
 case KeyEvent.VK_F1:
 plug();
 case KeyEvent.VK_F2:
 time();
 }
 }
 
 }
 
 public void plug() {
 score+=100;
 }
 
 public void time() {
 delay =1000;
 timer.setDelay(delay);
 }
 
 }
 
 
}

運行界面:

Java俄羅斯方塊小游戲

Java俄羅斯方塊小游戲

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/qq_26525215/article/details/51636654

延伸 · 閱讀

精彩推薦
  • JAVA教程支持生產阻塞的Java線程池

    支持生產阻塞的Java線程池

    在各種并發編程模型中,生產者-消費者模式大概是最常用的了。在實際工作中,對于生產消費的速度,通常需要做一下權衡 ...

    java教程網3832019-11-19
  • JAVA教程淺析Java方法傳值和傳引用問題

    淺析Java方法傳值和傳引用問題

    這篇文章主要是對Java方法傳值和傳引用問題進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助 ...

    java之家4142019-10-24
  • JAVA教程java實現將結果集封裝到List中的方法

    java實現將結果集封裝到List中的方法

    這篇文章主要介紹了java實現將結果集封裝到List中的方法,涉及java數據庫查詢及結果集轉換的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下 ...

    wdfscp4842020-05-29
  • JAVA教程Action訪問Servlet的API的簡單實例

    Action訪問Servlet的API的簡單實例

    下面小編就為大家帶來一篇Action訪問Servlet的API的簡單實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 ...

    jingxian1372020-05-12
  • JAVA教程Java中關于Null的9個解釋(Java Null詳解)

    Java中關于Null的9個解釋(Java Null詳解)

    這篇文章主要介紹了Java中關于Null的9個解釋(Java Null詳解),本文詳細講解了Java中Null的9個相關知識,需要的朋友可以參考下 ...

    junjie5302019-12-08
  • JAVA教程應用Java泛型和反射導出CSV文件的方法

    應用Java泛型和反射導出CSV文件的方法

    這篇文章主要介紹了應用Java泛型和反射導出CSV文件的方法,通過一個自定義函數結合泛型與反射的應用實現導出CSV文件的功能,具有一定的參考借鑒價值,需要...

    shichen20143562019-12-07
  • JAVA教程Java并發編程示例(十):線程組

    Java并發編程示例(十):線程組

    這篇文章主要介紹了Java并發編程示例(十):線程組,Java提供了ThreadGroup類來控制一個線程組,一個線程組可以通過線程對象來創建,也可以由其他線程組來創建...

    junjie1452019-12-06
  • JAVA教程Java中String性能優化

    Java中String性能優化

    本文給大家分享的是如何在java中對String進行性能優化,使用String的時候需要有哪些注意事項呢,這就是今天我們要給大家總結分析的,有需要的小伙伴可以...

    hebedich2802019-12-13
主站蜘蛛池模板: 好大好硬抽搐好爽想要 | 国产在线看片护士免费视频 | 精品图区 | 果冻传媒九一制片厂网站 | yellow片在线观看| 青青在线视频免费 | 日韩中文字幕一区 | 桥本有菜作品在线 | 久久国产精品免费网站 | 亚洲网红精品大秀在线观看 | 国产精品片 | 欧美日韩在线观看精品 | 国产一级视频在线观看 | h片免费网站 | 粗又长好猛好爽视频 | 香蕉久久夜色精品国产小优 | 俄罗斯freeⅹ性欧美 | 欧美在线视频7777kkkk | 91tv破解版不限次数 | free性丰满hd性欧美人体 | 99精品热| 惊弦45集免费看 | 四虎在线视频免费观看视频 | 欧美日韩精品一区二区三区视频 | 久久99re2热在线播放7 | 日韩精品国产自在欧美 | 黄 色 大 片 网站 | 国产在线观看99 | 9久re在线观看视频精品 | 精彩国产萝视频在线 | 亚洲高清中文字幕精品不卡 | 日本免费三片在线观看 | 欧美日韩国产超高清免费看片 | yy3341殇情影院理论片 | 青草视频免费观看在线观看 | oneday日本在线观看完整版 | 日韩免费一区 | 国产一区二区三区在线观看视频 | 免费大片a一级一级 | 国产自拍视频一区 | 深夜影院深a |