2024年10月14日 星期一

周家契約6號

 https://math-exercise.johnwu.cc/zh-tw/schulte-table/

舒格爾方格

可以訓練自己的反應能力

作者的github:https://github.com/johnwu1114/math-exercise?tab=readme-ov-file

嘗試自己做做看


























///week01_1_schulte_table01_line_fill_teztSize_text_for
void setup(){
  size(500,500);
}
void draw(){
  background(#FFFFF2);
  line(0, 100, 500, 100);
  line(0, 200, 500, 200);
  line(0, 300, 500, 300);
  line(0, 400, 500, 400);
  
  line(100, 0, 100, 500);
  line(200, 0, 200, 500);
  line(300, 0, 300, 500);
  line(400, 0, 400, 500);
  fill(0);
  textSize(50);
  textAlign(CENTER, CENTER);
  for(int y=50; y<=450; y+=100){
    text("1", 50, y);
    text("1", 150, y);
    text("1", 250, y);
    text("1", 350, y);
    text("1", 450, y);
  }
}





























上一個的簡化版
用for迴圈來畫線
///week01_1_schulte_table02_for_for_
void setup(){
  size(500,500);
  textSize(50);
  textAlign(CENTER, CENTER);
}
void draw(){
  for(int i=0; i<5; i++){
    for(int j=0; j<5; j++){
      fill(255); rect(j*100, i*100, 100, 100);
      fill(0); text("1", 50+j*100, 50+i*100);
    }
  }
}

























用random()實現隨機抽取
但會有重複出現的狀況
///week06_3_schulte_table03_random_2d_array_table
int [][] table = new int[5][5];
void setup(){
  size(500,500);
  textSize(50);
  textAlign(CENTER,CENTER);
  for(int i=0; i<5; i++){
    for(int j=0; j<5; j++){
      table[i][j] = int(random(1,26));
    }
  }
}
void draw(){
  for(int i=0; i<5; i++){
    for(int j=0; j<5; j++){
      fill(255); rect(j*100, i*100, 100, 100);
      fill(0); text(""+table[i][j], 50+j*100, 50+i*100);
    }
  }
}
























用上一個程式來改
把用過的數字用掉
多設一個used陣列
///week06_4_schulte_table04_no_repeat_used_array_while
int [] used = new int[26]; 
int [][] table = new int[5][5];
void setup(){
  size(500,500);
  textSize(50);
  textAlign(CENTER,CENTER);
  for(int i=0; i<5; i++){
    for(int j=0; j<5; j++){
      int now = int(random(1,26));
      while(used[now]==1) now = int(random(1,26));
      table[i][j] = now;
      used[now]=1;
    }
  }
}
void draw(){
  for(int i=0; i<5; i++){
    for(int j=0; j<5; j++){
      fill(255); rect(j*100, i*100, 100, 100);
      fill(0); text(""+table[i][j], 50+j*100, 50+i*100);
    }
  }
}




























繼續延續上一個
按了讓格子變灰
左手i對應的/100就是第幾格
j也是同理
///week06_5_schulte_table05_mosuePressed_pressed_i_j
int [] used = new int[26]; 
int [][] table = new int[5][5];
void setup(){
  size(500,500);
  textSize(50);
  textAlign(CENTER,CENTER);
  for(int i=0; i<5; i++){
    for(int j=0; j<5; j++){
      int now = int(random(1,26));
      while(used[now]==1) now = int(random(1,26));
      table[i][j] = now;
      used[now]=1;
    }
  }
}
int [][] pressed = new int[5][5];
void draw(){
  for(int i=0; i<5; i++){
    for(int j=0; j<5; j++){
      if(pressed[i][j]==1)  fill(128);
      else fill(255);
      rect(j*100, i*100, 100, 100);
      fill(0); text(""+table[i][j], 50+j*100, 50+i*100);
    }
  }
}
void mousePressed(){
  int i= mouseY/100, j = mouseX/100;
  pressed[i][j] = 1;
}
























延續上一個程式
想要讓他不能案不連續的
所以設一個want變數=1
每案對一個就加1
///week06_6_schulte_table06_int_want_1_if_table_i_j_want
int [] used = new int[26]; 
int [][] table = new int[5][5];
void setup(){
  size(500,500);
  textSize(50);
  textAlign(CENTER,CENTER);
  for(int i=0; i<5; i++){
    for(int j=0; j<5; j++){
      int now = int(random(1,26));
      while(used[now]==1) now = int(random(1,26));
      table[i][j] = now;
      used[now]=1;
    }
  }
}
int [][] pressed = new int[5][5];
void draw(){
  for(int i=0; i<5; i++){
    for(int j=0; j<5; j++){
      if(pressed[i][j]==1)  fill(128);
      else fill(255);
      rect(j*100, i*100, 100, 100);
      fill(0); text(""+table[i][j], 50+j*100, 50+i*100);
    }
  }
}
int want = 1;
void mousePressed(){
  int i= mouseY/100, j = mouseX/100;
  if(table[i][j]==want){
    pressed[i][j] = 1;
    want++;
  }
}




























加上計時的程式
millis()
///week06_7_schulte_table07_millis
int [] used = new int[26]; 
int [][] table = new int[5][5];
void setup(){
  size(500,600);
  textSize(50);
  textAlign(CENTER,CENTER);
  for(int i=0; i<5; i++){
    for(int j=0; j<5; j++){
      int now = int(random(1,26));
      while(used[now]==1) now = int(random(1,26));
      table[i][j] = now;
      used[now]=1;
    }
  }
}
int [][] pressed = new int[5][5];
void draw(){
  background(#FFFFF2);
  for(int i=0; i<5; i++){
    for(int j=0; j<5; j++){
      if(pressed[i][j]==1)  fill(128);
      else fill(255);
      rect(j*100, i*100, 100, 100);
      fill(0); text(""+table[i][j], 50+j*100, 50+i*100);
    }
  }
  text("You used "+millis()/1000, 200, 550);
}
int want = 1;
void mousePressed(){
  int i= mouseY/100, j = mouseX/100;
  if(table[i][j]==want){
    pressed[i][j] = 1;
    want++;
  }
}


























問chatgpt怎麼改成顯示小數
mf()能讓小數顯示出來
///week06_7_schulte_table07_millis
int [] used = new int[26]; 
int [][] table = new int[5][5];
void setup(){
  size(500,600);
  textSize(50);
  textAlign(CENTER,CENTER);
  for(int i=0; i<5; i++){
    for(int j=0; j<5; j++){
      int now = int(random(1,26));
      while(used[now]==1) now = int(random(1,26));
      table[i][j] = now;
      used[now]=1;
    }
  }
  starT = millis();
}
int starT = 0;
int [][] pressed = new int[5][5];
void draw(){
  background(#FFFFF2);
  for(int i=0; i<5; i++){
    for(int j=0; j<5; j++){
      if(pressed[i][j]==1)  fill(128);
      else fill(255);
      rect(j*100, i*100, 100, 100);
      fill(0); text(""+table[i][j], 50+j*100, 50+i*100);
    }
  }
  text("You used "+nf((millis() - starT)/1000.0, 3, 1), 200, 550);
}
int want = 1;
void mousePressed(){
  int i= mouseY/100, j = mouseX/100;
  if(table[i][j]==want){
    pressed[i][j] = 1;
    want++;
  }
}
























問chatgpt
他說可以改得比較有效率
提供一個shuffle()
但老師可以自己寫出同樣的演算法
///week06_9_schulte_table09_mousePressed_crash_if_proctect_shuffle_random
int [][] table = new int[5][5];
void setup() {
  size(500, 600);
  textSize(50);
  textAlign(CENTER, CENTER);
  int []numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25};
  for (int i=numbers.length - 1; i>0; i--) {
    int j = int(random(i+1));
    int temp = numbers[i];
    numbers[i] = numbers[i];
    numbers[j] = temp;
  }
  int index=0;
  for (int i=0; i<5; i++) {
    for (int j=0; j<5; j++) {
      table[i][j] = numbers[index++];
    }
  }
  starT = millis();
}
int starT = 0;
int [][] pressed = new int[5][5];
void draw() {
  background(#FFFFF2);
  for (int i=0; i<5; i++) {
    for (int j=0; j<5; j++) {
      if (pressed[i][j]==1)  fill(128);
      else fill(255);
      rect(j*100, i*100, 100, 100);
      fill(0);
      text(""+table[i][j], 50+j*100, 50+i*100);
    }
  }
  text("You used "+nf((millis() - starT)/1000.0, 3, 1), 200, 550);
}
int want = 1;
void mousePressed() {
  int i= mouseY/100, j = mouseX/100;
  if (table[i][j]==want) {
    pressed[i][j] = 1;
    want++;
  }
}




沒有留言:

張貼留言