チーム1826
課題名
Black Jack
研究者名
Tomoaki Taguchi
Tetsuji Toyokawa
Miho Sato
概要
後述のチームをリスペクトしつつ、シリアルポート通信を用いて作った。
基板のスイッチを押すとゲームがスタートする。
キーボードのdを押すとカードを引き(hit)、
キーボードのfを押すとその数字で勝負する(stand)。
ランダムに1~13までの数字をプレーヤーとCPUに足していくが、ブラックジャックのルール通り、11,12,13が出た場合は10として計算する。
数字の合計が21を超えたらゲームオーバー(CPUも同様)。
21以内でなおかつ相手CPUの合計と比べて、21に近ければ勝ち、低ければ負け、同じなら引き分けの表示が出るようになっている。また21だった場合はブラックジャックの表示が出る。なお、プレイヤーとCPUがどちらもバーストした場合はプレイヤーの負けとなる。
勝敗はLCDで一定時間表示される。
52枚引いたらRESETボタンを押してリセットすること。
使用した機器
・PSoC基板
・ストレート通信ケーブル
・ジャンパ線3本
・MiniProg
配線・設定・ソースコード
配線
設定
ソースコード
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include "stdlib.h"
#define SW 0b00010000
char ranaad[10][6],dnum[10][6];
int count=0;
int co1 =0;
int check[14]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int j = 0;
int WaitTime=-30000;
void draw(void){
j=rand()%13; if(j==0){ j=13; } if(j==1){ co1 +=1; } check[j] += 1; if(check[j] >= 5){ draw(); } if(j==11 | | j==12 | | j==13) j=10; }
void main(void){
char* strPtr;
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\nPSoc BlackJack!!\r\n");
PRT1DR&= (~SW); while(1){ if(PRT1DR&SW){ break; }else{ PRT1DR &= (~SW); count++; } }
srand(count); while(1){ int i=0; int sum=0,dsum=0; co1=0;
LCD_1_Start(); LCD_1_Position(0,0); LCD_1_PrCString("GAMESTART"); draw(); dsum+=j; UART_CPutString("Dealer's First Number :"); itoa(dnum[1],dsum,10); UART_PutString(dnum[1]); UART_CPutString("\r\n");
while(1){ draw(); dsum+=j; if(dsum>=17) break; } co1=0; while(1){
if(UART_bCmdCheck()){ if(strPtr = UART_szGetParam()){ if(*strPtr=='d'){ UART_CPutString("Found valid command\r\nCommand=>"); UART_PutString(strPtr); draw(); sum+=j; UART_CPutString("<\r\nParamaters:"); itoa(ranaad[i],sum,10); UART_PutString(ranaad[i]); UART_CPutString("\r\n"); i++; if(sum>21) break; } if(*strPtr=='f'){ break; } } UART_CmdReset(); } } UART_CmdReset(); if(sum <21 && co1 >=1){ UART_CPutString("You drew card 1! If you use 1 as 11, Press 'e'! or If you stay, Press 's'! "); UART_CPutString("\r\n"); while(1){ if(UART_bCmdCheck()){ if(strPtr = UART_szGetParam()){ if(*strPtr=='e'){ UART_CPutString("Found valid command\r\nCommand=>"); UART_PutString(strPtr); sum+=10; UART_CmdReset(); break; } else if(*strPtr=='s'){ UART_CmdReset(); break; } } } } } LCD_1_Start(); if(sum==21){ UART_CPutString("\r\nBlack Jack!!\r\n"); LCD_1_PrCString("BLACK JACK!!"); } else if(sum==dsum && sum>21){ UART_CPutString("\r\nYou Lose...\r\n"); LCD_1_PrCString("YOU LOSE"); } else if(sum>21){ UART_CPutString("\r\nOver!\r\n"); LCD_1_PrCString("OVER YOU LOSE"); } else if(dsum>21){ UART_CPutString("\r\nYou Win!"); LCD_1_PrCString("YOU WIN"); } else if(sum>dsum){ UART_CPutString("\r\nYou Win!!\r\n"); LCD_1_PrCString("YOU WIN"); } else if(sum<dsum){ UART_CPutString("\r\nYou Lose..\r\n"); LCD_1_PrCString("YOU LOSE"); } else { UART_CPutString("\r\nDraw\r\n"); LCD_1_PrCString("DRAW"); } sum=0; itoa(ranaad[0],dsum,10); UART_CPutString("\r\nCPU's score:"); UART_PutString(ranaad[0]); UART_CPutString("\r\n Please Wait... \r\n"); if(WaitTime>10000) WaitTime=-30000; while(WaitTime<=30000) WaitTime++; while(WaitTime>=-30000) WaitTime--; while(WaitTime<=30000) WaitTime++; UART_CPutString("\r\n"); UART_CmdReset(); }
}
考察
参考にしたチーム チーム1816
1816がプログラムのほとんどを完成させていたので、機能の追加をした。
LCDで通常通りに表示させると、LCDで勝敗を確認するより速くコンピュータ内の処理が終わってしまい、LCDが初期状態に戻ってしまう。そこで、コンピュータに無意味な処理をさせて確認時間を確保した。
改善する点としては、
・CPUの引いた1も1か11で区別つけられるようにする。
・PSoC基盤を二つ使って通信対戦できるようにする。
・勝った時、負けたときに割り込みを用いて短い音楽が流れるようにする。・
・勝敗の確認時間の間にResetをかけられるようにする。
が挙げられる。
- 最終更新:2018-06-12 15:44:58