チーム1625(55/57)

課題名

年末ジャンボ宝くじ2015シミュレーター

研究者名

Yu Matsushima
Yuta Yamada

概要

年末ジャンボ宝くじ2015の結果に基づいたシミュレーター。
自分のくじの番号、当選状況はTera_Term上に表示する。
1等~6等、前後賞、組違い賞がある。
乱数で番号を設定し、結果と見比べる。
当選すると当選金額がTera_Termに表示され、ファンファーレが鳴る。

使用機材 

PSoC基盤
ジャンパ線2本
スピーカー
PSoCMiniProg
シリアル通信ケーブル

回路図

クリックで拡大。
chips.png

ソースコード

#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;
int TC=0;

void myISR(void)
{
  TC += 1;
   PWM16_1_WritePulseWidth(PW);
   if(TC == 1)
       PWM16_1_WritePeriod(R);
   else if (TC == 3)
       PWM16_1_WritePeriod(SILENT);
   else if(TC == 4)
       PWM16_1_WritePeriod(R);
   else if (TC == 5)
       PWM16_1_WritePeriod(SILENT);
   else if (TC == 6)
       PWM16_1_WritePeriod(R);
   else if (TC == 7)
       PWM16_1_WritePeriod(SILENT);
   else if(TC == 8)
       PWM16_1_WritePeriod(R);
   else if (TC == 12)
       PWM16_1_WritePeriod(SILENT);
   else if(TC == 13)
       PWM16_1_WritePeriod(C);
   else if (TC == 17)
       PWM16_1_WritePeriod(R);
   else if(TC == 21)
       PWM16_1_WritePeriod(C);
   else if(TC == 25)
       PWM16_1_WritePeriod(R);
   else if (TC == 28)
       PWM16_1_WritePeriod(SILENT);
   else if (TC == 29)
       PWM16_1_WritePeriod(R);
   else if (TC == 30)
       PWM16_1_WritePeriod(SILENT);
   else if (TC == 31)
       PWM16_1_WritePeriod(R);
   else if (TC == 32)
       PWM16_1_WritePeriod(SILENT);
   else if (TC == 33)
       PWM16_1_WritePeriod(R);
   else if (TC == 37)
       PWM16_1_WritePeriod(SILENT);
}

void main(void)
{
  // M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
   // Insert your main routine code here.
   char *strPtr;
   int k, n1, n2, i;
   char *stk; 
   char *stn1;
   char *stn2;
   
   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("年末ジャンボシミュレーター(2015) \r\n");
   UART_CPutString("当選番号 \r\n");
   UART_CPutString("1等:86組 106608番(7億円) \r\n");
   UART_CPutString("2等:~5組 152324番(1000万円) \r\n");
   UART_CPutString("3等:~~組 181461番(100万円) \r\n");
   UART_CPutString("4等:~~組 ~~0607番(5万円) \r\n");
   UART_CPutString("5等:~~組 ~~~~68番(3000円) \r\n");
   UART_CPutString("6等:~~組 ~~~~~9番(300円) \r\n");
   UART_CPutString("前後賞:86組 106607、106609番(1.5億円) \r\n");
   UART_CPutString("組違い賞:~~組106608番(10万円) \r\n");
   UART_CPutString("\r\n");
   i = rand();
   while(1) {
       if(UART_bCmdCheck()) { 
           if(strPtr = UART_szGetParam()) {
               srand(i);
               k = rand()%100+1;
               n1 = rand()%10000+10000;
               n2 = rand()%10;
               csprintf(stk, "%d", k);
               UART_CPutString("あなたのくじの組:");
               UART_PutString(stk);
               UART_CPutString("\r\n");
               UART_CPutString("あなたのくじの番号:");
               csprintf(stn1, "%d", n1);
               UART_PutString(stn1);
               csprintf(stn2, "%d", n2);
               UART_PutString(stn2);
               UART_CPutString("\r\n");
               if(k==86 && n1==10660 && n2==8){
                   UART_CPutString("1等:7億円当選!!!!!");
                   M8C_EnableGInt;
                   PWM16_1_Start();
                   Timer16_1_EnableInt();
                   Timer16_1_Start();
                   TC = 0;
               }
               else if(k%10==5 && n1==15232 && n2==4){
                   UART_CPutString("2等:1000万円当選!!!");
                   M8C_EnableGInt;
                   PWM16_1_Start();
                   Timer16_1_EnableInt();
                   Timer16_1_Start();
                   TC = 0;
               }
               else if(n1==18146 && n2==1){
                   UART_CPutString("3等:100万円当選!");
                   M8C_EnableGInt;
                   PWM16_1_Start();
                   Timer16_1_EnableInt();
                   Timer16_1_Start();
                   TC = 0;
               }
               else if(n1%1000==67 && n2==6){
                   UART_CPutString("4等:5万円当選");
                   M8C_EnableGInt;
                   PWM16_1_Start();
                   Timer16_1_EnableInt();
                   Timer16_1_Start();
                   TC = 0;
               }
               else if(n1%10==6 && n2==8){
                   UART_CPutString("5等:3000円当選");
                   M8C_EnableGInt;
                   PWM16_1_Start();
                   Timer16_1_EnableInt();
                   Timer16_1_Start();
                   TC = 0;
               }
               else if(n2==9){
                   UART_CPutString("6等:300円当選");
                   M8C_EnableGInt;
                   PWM16_1_Start();
                   Timer16_1_EnableInt();
                   Timer16_1_Start();
                   TC = 0;
               }        
               else if(n1==10660 && n2==8){
                   UART_CPutString("組違い賞:10万円当選");
                   M8C_EnableGInt;
                   PWM16_1_Start();
                   Timer16_1_EnableInt();
                   Timer16_1_Start();
                   TC = 0;
               }
               else if((k==86 && n1==10660 && n2==7) | | (k==86 && n1==10660 && n2==9)){
                   UART_CPutString("前後賞:1.5億円当選!!!!");
                   M8C_EnableGInt;
                   PWM16_1_Start();
                   Timer16_1_EnableInt();
                   Timer16_1_Start();
                   TC = 0;
               }
               else
                   UART_CPutString("はずれ~~~");
               UART_CPutString("\r\n\r\n");
               i++;
           }
       UART_CmdReset();
       }
   }

}

考察

参考にしたラボ
uart_1
timer_pwm2

組は1~100までの整数、番号は6ケタの整数である。
番号を一つの乱数でうまく生成・表示させることができなかったので、上5ケタと下1ケタを分けて生成し、表示させることとした。
乱数を生成する際、Time関数を使いたかったのだが、time.hをincludeしても使うことができなかった。
time.hの中を見てみたところ、何も書いていなかったので、ここを自分で書けば使えたと考えられる。
他にいい乱数の生成法が浮かばず、結局疑似的な乱数となってしまい、実行し直すと最初からまた同じパターンが始まってしまう。
time関数を使える状況にする、あるいはtime関数を使わないいい乱数のシードを思いつけば、完全に乱数での抽選が行えたはずである。
また、まれに原因不明の文字化けも起こってしまう。

  • 最終更新:2016-06-14 15:53:24

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

認証パスワード