📄 cardgame.c
字号:
break;
case NEW_GAME:
ActivateTask(DealCards);
if(GetRemainingCards() < GAME_MINIMUM_CARDS){
ActivateTask(ShuffleCards);
gameState = GAME_SHUFFLING;
shuffleComplete = FALSE;
do{
WaitEvent(KEYPRESS|SHUFFLED);
GetEvent(ProcessKeyPress,(EventMaskRefType)&eventMask);
if((eventMask & KEYPRESS)!= 0){
ClearEvent(KEYPRESS);
while(ReceiveMessage(KeyPressMessage,keyValue) == E_OK){
if(*keyValue == '#'){
CancelAlarm(ShuffleAlarm);
SetEvent(DealCards,ABORT_SHUFFLE);
shuffleComplete = TRUE;
WriteDisplay(GameNormalPrompt);
}
}
}
else{
ClearEvent(SHUFFLED);
shuffleComplete = TRUE;
}
}while(shuffleComplete == FALSE);
}
else{
SetEvent(DealCards,SHUFFLED);
}
break;
case REQUEST_MULTIPLE:
*requestMode = REQUEST_HEAD_TO_HEAD;
SendMessage(RequestModeMessageOut,requestMode);
requestHeadToHead = TRUE;
SetRelAlarm(RequestModeAlarm,25000,0);
WriteDisplay(RequestModeAwaitPrompt);
gameState = GAME_AWAITING_RESPONSE;
break;
case CANCEL_REQUEST:
gameState = GAME_NORMAL;
WriteDisplay(GameNormalPrompt);
CancelAlarm(RequestModeAlarm);
break;
case ACCEPT_REQUEST:
*requestMode = ACCEPT_HEAD_TO_HEAD;
SendMessage(RequestModeMessageOut,requestMode);
gameState = GAME_NORMAL;
ChangeMode(HEAD_TO_HEAD);
break;
case REJECT_REQUEST:
*requestMode = REJECT_HEAD_TO_HEAD;
SendMessage(RequestModeMessageOut,requestMode);
gameState = GAME_NORMAL;
WriteDisplay(GameNormalPrompt);
break;
case REQUEST_CARD_DEALT:
dealComplete = FALSE;
while(dealComplete == FALSE){
dealtCard->type = REQUEST_CARD;
SendMessage(CardMessageOut,dealtCard);
SetRelAlarm(CardMessageAlarm,5000,0);
WaitEvent(TRANSMIT_COMPLETE|TRANSMIT_FAILED);
GetEvent(ProcessKeyPress,(EventMaskRefType)&eventMask);
if(eventMask&TRANSMIT_COMPLETE){
dealComplete = TRUE;
CancelAlarm(CardMessageAlarm);
}
ClearEvent(TRANSMIT_COMPLETE|TRANSMIT_FAILED);
}
break;
case RELINQUISH_TURN:
dealComplete = FALSE;
while(dealComplete == FALSE){
dealtCard->type = END_TURN;
SendMessage(CardMessageOut,dealtCard);
SetRelAlarm(CardMessageAlarm,5000,0);
WaitEvent(TRANSMIT_COMPLETE|TRANSMIT_FAILED);
GetEvent(ProcessKeyPress,(EventMaskRefType)&eventMask);
if(eventMask&TRANSMIT_COMPLETE){
dealComplete = TRUE;
CancelAlarm(CardMessageAlarm);
}
ClearEvent(TRANSMIT_COMPLETE|TRANSMIT_FAILED);
}
if(gameRole == GAME_DEALER){
DisplayCard(playerCards[0],tempBuffer);
WriteDisplayAt(2,9,tempBuffer);
EndGame();
}
else{
gameState = GAME_PLAYER_WAIT;
WriteDisplayAt(0,8,"*");
WriteDisplayAt(2,8," ");
}
break;
case DEAL_MULTI_CARD:
GetResource(CARDDECK);
dealerCards[dealerPosition] = DealCard(DEALER,dealerPosition,TRUE);
ReleaseResource(CARDDECK);
dealerScore += GetCardValue(dealerCards[dealerPosition]);
if(dealerScore > 21){
for(i=0;i<=dealerPosition;i++){
if(GetCardValue(dealerCards[i])==11){
dealerCards[i] = ACE_IS_ONE;
dealerScore -= 10;
break;
}
}
}
dealComplete = FALSE;
while(dealComplete == FALSE){
dealtCard->type = DEALER_CARD;
dealtCard->position = dealerPosition;
dealtCard->card = dealerCards[dealerPosition];
SendMessage(CardMessageOut,dealtCard);
SetRelAlarm(CardMessageAlarm,5000,0);
WaitEvent(TRANSMIT_COMPLETE|TRANSMIT_FAILED);
GetEvent(ProcessKeyPress,(EventMaskRefType)&eventMask);
if(eventMask&TRANSMIT_COMPLETE){
dealComplete = TRUE;
CancelAlarm(CardMessageAlarm);
}
ClearEvent(TRANSMIT_COMPLETE|TRANSMIT_FAILED);
}
if((++dealerPosition == 5) || (dealerScore > 21)){
DisplayCard(playerCards[0],tempBuffer);
WriteDisplayAt(0,9,tempBuffer);
dealComplete = FALSE;
while(dealComplete == FALSE){
dealtCard->type = END_TURN;
SendMessage(CardMessageOut,dealtCard);
SetRelAlarm(CardMessageAlarm,5000,0);
WaitEvent(TRANSMIT_COMPLETE|TRANSMIT_FAILED);
GetEvent(ProcessKeyPress,(EventMaskRefType)&eventMask);
if(eventMask&TRANSMIT_COMPLETE){
dealComplete = TRUE;
CancelAlarm(CardMessageAlarm);
}
ClearEvent(TRANSMIT_COMPLETE|TRANSMIT_FAILED);
}
EndGame();
}
break;
case NEW_MULTI_GAME:
if(newGameReceived == TRUE){
newGameReceived = FALSE;
if(gameRole == GAME_DEALER){
if(GetRemainingCards() > GAME_MINIMUM_CARDS){
ActivateTask(DealCards);
SetEvent(DealCards,SHUFFLED);
if(GetActiveApplicationMode() == HEAD_TO_HEAD){
firstShuffle = TRUE;
WaitEvent(CARDS_DEALT);
ClearEvent(CARDS_DEALT);
dealtCard->type = DEALER_CARD;
dealtCard->position = 0;
dealtCard->card = dealerCards[0];
ClearEvent(TRANSMIT_COMPLETE);
SendMessage(CardMessageOut,dealtCard);
WaitEvent(TRANSMIT_COMPLETE);
ClearEvent(TRANSMIT_COMPLETE);
dealtCard->position = 1;
dealtCard->card = dealerCards[1];
SendMessage(CardMessageOut,dealtCard);
WaitEvent(TRANSMIT_COMPLETE);
ClearEvent(TRANSMIT_COMPLETE);
dealtCard->type = PLAYER_CARD;
dealtCard->position = 0;
dealtCard->card = playerCards[0];
SendMessage(CardMessageOut,dealtCard);
WaitEvent(TRANSMIT_COMPLETE);
ClearEvent(TRANSMIT_COMPLETE);
dealtCard->position = 1;
dealtCard->card = playerCards[1];
SendMessage(CardMessageOut,dealtCard);
}
}
else{
*requestMode = SWITCH_DEALER;
SendMessage(RequestModeMessageOut,requestMode);
gameRole = GAME_PLAYER;
WriteDisplay(WaitingPrompt);
gameState = GAME_PLAYER_TURN;
}
}
else{
gameState = GAME_PLAYER_TURN;
dealerPosition = playerPosition = 0;
}
}
else{
newGameRequested = TRUE;
}
*requestMode = DEAL_NEW_HAND;
SendMessage(RequestModeMessageOut,requestMode);
break;
case CANCEL_MULTI:
*requestMode = CANCEL_HEAD_TO_HEAD;
SendMessage(RequestModeMessageOut,requestMode);
ChangeMode(SINGLE_PLAYER);
break;
case SEND_PLAYER:
dealComplete = FALSE;
while(dealComplete == FALSE){
dealtCard->type = PLAYER_CARD;
dealtCard->position = playerPosition;
dealtCard->card = playerCards[playerPosition];
SendMessage(CardMessageOut,dealtCard);
SetRelAlarm(CardMessageAlarm,5000,0);
WaitEvent(TRANSMIT_COMPLETE|TRANSMIT_FAILED);
GetEvent(ProcessKeyPress,(EventMaskRefType)&eventMask);
if(eventMask&TRANSMIT_COMPLETE){
dealComplete = TRUE;
ClearEvent(TRANSMIT_COMPLETE|TRANSMIT_FAILED);
CancelAlarm(CardMessageAlarm);
}
}
++playerPosition;
break;
case CREATE_OPPONENT_MESSAGE:
messageSize = 0;
messageNumber = '2';
gameState = GAME_CONSTRUCT_OPPONENT_MESSAGE;
WriteDisplay(OpponentMessagePrompt);
break;
case ENTER_LETTER_RANGE:
messageNumber = pressedKey;
break;
case ENTER_LETTER_EXACT:
opponentMessageOutBuffer[messageSize] = ConvertKeyCombo(messageNumber,pressedKey);
++messageSize;
opponentMessageOutBuffer[messageSize] = 0;
WriteDisplayAt(1,0,opponentMessageOutBuffer);
if(messageSize == 58){
simulatedKey = '#';
SetEvent(ProcessKeyPress,SIM_KEY);
}
break;
case ENTER_SPACE:
opponentMessageOutBuffer[messageSize++] = ' ';
opponentMessageOutBuffer[messageSize] = 0;
WriteDisplayAt(1,0,opponentMessageOutBuffer);
if(messageSize == 58){
simulatedKey = '#';
SetEvent(ProcessKeyPress,SIM_KEY);
}
break;
case ENTER_PERIOD:
opponentMessageOutBuffer[messageSize++] = '.';
opponentMessageOutBuffer[messageSize] = 0;
WriteDisplayAt(1,0,opponentMessageOutBuffer);
if(messageSize == 58){
simulatedKey = '#';
SetEvent(ProcessKeyPress,SIM_KEY);
}
break;
case SEND_OPPONENT_MESSAGE:
opponentMessageOutBuffer[messageSize++] = 0;
// SendMessageTo(OpponentMessageOut,opponentMessageOutBuffer,messageSize,messageOpponent);
SendMessage(OpponentMessageOut,opponentMessageOutBuffer);
gameState = GAME_NORMAL;
WriteDisplay(GameNormalPrompt);
break;
case CLEAR_OPPONENT_MESSAGE:
WriteDisplay(GameNormalPrompt);
gameState = GAME_NORMAL;
break;
case NO_ACTION:
break;
}
}
}
}
/************************************************
*
* Task: DealCards
*
* Description: Deals the first 4 cards when a
* new game starts.
*
************************************************/
TASK(DealCards)
{
EventMaskType eventMask;
WaitEvent(ABORT_SHUFFLE|SHUFFLED);
GetEvent(DealCards,(EventMaskRefType)&eventMask);
if((eventMask & SHUFFLED)!=0){
WriteDisplay(&GameMessage[0]);
if(GetActiveApplicationMode() == HEAD_TO_HEAD){
if(gameRole == GAME_DEALER){
WriteDisplayAt(1,1,"*");
}
else{
WriteDisplayAt(3,1,"*");
}
WriteDisplayAt(2,8,"*");
}
if(gameRole == GAME_DEALER){
GetResource(CARDDECK);
if(GetActiveApplicationMode() == SINGLE_PLAYER){
playerCards[0] = DealCard(PLAYER,0,TRUE);
dealerCards[0] = DealCard(DEALER,0,FALSE);
}
else{
playerCards[0] = DealCard(PLAYER,0,FALSE);
dealerCards[0] = DealCard(DEALER,0,TRUE);
}
playerCards[1] = DealCard(PLAYER,1,TRUE);
dealerCards[1] = DealCard(DEALER,1,TRUE);
ReleaseResource(CARDDECK);
dealerScore = GetCardValue(dealerCards[0])+GetCardValue(dealerCards[1]);
playerScore = GetCardValue(playerCards[0])+GetCardValue(playerCards[1]);
dealerPosition = playerPosition = 2;
if(GetActiveApplicationMode() == HEAD_TO_HEAD){
gameState = GAME_DEALER_WAIT;
}
else{
gameState = GAME_PLAYER_TURN;
}
}
ClearEvent(SHUFFLED);
}
else{
ClearEvent(ABORT_SHUFFLE);
gameState = GAME_NORMAL;
}
SetEvent(ProcessKeyPress,CARDS_DEALT);
TerminateTask();
}
/************************************************
*
* Task: DealerTurn
*
* Description: Deals the cards for the dealer.
* Dealer stays at 16 hits at 17.
*
************************************************/
TASK(DealerTurn)
{
UINT8 i;
char tempBuffer[4];
DisplayCard(dealerCards[0],tempBuffer);
WriteDisplayAt(0,9,tempBuffer);
if(dealerScore < 17){
dealerCards[dealerPosition] = DealCard(DEALER,dealerPosition,TRUE);
dealerScore += GetCardValue(dealerCards[dealerPosition]);
CheckScore(&dealerScore,dealerPosition,dealerCards);
if((++dealerPosition == 5) || (dealerScore > 21)){
EndGame();
}
}
else{
EndGame();
}
if(gameState == GAME_DEALER_TURN){
SetRelAlarm(DealerTurnAlarm,2000,0);
}
TerminateTask();
}
/************************************************
*
* Task: ChangeGameMode
*
* Description: Activated whenever a RequestModeMessageIn is
* received and performs the switch as necessary.
*
************************************************/
TASK(ChangeGameMode)
{
TickType tick;
if(GetActiveApplicationMode() == SINGLE_PLAYER){
if(requestHeadToHead == TRUE){
if(GetAlarm(RequestModeAlarm,&tick) == E_OK){
CancelAlarm(RequestModeAlarm);
ReceiveMessage(RequestModeMessageIn,requestedMode);
if(*requestedMode == ACCEPT_HEAD_TO_HEAD){
ChangeMode(HEAD_TO_HEAD);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -