チーム153B
課題名
スロットゲーム
研究者名
2-15-46 Ryo Nakajima
2-15-47 Jiai Nakamura
使用機材
・PSoC基盤
・ジャンパ線 1本
・スピーカー 1台
・PSoC MiniProg
概要
スロットマシーンのようにLCD上にランダムに変化しながら表示される3つの数字を用意し、スイッチを押すことで左から一つずつ数字の変化を止めていく。
3つの数字がそろったらLCD上に"BINGO!"と表示し、スピーカーから音楽が流れる。
デフォルトの状態ではランダムに表示される数字の幅は1~3であるが、ソースコード内のマクロ定数DIVIDEの値を変化させることで数字の幅を変更することができる。
リセットボタンを押すことで再度スロットが回る。
配線
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#pragma interrupt_handler myISR
#include <stdio.h>
#include <stdlib.h>
#define SW 0b00010000
#define DIVIDE 3
int PW = 125;
int SILENT=0,D=229,L=204,M=182,F=172,S=153,R=136,C=121,DD=115,LL=102,MM=91;
int TC=0;
void myISR(void){
TC += 1; PWM16_1_WritePulseWidth(PW); if(TC==1) PWM16_1_WritePeriod(DD); else if(TC==2) PWM16_1_WritePeriod(C); else if(TC==3) PWM16_1_WritePeriod(R); else if(TC==4) PWM16_1_WritePeriod(S); else if(TC==5) PWM16_1_WritePeriod(DD); else if(TC==6) PWM16_1_WritePeriod(C); else if(TC==7) PWM16_1_WritePeriod(R); else if(TC==8) PWM16_1_WritePeriod(S); else if(TC==9) PWM16_1_WritePeriod(DD); else if(TC==11) PWM16_1_WritePeriod(MM); else if(TC==13) PWM16_1_WritePeriod(LL); else if(TC==15) PWM16_1_WritePeriod(SILENT);
}
void slot_test(void){
int sl[3]={1,1,1}; char str0[5],str1[5],str2[5]; M8C_EnableGInt; Timer16_1_EnableInt(); LCD_1_Start(); PWM16_1_Start(); PRT1DR &= (~SW); csprintf(str0,"%d",sl[0]); csprintf(str1,"%d",sl[1]); csprintf(str2,"%d",sl[2]); LCD_1_PrString(str0); LCD_1_PrCString(" "); LCD_1_PrString(str1); LCD_1_PrCString(" "); LCD_1_PrString(str2); while(1){ if(PRT1DR & SW) break; } if(sl[0] == sl[1] && sl[1] == sl[2]){ //割り込み、音鳴らす,LCD Timer16_1_Start(); LCD_1_PrCString(" BINGO!"); while(1){}; }
}
void slot(void){
int sl[3]; int flag = 0,tcc = 0,flag_2 = 0; char str0[5],str1[5],str2[5]; M8C_EnableGInt; Timer16_1_EnableInt(); LCD_1_Start(); PWM16_1_Start();
PRT1DR &= (~SW); while(1){ LCD_1_Start(); tcc = 0; sl[0] = rand() % DIVIDE +1; sl[1] = rand() % DIVIDE +1; sl[2] = rand() % DIVIDE +1;
csprintf(str0,"%d",sl[0]); csprintf(str1,"%d",sl[1]); csprintf(str2,"%d",sl[2]); LCD_1_PrString(str0); LCD_1_PrCString(" "); LCD_1_PrString(str1); LCD_1_PrCString(" "); LCD_1_PrString(str2); while(tcc < 10000){ tcc ++; if(PRT1DR & SW){ flag = 1; break; } } if(flag == 1) break; }
while(1){ LCD_1_Start(); tcc = 0; sl[1] = rand() % DIVIDE +1; sl[2] = rand() % DIVIDE +1; csprintf(str1,"%d",sl[1]); csprintf(str2,"%d",sl[2]); LCD_1_PrString(str0); LCD_1_PrCString(" "); LCD_1_PrString(str1); LCD_1_PrCString(" "); LCD_1_PrString(str2); if(PRT1DR == 0b00000000) flag = 0; while(tcc < 10000){ tcc ++; if(PRT1DR & SW && flag == 0){ flag_2 = 1; break; } } if(flag_2 == 1) break; } while(1){ LCD_1_Start(); tcc = 0; sl[2] = rand() % DIVIDE +1; csprintf(str2,"%d",sl[2]); LCD_1_PrString(str0); LCD_1_PrCString(" "); LCD_1_PrString(str1); LCD_1_PrCString(" "); LCD_1_PrString(str2); if(PRT1DR == 0b00000000) flag_2 = 0; while(tcc < 10000){ tcc ++; if(PRT1DR & SW && flag_2 == 0){ flag = 1; break; } } if(flag == 1) break; } if(sl[0] == sl[1] && sl[1] == sl[2]){ //割り込み、音鳴らす,LCD Timer16_1_Start(); LCD_1_PrCString(" BINGO!"); while(1){}; }
}
void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts // Insert your main routine code here.
slot(); //slot_test(); while(1){};
}
仕様
3つの数字がそろった時に流れる音楽はNHK・のど自慢の音楽。
スイッチを押し続けて3つの数字が止まるのを回避するためにmain.c内ではフラグの管理を行っている。
数字がランダムに変化し続けているはスイッチが押されると止まる仕様になっているが、押された瞬間にflagという変数に1が代入され、スイッチが押され続けているとずっとflagは1のままである。
しかし次の数字を止めるための条件文としてflag==0というのがあるため一度スイッチを離さなければ次の数字の変化は止まらない仕組みになっている。
注意としてマクロのDIVIDEを偶数にすると、2回目のwhile文で乱数を生成する際に2つ目の数字に奇数、3つ目の数字に偶数のみが代入される仕様上の問題点が発生してしまうのでDIVIDEは奇数にしなければならない。
考察
このスロットゲームの欠陥は一般的なスロットマシーンのように押す順番を決めることができないことである。
シリアル通信でキーボードから入力を受け付け、3つのキーを割り当てることで実際のスロットマシーンと同様に自由な場所からスロットを止めることを可能にすると考えられる。
また、更なる改良として現在1列な数字を2列、3列と増やし横に加え斜めでもそろったら音が鳴るような仕様にすればいっそうゲーム性が増すだろう。
- 最終更新:2015-07-14 15:28:52