亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java制作智能拼圖游戲原理及代碼

2019-11-26 15:14:23
字體:
來源:轉載
供稿:網友

今天突發奇想,想做一個智能拼圖游戲來給哄女友。

需要實現這些功能
第一圖片自定義
第二宮格自定義,當然我一開始就想的是3*3 4*4 5*5,沒有使用3*5這樣的宮格。
第三要實現自動拼圖的功能,相信大家知道女人耍游戲都不是很厲害,所以這個自動拼圖功能得有。

其他什么暫停、排行就不寫了!
現在重點問題出來了
要實現自動拼圖功能似乎要求有點高哦!計算機有可不能像人一樣只能:
先追究下本質

拼圖游戲其實就是排列問題:

排列有這么一個定義:在一個1,2,...,n的排列中,如果一對數的前后位置與大小順序相反,即前面的數大于后面的數,那么它們就稱為一個逆序。一個排列中逆序的總數就稱為這個排列的逆序數。逆序數為偶數的排列稱為偶排列;逆序數為奇數的排列稱為奇排列。如2431中,21,43,41,31是逆序,逆序數是4,為偶排列。
再來一個定義:交換一個排列中的兩個數,則排列的奇偶性發生改變。
以上定義都摘自《高等代數》。

拼圖排列必須是偶排列。這個在我參考文獻中可以找到。
所以我的只能拼圖是這樣實現的!

后續在寫

參考:http://en.wikipedia.org/wiki/Fifteen_puzzle

自動拼圖:

首先自動拼圖應該有一定的規則,根據我拼圖的經驗,要完成拼圖,不同區域使用的拼圖規則是不同的,所以:
我的宮格圖分為了4個區域(假如宮格圖是n*n個格子)
第一個區域:x坐標范圍 0到n-2,y坐標范圍 0到n-3
第二個區域:x坐標n-1,y坐標范圍 0到n-3
第三個區域:x坐標范圍 0到n-3 ,y坐標范圍 n-2和n-1
第四個區域:x坐標范圍 n-2到n-1 ,y坐標范圍 n-2和n-1;即最后四格

每個區域按照各自區域的規則即可完成

Puzzle.java

import java.io.FileNotFoundException;import java.io.PrintStream;import java.io.UnsupportedEncodingException;import java.util.Random; public class Puzzle { private long step = 0; private int n = 6;// 宮格基數 private int[][] puzzle; private int resetBlock = 0;// //空白塊位置 private int whiteBlockX; private int whiteBlockY;   //當前要準備移動的塊的坐標即復位塊 private int resetBlockX; private int resetBlockY;   private boolean isPrint=false;   public Puzzle() {  init(); }  public Puzzle(int n) {  this.n = n;  init(); }  private void init() {  puzzle = new int[n][n];  for (int y = 0; y < n; y++) {   for (int x = 0; x < n; x++) {    puzzle[y][x] = x + y * n;   }  }  whiteBlockX = n-1;  whiteBlockY = n-1;  int times = 100;// 打亂次數,必須是偶數  Random random = new Random();  while (times > 0) {   int x0 = random.nextInt(n);   int y0 = random.nextInt(n);   int x1 = random.nextInt(n);   int y1 = random.nextInt(n);   if (x0 != x1 && y0!=y1) {// 保證是偶排序    if((x0==n-1&&y0==n-1)||(x1==n-1&&y1==n-1)){//最后一個不調換     continue;    }    times--;    int t = puzzle[x0][y0];    puzzle[x0][y0] = puzzle[x1][y1];    puzzle[x1][y1] = t;   }  }//  int[][] p = {{22,9 ,1 ,5 ,0 ,25 },{//    33,23,20,26,18,21},{//    6 ,16,17,10,34,31},{//    19,28,32,7 ,3 ,2},{//    11,4 ,12,14,27,24},{//    15,29,30,8 ,13,35}};//  puzzle = p; }   public void sort(){  for (int y = 0; y < n; y++) {   for (int x = 0; x < n; x++) {    if (x == n - 1 && y == n - 1) {// 最后一個為空白,    } else {     reset(x, y);    }   }  } } //把塊復位移動目標位置 private void reset(int targetX, int targetY) {  // 找到復位塊當前的位置  initResetBlock(targetX, targetY);  /*   * 復位順序是從左到右,從上到下   * 移動方式 先上移動,再左移動   * 當前復位塊,它要復位的位置可分為 四種情況   * 1、不在最右邊一行也不是最下面兩行   * 2、最右邊一行 x=n-1,但不是下面兩行;   * 3、最下面兩行 y=n-2,但不是最右邊一行;   * 4、即使最右邊的一行也是最下面兩行   */  if(targetX < n-1 && targetY < n-2){   if(resetBlockX==targetX&&resetBlockY==targetY){//位置正確不用移動    return;//退出遞歸   }   resetBlockToTarget(targetX, targetY);  }else if(targetX==n-1 && targetY < n-2){//第二種情況   if(resetBlockX==targetX&&resetBlockY==targetY){//位置正確不用移動    return;//退出遞歸   }   reset2(targetX, targetY);  }else if(targetX < n-2 && targetY == n-2){//   isPrint=true;   reset3(targetX);   return;  }else{   initResetBlock(n-2, n-2);   resetBlockToTarget(n-2, n-2);   if(whiteBlockX<n-1){    whiteBlockRight();   }   if(whiteBlockY<n-1){    whiteBlockDown();   }   if(whiteBlockX==n-1&&whiteBlockY==n-1){    return;   }  }  reset(targetX, targetY);//遞歸 } private void initResetBlock(int targetX,int targetY){  resetBlock = targetX + targetY * n;  for (int y = 0; y < n; y++) {   for (int x = 0; x < n; x++) {    if (puzzle[y][x] == resetBlock) {// x,y就是復位塊的位置     resetBlockX = x;     resetBlockY = y;     break;    }   }  } } private void reset3(int targetX){//  if(targetX>=2){//  }  initResetBlock(targetX, n-1);  resetBlockToTarget(targetX, n-2);     initResetBlock(targetX, n-2);  resetBlockToTarget(targetX+1, n-2);  l:  while (!(whiteBlockX==targetX && whiteBlockY==n-1)) {   if(whiteBlockY<n-1){    whiteBlockDown();    continue l;   }   if(whiteBlockX>targetX){    whiteBlockLeft();    continue l;   }   break;  }  whiteBlockUp();  swapWhiteBlockAndCurrentBlock();     if(puzzle[n-2][targetX]!=resetBlock||puzzle[n-1][targetX]!=(resetBlock+n)){//沒有復位成功//   isPrint=true;   swapWhiteBlockAndCurrentBlock();   reset3_0();   reset3(targetX);  } } private void reset3_0(){  if(resetBlockX<n-1){   whiteBlockDown();   whiteBlockRight();   whiteBlockRight();   whiteBlockUp();   swapWhiteBlockAndCurrentBlock();   reset3_0();   return;  }  return; }     private void reset2_3(){  if(whiteBlockX==resetBlockX && whiteBlockY==resetBlockY+1){   return;//滿足條件,退出遞歸  }  //白塊可能在復位塊的:左方、左下、下方  if(whiteBlockY==resetBlockY){//左方   whiteBlockDown();  }else if(whiteBlockX < resetBlockX){//左下   whiteBlockRight();  }else {   whiteBlockUp();  }  reset2_3();//遞歸 }   private void reset2_2(int targetX, int targetY){  if(resetBlockX==targetX&&resetBlockY==targetY){//2、把復位塊移到目標位置正下方   return;//退出遞歸  }     //復位塊可能位置,目標位置左方、正下方、左下方  if(resetBlockX==targetX){//正下方 上移   resetBlockUp(targetX, targetY);  }else{//左方或左下方;先右移再上移   resetBlockRight(targetX, targetY);  }  reset2_2(targetX, targetY);//遞歸 }  private void reset2(int targetX, int targetY){  if(resetBlockX==targetX&&resetBlockY==targetY){//位置正確不用移動   return;//退出遞歸  }  /* 1、如果白塊正好占了目標位置:如果復位塊正好在下方,交換及完成復位,如果下方不是復位塊,把白塊移開目標位置   * 2、把復位塊移到目標位置正下方   * 3、把白塊移動復位塊下方   * 4、按照規定的步驟復位   */  //第一步  if(whiteBlockX==targetX&& whiteBlockY==targetY){   if(whiteBlockX==resetBlockX&&whiteBlockY==resetBlockY+1){//復位塊在下方    swapWhiteBlockAndCurrentBlock();    return;   }else{    whiteBlockDown();   }  }  //第二步 把復位塊移到目標位置正下方  reset2_2(targetX, targetY+1);  //第三步 把白塊移動復位塊下方  reset2_3();  //第四步 按照規定的步驟復位  swapWhiteBlockAndCurrentBlock();  whiteBlockLeft();  whiteBlockUp();  whiteBlockRight();  whiteBlockDown();  whiteBlockLeft();  whiteBlockUp();  whiteBlockRight();  whiteBlockDown();  swapWhiteBlockAndCurrentBlock();  whiteBlockLeft();  whiteBlockUp();  whiteBlockUp();  whiteBlockRight();  swapWhiteBlockAndCurrentBlock(); }   private void resetBlockToTarget(int targetX, int targetY){  if(resetBlockX==targetX&&resetBlockY==targetY){//位置正確不用移動   return;//退出遞歸  }    if(resetBlockY==targetY){//正左   resetBlockLeft(targetX, targetY);  }else{//左下,下,右下   if(resetBlockX>=targetX){//右下||下;上移    if(resetBlockX==n-1){//復位塊在最右邊,先左移;方便上移時統一的采用白塊逆時針方式     resetBlockLeft(targetX, targetY);    }else{     resetBlockUp(targetX, targetY);    }   }else{//左下;右移    resetBlockRight(targetX, targetY);   }  }  resetBlockToTarget(targetX, targetY);//遞歸 }   private void resetBlockRight(int targetX, int targetY){  if(resetBlockX==targetX&&resetBlockY==targetY){//位置正確不用移動   return;//退出遞歸  }  if(resetBlockX==n-1){//復位塊在最右邊了,無法右移,直接退出   return;  }//  System.out.println("resetBlockRight");  if(whiteBlockY<resetBlockY){//上方   if(whiteBlockY<resetBlockY-1){//上方多行    whiteBlockDown();   }else{//上方一行    if(whiteBlockX<resetBlockX+1){//左上和正上     whiteBlockRight();    }else{//右上     whiteBlockDown();    }   }  }else if(whiteBlockY==resetBlockY){//同一行   if(whiteBlockX<resetBlockX){//左方    if(whiteBlockY==n-1){//到底了,只能往上     whiteBlockUp();    }else{     whiteBlockDown();    }   }else{//右方    if(whiteBlockX==resetBlockX+1){     swapWhiteBlockAndCurrentBlock();     return;//退出遞歸    }else{     whiteBlockLeft();    }   }  }else{//下方   if(whiteBlockX <= resetBlockX){//左下、下    whiteBlockRight();   }else{//右下    whiteBlockUp();   }  }  resetBlockRight(targetX, targetY);//遞歸 }   private void resetBlockLeft(int targetX, int targetY){  if(resetBlockX==targetX&&resetBlockY==targetY){//位置正確不用移動   return;//退出遞歸  }  if(resetBlockX==0){//在左邊邊界 復位塊無法左移,直接退出遞歸   return;  }//  System.out.println("resetBlockLeft");  if(whiteBlockY<resetBlockY){//上方   if(whiteBlockY<resetBlockY-1){//上方多行    whiteBlockDown();   }else{//上方一行    if(whiteBlockX==resetBlockX){//上方     if(whiteBlockX==n-1){//最右邊,白塊無法右移,只能左移      whiteBlockLeft();     }else{      if(resetBlockY==n-1){//復位塊在最低端,白塊不能順時針移動       whiteBlockLeft();      }else{       whiteBlockRight();      }     }    }else if(whiteBlockX>resetBlockX){//右上方     if(resetBlockY==n-1){//復位塊在最低端,白塊不能順時針移動      whiteBlockLeft();     }else{      whiteBlockDown();     }    }else{//左上方     whiteBlockDown();    }   }  }else if(whiteBlockY==resetBlockY){//左方、右方   if(whiteBlockX<resetBlockX){//左方    if(whiteBlockX==resetBlockX-1){//左邊一格     swapWhiteBlockAndCurrentBlock();//退出遞歸     return;    }else{     whiteBlockRight();    }   }else{//右方    if(whiteBlockY==n-1){//到底了,不能下移。只能上移     whiteBlockUp();    }else{     whiteBlockDown();    }   }  }else{//左下、下方、右下   if(whiteBlockX<resetBlockX){//左下    if(whiteBlockX==resetBlockX-1){     whiteBlockUp();    }else{     whiteBlockRight();    }   }else{//下方、右下    whiteBlockLeft();   }  }  resetBlockLeft(targetX, targetY);//遞歸 }   private void resetBlockUp(int targetX, int targetY){  if(resetBlockX==targetX&&resetBlockY==targetY){//位置正確不用移動   return;//退出遞歸  }  if(resetBlockY==0){//復位塊到頂了,無法上移   return;  }//  System.out.println("resetBlockUp");  if (whiteBlockY < resetBlockY) {//上方   if(whiteBlockY < resetBlockY - 1){//上方多行    whiteBlockDown();   }else{//上方一行    if(whiteBlockX == resetBlockX){//白塊和復位塊在同一列(豎列) 白塊和復位塊直接交換位置     swapWhiteBlockAndCurrentBlock();//退出遞歸     return;    }else{     if(whiteBlockX<resetBlockX){//白塊在復位塊的左邊;白塊右移      whiteBlockRight();      }else{//白塊在復位塊的右邊;白塊左移      whiteBlockLeft();     }    }   }  } else if (whiteBlockY == resetBlockY) {//白塊和復位塊同一行;白塊上移   if(whiteBlockX<resetBlockX){//正左    if(whiteBlockX<resetBlockX-1){//正左多格     whiteBlockRight();    }else{//正左一格     if(whiteBlockY==n-1){//到底了      whiteBlockUp();     }else {      if(resetBlockX==n-1){//復位塊在最右邊,無法逆時針,只有順指針移動白塊       whiteBlockUp();      }else{       whiteBlockDown();      }     }    }   }else{//正右    whiteBlockUp();   }  }else{//白塊在復位塊下方,白塊需要饒過復位塊上移,白塊逆時針繞到白塊上面   //三種情況:左下,下,右下   if(whiteBlockX<=resetBlockX){//左下,下;白塊右移    if(resetBlockX==n-1){//復位塊在最右邊,無法逆時針,只有順指針移動白塊     if(whiteBlockX==resetBlockX){//正下方      whiteBlockLeft();     }else{//左下方      whiteBlockUp();     }    }else{     whiteBlockRight();    }   }else{//右下;白塊上移    whiteBlockUp();   }  }  resetBlockUp(targetX, targetY);//遞歸 }   //白塊和復位塊交換位置 private void swapWhiteBlockAndCurrentBlock(){  step++;  int tempX = whiteBlockX,tempY = whiteBlockY;  int temp = puzzle[whiteBlockY][whiteBlockX];  puzzle[whiteBlockY][whiteBlockX] = puzzle[resetBlockY][resetBlockX];  puzzle[resetBlockY][resetBlockX] = temp;  whiteBlockX = resetBlockX;  whiteBlockY = resetBlockY;  resetBlockX = tempX;  resetBlockY = tempY;  println("swap"); }   private void whiteBlockDown(){  step++;  int temp = puzzle[whiteBlockY][whiteBlockX];  puzzle[whiteBlockY][whiteBlockX] = puzzle[whiteBlockY+1][whiteBlockX];  puzzle[whiteBlockY+1][whiteBlockX] = temp;  whiteBlockY++;  println("↓"); } private void whiteBlockUp(){  step++;  int temp = puzzle[whiteBlockY][whiteBlockX];  puzzle[whiteBlockY][whiteBlockX] = puzzle[whiteBlockY-1][whiteBlockX];  puzzle[whiteBlockY-1][whiteBlockX] = temp;  whiteBlockY--;  println("↑"); }   private void whiteBlockLeft(){  step++;  int temp = puzzle[whiteBlockY][whiteBlockX];  puzzle[whiteBlockY][whiteBlockX] = puzzle[whiteBlockY][whiteBlockX-1];  puzzle[whiteBlockY][whiteBlockX-1] = temp;  whiteBlockX--;  println("←"); } private void whiteBlockRight(){  step++;  int temp = puzzle[whiteBlockY][whiteBlockX];  puzzle[whiteBlockY][whiteBlockX] = puzzle[whiteBlockY][whiteBlockX+1];  puzzle[whiteBlockY][whiteBlockX+1] = temp;  whiteBlockX++;  println("→"); }     @Override public String toString() {  StringBuilder sb = new StringBuilder();  sb.append("resetBlock=("+resetBlock+","+resetBlockX+","+resetBlockY+")/n");  if(puzzle!=null){   int len = String.valueOf(n*2-1).length();   for (int y = 0; y < n; y++) {    for (int x = 0; x < n; x++) {     if(x>0){      sb.append(",");     }     sb.append(_str(String.valueOf(puzzle[y][x]), len));    }    sb.append("/n");   }   sb.append("---------------------------------------");  }else{   sb.append("puzzle is null");  }  return sb.toString(); } private String _str(String str,int len){  str=str==null?"":str;  if(str.length()<len){   return _str(str+" ", len);  }  return str; }   private void println(String str){  if(isPrint){   System.out.println(str);   System.out.println(this);  } }  public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {//  System.setOut(new PrintStream("e:/puzzle.txt","UTF-8"));  Puzzle p = new Puzzle();  System.out.println(p);  try {   p.sort();  } catch (Exception e) {   e.printStackTrace();   System.out.println("Exception:");  }finally{   System.out.println(p);  } }}

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品一区二区三区在线视频| 九九精品视频在线观看| 亚洲午夜激情免费视频| 日韩av在线直播| 国产精品一香蕉国产线看观看| 日韩激情第一页| 国产精品扒开腿做| 久久久久www| 精品调教chinesegay| 在线观看视频99| 国产精品香蕉国产| 亚洲视频综合网| 久久国产天堂福利天堂| 欧美日韩中文字幕在线| 亚洲美女动态图120秒| 97视频国产在线| 成人精品久久av网站| 国产日韩欧美综合| 91在线观看免费| 精品国产乱码久久久久久天美| 狠狠色狠狠色综合日日小说| 成人网欧美在线视频| 欧美激情视频免费观看| 欧美激情精品久久久久久变态| 精品视频一区在线视频| 日韩精品极品在线观看播放免费视频| 成人欧美一区二区三区黑人孕妇| 国产99久久久欧美黑人| 亚洲欧美日韩国产中文专区| 国产精品成人久久久久| 国产精品福利在线观看网址| 欧美一区二粉嫩精品国产一线天| 成人激情春色网| 亚洲人成电影在线观看天堂色| 欧美日韩国产影院| 久久久久久久久国产| 国产91成人在在线播放| 亚洲精品福利在线观看| 欧美激情a∨在线视频播放| 亚洲精品一区二区三区不| 这里精品视频免费| 亚洲精品wwww| 成人免费观看网址| 中文字幕亚洲一区| 午夜精品久久久久久久男人的天堂| 国产精品ⅴa在线观看h| 国产精品久久99久久| 国产精品吹潮在线观看| 欧美激情欧美狂野欧美精品| 91精品国产91久久久久福利| 午夜精品国产精品大乳美女| 欧美大尺度激情区在线播放| 国产精品一区专区欧美日韩| 91色在线视频| 欧美成人全部免费| 高清日韩电视剧大全免费播放在线观看| 神马久久久久久| 国产区精品在线观看| 成人黄色免费在线观看| 欧美日韩国产精品一区二区三区四区| 欧洲亚洲女同hd| 亚洲最大av网站| 精品亚洲永久免费精品| 国产精品高潮视频| 亚洲人成免费电影| 欧美日本中文字幕| 国产成人综合亚洲| 亚洲va电影大全| 69影院欧美专区视频| 日韩欧美主播在线| 久久精品最新地址| 久久久精品在线观看| 欧美性猛交xxxx乱大交| 国产精品视频色| 欧美视频一区二区三区…| 亚洲成人久久久| 亚洲综合av影视| 日韩精品中文字幕久久臀| 亚洲精品免费网站| 中文字幕在线看视频国产欧美在线看完整| 亚洲黄色在线看| 欧美精品手机在线| 欧美黑人巨大精品一区二区| 欧美大胆在线视频| 国产精品视频精品视频| 亚洲免费视频观看| 91精品国产综合久久久久久蜜臀| 国产精品亚洲аv天堂网| 久久久久久免费精品| 国产中文字幕日韩| 自拍视频国产精品| 欧美激情videoshd| 日本最新高清不卡中文字幕| 欧美激情伊人电影| 久久免费视频观看| 亚洲人线精品午夜| 欧美精品videofree1080p| 国产精品精品久久久| 精品国产一区二区三区久久| 成人性生交xxxxx网站| 亚洲欧美在线第一页| 久久久久久久久久亚洲| 亚洲tv在线观看| 国产午夜精品全部视频在线播放| 国产69久久精品成人看| 亚洲一区二区免费在线| 一区二区三区国产在线观看| 午夜精品99久久免费| 欧美性xxxx极品hd欧美风情| 日本伊人精品一区二区三区介绍| 国产美女高潮久久白浆| 欧美黄网免费在线观看| 91在线观看免费| 亚洲高清一区二| 欧美在线观看网站| 亚洲成人精品久久久| 欧美日韩综合视频| 国产精品亚洲欧美导航| 亚洲欧美日韩国产精品| 91tv亚洲精品香蕉国产一区7ujn| 国外成人在线直播| 亚洲精品国产综合久久| 亚洲视频在线观看视频| 久久久久久久999| 亚洲欧美一区二区激情| 亚洲影视中文字幕| 亚洲欧美国产精品va在线观看| 高清欧美性猛交xxxx黑人猛交| 国产精品96久久久久久| 欧美精品免费看| 久久久av免费| 亚洲精品综合久久中文字幕| 78色国产精品| 91精品在线观| 欧美激情奇米色| 欧美最近摘花xxxx摘花| 欧美理论电影在线观看| 中文字幕亚洲欧美日韩在线不卡| 国产成人啪精品视频免费网| 亚洲欧美精品在线| 国产精品青青在线观看爽香蕉| 北条麻妃在线一区二区| y97精品国产97久久久久久| 亚洲成人网久久久| 久久免费观看视频| 大荫蒂欧美视频另类xxxx| 国产在线拍揄自揄视频不卡99| 日本中文字幕成人| 中文字幕av一区二区| 国产日韩欧美在线观看| 精品久久久一区| 中文字幕一区二区精品| 美女视频黄免费的亚洲男人天堂| 亚洲伊人久久大香线蕉av| 国产精品自产拍在线观| 欧美高清在线播放| 成人国产亚洲精品a区天堂华泰| 91精品美女在线| 久久婷婷国产麻豆91天堂| 国产午夜精品麻豆| 亚洲性69xxxbbb| 国产精品久久久久久久电影| 国产激情久久久久| 97视频免费在线观看|