最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用Java實(shí)現(xiàn)連連看小游戲

 更新時(shí)間:2022年05月09日 14:42:27   作者:zoeZiYu  
這篇文章主要為大家詳細(xì)介紹了用Java實(shí)現(xiàn)連連看小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

很多人寫游戲都是從連連看或者五子棋這類的簡單小游戲入手的,最近我也嘗試著寫了一個(gè)連連看,想要再梳理一遍其中的思路。

連連看的規(guī)則

連連看要求在一定范圍內(nèi)找到兩個(gè)特征一樣并且能夠通過空白的通道在兩折(直角)以內(nèi)相連的東西,連續(xù)點(diǎn)擊兩個(gè)東西之后消除。
通常我們會選擇用圖片來進(jìn)行匹配,這樣更直觀有趣。

如何存儲連連看的數(shù)據(jù)

使用二維數(shù)組進(jìn)行存儲,每一個(gè)數(shù)組元素對應(yīng)一個(gè)位置上的圖片種類。
例如我們分別用1,2,3,4代表四個(gè)不同的圖片,用0代表沒有圖片;那么二維數(shù)組{{},{},{},{}}就相應(yīng)地存儲對應(yīng)位置的數(shù)據(jù)。如果要對圖片進(jìn)行變更(連連看中的消除),那么只需要改變該位置對應(yīng)的數(shù)組元素的值就行了(在這個(gè)例子中,消除就改為0)。

如何實(shí)現(xiàn)數(shù)組數(shù)據(jù)的初始化

1、一般來說連連看開始都會隨機(jī)生成圖片,此處的隨機(jī)生成需要用到Random類里面的nextInt方法,能隨機(jī)生成給定范圍內(nèi)的隨機(jī)一個(gè)整數(shù)。
2、我們生成數(shù)組的時(shí)候要考慮一個(gè)問題:連連看相同的圖片個(gè)數(shù)是偶數(shù),這樣才不會到最后形成落單的尷尬局面。

//隨機(jī)給出數(shù)組值,初始化游戲數(shù)據(jù)
public int[][] DATA(int[][] data){
?? ??? ??? ?
?? ??? ??? ?int[][] d=data;
?? ??? ??? ?Random random=new Random();
?? ??? ??? ?for(int i=0;i<8;i++){
?? ??? ??? ??? ?d[0][i]=0;
?? ??? ??? ??? ?d[7][i]=0;
?? ??? ??? ?}
?? ??? ??? ?for(int i=1;i<7;i++){
?? ??? ??? ??? ?d[i][0]=0;
?? ??? ??? ??? ?d[i][7]=0;
?? ??? ??? ?}
?? ??? ??? ?for(int i=0;i<18;i++){
?? ??? ??? ??? ?
?? ??? ??? ?
?? ??? ??? ??? ?int m=random.nextInt(Const.Const_TYPECOUNNT)+1;
?? ??? ??? ??? ?int x1=random.nextInt(Const.COL)+1;
?? ??? ??? ??? ?int y1=random.nextInt(Const.COL)+1;
?? ??? ??? ??? ?
?? ??? ??? ??? ?while(d[x1][y1]!=0){
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?x1=random.nextInt(Const.COL)+1;
?? ??? ??? ??? ??? ?y1=random.nextInt(Const.COL)+1;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?d[x1][y1]=m;?? ?
?? ??? ??? ??? ?int x2=random.nextInt(Const.COL)+1;
?? ??? ??? ??? ?int y2=random.nextInt(Const.COL)+1;
?? ??? ??? ??? ?while(d[x2][y2]!=0){
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?x2=random.nextInt(Const.COL)+1;
?? ??? ??? ??? ??? ?y2=random.nextInt(Const.COL)+1;
?? ??? ??? ??? ?
?? ??? ??? ?}
?? ??? ??? ?d[x2][y2]=m;
?? ??? ??? ?}
?? ??? ??? ?return(d);
?? ??? ??? ?
?? ??? ?}

如何繪制圖片

連連看的存儲都是以int的類型存儲的,可我們要呈現(xiàn)出來的效果是一張一張的圖片……
先用Image導(dǎo)入所有圖片,最好圖片的命名能夠用數(shù)字命名,這樣就可以批量導(dǎo)入了。這里就不過多贅述了,看實(shí)例代碼吧:

?public void init(){
?? ??? ?imgArr = new Image[Const.Const_TYPECOUNNT];
?? ??? ?for(int i=0; i < imgArr.length; i++){
?? ??? ?imgArr[i] = new ImageIcon("llkImage/"+i+".jpg").getImage();
?? ??? ?}
?? ?}

關(guān)于圖片大小的調(diào)整我用的是比較原始的方法:編輯圖片本身像素大小;還可以通過drawImage來直接規(guī)定大小。

重繪棋子

沒有重繪的窗體在我們對其進(jìn)行拖動或者最小化等改變的時(shí)候會變成空白的,重繪就是將窗體的paint方法重寫,這樣對窗體的任何操作都會將paint方法重新寫一遍。也就是在屏幕上重新畫一遍。
我們的棋子都存在一個(gè)二維數(shù)組里面,那么我們就可以將棋子繪制的步驟放在重繪里面來實(shí)現(xiàn),那么棋子就跟窗體一樣,可以“一直存在”了,也可以根據(jù)數(shù)組的改變來改變。

代碼示例:

public void paint(Graphics g) {
?? ??? ?// 重繪paint方法
?? ??? ?super.paint(g);
?? ??? ?//

?? ??? ?for (int i = 1; i < Const.COL+1; i++) {
?? ??? ??? ?for (int j = 1; j < Const.ROW+1; j++) {?? ??? ?
?? ??? ?if (data[i][j] == 0) {
?? ??? ??? ?g.setColor(new Color(69,175,198));
?? ??? ??? ?g.fillRect(Const.START_X + i * Const.SIZE, Const.START_Y + j * Const.SIZE, Const.SIZE, Const.SIZE);
?? ??? ?}?
?? ??? ?else {
?? ??? ??? ?g.drawImage(imgArr[data[i][j]-1], Const.START_X + i * Const.SIZE, Const.START_Y + j * Const.SIZE, null);
?? ??? ??? ??
?? ??? ??? ?}
?? ??? ?}
?? ?}

連連看的實(shí)現(xiàn)算法

兩個(gè)圖片消除的方法有三種:

1.直線連接
2.一折連接
3.二折連接

其中二折連接可以找一個(gè)點(diǎn)既與其中一個(gè)圖片一折連接又與另一個(gè)圖片直線連接;一折連接又可以找一個(gè)點(diǎn)與其中一個(gè)圖片直線連接又與另一個(gè)圖片直線連接。
所以綜上所述,只需要寫出一個(gè)直線連接的判斷方法,我們所有的規(guī)則方法就都可以實(shí)現(xiàn)了。

數(shù)組的元素=0時(shí)代表這里的圖片為空,有路可走。
首先,兩個(gè)數(shù)組元素直線相連的前提是這兩個(gè)元素的橫坐標(biāo)或者縱坐標(biāo)相等且路徑上的數(shù)組元素全部為零。

代碼示例:

//0折點(diǎn)的方法
public boolean zero(int[][] data,int X1, int Y1,int X2,int Y2){
?? ??? ?int max;?
?? ??? ?int min;
?? ?
?? ??? ?//x值相等
?? ??? ?if(X1==X2){
?? ??? ??? ?max=Y1 > Y2 ? Y1:Y2;
?? ??? ??? ?min=Y1 < Y2 ? Y1:Y2;
?? ??? ??? ?for(int i=min+1;i<max;i++){
?? ??? ??? ??? ?if(data[X1][i]!=0){
?? ??? ??? ??? ??? ?return false;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?return true;
?? ??? ?}
?? ??? ?//y值相等
?? ??? ?else if(Y1==Y2){
?? ??? ??? ?max=X1 > X2 ? X1:X2;
?? ??? ??? ?min=X1 < X2 ? X1:X2;
?? ??? ??? ?for(int i=min+1;i<max;i++){
?? ??? ??? ??? ?if(data[i][Y1]!=0){
?? ??? ??? ??? ??? ?return false;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?return true;
?? ??? ?}
?? ??? ?else return false;
?? ?}
?? ?//1折點(diǎn)的方法
? ? public boolean one(int[][] data,int X1, int Y1,int X2,int Y2){
? ? ?? ?
? ? ?? ?if((zero(data,X1,Y1,X1,Y2)&&zero(data,X1,Y2,X2,Y2)&&data[X1][Y2]==0)||(data[X2][Y1]==0&&zero(data,X1,Y1,X2,Y1)&&zero(data,X2,Y1,X2,Y2))){
? ? ?? ??? ?return true;
? ? ?? ?}
? ? ?? ?return false;
? ? ?? ?}
? ??
?? ?//2折點(diǎn)的方法
?? ?public boolean two(int[][] data,int X1, int Y1,int X2,int Y2){?
?? ??? ?//向下尋找一個(gè)第一折點(diǎn)
?? ??? ?for(int i=X1+1;i<=Const.COL+1;i++){
?? ??? ??? ?if(zero(data,X1,Y1,i,Y1)&&one(data,i,Y1,X2,Y2)){
?? ??? ??? ??? ?return true;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?//向上尋找一個(gè)第一折點(diǎn)
?? ??? ?for(int i=X1-1;i>=0;i--){
?? ??? ??? ?if(zero(data,X1,Y1,i,Y1)&&one(data,i,Y1,X2,Y2)){
?? ??? ??? ??? ?return true;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?//向左
?? ??? ?for(int i=Y1-1;i>=0;i--){
?? ??? ??? ?if(zero(data,X1,Y1,X1,i)&&one(data,X1,i,X2,Y2)){
?? ??? ??? ??? ?return true;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?//向右
?? ??? ?for(int i=Y1+1;i<=Const.ROW+1;i++){
?? ??? ??? ?if(zero(data,X1,Y1,X1,i)&&one(data,X1,i,X2,Y2)){
?? ??? ??? ??? ?return true;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?return false;
?? ?}

如何獲取兩次鼠標(biāo)點(diǎn)擊的位置

廢話不多說,直接上代碼:

//鼠標(biāo)點(diǎn)擊松開事件
public void mouseReleased(MouseEvent e) {
?? ??? ?int x,y;
?? ??? ?Rule rule = new Rule();
?? ??? ?x = e.getX();
?? ??? ?y = e.getY();
?? ??? ?
?? ??? ?if(count%2==0){
?? ??? ?X1 = (x - Const.START_X) / Const.SIZE;
?? ??? ?Y1 = (y - Const.START_Y) / Const.SIZE;
?? ??? ?count++;
?? ??? ?}
?? ??? ?else {
?? ??? ?X2 = (x - Const.START_X) / Const.SIZE;
?? ??? ?Y2 = (y - Const.START_Y) / Const.SIZE;
?? ??? ?count++;
?? ??? ?if (rule.judge(X1, Y1, X2, Y2, data)&&
?? ??? ??? ??? ?(rule.zero(data,X1,Y1,X2,Y2)||rule.one(data, X1, Y1, X2, Y2)||rule.two(data, X1, Y1, X2, Y2))){
?? ??? ??? ?data[X1][Y1]=0;data[X2][Y2]=0;
?? ??? ?}
?? ??? ?}
?? ??? ?
?? ??? ?ui.repaint();
?? ??? ?
?? ?}

成果展示

以上,我的游戲還是個(gè)很簡單的模板,仍待完善,可以把界面做得更精美,還可以增加游戲難度的選擇以及時(shí)間和步數(shù)的規(guī)定,最后還可以加上游戲的輸贏判斷,希望能夠幫助到有需要的人。

相關(guān)文章

  • Spring的@ComponentScan注解用法介紹

    Spring的@ComponentScan注解用法介紹

    這篇文章主要介紹了Spring的@ComponentScan注解用法介紹,@ComponentScan注解一般和@Configuration注解一起使用,主要的作用就是定義包掃描的規(guī)則,然后根據(jù)定義的規(guī)則找出哪些需類需要自動裝配到spring的bean容器中,然后交由spring進(jìn)行統(tǒng)一管理,需要的朋友可以參考下
    2023-11-11
  • Spring @Retryable注解輕松搞定循環(huán)重試功能

    Spring @Retryable注解輕松搞定循環(huán)重試功能

    spring系列的spring-retry是另一個(gè)實(shí)用程序模塊,可以幫助我們以標(biāo)準(zhǔn)方式處理任何特定操作的重試。在spring-retry中,所有配置都是基于簡單注釋的。本文主要介紹了Spring@Retryable注解如何輕松搞定循環(huán)重試功能,有需要的朋友可以參考一下
    2023-04-04
  • 詳解SpringBoot集成Redis來實(shí)現(xiàn)緩存技術(shù)方案

    詳解SpringBoot集成Redis來實(shí)現(xiàn)緩存技術(shù)方案

    本篇文章主要介紹了詳解SpringBoot集成Redis來實(shí)現(xiàn)緩存技術(shù)方案,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-06-06
  • JDK完全卸載超詳細(xì)步驟

    JDK完全卸載超詳細(xì)步驟

    這篇文章主要給大家介紹了關(guān)于JDK完全卸載超詳細(xì)步驟的相關(guān)資料,在安裝JDK之前,最好將原來可能安裝過的JDK卸載掉,以免影響到新JDK的使用,需要的朋友可以參考下
    2023-08-08
  • Java基礎(chǔ)之命名規(guī)范的詳解

    Java基礎(chǔ)之命名規(guī)范的詳解

    這篇文章主要介紹了Java基礎(chǔ)之命名規(guī)范的詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)Java基礎(chǔ)的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Java項(xiàng)目的目錄結(jié)構(gòu)詳解

    Java項(xiàng)目的目錄結(jié)構(gòu)詳解

    本文主要介紹了Java項(xiàng)目的目錄結(jié)構(gòu)詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Spring中使用自定義ThreadLocal存儲導(dǎo)致的坑及解決

    Spring中使用自定義ThreadLocal存儲導(dǎo)致的坑及解決

    這篇文章主要介紹了Spring中使用自定義ThreadLocal存儲導(dǎo)致的坑及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 沒有編輯器的環(huán)境下是如何創(chuàng)建Servlet(Tomcat+Java)項(xiàng)目的?

    沒有編輯器的環(huán)境下是如何創(chuàng)建Servlet(Tomcat+Java)項(xiàng)目的?

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著在沒有編輯器的環(huán)境下如何創(chuàng)建Servlet(Tomcat+Java)項(xiàng)目展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • SpringBoot中的@ControllerAdvice注解原理詳解

    SpringBoot中的@ControllerAdvice注解原理詳解

    這篇文章主要介紹了SpringBoot中的@ControllerAdvice注解原理詳解,在SpringBoot應(yīng)用程序啟動過程中,Spring會掃描所有的類,尋找?guī)в蠤ControllerAdvice注解的類這些方法會被添加到一個(gè)映射表中,以便后續(xù)處理異常時(shí)能找到對應(yīng)的處理方法,需要的朋友可以參考下
    2024-01-01
  • 使用Java調(diào)用Yolo模型的基本步驟

    使用Java調(diào)用Yolo模型的基本步驟

    Yolo(You Only Look Once)是一種基于深度學(xué)習(xí)的目標(biāo)檢測算法,它可以在一張圖像中同時(shí)檢測出多個(gè)目標(biāo),并給出它們的位置和類別,這篇文章主要介紹了使用Java調(diào)用Yolo模型的基本步驟,需要的朋友可以參考下
    2024-03-03

最新評論

临洮县| 莫力| 静宁县| 夏河县| 青神县| 九龙城区| 兴安盟| 手机| 玉田县| 香港 | 高安市| 奉贤区| 静宁县| 伊春市| 运城市| 津市市| 关岭| 北票市| 聂拉木县| 永州市| 阿勒泰市| 大同县| 进贤县| 盐源县| 东丰县| 陇南市| 维西| 藁城市| 泰安市| 聂荣县| 罗山县| 西吉县| 南涧| 通海县| 酉阳| 柯坪县| 白水县| 东乌珠穆沁旗| 南通市| 朝阳市| 深州市|