code.club

 找回密碼
 立即註冊
搜索
查看: 2909|回復: 0

processing寫的四重選擇的拼圖遊戲

[複製鏈接]
發表於 2021-12-5 19:43:22 | 顯示全部樓層 |閱讀模式
本帖最後由 2266 於 2021-12-5 19:45 編輯


  1. int image_number =16; // 設定有幾張圖片
  2. int howManyAnswers = 4; //answer有幾張
  3. PImage[] imgAnswer = new PImage[howManyAnswers];
  4. float answerImageWidth = 200; //answer圖片的寬
  5. float imageRandomWidth = 105; //設定隨機置圖區的方格寬度,會比原圖稍寛好有留白
  6. float imageWidth = 100; //中間拼圖區的格子寬
  7. float[] imgX = new float[image_number]; //圖片的x坐標設成陣列
  8. float[] imgY = new float[image_number]; //圖片的y坐標設成陣列
  9. float[] imgCenterX = new float[image_number]; //中央拼圖區格線x坐標
  10. float[] imgCenterY = new float[image_number]; //中央拼圖區格線y坐標
  11. PImage[] imgToySoldier = new PImage[image_number]; //四個圖片陣列的設定
  12. PImage[] imgSnowNight = new PImage[image_number];
  13. PImage[] imgKnight = new PImage[image_number];
  14. PImage[] imgXmasGirl = new PImage[image_number];
  15. PImage[] imgRandom = new PImage[image_number]; //隨機置圖的圖片陣列
  16. boolean[] bbb = new boolean[image_number];
  17. PImage blankImage;
  18. PImage checkIfExist; //在隨機置圖區中用來檢查是否已放置的圖片

  19. //用以檢查是否圖片已放置的函數
  20. boolean isItExisted(int y,PImage pi, PImage[] pic){ //參數一是要檢查的圖片數,參數二是被檢查的圖片,參數三是用來檢查該圖是否已出現過的圖片陣列
  21. boolean exist = false; //先預設為 false
  22. for(int i=0;i<y;i++)
  23. if(pi==pic[i]) exist = true; //如果循序檢查發現該圖等於陣列中的某圖,表示已出現過,則exist等於true並回報之
  24. return exist;
  25. }
  26. //函數結數

  27. // 隨機圖片排列函數
  28. void imageRandomly(PImage[] toBeRandomed){ //參數是要被隨機排的現有圖片陣列
  29.   PImage checkIt; //要放到isItExisted()中檢查是否已存在的圖片
  30.   for(int x=0;x<image_number;x++) imgRandom[x] = loadImage("img_100_4/blank.png"); //給blank圖片的值不是為了排出空格,而是為了之後變更成其他圖片
  31.       for(int x=0;x<image_number;x++)
  32.   {
  33.   do{
  34.   checkIt = toBeRandomed[int(random(0,image_number))];} //將隨機的圖片指定給 checkIt
  35.   while(isItExisted(image_number,checkIt,imgRandom)); //將 checkIt 放入參數檢查回報是否為 true,若為 true 繼續回到上一動作,若false則結束並至下一動作
  36.   imgRandom[x] = checkIt; //將checkIt目前的圖片指給隨機圖片陣列的第某項
  37.   }
  38.   }
  39. //

  40. //定出隨機區的格子和各格子的xy坐標
  41. void setGrid(){
  42.   
  43.   for(int i=0;i<image_number;i++)
  44.       if(i%2==0) //逢二的倍數
  45.        {
  46.          imgX[i] = 750; //x坐標不變
  47.          imgY[i] = 50+i/2*imageRandomWidth; //y坐標從50起加上(先將i除二是因為逢二個才會乘一次,然後乘上設定好的寬度)
  48.      }
  49.        else {
  50.          imgX[i]=750+imageRandomWidth; //x坐標加上設定好的寬度
  51.      imgY[i] = imgY[i-1]; //y坐標維持和上一個的一樣
  52.        }
  53.      }
  54. //
  55. void playIt(){
  56.   
  57. for(int i=0;i<16;i++){
  58.   image(imgRandom[i],imgX[i],imgY[i]);  
  59.   
  60. if(bbb[i]) {imgX[i] = mouseX-imageWidth/2;imgY[i] = mouseY-imageWidth/2;}  //當該圖的boolean為true,則該圖可移動,並將滑鼠保持在圖中央

  61. if(!mousePressed)
  62.      {
  63.      bbb[i] = false;
  64.      for(int t=0;t<4;t++)
  65.       for(int s=0;s<4;s++)
  66.        if(abs(imgX[i]-imgCenterX[t])<30&& abs(imgY[i]-imgCenterY[s])<30)
  67.          {
  68.              imgX[i] = imgCenterX[t];
  69.              imgY[i] = imgCenterY[s];
  70.          }
  71.    
  72.      }
  73.    }
  74. }
  75.   
  76.   
  77.   
  78.   
  79. void setup(){
  80.   size(1000,1000);
  81.   // 給四個answer圖片的值
  82.   imgAnswer[0] = loadImage("img_100_4/answerKnight.png");
  83.   imgAnswer[1] = loadImage("img_100_4/answerAliceTable.png");
  84.   imgAnswer[2] = loadImage("img_100_4/answerKremlin.png");
  85.   imgAnswer[3] = loadImage("img_100_4/answerFu.png");
  86.   //先設定中間拼圖區的xy坐標各有四種數值
  87.   for(int i=0;i<4;i++)
  88.   {
  89.    imgCenterX[i] = 300 + i*imageWidth;
  90.    imgCenterY[i] = 200 + i*imageWidth;
  91.    }
  92.    //
  93.   
  94.   for(int x=0;x<image_number;x++)
  95.   {
  96.     imgKnight[x] = loadImage("img_100_4/knight/"+x+".png"); //先給圖片陣列賦值
  97.     imgToySoldier[x] = loadImage("img_100_4/fu/"+x+".png"); //先給圖片陣列賦值
  98.     imgSnowNight[x] =  loadImage("img_100_4/kremlin/"+x+".png"); //先給圖片陣列賦值
  99.     imgXmasGirl[x] =  loadImage("img_100_4/alicetable/"+x+".png"); //先給圖片陣列賦值
  100.     bbb[x] = false; //boolean 先都設為false;
  101.   }
  102.   
  103.    setGrid(); //設定好隨機區的格線坐標位置
  104.    imageRandomly(imgKnight); //先用一個圖片陣列放入隨機圖片陣列
  105.   }
  106.   
  107. void draw(){
  108.   
  109.   background(255);

  110. //設定answer大圖的顯示
  111. for(int i=0;i<howManyAnswers;i++)
  112. image(imgAnswer[i],30,50+i*(answerImageWidth+10));
  113.   
  114.   //在中間畫出4x4的拼圖格線
  115.   for(int i=0;i<4;i++)
  116.     for(int j=0;j<4;j++)
  117.      rect(imgCenterX[i],imgCenterY[j],imageWidth,imageWidth);
  118.   //
  119.   
  120. //  將已有圖的隨機圖片陣列放到隨機區各格子中
  121.    for(int i=0;i<image_number;i++){
  122.       image(imgRandom[i],imgX[i],imgY[i]);
  123.   }
  124. playIt();
  125. }

  126. void mousePressed(){
  127. //先保證所有的牌boolean是false,但唯有滑鼠點到那張是true,以免移動到其他牌
  128. for(int i=0;i<16;i++)
  129.   if(mouseX>imgX[i]&&mouseX<imgX[i]+imageWidth&&mouseY>imgY[i]&&mouseY<imgY[i]+imageWidth)
  130.   {
  131.     for(int j=0;j<16;j++) bbb[j] = false;
  132.     bbb[i]=true;
  133.   }
  134.   
  135.   
  136. //如果滑鼠在不同區中按下,則隨機區放入不同的圖片陣列
  137.     if(mouseX>30&&mouseX<230&&mouseY>50&&mouseY<250) {
  138.       setGrid(); //要重設一切隨機區,不然已在拼圖區的圖片座標可會留在拼圖區
  139.   imageRandomly(imgKnight);
  140.   }
  141.    
  142.     if(mouseX>30&&mouseX<230&&mouseY>260&&mouseY<460) {
  143.       setGrid();
  144.   imageRandomly(imgXmasGirl);}
  145.   
  146.      if(mouseX>30&&mouseX<230&&mouseY>470&&mouseY<670) {
  147.        setGrid();
  148.   imageRandomly(imgSnowNight);}
  149.   
  150.      if(mouseX>30&&mouseX<230&&mouseY>690&&mouseY<890) {
  151.        setGrid();
  152.   imageRandomly(imgToySoldier);}
  153.   
  154. }
複製代碼
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|手機版|Archiver|code.club  

GMT+8, 2024-3-29 06:32 , Processed in 0.104016 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表