チーム1859
課題名
サンマ(じゃんけん)
研究者名
Kazuya Kinoshita
Kohei Takemura
Takumi Tamada
概要
シリアルポートを使ってPSoCとじゃんけんをする。ルールは簡単で、先に3勝したほうが勝ちとなる。自分がキーボードで決めた手とPSoCが決めた手が同時に出していることをシリアル通信で実現できるように、ソースコードでは先にキーボード入力が出す手の処理を行い、その後に、PC側の出す手の処理を行う。PC側の出す手を決める部分は疑似乱数を用いた。さらに、現在の勝敗がわかるようにint型の変数を用いて、シリアル通信で表示させた。
使用機材・配置と配線
・使用機材
PSoC基板 1個
PSoCMiniprog 1本
ジャンパ線 2本
シリアル通信ケーブル 1本
設計
・配置と配線
ソースコード(main.c)
#include <m8c.h>
#include "PSoCAPI.h"
#include <stdio.h>
#include <stdlib.h>
char windraw[3][3],losedraw[3][3];
void main(void)
{
// Insert your main routine code here. int yubi = 0; //ユーザーの出す手 int enemy = 0; //相手の出す手 int win = 0, lose = 0;//勝ち、負けの判定フラグ int a=0;
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\nWelcome to PSoC JYANNKENN.\r\n"); UART_CPutString(" Win 3 times or lose 3 time to end\r\n"); UART_CPutString(" START! \r\n"); //スタート UART_CPutString(" グー: r チョキ: s パー: p \r\n"); while(1){ a++; if(UART_bCmdCheck()){ if(strPtr = UART_szGetParam()){ //ユーザーの出す手を選択 UART_CPutString("\r\n"); UART_CPutString("Your choice => "); UART_PutString(strPtr); UART_CPutString("\r\n"); if (*strPtr=='r'){ //グー yubi = 0; UART_CPutString(" You : グー\r\n"); } else if (*strPtr=='s'){ //チョキ yubi = 1; UART_CPutString(" You : チョキ\r\n"); } else if (*strPtr=='p'){ //パー yubi = 2; UART_CPutString(" You : パー\r\n"); } else{ //エラー yubi = 8; UART_CPutString(" error \r\n"); UART_CPutString(" please enter\r\n"); UART_CPutString(" グー: r チョキ: s パー: p \r\n"); UART_CmdReset(); continue; } srand(a); //相手の手(乱数) enemy = rand() % 3; if(yubi == 0 | | yubi == 1 | | yubi == 2){ if(enemy == 0) UART_CPutString(" Enemy : グー\r\n"); else if(enemy == 1) UART_CPutString(" Enemy : チョキ\r\n"); else if(enemy == 2) UART_CPutString(" Enemy : パー\r\n"); } //勝敗判定 if(yubi == enemy){ UART_CPutString("\r\n Drow \r\n"); UART_CmdReset(); continue; } else if(yubi+1 == enemy | | yubi-2 == enemy){ win++; UART_CPutString("\r\n You win! \r\n"); } else{ lose++; UART_CPutString("\r\n You lose... \r\n"); } UART_CPutString(" Number of times win : "); //num = (char*)win; itoa(windraw[1],win,10); UART_PutString(windraw[1]); UART_CPutString("\r\n"); UART_CPutString(" Number of times lose : "); itoa(losedraw[1],lose,10); UART_PutString(losedraw[1]); UART_CPutString("\r\n\r\n"); if(win == 3){ UART_CPutString("\r\n You are winner!! \r\n\r\n"); break; } else if(lose == 3){ UART_CPutString("\r\n You are loser... \r\n\r\n"); break; } } UART_CmdReset(); } }
}
考察
チーム1756とuart_1のラボを参考に作成した。もしソースコードで、PC側の出す手の処理がキーボード入力が出す手の処理より先に記述されていれば、シリアル通信ではPC側が出した手が表示されてしまい、その後にキーボード入力をすることになるので後出しじゃんけんのようになってしまうと考えられる。
改善点としては、ルールとして3勝するだけでは物足りなさを感じるので、勝つ回数を増やしたり、相手の数を増やして対戦時間を長時間にするなど、さらに機能を追加するとよりゲーム性が増し、利用者を飽きさせないようにできると考えられる。また、スピーカーを用いて、PCに勝った時のBGMと、負けた時のBGMを導入することで、視覚のみならず聴覚で勝敗を伝えると分かりやすくなると考えられる。
- 最終更新:2018-11-27 16:30:45