チーム1744

課題名

  音 とは 
~another eden~

研究者名

Ruito Fujimoto
Yuya Miyamoto

使用器具

・PSoC基盤 1個
・MiniProg 1本
・EIA-574(DSUB9)ストレート通信ケーブル 1本
・スピーカー 1個
・ジャンパー線 4本

ゲーム内容

①出題者がキーボードで音を鳴らす
 ( a:ド w:ド# s:レ e:レ# d:ミ f:ファ t:ファ# g:ソ y:ソ# h:ラ u:ラ# j:シ k:ド l:無音 )

②聞こえた音を上記の合致する記号を選ぶ

③正解していたら正解の音が、不正解ならば不正解の音が鳴る。

④正解、不正解、スコア、残りライフをLCD画面に表示する。(正解の音と回答者が答えた音を比較して、低い場合(lower)、高い場合(higher))

⑤5回正解したら1「GAME CLEAR!」、3回間違えると「GAME OVER.」と表示する

⑥ゲームクリアしたら「地の雨」、ゲームオーバーしたら「前前前世」が流れる。

また、以下のような設定とする
 LCD画面…回答者用
 PC画面 …出題者用

ソースコード

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include <stdlib.h>
#include <stdio.h>
#pragma interrupt_handler myISR

int PW=125;
int SILENT=0,D=229,L=204,M=182,F=172,S=153,R=136,C=121,DD=115,D1=217,L1=193,F1=162,S1=145,R1=129,X=500,CC=257;
int SCORE=0,LIFE=3,CLEAR=5;
int TC=0;
int ANSWER;

void myISR(void){
TC+=1;
 PWM16_1_WritePulseWidth(PW);
 //正解
 if(ANSWER==0){
   if(TC==1)
     PWM16_1_WritePeriod(C);
   else if(TC==6)
     PWM16_1_WritePeriod(S);
   else if(TC==15)
     PWM16_1_WritePeriod(SILENT);
 }
 //不正解
 else if(ANSWER==1){
   if(TC==1)
     PWM16_1_WritePeriod(X);
   else if(TC==6)
     PWM16_1_WritePeriod(SILENT);
   else if(TC==10)
     PWM16_1_WritePeriod(X);
   else if(TC==20)
     PWM16_1_WritePeriod(SILENT);
 }
 //クリア
 else if(ANSWER==2){
if(TC == -2)
PWM16_1_WritePeriod(D);
else if(TC == 2)
PWM16_1_WritePeriod(L);
else if(TC == 6)
PWM16_1_WritePeriod(M);
else if(TC == 10)
PWM16_1_WritePeriod(F);
else if(TC == 14)
PWM16_1_WritePeriod(S);
else if(TC == 22)
PWM16_1_WritePeriod(R);
else if(TC == 26)
PWM16_1_WritePeriod(F);
else if(TC == 30)
PWM16_1_WritePeriod(M);
else if(TC == 38)
PWM16_1_WritePeriod(L);
else if(TC == 46)
PWM16_1_WritePeriod(D);

else if(TC == 62)
PWM16_1_WritePeriod(S);
else if(TC == 68)
PWM16_1_WritePeriod(F);
else if(TC == 70)
PWM16_1_WritePeriod(M);
else if(TC == 74)
PWM16_1_WritePeriod(S);
else if(TC == 78)
PWM16_1_WritePeriod(F);
else if(TC == 82)
PWM16_1_WritePeriod(M);
else if(TC == 86)
PWM16_1_WritePeriod(L);

else if(TC == 94)
PWM16_1_WritePeriod(S);
else if(TC == 100)
PWM16_1_WritePeriod(F);
else if(TC == 102)
PWM16_1_WritePeriod(M);
else if(TC == 106)
PWM16_1_WritePeriod(S);
else if(TC == 110)
PWM16_1_WritePeriod(F);
else if(TC == 114)
PWM16_1_WritePeriod(M);
else if(TC == 118)
PWM16_1_WritePeriod(L);

else if(TC == 128)
PWM16_1_WritePeriod(D);
else if(TC == 132)
PWM16_1_WritePeriod(L);
else if(TC == 136)
PWM16_1_WritePeriod(M);
else if(TC == 140)
PWM16_1_WritePeriod(F);
else if(TC == 144)
PWM16_1_WritePeriod(S);
else if(TC == 152)
PWM16_1_WritePeriod(R);
else if(TC == 156)
PWM16_1_WritePeriod(F);
else if(TC == 160)
PWM16_1_WritePeriod(M);
else if(TC == 168)
PWM16_1_WritePeriod(L);
else if(TC == 176)
PWM16_1_WritePeriod(D);

else if(TC == 190)
PWM16_1_WritePeriod(SILENT);
  }
 //失敗
 else if(ANSWER==3){
if(TC == 2)
 PWM16_1_WritePeriod(CC);
 else if (TC == 3)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 4)
 PWM16_1_WritePeriod(CC);
 else if (TC == 5)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 6)
 PWM16_1_WritePeriod(CC);
 else if (TC == 7)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 9)
 PWM16_1_WritePeriod(F1);
 else if (TC == 11)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 13)
 PWM16_1_WritePeriod(F1);
 else if (TC == 15)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 17)
 PWM16_1_WritePeriod(F1);
 else if (TC == 19)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 21)
 PWM16_1_WritePeriod(L1);
 else if (TC == 22)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 23)
 PWM16_1_WritePeriod(D1);
 else if (TC == 25)
 PWM16_1_WritePeriod(D1);
 else if (TC == 26)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 27)
 PWM16_1_WritePeriod(D1);
 else if (TC == 29)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 31)
 PWM16_1_WritePeriod(CC);
 else if (TC == 33)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 35)
 PWM16_1_WritePeriod(CC);
 else if (TC == 36)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 37)
 PWM16_1_WritePeriod(CC);
 else if (TC == 38)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 39)
 PWM16_1_WritePeriod(CC);
 else if (TC == 40)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 41)
 PWM16_1_WritePeriod(F1);
 else if (TC == 42)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 43)
 PWM16_1_WritePeriod(F1);
 else if (TC == 44)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 45)
 PWM16_1_WritePeriod(F1);
 else if (TC == 46)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 47)
 PWM16_1_WritePeriod(F1);
 else if (TC == 48)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 49)
 PWM16_1_WritePeriod(F1);
 else if (TC == 50)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 51)
 PWM16_1_WritePeriod(L1);
 else if (TC == 52)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 53)
 PWM16_1_WritePeriod(L1);
 else if (TC == 54)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 55)
 PWM16_1_WritePeriod(D1);
 else if (TC == 57)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 59)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 59)
 PWM16_1_WritePeriod(CC);
 else if (TC == 60)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 62)
 PWM16_1_WritePeriod(CC);
 else if (TC == 63)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 64)
 PWM16_1_WritePeriod(D1);
 else if (TC == 65)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 66)
 PWM16_1_WritePeriod(L1);
 else if (TC == 67)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 68)
 PWM16_1_WritePeriod(D1);
 else if (TC == 70)
 PWM16_1_WritePeriod(D1);
 else if (TC == 70)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 72)
 PWM16_1_WritePeriod(CC);
 else if (TC == 73)
 PWM16_1_WritePeriod(CC);
 else if (TC == 74)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 75)
 PWM16_1_WritePeriod(CC);
 else if (TC == 76)
 PWM16_1_WritePeriod(SILENT);  
 else if (TC == 77)
 PWM16_1_WritePeriod(CC);
 else if (TC == 78)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 80)
 PWM16_1_WritePeriod(CC);
 else if (TC == 81)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 82)
 PWM16_1_WritePeriod(D1);
 else if (TC == 83)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 84)
 PWM16_1_WritePeriod(L1);
 else if (TC == 85)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 86)
 PWM16_1_WritePeriod(D1);
 else if (TC == 88)
 PWM16_1_WritePeriod(D1);
 else if (TC == 88)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 90)
 PWM16_1_WritePeriod(CC);
 else if (TC == 91)
 PWM16_1_WritePeriod(CC);
 else if (TC == 92)
 PWM16_1_WritePeriod(SILENT);
 else if (TC == 93)
 PWM16_1_WritePeriod(CC);
 else if (TC == 94)
 PWM16_1_WritePeriod(SILENT);
 }
}
void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
  // Insert your main routine code here.
  
  char *strPtr_1;
  char *strPtr_2;
  int answer;          // 正解の音
  int choice;          // 回答した音
  int score = SCORE;   // スコア
  char score_char[20]; // スコアの文字列化
  int life = LIFE;     // ライフ
  char life_char[20];  // ライフの文字列化
  
  UART_CmdReset();
  UART_IntCntl(UART_ENABLE_RX_INT);
  Counter8_WritePeriod(155);
  Counter8_WriteCompareValue(77);
  Counter8_Start();
  UART_Start(UART_PARITY_NONE);
  M8C_EnableGInt;
  LCD_Start();
  PWM16_1_Start();
  Timer16_1_EnableInt();
  
  
  
  // ゲームスタートの初期画面
  // UART側に出題を要求する
  UART_CPutString("\r\nPSoC Synthesizer V1.1 \r\n");
  UART_CPutString("\r\nSet the Answer Tone.\r\n");
  // LCD
  LCD_PrCString("GAME START!");
  
  while(1){
    // 1つ目のループ 出題(鳴らす音を選ぶ)
    while(1){
      if(UART_bCmdCheck()){
        if(strPtr_1 = UART_szGetParam()){
        
          // コマンド入力と音の発生、正解をanswerに記憶

         if(*strPtr_1 == 'a'){
            PWM16_1_WritePeriod(D);
            answer = 1;
          }
          else if(*strPtr_1 == 's'){
            PWM16_1_WritePeriod(L);
            answer = 3;
          }
          else if(*strPtr_1 == 'd'){
            PWM16_1_WritePeriod(M);
            answer = 5;
          }
          else if(*strPtr_1 == 'f'){
            PWM16_1_WritePeriod(F);
            answer = 6;
          }
          else if(*strPtr_1 == 'g'){
            PWM16_1_WritePeriod(S);
            answer = 8;
          }
          else if(*strPtr_1 == 'h'){
            PWM16_1_WritePeriod(R);
            answer = 10;
          }
          else if(*strPtr_1 == 'j'){
            PWM16_1_WritePeriod(C);
            answer = 12;
          }
          else if(*strPtr_1 == 'k'){
            PWM16_1_WritePeriod(DD);
            answer = 13;
          }
          else if(*strPtr_1 == 'w'){
            PWM16_1_WritePeriod(D1);
            answer = 2;
          }
          else if(*strPtr_1 == 'e'){
            PWM16_1_WritePeriod(L1);
            answer = 4;
          }
          else if(*strPtr_1 == 't'){
            PWM16_1_WritePeriod(F1);
            answer = 7;
          }
          else if(*strPtr_1 == 'y'){
            PWM16_1_WritePeriod(S1);
            answer = 9;
          }
          else if(*strPtr_1 == 'u'){
            PWM16_1_WritePeriod(R1);
            answer = 11;
          }
          // 無音(SILENT)を選択した場合、ゲーム終了
          else if(*strPtr_1 == 'l'){
               PWM16_1_WritePeriod(SILENT);
            UART_CPutString("Bye!\r\n");
            break;
          }
          UART_CmdReset();
        
          // 回答を要求する表示
          // UART
          UART_CPutString("Inputed your Answer from \r\n[a:低いド, w:ド#, s:レ, e:レ#, d:ミ, f:ファ, t:ファ#, g:ソ, y:ソ#, h:ラ, u:ラ#, j:シ, k:高いド] => ");
          // LCD
          LCD_Control(0x01);
          LCD_Position(0,0);
          LCD_PrCString("Input Answer");
          
          // 出題し、回答を要求したところで、1つ目のループを抜ける
          break;
        }
      }
    }
    
    // 2つ目のループ 回答(鳴っている音を選ぶ)
    while(1){
      if(strPtr_2 = UART_szGetParam()){
        UART_PutString(strPtr_2);
        PWM16_1_WritePeriod(SILENT);
        
        // コマンド入力、回答をchoiceに記憶
        if(*strPtr_2 == 'a'){
          choice = 1;
        }
        else if(*strPtr_2 == 's'){
          choice = 3;
        }
        else if(*strPtr_2 == 'd'){
          choice = 5;
        }
        else if(*strPtr_2 == 'f'){
          choice = 6;
        }
        else if(*strPtr_2 == 'g'){
          choice = 8;
        }
        else if(*strPtr_2 == 'h'){
          choice = 10;
        }
        else if(*strPtr_2 == 'j'){
          choice = 12;
        }
        else if(*strPtr_2 == 'k'){
          choice = 13;
        }
        else if(*strPtr_2 == 'w'){
          choice = 2;
        }
        else if(*strPtr_2 == 'e'){
          choice = 4;
        }
        else if(*strPtr_2 == 't'){
          choice = 7;
        }
        else if(*strPtr_2 == 'y'){
          choice = 9;
        }
        else if(*strPtr_2 == 'u'){
          choice = 11;
        }
        
        //LCDの初期化
        LCD_Control(0x01);
        LCD_Position(0,0);
        
        // 正解の場合
        if(choice == answer){
          score++;
          ANSWER=0;
          Timer16_1_Start();
          TC=0;
          
          
          // 正解の表示
          if(score != CLEAR) {
            // UART
            UART_CPutString("\r\nTrue!");
            // LCD
            LCD_PrCString("True!");
            // 出力のために、int型変数をchar型配列にコピー
            csprintf(score_char, "%d", score);
            if(life==3)
               csprintf(life_char, "###", life);
               else if(life==2)
               csprintf(life_char, "##", life);
               else if(life==1)
               csprintf(life_char, "#", life);
          }
          
          // クリアした場合(スコアがCLEARに達した場合)
          else {
          TC=-2;
          ANSWER=2;
          Timer16_1_Start();
          TC=0;
            csprintf(score_char, "%d", score);
            // UART
            UART_CPutString("\r\n\r\nGAME CLEAR!\r\nscore : ");
            UART_PutString(score_char);
            // LCD
            LCD_PrCString("GAME CLEAR!");
            LCD_Position(1,0);
            LCD_PrCString("Score : ");
            LCD_PrString(score_char);
            
            // 初期化してゲーム再開
            score = SCORE;
            life = LIFE;
            UART_CPutString("\r\n\r\nSet the Answer Tone.\r\n");
            break;
          }
        }
        
        // 不正解の場合
        else {
        ANSWER=1;
          life--;
          Timer16_1_Start();
          TC=0;
          
          // 不正解の表示
          if(life != 0) {
            // UART
            UART_CPutString("\r\nFalse");
            // LCD
            LCD_PrCString("False");
            // 出力のために、int型変数をchar型配列にコピー
            csprintf(score_char, "%d", score);
            if(life==3)
               csprintf(life_char, "###", life);
               else if(life==2)
               csprintf(life_char, "##", life);
               else if(life==1)
               csprintf(life_char, "#", life);
            
            LCD_Position(1,0);
            // 正解の音程は回答したものよりも高い
            if(choice > answer){
              UART_CPutString("\r\nhigher");
              LCD_PrCString("higher");
            }
            // 正解の音程は回答したものよりも低い
            else if(choice < answer){
              UART_CPutString("\r\nlower");
              LCD_PrCString("lower");
            }
          }
          
          // ゲームオーバーの場合(ライフが0になった場合)
          else {
          ANSWER=3;
          Timer16_1_Start();
          TC=0;
            csprintf(score_char, "%d", score);
            // UART
            UART_CPutString("\r\n\r\nGAME OVER.\r\nscore : ");
            UART_PutString(score_char);
            // LCD
            LCD_Position(0,0);
            LCD_PrCString("GAME OVER.");
            LCD_Position(1,0);
            LCD_PrCString("Score : ");
            LCD_PrString(score_char);
            
            // 初期化してゲーム再開
            score = SCORE;
            life = LIFE;
            UART_CPutString("\r\n\r\nSet the Answer Tone.\r\n");
            break;
          }
        }
        
        // スコアの表示
        // UART
        UART_CmdReset();
        UART_CPutString("\r\nscore : ");
        UART_PutString(score_char);
        // LCD
        LCD_Position(0,7);
        LCD_PrCString("Score: ");
        LCD_PrString(score_char);
        
        // ライフの表示
        // UART
        UART_CPutString("\r\nlife : ");
        UART_PutString(life_char);
        // LCD
        LCD_Position(1,7);
        LCD_PrCString("Life :");
        LCD_PrString(life_char);
        
        // 次の出題をUART側に要求して、2つ目のループを抜ける
        UART_CPutString("\r\n\r\nSet the Answer Tone.\r\n");
        break;
      }
    }
  }    
}




考察

 今回は、チーム1568を参考にゲームを作成した。ゲームの音源はチーム1663(地の雨)、チーム171B (前前前世)を引用した。
 正解不正解のBGMを加えることにより、より一層耳で楽しめるため、参考にしたチームのゲームより幅ができた。
問題点は、出題者側が指示された内容どおりにコマンドを押さないといけないということ。もし違うコマンドを押してしまった場合、そのあとに別のコマンドを押しても反応しなくなるエラーが生じてしまう。このエラーは条件文などでコマンドを縛ってあげることで、万が一間違ったコマンドを押してしまっても反応しないというエラーは起きないだろう。
また、回答者側がその出題された問題を間違えると、答えを教えてくれないまま次の問題へと進んでしまう。この部分の改善点は、正解するまで同じ問題を繰り返すことに加えて、もし間違ったときに何かしらのヒントを与えることができればより良くなったと考えられる。
 
 

  • 最終更新:2017-10-24 17:05:52

このWIKIを編集するにはパスワード入力が必要です

認証パスワード