歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java 對對碰游戲

Java 對對碰游戲

日期:2017/3/1 10:40:02   编辑:Linux編程

對對碰游戲規則說明:

一. 概述

游戲在 8 × 8 格子的游戲池中進行。每個格子中有一個圖標。鼠標連續選中兩個相鄰的圖標,它們的位置會互換,互換後如果橫排或豎排有 3 個以上相同的圖標,則可以消去該圖標,並得分。

二. 基本規則

交換
玩家選中相鄰(橫、豎)的兩個圖標,則這兩個圖標的位置發生互換,如果互換成功則消去圖標,否則取消位置交換。

消去
玩家選擇兩個圖標進行位置互換,互換後如果橫排或豎排有 3 個以上相同的圖標,則消去這幾個相同的圖標,如果互換後沒有可以消去的圖標,則選中的兩個圖標換回原來的位置。消去後的空格由上面的圖標掉下來補齊。每次消去圖標玩家都能得到一定的分數。

連鎖
玩家消去圖標後,上面的圖標掉下來補充空格。如果這時游戲池中有連續擺放(橫、豎)的 3 個或 3 個以上相同的圖標,則可以消去這些圖標,這就是一次連鎖。空格被新的圖標填充,又可以進行下一次連鎖。每次連鎖會有加分。

重排
玩家已經不能消去任何圖標時,將清空游戲池,用新的圖標填充。

對對碰游戲算法分析:
分析一下,交換一般分為三種情況:
情況1:交換後,消除的頭像是豎排的。
情況2:交換後,消除的頭像是橫排的。
情況3:交換後,消除的頭像橫豎排都存在
過程就是點擊兩個圖樣,先檢查是否是同一圖樣,再檢查是否在同一直線,再檢查是否是一個折點,再是兩個折點,如果都不是則返回無解,如果是,返回TRUE,記錄折點,用直線連接折點和連接點並消除兩個圖樣,這個點的值變為0



交換、消除、填補算法

  1. public void setExchange() {
  2. if (isSelected) {
  3. isExchange = true;
  4. isSelected = false;
  5. doExchange();
  6. }
  7. }
  8. private void moveRightDown() {
  9. if (currentX == BODY_W - 1 || currentY == BODY_H - 1) {
  10. isSelected = false;
  11. }
  12. currentX = ++currentX % BODY_W;
  13. currentY = ++currentY % BODY_H;
  14. setExchange();
  15. }
  16. private void moveLeftDown() {
  17. if (currentX == 0 || currentY == BODY_H - 1) {
  18. isSelected = false;
  19. }
  20. currentX = (--currentX + BODY_W) % BODY_W;
  21. currentY = ++currentY % BODY_H;
  22. setExchange();
  23. }
  24. private void moveRightUp() {
  25. if (currentY == 0 || currentX == BODY_W - 1) {
  26. isSelected = false;
  27. }
  28. currentX = ++currentX % BODY_W;
  29. currentY = (--currentY + BODY_H) % BODY_H;
  30. setExchange();
  31. }
  32. private void moveLeftUp() {
  33. if (currentX == 0 || currentY == 0) {
  34. isSelected = false;
  35. }
  36. currentX = (--currentX + BODY_W) % BODY_W;
  37. currentY = (--currentY + BODY_H) % BODY_H;
  38. setExchange();
  39. }
  40. private void moveUp() {
  41. if (currentY == 0) {
  42. isSelected = false;
  43. }
  44. currentY = (--currentY + BODY_H) % BODY_H;
  45. setExchange();
  46. }
  47. private void moveDown() {
  48. if (currentY == BODY_H - 1) {
  49. isSelected = false;
  50. }
  51. currentY = ++currentY % BODY_H;
  52. setExchange();
  53. }
  54. private void moveLeft() {
  55. if (currentX == 0) {
  56. isSelected = false;
  57. }
  58. currentX = (--currentX + BODY_W) % BODY_W;
  59. setExchange();
  60. }
  61. private void moveRight() {
  62. if (currentX == BODY_W - 1) {
  63. isSelected = false;
  64. }
  65. currentX = ++currentX % BODY_W;
  66. setExchange();
  67. }
  68. private void doExchange() {
  69. if (currentX - selectedX == -1) {
  70. if (currentY - selectedY == -1) {
  71. tempMove[currentX][currentY] = 9;
  72. tempMove[selectedX][selectedY] = 1;
  73. } else if (currentY - selectedY == 0) {
  74. tempMove[currentX][currentY] = 6;
  75. tempMove[selectedX][selectedY] = 4;
  76. } else if (currentY - selectedY == 1) {
  77. tempMove[currentX][currentY] = 3;
  78. tempMove[selectedX][selectedY] = 7;
  79. }
  80. } else if (currentX - selectedX == 0) {
  81. if (currentY - selectedY == -1) {
  82. tempMove[currentX][currentY] = 8;
  83. tempMove[selectedX][selectedY] = 2;
  84. } else if (currentY - selectedY == 1) {
  85. tempMove[currentX][currentY] = 2;
  86. tempMove[selectedX][selectedY] = 8;
  87. }
  88. } else if (currentX - selectedX == 1) {
  89. if (currentY - selectedY == -1) {
  90. tempMove[currentX][currentY] = 7;
  91. tempMove[selectedX][selectedY] = 3;
  92. } else if (currentY - selectedY == 0) {
  93. tempMove[currentX][currentY] = 4;
  94. tempMove[selectedX][selectedY] = 6;
  95. } else if (currentY - selectedY == 1) {
  96. tempMove[currentX][currentY] = 1;
  97. tempMove[selectedX][selectedY] = 9;
  98. }
  99. }
  100. int temp = body[selectedX][selectedY];
  101. body[selectedX][selectedY] = body[currentX][currentY];
  102. body[currentX][currentY] = temp;
  103. }
Copyright © Linux教程網 All Rights Reserved