チーム1812

課題名

音の出る数当てゲーム!

研究者名

2-15-62 Takashi Hasebe
2-15-73 Shohei Miyamoto
2-15-83 Naoya Wada

使用器具

・PSoC基板
・ジャンパ線3本
・EIA-574(DSUB9)ストレート通信ケーブル
・スピーカー

概要

今回の作品はuartとpwmを利用してゲームを作りました。
数をキーボードから入力してその数が設定した数と違っていると
設定した数と比較して大きいか小さいかをLCDに出力します。
正解すると"Congratulation!"と表示し、また入力した回数が表示されます。
そして、そのあとにはみんなが知っているあの高貴なお歌が流れ始めます!!

ソースコード

#include <m8c.h>
#include "PSoCAPI.h"
#include <stdlib.h>
#pragma interrupt_handler myISR

int PW=125; // Pulse Width
int SILENT=0, D=229, L=204, M=182, F=172, S=153, R=136, C=121,DD = 115, LL =102, MM = 91, FF = 85, SS = 75, RR = 68;
int TC=0; //Time Count


int x = 0;
int i = 0;

void myISR(void)
{
TC += 1; //TC = TC +1
PWM16_1_WritePulseWidth(PW);

if(TC == 1){
PWM16_1_WritePeriod(SILENT);
LCD_1_Start();
     LCD_1_PrCString("kimi");}
if(TC == 12){
PWM16_1_WritePeriod(SILENT);
LCD_1_Start();
     LCD_1_PrCString("gayo");}
if(TC == 20){
PWM16_1_WritePeriod(SILENT);
LCD_1_Start();
     LCD_1_PrCString("kokka");}
     
     
     

if(TC == 31){
PWM16_1_WritePeriod(L);
LCD_1_Start();
     LCD_1_PrCString("ki");}
     

else if(TC == 37){
PWM16_1_WritePeriod(D);
LCD_1_Start();
     LCD_1_PrCString("mi");}
     
else if(TC == 43){
PWM16_1_WritePeriod(L);
LCD_1_Start();
     LCD_1_PrCString("ga");}

else if(TC == 49){
PWM16_1_WritePeriod(M);
LCD_1_Start();
     LCD_1_PrCString("-");}

else if(TC == 55){
PWM16_1_WritePeriod(S);
LCD_1_Start();
     LCD_1_PrCString("yo");}

else if (TC == 61){
PWM16_1_WritePeriod(M);
LCD_1_Start();
     LCD_1_PrCString("-");}

else if(TC == 67){
PWM16_1_WritePeriod(L);
LCD_1_Start();
     LCD_1_PrCString("ha");}
     
else if(TC == 79){
PWM16_1_WritePeriod(M);
LCD_1_Start();
     LCD_1_PrCString("ti");}    

else if(TC == 85){
PWM16_1_WritePeriod(S);
LCD_1_Start();
     LCD_1_PrCString("yo");}
     
else if(TC == 91){
PWM16_1_WritePeriod(R);
LCD_1_Start();
     LCD_1_PrCString("ni");}

else if(TC == 97){
PWM16_1_WritePeriod(S);
LCD_1_Start();
     LCD_1_PrCString("-");}

else if(TC == 100){
PWM16_1_WritePeriod(R);
LCD_1_Start();
     LCD_1_PrCString("-");}
     
else if(TC == 103){
PWM16_1_WritePeriod(LL);
LCD_1_Start();
     LCD_1_PrCString("ya");}

else if(TC == 109){
PWM16_1_WritePeriod(C);
LCD_1_Start();
     LCD_1_PrCString("ti");}
     
else if(TC == 115){
PWM16_1_WritePeriod(R);
LCD_1_Start();
     LCD_1_PrCString("yo");}
 
else if(TC == 121){
PWM16_1_WritePeriod(S);
LCD_1_Start();
     LCD_1_PrCString("ni");}
     

else if(TC == 127){
PWM16_1_WritePeriod(M);
LCD_1_Start();
     LCD_1_PrCString("sa");}
     
else if(TC == 133){
PWM16_1_WritePeriod(S);
LCD_1_Start();
     LCD_1_PrCString("za");}

else if(TC == 136){
PWM16_1_WritePeriod(R);
LCD_1_Start();
     LCD_1_PrCString("re");}
     
else if(TC == 148){
PWM16_1_WritePeriod(LL);
LCD_1_Start();
     LCD_1_PrCString("i");}    
 
else if(TC == 154){
PWM16_1_WritePeriod(DD);
LCD_1_Start();
     LCD_1_PrCString("si");}
     
else if(TC == 160){
PWM16_1_WritePeriod(LL);
LCD_1_Start();
     LCD_1_PrCString("no");}

else if(TC == 172){
PWM16_1_WritePeriod(M);
LCD_1_Start();
     LCD_1_PrCString("i");}
     
else if(TC == 178){
PWM16_1_WritePeriod(S);
 LCD_1_Start();
     LCD_1_PrCString("wa");}
     
else if(TC == 184){
PWM16_1_WritePeriod(R);
LCD_1_Start();
     LCD_1_PrCString("o");}

else if(TC == 190){
PWM16_1_WritePeriod(S);
LCD_1_Start();
     LCD_1_PrCString("to");}
 
else if(TC == 196){
PWM16_1_WritePeriod(M);
LCD_1_Start();
     LCD_1_PrCString("na");}

else if(TC == 204){
PWM16_1_WritePeriod(S);
LCD_1_Start();
     LCD_1_PrCString("ri");}
     
else if(TC == 208){
PWM16_1_WritePeriod(L);
LCD_1_Start();
     LCD_1_PrCString("te");}

else if(TC == 220){
PWM16_1_WritePeriod(R);
LCD_1_Start();
     LCD_1_PrCString("ko");}
     
else if(TC == 226){
PWM16_1_WritePeriod(DD);
LCD_1_Start();
     LCD_1_PrCString("ke");}    

else if(TC == 232){
PWM16_1_WritePeriod(LL);
LCD_1_Start();
     LCD_1_PrCString("no");}
     
else if(TC == 244){
PWM16_1_WritePeriod(DD);
LCD_1_Start();
     LCD_1_PrCString("mu");}
     
else if(TC == 250){
PWM16_1_WritePeriod(LL);
LCD_1_Start();
     LCD_1_PrCString("-");}
     

else if(TC == 256){
PWM16_1_WritePeriod(R);
LCD_1_Start();
     LCD_1_PrCString("su");}
     
else if(TC == 262){
PWM16_1_WritePeriod(S);
LCD_1_Start();
     LCD_1_PrCString("-");}
     
else if(TC == 268){
PWM16_1_WritePeriod(R);
LCD_1_Start();
     LCD_1_PrCString("ma");}
     
else if(TC == 274){
PWM16_1_WritePeriod(S);
LCD_1_Start();
     LCD_1_PrCString("-");}    
 
else if(TC == 277){
PWM16_1_WritePeriod(M);
LCD_1_Start();
     LCD_1_PrCString("-");}
     

else if(TC == 280){
PWM16_1_WritePeriod(L);
LCD_1_Start();
     LCD_1_PrCString("de");}
     

else if(TC == 292){
PWM16_1_WritePeriod(SILENT);
LCD_1_Start();
     LCD_1_PrCString("end");}
}


void main(void){

char * strPtr;
char buf[10];
  LCD_1_Start();
   UART_CmdReset();
   UART_IntCntl(UART_ENABLE_RX_INT);
Counter8_WritePeriod(155);
Counter8_WriteCompareValue(77);
Counter8_Start();
  UART_Start(UART_PARITY_NONE);
M8C_EnableGInt;
  UART_CPutString("\r\nInput The Number 1~100.\r\n");
   LCD_1_PrCString("Guess The Number");


x = rand() % 100 + 1;


while(1){
  if(UART_bCmdCheck()){
       
       if(strPtr=UART_szGetParam()){
        i++;
        if(atoi(strPtr)<1 | | atoi(strPtr)>100){
          UART_CPutString("Out of Range!\r\n");
          LCD_1_Position (0,0);LCD_1_PrCString("ERROR!          ");
        }
        else if(atoi(strPtr)<x){
          UART_CPutString("You Input > ");
          UART_PutString(strPtr);
          UART_CPutString(" <\r\n");
          LCD_1_Position (0,0);LCD_1_PrCString("Ans is Bigger.  ");
        }
        else if(atoi(strPtr)>x){
          UART_CPutString("You Input > ");
          UART_PutString(strPtr);
          UART_CPutString(" <\r\n");
          LCD_1_Position (0,0);LCD_1_PrCString("Ans is Smaller. ");
        }
        else if(atoi(strPtr)==x){
          UART_CPutString("You Input > ");
          UART_PutString(strPtr);
          UART_CPutString(" < It's The Answer!\r\n");
          LCD_1_Position (0,0);LCD_1_PrCString("Congratulation! ");
          LCD_1_Position (1,0);LCD_1_PrCString("Input Times:");
          itoa(buf,i,10);
          LCD_1_Position (1,6);LCD_1_PrString(buf);
          
          M8C_EnableGInt;
          TC = 0;
            PWM16_1_Start();
          Timer16_1_EnableInt();
            Timer16_1_Start();
            while(1)
           {};
          
        }
      }
       

  UART_CmdReset();
   }
}
}

考察

  チーム1663とチーム1316を参考にした。
 答えになる数をrand関数による乱数で実装しようとしたが、
乱数を初期化するときに使おうとしていた関数に必要なヘッダーファイルがなかったため、
違う値の乱数が作れず、その数で固定されてしまった。
 音声部分の考察としては、途中の部分で音が出るタイミングが思っていたのとずれてしまうと、
変更するときにその後にある音のすべてのタイマーをずらさなければいけないのが少々めんどくさかった。
また、音節の区切りに音が出ないSILENTを入れるともっとよくなったかもしれないと感じた。

  • 最終更新:2018-05-15 16:30:44

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

認証パスワード