⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cardgame.c

📁 《OSEK/VDX汽车电子嵌入式软件编程技术》中光盘的资料
💻 C
📖 第 1 页 / 共 3 页
字号:
               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 + -