チーム2216

課題名

音あてゲーム

研究者名

Noa Mori
Hideki Maruyama

使用した機器

PSoC基盤
LCDディスプレイ
キーボード
PSoC MiniProg
ジャンパ線
スピーカー
シリアル通信ケーブル

概要

難易度1,2で選び、ランダムで鳴る音がなにか、キーボードの入力であてる。音は全部で5回出題される。
難易度1の場合はドレミファソラシドの中から問題が出題される。
難易度2の場合はシャープの音とドレミファソラシドの中から問題が出題される。
正解数によって、LCDディスプレイに表示される結果が変わる。
正解数が1以下の場合は bad 、2以上4以下の場合は good! 、全問正解の場合は excellent!! が表示される。
基盤上のresetボタンを押すことで新たにゲームが始まるようになっている。

ソースコード

#include <m8c.h>
#include "PSoCAPI.h"
#include <stdlib.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;
int DS=217, LS=193, FS=172, SS=145, RS=129;
int Canswer,answer;
int check=0;
int TC=0;
int Ran;
int RandomWP;
int turn;
char* name;
unsigned int Ncount=0;
unsigned int count=0;
int dif=1,Dcheck=1;
char* Dif;
int Wcount=0;

void myISR(void) {
  TC += 1;
   if(Ran == 0)
       RandomWP = D;
   else if(Ran == 1)
       RandomWP = L;
   else if(Ran == 2)
       RandomWP = M;
   else if(Ran == 3)
       RandomWP = F;
   else if(Ran == 4)
       RandomWP = S;
   else if(Ran == 5)
       RandomWP = R;
   else if(Ran == 6)
       RandomWP = C;
   else if(Ran == 7)
       RandomWP = DD;
   else if(Ran == 8)
       RandomWP = DS;
   else if(Ran == 9)
       RandomWP = LS;
   else if(Ran == 10)
       RandomWP = FS;
   else if(Ran == 11)
       RandomWP = SS;
   else if(Ran == 12)
       RandomWP = RS;

  Canswer = RandomWP;

  if(TC == 100) {
       PWM16_WritePeriod(SILENT);
       LCD_Position(0,0);
       LCD_PrCString("     listen        ");
   }
   else if(TC == 200) 
       PWM16_WritePeriod(Canswer);
   else if(TC == 300)
       PWM16_WritePeriod(SILENT);
   else if(TC == 400) {
       LCD_Position(0,0);
       LCD_PrCString("3           ");
   }
   else if(TC == 500) {
       LCD_Position(0,0);
       LCD_PrCString("2");
   }
   else if(TC == 600) {
       LCD_Position(0,0);
       LCD_PrCString("1");
   }
   else if(TC == 800) 
       PWM16_WritePeriod(SILENT);
}


void main(void)
{
  char* strPtr;
   M8C_EnableGInt;
   UART_CmdReset();
   UART_IntCntl(UART_ENABLE_RX_INT);
   Counter8_WritePeriod(155);
   Counter8_WriteCompareValue(77);
   Counter8_Start();
   UART_Start(UART_PARITY_NONE);

  PWM16_Start();
   LCD_Start();
   UART_CPutString("\r\nLook at the LCD\r\n");
   LCD_Position(0,0);
   LCD_PrCString("level 1 or 2");
   while(Dcheck) {
       if(UART_bCmdCheck()) {
           if(Dif = UART_szGetParam()) {
               UART_PutString(Dif);

              if(*Dif == '1') {
                   dif = 1;
                   Dcheck=0;
               }
               else if(*Dif == '2') {
                   dif = 2;
                   Dcheck = 0;
               }
               
               UART_CmdReset();
   }}}
   LCD_Position(0,0);
   LCD_PrCString("what your name?  ");
   while(name == NULL) {
       count++;
       if(UART_bCmdCheck()) {
           if(name = UART_szGetParam()) {
               switch(*name) {
                   case 'a':
                   case 'n':
                   case 'd':
                   case 'c':
                       Ncount = Ncount + 1;
                       break;
                   case 'i':
                   case 'h':
                   case 'b':
                   case 'v':
                       Ncount = Ncount + 2;
                       break;
                   case 'u':
                   case 'm':
                   case 'p':
                       Ncount = Ncount + 3;
                       break;
                   case 'e':
                   case 'y':
                   case 'q':
                       Ncount = Ncount + 4;
                       break;
                   case 'o':
                   case 'r':
                   case 'f':
                       Ncount = Ncount + 5;
                       break;
                   case 'k':
                   case 'w':
                   case 'j':
                       Ncount = Ncount + 6;
                       break;
                   case 's':
                   case 'g':
                   case 'l':
                       Ncount = Ncount + 7;
                       break;
                   case 't':
                   case 'z':
                   case 'x':
                       Ncount = Ncount + 0;
                       break;
                   default:
                       Ncount = Ncount + 3;
                       break;
               }
               UART_PutString(name);
   }}}

  for(turn = 1;turn<=5;turn++) {
       srand(Ncount + count + turn + dif);
       if(dif == 1) 
           Ran = rand() % 8;
       if(dif == 2) 
           Ran = rand() % 13;
       TC = 0;
       M8C_EnableGInt;
       Timer16_EnableInt();
       Timer16_Start();
       check = 1;


      while(check) {
           if(UART_bCmdCheck()) {
               if(strPtr = UART_szGetParam()) {
                   UART_CPutString("\r\n");
                   UART_PutString(strPtr);
                   if(*strPtr == 'a') {
                       answer = D;
                       check=0;
                   }
                   else if(*strPtr == 's') {
                       answer = L;
                       check=0;
                   }
                   else if(*strPtr == 'd') {
                       answer = M;
                       check=0;
                   }
                   else if(*strPtr == 'f') {
                       answer = F;
                       check=0;
                   }
                   else if(*strPtr == 'g') {
                       answer = S;
                       check=0;
                   }
                   else if(*strPtr == 'h') {
                       answer = R;
                       check=0;
                   }
                   else if(*strPtr == 'j') {
                       answer = C;
                       check=0;
                   }
                   else if(*strPtr == 'k') {
                       answer = DD;
                       check=0;
                   }
                   else if(*strPtr == 'w') {
                       answer = DS;
                       check=0;
                   }
                   else if(*strPtr == 'e') {
                       answer = LS;
                       check=0;
                   }
                   else if(*strPtr == 't') {
                       answer = FS;
                       check=0;
                   }
                   else if(*strPtr == 'y') {
                       answer = SS;
                       check=0;
                   }
                   else if(*strPtr == 'u') {
                       answer = RS;
                       check=0;
                   }}
               UART_CmdReset();
           }}
               PWM16_WritePeriod(answer);
       if(Canswer == answer) {
           LCD_Position(0,0);
           LCD_PrCString("     right         ");
           Wcount++;
           check = 1;
       }
       else {
           LCD_Position(0,0);
           LCD_PrCString("     false         ");
           check = 1;
       }}
   TC = 700;
   if(Wcount == 5) {
       LCD_Position(0,0);
       LCD_PrCString("  excellent!!         ");
   }
   if(Wcount  <= 4 && Wcount >= 2) {
       LCD_Position(0,0);
       LCD_PrCString("     good!        ");
   }
   if(Wcount <= 1) {
       LCD_Position(0,0);
       LCD_PrCString("     bad          ");
   }
}



考察

<参考文献>
チーム2122

基板から音を流し、その音を当てるゲーム。PSoC Designerに時間が導入されていなかったので、鳴らす音を決めるための乱数作成に難儀した。
結局、プレイヤーに名前を入力してもらい、その時入力された値をもとに乱数の種を生成し鳴らす音を決定している。
当初は入力された文字の文字コードを乱数の種に使うつもりでいたが、なかなかうまくいかずswitch文での分岐になった。
アナログセンサーから値を取得する手段もあったが今回は断念した。
これらのことから、入力する名前によって答えが分かってしまう点が問題点といえるだろう。

  • 最終更新:2022-05-17 16:40:36

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

認証パスワード