チーム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

配線・設定・ソースコード

配線
1826_1.png

設定
1826_2.PNG

ソースコード

#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

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

認証パスワード