日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java實現簡易俄羅斯方塊

瀏覽:94日期:2022-08-31 09:00:27

本文實例為大家分享了Java實現簡易俄羅斯方塊的具體代碼,供大家參考,具體內容如下

一、將對象抽象為類

首先考慮俄羅斯方塊游戲中含有哪些具體的對象,對象中含有哪些具體屬性和方法,然后用代碼來實現。

建立如下類:

Cell類:代表最小的方格單位,構成7種圖形的最基本圖形。

含有row(行號),col(列號),image(對應的圖片)屬性,

含有left(左移),right(右移),drop(下落)方法。

Tetromino類:代表由4個最小方格構成的7種圖形的合集。

含有cells(四個方塊)屬性,

含有moveLeft(四格方塊向左移動),moveRight(四格方塊向右移動),softDrop(軟下落),randomOne(隨機生成一個四格方格)方法。

T類繼承于Tetromino類:

Java實現簡易俄羅斯方塊

I類繼承于Tetromino類:

Java實現簡易俄羅斯方塊

L類繼承于Tetromino類:

Java實現簡易俄羅斯方塊

S類繼承于Tetromino類:

Java實現簡易俄羅斯方塊

Z類繼承于Tetromino類:

Java實現簡易俄羅斯方塊

O類繼承于Tetromino類:

Java實現簡易俄羅斯方塊

J類繼承于Tetromino類:

Java實現簡易俄羅斯方塊

Tetris類:俄羅斯方塊的主方法類,包括了游戲運行過程中所需要的眾多方法。

含有currentOne(正在下落的四格方塊),nextOne(即將下落的四格方塊),Cell[][]wall(二維數組的表格,代表墻)屬性。

二、類的實現

Notes:各類實現過程中要符合Javabean規范。

Cell類:

package com.tetris; import java.awt.image.BufferedImage; /* * 俄羅斯方塊中的最小單位:方格 * 特征(屬性): * row--行號 * col--列號 * image--對應的圖片 * * 行為(方法) * left(); * right(); * drop(); */public class Cell { private int row; //行 private int col; //列 private BufferedImage image; public Cell(int row, int col, BufferedImage image) { super(); this.row = row; this.col = col; this.image = image; } public Cell() { super(); // TODO Auto-generated constructor stub } public int getRow() { return row; } public void setRow(int row) { this.row = row; } public int getCol() { return col; } public void setCol(int col) { this.col = col; } public BufferedImage getImage() { return image; } public void setImage(BufferedImage image) { this.image = image; } @Override public String toString() { return '(' + row + ', ' + col + ')'; } //向左移動 public void left(){ col--; } //向右移動 public void right(){ col++; } //向下移動 public void drop(){ row++; }}

Tetromino類:

package com.tetris; import java.util.Arrays; import javax.xml.transform.Templates; /* * 四格方塊 * 屬性: * ---cells,----四個方塊 * * 行為: * moveLeft() * moveRight() * softDrop() */public class Tetromino { protected Cell[] cells=new Cell[4]; //四格方塊向左移動 //實際上:就是每個方塊向左移動 public void moveLeft(){ for (int i = 0; i < cells.length; i++) { cells[i].left(); } } //四格方塊向右移動 //實際上:就是每個方塊向右移動 public void moveRight(){ for (int i = 0; i < cells.length; i++) { cells[i].right(); } } //四格方塊向下移動 //實際上:就是每個方塊向下移動 public void softDrop(){ for (int i = 0; i < cells.length; i++) { cells[i].drop(); } } @Override public String toString() { return '[' + Arrays.toString(cells) + ']'; } //隨機生成一個四格方塊 public static Tetromino randomOne(){ Tetromino t = null; int num=(int)(Math.random()*7); switch (num){ case 0:t=new T();break; case 1:t=new O();break; case 2:t=new I();break; case 3:t=new J();break; case 4:t=new L();break; case 5:t=new S();break; case 6:t=new Z();break; default: break; } return t; }}

T類繼承于Tetromino類:

package com.tetris; public class T extends Tetromino { //提供構造器,進行初始化 //T型的四格方塊的位置 public T(){ cells[0]=new Cell(0,4,Tetris.T); cells[1]=new Cell(0,3,Tetris.T); cells[2]=new Cell(0,5,Tetris.T); cells[3]=new Cell(1,4,Tetris.T); }}

I類繼承于Tetromino類:

package com.tetris; public class I extends Tetromino { //提供構造器,進行初始化 //T型的四格方塊的位置 public I(){ cells[0]=new Cell(0,4,Tetris.I); cells[1]=new Cell(0,3,Tetris.I); cells[2]=new Cell(0,5,Tetris.I); cells[3]=new Cell(0,6,Tetris.I); }}

L類繼承于Tetromino類:

package com.tetris; public class L extends Tetromino { //提供構造器,進行初始化 //T型的四格方塊的位置 public L(){ cells[0]=new Cell(0,4,Tetris.L); cells[1]=new Cell(0,3,Tetris.L); cells[2]=new Cell(0,5,Tetris.L); cells[3]=new Cell(1,5,Tetris.L); }}

S類繼承于Tetromino類:

package com.tetris; public class S extends Tetromino { //提供構造器,進行初始化 //T型的四格方塊的位置 public S(){ cells[0]=new Cell(1,4,Tetris.S); cells[1]=new Cell(0,3,Tetris.S); cells[2]=new Cell(0,4,Tetris.S); cells[3]=new Cell(1,5,Tetris.S); }}

Z類繼承于Tetromino類:

package com.tetris; public class Z extends Tetromino { //提供構造器,進行初始化 //T型的四格方塊的位置 public Z(){ cells[0]=new Cell(0,4,Tetris.Z); cells[1]=new Cell(0,5,Tetris.Z); cells[2]=new Cell(1,3,Tetris.Z); cells[3]=new Cell(1,4,Tetris.Z); }}

O類繼承于Tetromino類:

package com.tetris; public class O extends Tetromino { //提供構造器,進行初始化 //T型的四格方塊的位置 public O(){ cells[0]=new Cell(0,4,Tetris.O); cells[1]=new Cell(0,5,Tetris.O); cells[2]=new Cell(1,4,Tetris.O); cells[3]=new Cell(1,5,Tetris.O); }}

J類繼承于Tetromino類:

package com.tetris; public class J extends Tetromino { //提供構造器,進行初始化 //T型的四格方塊的位置 public J(){ cells[0]=new Cell(0,4,Tetris.J); cells[1]=new Cell(0,3,Tetris.J); cells[2]=new Cell(0,5,Tetris.J); cells[3]=new Cell(1,3,Tetris.J); }}

Tetris類:

//屬性:正在下落的四格方塊private Tetromino currentOne=Tetromino.randomOne();//屬性:將要下落的四格方塊private Tetromino nextOne=Tetromino.randomOne(); //屬性:墻,20行10列的表格 寬度為26private Cell[][]wall=new Cell[20][10];

三、繪制俄羅斯方塊圖形

個人理解,這個過程就是顯現出游戲界面的過程,當然啦,這一步主要是加載靜態資源,諸如圖片,音頻和視頻等。

1.加載靜態資源

俄羅斯方塊主要應用的靜態資源是圖片,所以我們用到的是IO類中的ImageIO類中的ImageIO.read方法,導入各類四格方塊的圖形圖片以及背景圖片,具體代碼如下:

public static BufferedImage T; public static BufferedImage I; public static BufferedImage O; public static BufferedImage J; public static BufferedImage L; public static BufferedImage S; public static BufferedImage Z; public static BufferedImage background; static{ try { /* * getResouce(String url) * url:加載圖片的路徑 * 相對位置是同包下 */ T=ImageIO.read(Tetris.class.getResource('T.png')); I=ImageIO.read(Tetris.class.getResource('I.png')); O=ImageIO.read(Tetris.class.getResource('O.png')); J=ImageIO.read(Tetris.class.getResource('J.png')); L=ImageIO.read(Tetris.class.getResource('L.png')); S=ImageIO.read(Tetris.class.getResource('S.png')); Z=ImageIO.read(Tetris.class.getResource('Z.png')); background=ImageIO.read(Tetris.class.getResource('tetris.png')); } catch (Exception e) { e.printStackTrace(); } }

2.畫游戲靜態界面

在這一部分中需要繪制三部分,用到了三種方法,分別是paintCurrentOne(正在下落的四格方塊),paintNextOne(等待進入的四格方塊),paintWall(背景墻)。

繪制需要重寫JPanel類中的paint(Graphics g)方法,具體代碼實現如下:

public void paint(Graphics g){ //繪制背景 /* * g:畫筆 * g.drawImage(image,x,y,null) * x:開始繪制的橫坐標 * y:開始繪制的縱坐標 */ g.drawImage(background,0,0,null); //平移坐標軸 g.translate(15, 15); //繪制墻 paintWall(g); //繪制正在下落的四格方塊 paintCurrentOne(g); //繪制下一個即將下落的四格方塊 paintNextOne(g); } /* * 繪制下一個即將下落的四格方塊 * 繪制到面板的右上角的相應區域 */ public void paintNextOne(Graphics g){ //獲取nextOne對象的四個元素 Cell[] cells=nextOne.cells; for (Cell c:cells) { //獲取每一個元素的行號和列號 int row=c.getRow(); int col=c.getCol(); //橫坐標和縱坐標 int x=col*CELL_SIZE+260; int y=row*CELL_SIZE+26; g.drawImage(c.getImage(), x, y, null); } } /* * 繪制正在下落的四格方塊 * 取出數組的元素 * 繪制數組的圖片 * 橫坐標x * 縱坐標y */ public void paintCurrentOne(Graphics g){ Cell[] cells=currentOne.cells; for (Cell c:cells) { int x=c.getCol()*CELL_SIZE; int y=c.getRow()*CELL_SIZE; g.drawImage(c.getImage(), x, y, null); } } /* * 墻是20行,10列的表格 * 是一個二維數組 * 用雙層循環 * 繪制正方形 */ public void paintWall(Graphics a){ //外層循環控制行數 for (int i = 0; i < 20; i++) { //內層循環控制列數 for (int j = 0; j < 10; j++) { int x=j*CELL_SIZE; int y=i*CELL_SIZE; Cell cell=wall[i][j]; a.drawRect(x, y, CELL_SIZE, CELL_SIZE); if(wall[i][j]==null){ a.drawRect(x, y, CELL_SIZE, CELL_SIZE); }else{ a.drawImage(cell.getImage(),x,y,null); } } } }

實現效果如下:

Java實現簡易俄羅斯方塊

3.讓四格方塊動起來

光有靜態的畫面是不能夠稱為游戲的,還有要動態效果和接收鍵盤指令并響應的能力。

(1)動態效果

俄羅斯方塊中的動態效果主要指7種四格方塊擁有自動下降,軟下降,左移,右移,旋轉的能力,分別使用canDrop(),softDropAction(),moveLeftAction(),moveRightAction(),spinCellAction()方法來實現,與此同時,還需根據游戲規則注意四格方塊可能遇到觸碰到左右邊界,方塊覆蓋等錯誤,在此使用outOfBounds(),coincide()方法來避免。當不能下落時,需要將四格方塊,嵌入到墻中,使用landToWall()方法。

具體代碼實現如下:

/* * 使用left鍵控制向左的行為 */ public void moveLeftAction() { currentOne.moveLeft(); if(outOfBounds()||coincide()){ currentOne.moveRight(); } } /* * 使用right鍵控制向右的行為 */ public void moveRightAction() { currentOne.moveRight(); if(outOfBounds()||coincide()){ currentOne.moveLeft(); } } /* * 使用down鍵控制四格方塊的下落 */ public void softDropAction() { if(canDrop()){ currentOne.softDrop(); }else{ landToWall(); currentOne=nextOne; nextOne=Tetromino.randomOne(); } } public boolean outOfBounds(){ Cell[] cells=currentOne.cells; for (Cell c : cells) { int col=c.getCol(); if(col<0||col>9){ return true; } } return false; } public boolean coincide(){ Cell[] cells=currentOne.cells; for (Cell c : cells) { int row=c.getRow(); int col=c.getCol(); if(wall[row][col]!=null){ return true; } } return false; } public boolean canDrop(){ Cell[] cells=currentOne.cells; for (Cell c: cells) { //獲取每個元素的行號 /* * 判斷: * 只要有一個元素的下一行上有方塊 * 或者只要有一個元素到達最后一行,就不能下落了 */ int row=c.getRow(); int col=c.getCol(); if(row==19){ return false; } if(wall[row+1][col]!=null){ return false; } } return true; } /* * 當不能下落時,需要將四格方塊,嵌入到墻中 * 也就是存儲到二維數組中相應的位置上 */ public void landToWall(){ Cell[] cells=currentOne.cells; for (Cell c : cells) { //獲取最終的行號和列號 int row=c.getRow(); int col=c.getCol(); wall[row][col]=c; } }

實現效果如下:

Java實現簡易俄羅斯方塊

(2)接收鍵盤指令并響應

游戲和玩家緊密關聯,所以接下來我們需要使玩家能夠通過鍵盤控制四格方塊移動。

因此,我們要開啟鍵盤監聽來達到玩家實時控制游戲的目的,并且通過不同的按鍵調用四格方塊移動的不同方法。

具體代碼如下:

//開啟鍵盤監聽事件 KeyListener l=new KeyAdapter() { public void keyPressed(KeyEvent e){ //獲取以下鍵子的代號 int code=e.getKeyCode(); switch (code) { case KeyEvent.VK_DOWN: softDropAction();break; case KeyEvent.VK_LEFT: moveLeftAction();break; case KeyEvent.VK_RIGHT: moveRightAction();break; } repaint(); } }; this.addKeyListener(l); this.requestFocus(); while(true){ /* * 當程序運行到此,會進入睡眠狀態 * 睡眠時間為300毫秒,單位為毫秒 * 300毫秒后會自動執行后續代碼 */ try { Thread.sleep(300); } catch (InterruptedException e) {e.printStackTrace(); } if(canDrop()){ currentOne.softDrop(); }else{ landToWall(); //將下一個下落的四格方塊賦值給正在下落的變量 currentOne=nextOne; nextOne=Tetromino.randomOne(); } /* * 下落之后,要重新進行繪制,才會看到下落后的位置 * repaint方法也是Jpanel類中提供的 * 此方法調用了paint方法 */ repaint(); } }實現效果如下:

Java實現簡易俄羅斯方塊

更多關于俄羅斯方塊的文章,請點擊查看專題:《俄羅斯方塊》

更多精彩游戲,請參考專題《java經典小游戲》

更多有趣的經典小游戲實現專題,分享給大家:

C++經典小游戲匯總

python經典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經典游戲 玩不停

javascript經典小游戲匯總

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品国产一级| 黑森林国产精品av| 麻豆久久久久久| 日韩精品一区二区三区中文字幕| 91精品国产乱码久久久久久久 | 黄色在线网站噜噜噜| 国产午夜精品一区在线观看| 日本不卡视频在线观看| 在线 亚洲欧美在线综合一区| 国产一区二区三区久久| 国内精品伊人| 人人精品亚洲| av成人国产| 亚洲一二av| 国产精品sm| 日韩中文在线电影| 不卡av一区二区| 午夜天堂精品久久久久| 日韩1区2区3区| 美女视频黄 久久| 国产精品毛片久久| 激情综合激情| 深夜日韩欧美| 国产欧美午夜| 欧美国产美女| 好吊日精品视频| 日韩激情一二三区| 中文字幕在线看片| 亚洲视频www| 日韩美女国产精品| 国产a久久精品一区二区三区| 91精品一区二区三区综合在线爱 | 精品日韩毛片| 欧美日韩亚洲一区三区| а√天堂8资源在线| 精品久久久亚洲| 亚洲播播91| 久久国产精品免费一区二区三区| 国产高潮在线| 欧美在线看片| 99国产精品| 成人欧美一区二区三区的电影| 日韩影院精彩在线| 日韩成人高清| 国产精久久一区二区| 日韩一区二区免费看| 日本黄色精品| 国产日韩视频在线| 丝袜国产日韩另类美女| 亚洲啊v在线| 日韩一区二区三区精品| 久久男女视频| 精品美女视频 | 日韩高清不卡| 国产极品模特精品一二| 伊人久久亚洲| 久久99伊人| 亚洲我射av| 99久久精品网站| 综合国产视频| 国产精品流白浆在线观看| 国产精品nxnn| 青草国产精品| 亚洲精品动态| 日韩精品国产精品| 日韩精品中文字幕一区二区| 99国产成+人+综合+亚洲欧美| 久久三级视频| 欧美日韩国产亚洲一区| 欧美日韩中文字幕一区二区三区| 精品久久一区| 国产不卡人人| 欧美福利专区| 免费人成黄页网站在线一区二区| 五月婷婷六月综合| 在线精品一区| 中文一区一区三区免费在线观 | 中国女人久久久| 日韩精品一区二区三区免费观看| 日韩欧美一区二区三区在线视频| 日韩欧美午夜| 午夜日韩福利| 久久国内精品自在自线400部| 国产高清视频一区二区| 国产精品麻豆久久| 成人久久久久| 性色av一区二区怡红| 日本午夜免费一区二区| 国产精品麻豆成人av电影艾秋| 久久精品理论片| 99视频精品全部免费在线视频| 影院欧美亚洲| 国产精品网在线观看| 99久久99久久精品国产片果冰| 日韩影院在线观看| 日韩精品视频网| 精品网站999| 亚洲综合中文| 激情黄产视频在线免费观看| 久久精品国产大片免费观看| 欧美中文一区二区| 18国产精品| 亚洲男女av一区二区| 久久福利在线| 国产综合婷婷| 麻豆中文一区二区| 国产精品美女久久久| 韩日一区二区| 蜜臀久久久久久久| 久久久精品午夜少妇| 精品一区二区三区中文字幕在线| 99久久夜色精品国产亚洲狼| 日本强好片久久久久久aaa| 亚洲天堂1区| 欧美激情麻豆| 亚洲精品在线观看91| 久久亚洲精品中文字幕| 免费的成人av| 伊人久久亚洲影院| 久久精品不卡| 九九精品调教| 青青草精品视频| 日韩视频1区| 日韩视频二区| 国产黄大片在线观看| 久久久久久婷| 国产传媒在线观看| 黄在线观看免费网站ktv| 精品一区二区三区视频在线播放 | 一区二区精品| 三级久久三级久久久| 香蕉久久夜色精品国产| 不卡在线一区| 国产 日韩 欧美一区| 国产一区二区三区黄网站| 国产精品一区二区三区美女| 免费看黄色91| 91精品国产调教在线观看| 久久精品国产99久久| 久久人人97超碰国产公开结果| 欧美日韩精品免费观看视完整| 国产精品1区在线| 国产精品天堂蜜av在线播放| 国产剧情一区| 国产伊人久久| 亚洲福利国产| 涩涩涩久久久成人精品| 你懂的亚洲视频| se01亚洲视频| 国产精品视区| 国产精选久久| 欧美日韩国产高清电影| 日本欧美在线看| 久久久久久亚洲精品美女| 99精品在线| 国产亚洲人成a在线v网站| 中文字幕在线视频网站| 久久福利精品| 欧美日韩网址| 91精品蜜臀一区二区三区在线 | 久久久久久久久成人| 久久久精品网| 国产亚洲人成a在线v网站| 天堂8中文在线最新版在线| 亚洲综合日本| 麻豆一区二区在线| 亚洲黄色影院| 在线中文字幕播放| 日韩精品免费视频一区二区三区| 精品中文字幕一区二区三区 | 亚洲一区二区三区在线免费| 国产一区二区三区视频在线| 日韩制服丝袜av| 日韩中文欧美| 精品一区二区三区亚洲| 日韩和欧美一区二区| 亚洲第一精品影视| 久久久久免费| 日韩和欧美一区二区三区| 国产亚洲精品v| 精精国产xxxx视频在线野外| 亚洲深深色噜噜狠狠爱网站| 精品国产欧美| 国产精品.xx视频.xxtv| 青青草国产成人99久久| 在线精品视频在线观看高清| 欧美国产日韩电影| 国产精品第十页| 国产视频一区二区在线播放| 亚洲三级av| 综合激情在线| 蜜臀久久久99精品久久久久久| 精品中文字幕一区二区三区| 亚州欧美在线| 亚洲视频播放| 中文无码日韩欧| 水蜜桃久久夜色精品一区| 国产精品久久国产愉拍| 日本三级亚洲精品| 国产激情精品一区二区三区|