2022年1月17日 星期一

豹笑英文 (成果展示 week13)



記憶翻牌遊戲

這是一個記憶翻牌遊戲,需要兩名玩家,配對成功得5分且可繼續翻牌,連續配對成功獲得加成分數3分,當配對失敗時則換對方翻牌,直到無牌可翻就遊戲結束,得分高者為贏家!!

int[][] temp=new int[9][4]; //翻牌情況

String[] en={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R",

             "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R"};

String[][] in=new String[9][4]; //存放牌的值

int x,y,c1=0,c2=0,T=0,player=1,P1_point=0,P2_point=0,bonus=0;

String t1,t2;

boolean change; //是否換人翻牌

void input(){

  for(int i=0;i<9;i++){ //未翻牌=0,翻牌=1,固定=2

    for(int j=0;j<4;j++){

      temp[i][j]=1;

    }

  }

  for(String k:en){

    for(;;){

      x=int(random(0,9));

      y=int(random(0,4));

      if(en[c1]==null) break; //確保不會有同個字被抓多次,EX:A出現三次

      if(in[x][y]==null){

        temp[x][y]=0;  //變成0=未翻牌

        en[c1]=null;  //已取用的字拿掉,為了配合上面的確保機制

        in[x][y]=k;    //設定翻牌後的值

      }

    }

    c1++;

  }

}

void test(){ //測試用函數

  for(int i=0;i<9;i++){ //未翻牌=0,翻牌=1,固定=2

    for(int j=0;j<4;j++){

      print(temp[i][j]); //測試翻牌情況

    }

  }

  for(int i=0;i<9;i++){ //未翻牌=0,翻牌=1,固定=2

    for(int j=0;j<4;j++){

      print(in[i][j]); //測試值確實存在

    }

  }

  println();

}

void setup(){

  size(900,700); //設定介面大小

  background(255); //白色背景

  input(); //呼叫input()函數

  test();  //呼叫test()函數

  fill(0,0,0);

  textSize(50);

  textAlign(CENTER,CENTER); //文字置中

  text("Player1: "+P1_point,150,650); //顯示目前得分

  text("Player2: "+P2_point,750,650);

}

void draw(){

  for(int i=0;i<10;i++){

    line(i*100,0,i*100,600); //畫直線

    line(0,i*150,900,i*150); //畫橫線

  }

  if(T>0){ //1秒鐘後進行兩張牌的比對

    T--;

    if(T==0 && c2==2){

      check(); //比對

      show();  //顯示

    }

  }

}

void mouseClicked(){

  T=60;

  if(temp[mouseX/100][mouseY/150] == 0) { //確認牌是沒有翻過的

    c2++; //計算翻了幾次牌

    if(c2==1){ //翻第一張牌

      temp[mouseX/100][mouseY/150]=1; //翻牌

      text(in[mouseX/100][mouseY/150],mouseX/100*100+50,mouseY/150*150+75); //顯示值

      t1=in[mouseX/100][mouseY/150];

    }else if(c2==2){ //翻第二張牌

      temp[mouseX/100][mouseY/150]=1; //翻牌

      text(in[mouseX/100][mouseY/150],mouseX/100*100+50,mouseY/150*150+75); //顯示值

      t2=in[mouseX/100][mouseY/150];

    }

  }

}

void check(){

  change=false;

  if(t1==t2){

    bonus++; //連續得分次數

    if(player==1){

      P1_point+=5;

      if(bonus>1){ //連續得分的話,加成,多3分

        P1_point+=3;

      }

    }else if(player==2){

      P2_point+=5;

      if(bonus>1){ //連續得分的話,加成,多3分

        P2_point+=3;

      }

    }

    for(int i=0;i<9;i++){ 

      for(int j=0;j<4;j++){

        if(in[i][j]==t1 || in[i][j]==t2){

          temp[i][j]=2;

        }

      }

    }

  }else{

    bonus=0;

    change=true; //換人翻牌

    if(change==true && player==1){

      player=2;

    }else if(change==true && player==2){

      player=1;

    }

    for(int i=0;i<9;i++){ 

      for(int j=0;j<4;j++){

        if(in[i][j]==t1 || in[i][j]==t2){

          temp[i][j]=0;

        }

      }

    }

  }

  background(255);

  c2=0; //新一輪選牌

}

void show(){

  for(int i=0;i<9;i++){ 

    for(int j=0;j<4;j++){

      if(temp[i][j]==2){

        text(in[i][j],i*100+50,j*150+75);

      }

    }

  }

  text("Player1: "+P1_point,150,650);

  text("Player2: "+P2_point,750,650);

  test(); //測試用

  Gameover(); //檢測是否結束遊戲

}

void Gameover(){

  boolean gameover=true;

  for(int i=0;i<9;i++){ 

    for(int j=0;j<4;j++){

      if(temp[i][j]==0 || temp[i][j]==1){

        gameover=false; //還有牌未翻,遊戲不能結束

      }

    }

  }

  if(gameover==true){

    size(900,700);

    background(255,235,205);

    noStroke();

    textSize(125);

    textAlign(CENTER,CENTER); //文字置中

    text("GAME OVER",450,200);

    if(P1_point>P2_point){

      text("PLAYER 1 WIN",450,400); //顯示贏家

    }else{

      text("PLAYER 2 WIN",450,500);

    }

  }

}

沒有留言:

張貼留言