Ir para conteúdo
Fórum Script Brasil

Marcelo Utikawa da Fonseca

Membros
  • Total de itens

    297
  • Registro em

  • Última visita

Tudo que Marcelo Utikawa da Fonseca postou

  1. Boa tarde! Depois de muito trabalho eu terminei o jogo! B) Ainda falta dar a mensagem que terminou o jogo e não permitir mover a carta do baralho para os slots mas já funciona! Segue o código: baralho.h #ifndef BARALHO_H_INCLUDED #define BARALHO_H_INCLUDED #define CARD_VALUE_INVALID 0x0000 #define CARD_VALUE_ACE 0x0001 #define CARD_VALUE_2 0x0002 #define CARD_VALUE_3 0x0004 #define CARD_VALUE_4 0x0008 #define CARD_VALUE_5 0x0010 #define CARD_VALUE_6 0x0020 #define CARD_VALUE_7 0x0040 #define CARD_VALUE_8 0x0080 #define CARD_VALUE_9 0x0100 #define CARD_VALUE_10 0x0200 #define CARD_VALUE_J 0x0400 #define CARD_VALUE_Q 0x0800 #define CARD_VALUE_K 0x1000 #define DECK_TYPE_FULL (CARD_VALUE_ACE | CARD_VALUE_2 | CARD_VALUE_3 | CARD_VALUE_4 | CARD_VALUE_5 | \ CARD_VALUE_6 | CARD_VALUE_7 | CARD_VALUE_8 | CARD_VALUE_9 | CARD_VALUE_10 | \ CARD_VALUE_J | CARD_VALUE_Q | CARD_VALUE_K) #define DECK_TYPE_TRUCO (CARD_VALUE_ACE | CARD_VALUE_2 | CARD_VALUE_3 | CARD_VALUE_4 | CARD_VALUE_5 | \ CARD_VALUE_6 | CARD_VALUE_7 | CARD_VALUE_J | CARD_VALUE_Q | CARD_VALUE_K) typedef enum { Diamond, Spade, Heart, Club } Suit; typedef struct { int iValue; Suit eSuit; } Card; typedef struct strCardList CardList; struct strCardList { Card *pCard; CardList *pNext; }; // Funcoes referentes a Cartas Card * Card_Create (int iValue, Suit eSuit); void Card_Free (Card *pCard); char * Card_GetSuitString(Card *pCard); int Card_IsBlack (Card *pCard); int Card_GetValue (Card *pCard); // Funcoes referentes a Listas de Cartas CardList * CardList_GetPosition (CardList **pList, CardList **pRetPrevious, int iPosition); int CardList_GetSize (CardList **pList); void CardList_InsertCardList(CardList **pList, CardList *pNew); void CardList_InsertCard (CardList **pList, Card *pCard); CardList * CardList_GetSubset (CardList **pList, Card *pCard); Card * CardList_GetCard (CardList **pList); void CardList_CreateDeck (CardList **pList, unsigned int uDeckMask); void CardList_Shuffle (CardList **pList, int iCount); void CardList_Free (CardList **pList); #endif // BARALHO_H_INCLUDED baralho.c #include <time.h> #include <stdlib.h> #include <malloc.h> #include "baralho.h" Card * Card_Create(int iValue, Suit eSuit) { Card *pNew = (Card *)malloc(sizeof(Card)); if(pNew != NULL) { pNew->iValue = iValue; pNew->eSuit = eSuit; } return pNew; } void Card_Free(Card *pCard) { if(pCard != NULL) { free(pCard); } } int Card_GetValue(Card *pCard) { int iValue; if(pCard != NULL) { for(iValue = 0; iValue < CARD_VALUE_K; iValue++) { if(pCard->iValue == (1<<iValue)) { return iValue+1; } } } return CARD_VALUE_INVALID; } char * Card_GetSuitString(Card *pCard) { if(pCard != NULL) { switch(pCard->eSuit) { case Diamond: return "Ouros" ; case Spade : return "Espadas"; case Heart : return "Copas" ; case Club : return "Paus" ; } } return ""; } int Card_IsBlack(Card *pCard) { if(pCard != NULL && (pCard->eSuit == Spade || pCard->eSuit == Club)) return 1; return 0; } CardList * CardList_GetPosition(CardList **pList, CardList **pRetPrevious, int iPosition) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL) return NULL; pCurrent = *pList; while(pCurrent != NULL) { if(iPosition < 0 && pCurrent->pNext == NULL) break; // Encontrou ultimo item if(iPosition-- == 0) break; // Encontrou item procurado pPrevious = pCurrent; pCurrent = pCurrent->pNext; } if(pRetPrevious != NULL) { if(pCurrent != NULL) { *pRetPrevious = pPrevious; } else { *pRetPrevious = NULL; } } return pCurrent; } int CardList_GetSize(CardList **pList) { int iSize = 0; CardList *pCurrent; if(pList != NULL && *pList != NULL) { pCurrent = *pList; while(pCurrent != NULL) { iSize++; pCurrent = pCurrent->pNext; } } return iSize; } void CardList_InsertCardList(CardList **pList, CardList *pNew) { CardList *pCurrent; if(pList == NULL || pNew == NULL) return; if(*pList == NULL) { *pList = pNew; } else { pCurrent = CardList_GetPosition(pList, NULL, -1); pCurrent->pNext = pNew; } } void CardList_InsertCard(CardList **pList, Card *pCard) { CardList *pNew; if(pList == NULL || pCard == NULL) return; pNew = (CardList *)malloc(sizeof(CardList)); pNew->pCard = pCard; pNew->pNext = NULL; CardList_InsertCardList(pList, pNew); } CardList * CardList_GetSubset(CardList **pList, Card *pCard) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL || pCard == NULL) return NULL; pCurrent = *pList; while(pCurrent != NULL) { if(pCurrent->pCard->iValue == pCard->iValue && pCurrent->pCard->eSuit == pCard->eSuit) { break; // Achou a carta! } else { pPrevious = pCurrent; pCurrent = pCurrent->pNext; } } if(pPrevious != NULL) { pPrevious->pNext = NULL; } else if(pCurrent != NULL) { *pList = NULL; } // Se achou, pCurrent tera a posicao onde inicia a lista a partir de pCard, senao tera NULO. return pCurrent; } Card * CardList_GetCard(CardList **pList) { Card *pCard = NULL; CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL) return NULL; pCurrent = CardList_GetPosition(pList, &pPrevious, -1); if(pPrevious != NULL) { pPrevious->pNext = NULL; } else { // Lista vazia, carrega NULO *pList = NULL; } // Se achou, pCurrent tera a posicao onde inicia a lista a partir de pCard, senao tera NULO. if(pCurrent != NULL) { pCard = pCurrent->pCard; free(pCurrent); } return pCard; } void CardList_CreateDeck(CardList **pList, unsigned int uDeckMask) { int iValue; if(pList == NULL) return; for(iValue=0; (1<<iValue) <= CARD_VALUE_K; iValue++) { if(uDeckMask & (1<<iValue)) { CardList_InsertCard(pList, Card_Create(1<<iValue, Diamond)); CardList_InsertCard(pList, Card_Create(1<<iValue, Spade )); CardList_InsertCard(pList, Card_Create(1<<iValue, Heart )); CardList_InsertCard(pList, Card_Create(1<<iValue, Club )); } } } void CardList_Shuffle(CardList **pList, int iCount) { int iSize; CardList *pPrevious, *pStart, *pEnd; if(pList == NULL || *pList == NULL) return; iSize = CardList_GetSize(pList); if(iCount <= 0) { iCount = 4*iSize; } srand(time(NULL)); while(iCount--) { // Carrega posicao inicial aleatoriamente pStart = CardList_GetPosition(pList, &pPrevious, rand()%iSize); if(pPrevious == NULL) { *pList = pStart->pNext; } else { pPrevious->pNext = pStart->pNext; } // Carrega posicao final aleatoriamente pEnd = CardList_GetPosition(pList, NULL, rand()%(iSize-1)); pStart->pNext = pEnd->pNext; pEnd ->pNext = pStart; } } void CardList_Free(CardList **pList) { CardList *pCurrent; if(pList == NULL || *pList == NULL) return; while(*pList != NULL) { pCurrent = *pList; *pList = pCurrent->pNext; Card_Free(pCurrent->pCard); free(pCurrent); } } paciencia.c #include <stdio.h> #include <malloc.h> #include <string.h> #include "baralho.h" #define GAME_SLOT_NUM 7 #define GAME_SLOT_CLOSED 0 #define GAME_SLOT_OPEN 1 #define GAME_CMD_NONE 0 #define GAME_CMD_QUIT 1 #define GAME_CMD_CARD_NEW 2 #define GAME_CMD_MOVE 3 #define GAME_KEY_CARD_NEW '+' #define GAME_KEY_CARD_OPEN '*' #define GAME_KEY_QUIT 'X' #define CARD_STRING_CLOSED "|###|" #define CARD_STRING_EMPTY "| |" #define CARD_STRING_NONE " " #define CARD_REF_INVALID 0 #define CARD_REF_OPEN 1 #define CARD_REF_FOUNDATION 2 #define CARD_REF_SLOT 3 typedef struct { Card *pCard; CardList *pDeck, *pWaste, *pFoundation[4], *pSlots[GAME_SLOT_NUM][2]; } GameState; typedef struct { int iRef; int iColumn; int iIndex; } GameCardRef; void PrintCard(Card *pCard) { char szCardString[6]; char *szCard[] = { "??", " A", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", "10", " J", " Q", " K" }, cSuit = '?'; if(pCard != NULL) { switch(pCard->eSuit) { case Diamond: cSuit = 'o'; break; case Spade : cSuit = 's'; break; case Heart : cSuit = 'c'; break; case Club : cSuit = 'p'; break; } sprintf(szCardString, "|%s%c|", szCard[Card_GetValue(pCard)], cSuit); } else { strcpy(szCardString, CARD_STRING_EMPTY); } printf("%s", szCardString); } void Game_PrintBoard(GameState **pGame) { Card *pCard; CardList *pSlotList; int iCount, iSlotSize[GAME_SLOT_NUM], iSlot, iCardPrinted; if(pGame == NULL || *pGame == NULL) return; printf("\n\n"); if(CardList_GetSize(&(*pGame)->pDeck) > 0) { printf("%s ", CARD_STRING_CLOSED); } else { printf("%s ", CARD_STRING_EMPTY ); } PrintCard((*pGame)->pCard); printf(" %s ", CARD_STRING_NONE); for(iCount=0; iCount<4; iCount++) { pCard = NULL; if((*pGame)->pFoundation[iCount] != NULL) { pCard = CardList_GetPosition(&(*pGame)->pFoundation[iCount], NULL, -1)->pCard; } PrintCard(pCard); printf(" "); } printf("\n|(+)| |(*)| |(a)| |(b)| |(c)| |(d)|\n\n"); for(iSlot = 0; iSlot < GAME_SLOT_NUM; iSlot++) { printf("|(%d)| ", iSlot); iSlotSize[iSlot] = CardList_GetSize(&(*pGame)->pSlots[iSlot][GAME_SLOT_CLOSED]); } printf("\n"); iCount = 0; do { iCardPrinted = 0; for(iSlot = 0; iSlot < GAME_SLOT_NUM; iSlot++) { if(iCount < iSlotSize[iSlot]) { iCardPrinted = 1; printf("%s ", CARD_STRING_CLOSED); } else { pSlotList = CardList_GetPosition(&(*pGame)->pSlots[iSlot][GAME_SLOT_OPEN], NULL, iCount - iSlotSize[iSlot]); if(pSlotList != NULL) { iCardPrinted = 1; PrintCard(pSlotList->pCard); printf(" "); } else { printf("%s ", CARD_STRING_NONE); } } } iCount++; printf("\n"); } while(iCardPrinted); printf("\n"); } GameState * Game_Create(void) { GameState *pGame; int iCount, iSlot; pGame = (GameState *)malloc(sizeof(GameState)); if(pGame == NULL) return NULL; memset(pGame, 0, sizeof(GameState)); CardList_CreateDeck(&(pGame->pDeck), DECK_TYPE_FULL); CardList_Shuffle (&(pGame->pDeck), 0); for(iSlot = 0; iSlot < GAME_SLOT_NUM; iSlot++) { pGame->pCard = CardList_GetCard(&(pGame->pDeck)); CardList_InsertCard(&(pGame->pSlots[iSlot][GAME_SLOT_OPEN]), pGame->pCard); for(iCount = iSlot; iCount > 0; iCount--) { pGame->pCard = CardList_GetCard(&(pGame->pDeck)); CardList_InsertCard(&(pGame->pSlots[iSlot][GAME_SLOT_CLOSED]), pGame->pCard); } } pGame->pCard = CardList_GetCard(&(pGame->pDeck)); return pGame; } CardList ** Game_GetCardList(GameState *pGame, GameCardRef *pRef) { if(pGame != NULL && pRef != NULL) { switch(pRef->iRef) { case CARD_REF_FOUNDATION: if(pRef->iColumn >= 0 && pRef->iColumn < 4) return &pGame->pFoundation[pRef->iColumn]; break; case CARD_REF_SLOT: if(pRef->iColumn >= 0 && pRef->iColumn < GAME_SLOT_NUM) return &pGame->pSlots[pRef->iColumn][GAME_SLOT_OPEN]; break; } } return NULL; } int Game_CanMove(Card *pFromCard, Card *pToCard, int iToRef) { int iCanMove = 0, iFromIsBlack, iToIsBlack; if(pFromCard != NULL) { iFromIsBlack = Card_IsBlack(pFromCard); iToIsBlack = Card_IsBlack(pToCard ); if(iToRef == CARD_REF_FOUNDATION) { if(pToCard == NULL && Card_GetValue(pFromCard) == CARD_VALUE_ACE) { iCanMove = 1; } else if(Card_GetValue(pFromCard) == Card_GetValue(pToCard)+1 && pFromCard->eSuit == pToCard->eSuit) { iCanMove = 1; } } else if(iToRef == CARD_REF_SLOT) { if(pToCard == NULL) { iCanMove = 1; } else if(Card_GetValue(pFromCard) == Card_GetValue(pToCard)-1 && iFromIsBlack != iToIsBlack) { iCanMove = 1; } } } return iCanMove; } void Game_ProcessCommand(GameState **pGame, int iCommand, GameCardRef *pFrom, GameCardRef *pTo) { int iCount; Card *pFromCard, *pToCard; CardList **pFromList, **pToList; if(pGame == NULL || *pGame == NULL || pFrom == NULL) return; switch(iCommand) { case GAME_CMD_CARD_NEW: if(pFrom->iRef == CARD_REF_OPEN) { if((*pGame)->pCard != NULL) { CardList_InsertCard(&(*pGame)->pWaste, (*pGame)->pCard); } if(CardList_GetSize(&(*pGame)->pDeck) == 0) { for(iCount = CardList_GetSize(&(*pGame)->pWaste); iCount > 0; iCount--) { CardList_InsertCard(&(*pGame)->pDeck, CardList_GetCard(&(*pGame)->pWaste)); } } (*pGame)->pCard = CardList_GetCard(&(*pGame)->pDeck); } else if(pFrom->iRef == CARD_REF_SLOT) { pFromList = Game_GetCardList(*pGame, pFrom); if(pFromList != NULL && *pFromList == NULL) { pFromCard = CardList_GetCard(&(*pGame)->pSlots[pFrom->iColumn][GAME_SLOT_CLOSED]); if(pFromCard != NULL) CardList_InsertCard(pFromList, pFromCard); } } break; case GAME_CMD_MOVE: if(pTo == NULL || pTo->iRef == CARD_REF_OPEN) break; pToList = Game_GetCardList(*pGame, pTo); pFromCard = NULL; pToCard = NULL; pFromList = NULL; if(pToList != NULL) { if(*pToList != NULL) { pToCard = CardList_GetPosition(pToList, NULL, -1)->pCard; } if(pFrom->iRef == CARD_REF_OPEN) { pFromCard = (*pGame)->pCard; } else { pFromList = Game_GetCardList(*pGame, pFrom); if(pFromList != NULL && *pFromList != NULL) { if(*pToList != NULL) { iCount = CardList_GetSize(pFromList); while(iCount-- > 0) { pFromCard = CardList_GetPosition(pFromList, NULL, iCount)->pCard; if(Game_CanMove(pFromCard, pToCard, pTo->iRef)) break; } if(iCount < 0) { pFromCard = NULL; } } else { pFromCard = CardList_GetPosition(pFromList, NULL, pTo->iRef == CARD_REF_SLOT ? 0 : -1)->pCard; if(pTo->iRef == CARD_REF_SLOT && Card_GetValue(pFromCard) != 13) { pFromCard = NULL; } } } } } if(pFromCard != NULL && pToList != NULL && Game_CanMove(pFromCard, pToCard, pTo->iRef)) { if(pFromList != NULL) { CardList_InsertCardList(pToList, CardList_GetSubset(pFromList, pFromCard)); } else { CardList_InsertCard(pToList, pFromCard); } if(pFrom->iRef == CARD_REF_OPEN) { (*pGame)->pCard = CardList_GetCard(&(*pGame)->pWaste); if((*pGame)->pCard == NULL) { Game_ProcessCommand(pGame, GAME_CMD_CARD_NEW, NULL, NULL); } } } } } void Game_GetRefFromKey(GameCardRef *pRef, char cKey) { if(pRef == NULL) return; if(cKey >= '0' && cKey <= '9') { // Maximo: 10 slots cKey -= '0'; if(cKey < GAME_SLOT_NUM) { pRef->iRef = CARD_REF_SLOT; pRef->iColumn = cKey; } } else if(cKey >= 'a' && cKey <= 'd') { pRef->iRef = CARD_REF_FOUNDATION; pRef->iColumn = cKey - 'a'; } else if(cKey == GAME_KEY_CARD_OPEN) { pRef->iRef = CARD_REF_OPEN; pRef->iColumn = 0; } else { pRef->iRef = CARD_REF_INVALID; } } int main(void) { char cKey; int iCommand = GAME_CMD_QUIT; GameState *pGame = Game_Create(); GameCardRef tFrom, tTo; do { Game_PrintBoard(&pGame); printf("Digite o comando e pressione ENTER: "); cKey = getchar(); iCommand = GAME_CMD_NONE; switch(cKey) { case GAME_KEY_CARD_NEW: iCommand = GAME_CMD_CARD_NEW; Game_GetRefFromKey(&tFrom, GAME_KEY_CARD_OPEN); break; case GAME_KEY_QUIT: iCommand = GAME_CMD_QUIT; break; case '\n': case '\r': break; default: Game_GetRefFromKey(&tFrom, cKey); if(tFrom.iRef != CARD_REF_INVALID) { cKey = getchar(); if(cKey == '\n') { if(tFrom.iRef == CARD_REF_SLOT) iCommand = GAME_CMD_CARD_NEW; } else { Game_GetRefFromKey(&tTo, cKey); if(tTo.iRef != CARD_REF_INVALID) { iCommand = GAME_CMD_MOVE; } } } if(iCommand == GAME_CMD_NONE) printf("\n\nComando invalido!\n\n"); break; } Game_ProcessCommand(&pGame, iCommand, &tFrom, &tTo); while(cKey != '\n') { cKey = getchar(); } } while(iCommand != GAME_CMD_QUIT); return 0; }
  2. O que você precisa fazer não é gerar um evento mas sim carregar o texto em um objeto como um textview. É dentro do evento do botão que você faz isso. Ao invés de usar o cout você carrega o texto nesse objeto... Além disso, como é um for longo e que pode ser interrompido pela interface, você precisa chamar alguma função que leia os eventos da interface ou seu programa vai parar de responder. Abraços, Marcelo Utikawa da Fonseca
  3. Nossa, você desenterrou um defunto bem antigo! Acho que nem osso tem mais... :D agora falando sério: com o gets somente poderia ler da stdin. Além disso, gets não é recomendado pois não há controle quanto ao tamanho do buffer. O correto é sempre usar o fgets. Abraços, Marcelo Utikawa da Fonseca
  4. Oi! Especificamente sobre o wxWidgets não posso ajudar mas o problema de estar mandando os textos para o terminal deve ser porque você está usando cout ou printf. Você tem que usar um objeto como um textview para exibir o texto. Coloque o código que vendo a lógica pode ser que consigo te ajudar! Abraços, Marcelo Utikawa da Fonseca Oi! Especificamente sobre o wxWidgets não posso ajudar mas o problema de estar mandando os textos para o terminal deve ser porque você está usando cout ou printf. Você tem que usar um objeto como um textview para exibir o texto. Coloque o código que vendo a lógica pode ser que consigo te ajudar! Abraços, Marcelo Utikawa da Fonseca
  5. Qual exatamente é a sua dúvida? O que você não sabe fazer? Há existe o algoritmo pronto, você conseguiu fazer algo? Abraços, Marcelo Utikawa da Fonseca
  6. O problema é que faltou o zero no final da string: #include <16F877A.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #use delay(clock=20000000) #use rs232 (baud = 9600, xmit=pin_c6, rcv=pin_c7) #fuses HS,NOWDT,NOLVP char val[9]; char x[4],y[4],z[4]; void main() { printf("Selecione os parametros\n\r"); gets(val); x[0]=val[0]; x[1]=val[1]; x[2]=val[2]; x[3]=0; y[0]=val[3]; y[1]=val[4]; y[2]=val[5]; y[3]=0; z[0]=val[6]; z[1]=val[7]; z[2]=val[8]; z[3]=0; printf("x é %s \n",x); printf("y é %s \n",y); printf("z é %s \n",z); }
  7. Mais uma atualização... Agora toda a lógica do baralho está pronta. Só falta o jogo em si, que é o que estou trabalhando agora. Tire suas dúvidas! baralho.c #include <time.h> #include <stdlib.h> #include <malloc.h> #include "baralho.h" Card * Card_Create(int iValue, Suit eSuit) { Card *pNew = (Card *)malloc(sizeof(Card)); if(pNew != NULL) { pNew->iValue = iValue; pNew->eSuit = eSuit; } return pNew; } void Card_Free(Card *pCard) { if(pCard != NULL) { free(pCard); } } int Card_GetValue(Card *pCard) { int iValue; if(pCard != NULL) { for(iValue = 0; iValue < CARD_VALUE_K; iValue++) { if(pCard->iValue == (1<<iValue)) { return iValue+1; } } } return CARD_VALUE_INVALID; } char * Card_GetSuitString(Card *pCard) { if(pCard != NULL) { switch(pCard->eSuit) { case Diamond: return "Ouros" ; case Spade : return "Espadas"; case Heart : return "Copas" ; case Club : return "Paus" ; } } return ""; } CardList * CardList_GetPosition(CardList **pList, CardList **pRetPrevious, int iPosition) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL) return NULL; pCurrent = *pList; while(pCurrent != NULL) { if(iPosition < 0 && pCurrent->pNext == NULL) break; // Encontrou ultimo item if(iPosition-- == 0) break; // Encontrou item procurado pPrevious = pCurrent; pCurrent = pCurrent->pNext; } if(pRetPrevious != NULL) { if(pCurrent != NULL) { *pRetPrevious = pPrevious; } else { *pRetPrevious = NULL; } } return pCurrent; } int CardList_GetSize(CardList **pList) { int iSize = 0; CardList *pCurrent; if(pList != NULL && *pList != NULL) { pCurrent = *pList; while(pCurrent != NULL) { iSize++; pCurrent = pCurrent->pNext; } } return iSize; } void CardList_InsertCardList(CardList **pList, CardList *pNew) { CardList *pCurrent; if(pList == NULL || pNew == NULL) return; if(*pList == NULL) { *pList = pNew; } else { pCurrent = CardList_GetPosition(pList, NULL, -1); pCurrent->pNext = pNew; } } void CardList_InsertCard(CardList **pList, Card *pCard) { CardList *pNew; if(pList == NULL || pCard == NULL) return; pNew = (CardList *)malloc(sizeof(CardList)); pNew->pCard = pCard; pNew->pNext = NULL; CardList_InsertCardList(pList, pNew); } CardList * CardList_GetSubset(CardList **pList, Card *pCard) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL || pCard == NULL) return NULL; pCurrent = *pList; while(pCurrent != NULL) { if(pCurrent->pCard->iValue == pCard->iValue && pCurrent->pCard->eSuit == pCard->eSuit) { break; // Achou a carta! } else { pPrevious = pCurrent; pCurrent = pCurrent->pNext; } } if(pPrevious != NULL) { pPrevious->pNext = NULL; } // Se achou, pCurrent tera a posicao onde inicia a lista a partir de pCard, senao tera NULO. return pCurrent; } Card * CardList_GetCard(CardList **pList) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL) return NULL; pCurrent = CardList_GetPosition(pList, &pPrevious, -1); if(pPrevious != NULL) { pPrevious->pNext = NULL; } else { // Lista vazia, carrega NULO *pList = NULL; } // Se achou, pCurrent tera a posicao onde inicia a lista a partir de pCard, senao tera NULO. return pCurrent->pCard; } void CardList_CreateDeck(CardList **pList, unsigned int uDeckMask) { int iValue; if(pList == NULL) return; for(iValue=0; (1<<iValue) <= CARD_VALUE_K; iValue++) { if(uDeckMask & (1<<iValue)) { CardList_InsertCard(pList, Card_Create(1<<iValue, Diamond)); CardList_InsertCard(pList, Card_Create(1<<iValue, Spade )); CardList_InsertCard(pList, Card_Create(1<<iValue, Heart )); CardList_InsertCard(pList, Card_Create(1<<iValue, Club )); } } } void CardList_Shuffle(CardList **pList, int iCount) { int iSize; CardList *pPrevious, *pStart, *pEnd; if(pList == NULL || *pList == NULL) return; iSize = CardList_GetSize(pList); if(iCount <= 0) { iCount = 4*iSize; } srand(time(NULL)); while(iCount--) { // Carrega posicao inicial aleatoriamente pStart = CardList_GetPosition(pList, &pPrevious, rand()%iSize); if(pPrevious == NULL) { *pList = pStart->pNext; } else { pPrevious->pNext = pStart->pNext; } // Carrega posicao final aleatoriamente pEnd = CardList_GetPosition(pList, NULL, rand()%(iSize-1)); pStart->pNext = pEnd->pNext; pEnd ->pNext = pStart; } } void CardList_Free(CardList **pList) { CardList *pCurrent; if(pList == NULL || *pList == NULL) return; while(*pList != NULL) { pCurrent = *pList; *pList = pCurrent->pNext; Card_Free(pCurrent->pCard); free(pCurrent); } } baralho.h #ifndef BARALHO_H_INCLUDED #define BARALHO_H_INCLUDED #define CARD_VALUE_INVALID 0x0000 #define CARD_VALUE_ACE 0x0001 #define CARD_VALUE_2 0x0002 #define CARD_VALUE_3 0x0004 #define CARD_VALUE_4 0x0008 #define CARD_VALUE_5 0x0010 #define CARD_VALUE_6 0x0020 #define CARD_VALUE_7 0x0040 #define CARD_VALUE_8 0x0080 #define CARD_VALUE_9 0x0100 #define CARD_VALUE_10 0x0200 #define CARD_VALUE_J 0x0400 #define CARD_VALUE_Q 0x0800 #define CARD_VALUE_K 0x1000 #define DECK_TYPE_FULL (CARD_VALUE_ACE | CARD_VALUE_2 | CARD_VALUE_3 | CARD_VALUE_4 | CARD_VALUE_5 | \ CARD_VALUE_6 | CARD_VALUE_7 | CARD_VALUE_8 | CARD_VALUE_9 | CARD_VALUE_10 | \ CARD_VALUE_J | CARD_VALUE_Q | CARD_VALUE_K) #define DECK_TYPE_TRUCO (CARD_VALUE_ACE | CARD_VALUE_2 | CARD_VALUE_3 | CARD_VALUE_4 | CARD_VALUE_5 | \ CARD_VALUE_6 | CARD_VALUE_7 | CARD_VALUE_J | CARD_VALUE_Q | CARD_VALUE_K) typedef enum { Diamond, Spade, Heart, Club } Suit; typedef struct { int iValue; Suit eSuit; } Card; typedef struct strCardList CardList; struct strCardList { Card *pCard; CardList *pNext; }; // Funcoes referentes a Cartas Card * Card_Create (int iValue, Suit eSuit); void Card_Free (Card *pCard); char * Card_GetSuitString(Card *pCard); int Card_GetValue (Card *pCard); // Funcoes referentes a Listas de Cartas CardList * CardList_GetPosition (CardList **pList, CardList **pRetPrevious, int iPosition); int CardList_GetSize (CardList **pList); void CardList_InsertCardList(CardList **pList, CardList *pNew); void CardList_InsertCard (CardList **pList, Card *pCard); CardList * CardList_GetSubset (CardList **pList, Card *pCard); Card * CardList_GetCard (CardList **pList); void CardList_CreateDeck (CardList **pList, unsigned int uDeckMask); void CardList_Shuffle (CardList **pList, int iCount); void CardList_Free (CardList **pList); #endif // BARALHO_H_INCLUDED paciencia.c #include <stdio.h> #include <malloc.h> #include <string.h> #include "baralho.h" #define GAME_SLOT_NUM 7 #define GAME_SLOT_CLOSED 0 #define GAME_SLOT_OPEN 1 typedef struct { Card *pCard; CardList *pDeck, *pWaste, *pFoundation[4], *pSlots[GAME_SLOT_NUM][2]; } GameState; void PrintCard(Card *pCard) { char szCardString[6]; char *szCard[] = { "??", " A", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", "10", " J", " Q", " K" }, cSuit = '?'; if(pCard != NULL) { switch(pCard->eSuit) { case Diamond: cSuit = 'o'; break; case Spade : cSuit = 's'; break; case Heart : cSuit = 'c'; break; case Club : cSuit = 'p'; break; } sprintf(szCardString, "|%s%c|", szCard[Card_GetValue(pCard)], cSuit); } else { strcpy(szCardString, "| |"); } printf("%s", szCardString); } void Game_PrintBoard(GameState **pGame) { int iCount; Card *pCard; if(pGame == NULL || *pGame == NULL) return; printf("Tamanho do baralho: %d\n", CardList_GetSize(&((*pGame)->pDeck))); printf("|###| "); PrintCard((*pGame)->pCard); printf(" "); for(iCount=0; iCount<4; iCount++) { pCard = NULL; if((*pGame)->pFoundation[iCount] != NULL) { pCard = (*pGame)->pFoundation[iCount]->pCard; } PrintCard(pCard); printf(" "); } printf("\n| + | | * | |(a)| |(b)| |(c)| |(d)|\n\n"); for(iCount = 0; iCount < GAME_SLOT_NUM; iCount++) { } printf("\n"); } GameState * Game_Create(void) { GameState *pGame; int iCount, iSlot; pGame = (GameState *)malloc(sizeof(GameState)); if(pGame == NULL) return NULL; memset(pGame, 0, sizeof(GameState)); CardList_CreateDeck(&(pGame->pDeck), DECK_TYPE_FULL); CardList_Shuffle (&(pGame->pDeck), 0); for(iSlot = 0; iSlot < GAME_SLOT_NUM; iSlot++) { for(iCount = iSlot; iCount > 0; iCount--) { pGame->pCard = CardList_GetCard(&(pGame->pDeck)); CardList_InsertCard(&(pGame->pSlots[iSlot][GAME_SLOT_CLOSED]), pGame->pCard); } } pGame->pCard = CardList_GetCard(&(pGame->pDeck)); return pGame; } int main(void) { GameState *pGame = Game_Create(); Game_PrintBoard(&pGame); return 0; } Abraços, Marcelo Utikawa da Fonseca
  8. Boa tarde! Bem interessante esse problema de erdos... :) Qual é o ponto que você não está conseguindo fazer? Leia cada linha com fgets e depois use a strchr para encontrar os nomes... Abraços, Marcelo Utikawa da Fonseca
  9. O plugin é o cdt (eclipse.org/cdt) mas existe versão do eclipse já pronta para programar em c... Entre no eclipse.org/downloads e baixe! :) Abraços, Marcelo Utikawa da Fonseca
  10. Boa tarde! Sim, é possível mesclar tudo em um único arquivo. Basta pegar o conteúdo dos arquivos baralho.h, baralho.c e paciencia.c, nessa ordem, e criar um novo arquivo. Porém usar mais de um arquivo é normal. Imagine um windows desenvolvido em um único arquivo! Qualquer programa um pouco maior terá vários arquivos. E qualquer ide suporta isso! :) Abraços, Marcelo Utikawa da Fonseca
  11. O conio.h declara as funções getch e clrscr. Trocamos a getch por getchar, que é padrão da linguagem e é definida em stdio.h. A clrscr serve para limpar a tela, o mesmo que faz o comando cls. ela não é necessária para o programa rodar,é apenas por estética. Assim conio.h deixou de ser necessária e pôde ser removida. Abraços, Marcelo Utikawa da Fonseca
  12. Olá! Qual o erro que aparece? Eu acho que é com a clrscr. Essa função serve para limpar a tela e não vai interferir no funcionamento do programa. Apenas comente ela! E remova também o include de conio.h. Mude a função getch para getchar. Fazendo essas alterações o programa deve compilar e funcionar. Abraços, Marcelo Utikawa da Fonseca
  13. Aos que tem dúvidas, criem um tópico na área de c/c++. Este tópico não é para tirar dúvidas, é apenas um aviso sobre como usar o fórum! Abraços, Marcelo Utikawa da Fonseca
  14. Ótimo! Valeu por avisar! E lembre-se de desalocar o vetor quando terminar de usar as pilhas! free(vet); E claro, lembre-se de desalocar as pilhas também mas aí já não sei qual é a função, depende aí de você. :) Abraços, Marcelo Utikawa da Fonseca
  15. O vet deve ser um vetor para as pilhas oa invés de int. Veja abaixo: Pilha **vet; vet = (Pilha **)malloc(sizeof(Pilha *)*quant); for(i = 0; i < quant; i++){ vet[i] = criar(); } Eu fiz esse código de cabeça agora, deve estar certo. Acabou minha hora de almoço então não vou poder testar... Teste diga se resolveu! Abraços, Marcelo Utikawa da Fonseca
  16. Olá! Estou conseguindo fazer o programa mais rápido do que esperava! :) Agora o baralho.c está quase pronto. Faltam apenas as funções para criar o baralho completo (que é apenas um loop chamando a função Card_Create) e a função para embaralhar. Terminando é só fazer o jogo em si. Seguem os códigos atualizados: baralho.c #include <malloc.h> #include "baralho.h" Card * Card_Create(int iValue, Suit eSuit) { Card *pNew = (Card *)malloc(sizeof(Card)); if(pNew != NULL) { pNew->iValue = iValue; pNew->eSuit = eSuit; } return pNew; } void Card_Free(Card *pCard) { if(pCard != NULL) { free(pCard); } } char * Card_GetSuitString(Card *pCard) { if(pCard != NULL) { switch(pCard->eSuit) { case Diamond: return "Ouros" ; case Spade : return "Espadas"; case Heart : return "Copas" ; case Club : return "Paus" ; } } return ""; } void CardList_InsertCard(CardList **pList, Card *pCard) { CardList *pNew, *pCurrent; if(pList == NULL || pCard == NULL) return; pNew = (CardList *)malloc(sizeof(CardList)); pNew->pCard = pCard; pNew->pNext = NULL; if(*pList == NULL) { *pList = pNew; } else { pCurrent = *pList; while(pCurrent->pNext != NULL) { pCurrent = pCurrent->pNext; } pCurrent->pNext = pNew; } } void CardList_InsertCardList(CardList **pList, CardList *pNew) { CardList *pCurrent; if(pList == NULL || pNew == NULL) return; if(*pList == NULL) { *pList = pNew; } else { pCurrent = *pList; while(pCurrent->pNext != NULL) { pCurrent = pCurrent->pNext; } pCurrent->pNext = pNew; } } CardList * CardList_GetSubset(CardList **pList, Card *pCard) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL || pCard == NULL) return NULL; pCurrent = *pList; while(pCurrent != NULL) { if(pCurrent->pCard->iValue == pCard->iValue && pCurrent->pCard->eSuit == pCard->eSuit) { break; // Achou a carta! } else { pPrevious = pCurrent; pCurrent = pCurrent->pNext; } } if(pPrevious != NULL) { pPrevious->pNext = NULL; } // Se achou, pCurrent tera a posicao onde inicia a lista a partir de pCard, senao tera NULO. return pCurrent; } Card * CardList_GetCard(CardList **pList) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL) return NULL; pCurrent = *pList; while(pCurrent->pNext != NULL) { pPrevious = pCurrent; pCurrent = pCurrent->pNext; } if(pPrevious != NULL) { pPrevious->pNext = NULL; } // Se achou, pCurrent tera a posicao onde inicia a lista a partir de pCard, senao tera NULO. return pCurrent->pCard; } baralho.h #ifndef BARALHO_H_INCLUDED #define BARALHO_H_INCLUDED typedef enum { Diamond, Spade, Heart, Club } Suit; typedef struct { int iValue; Suit eSuit; } Card; typedef struct strCardList CardList; struct strCardList { Card *pCard; CardList *pNext; }; // Funcoes referentes a Cartas Card * Card_Create (int iValue, Suit eSuit); void Card_Free (Card *pCard); char * Card_GetSuitString(Card *pCard); // Funcoes referentes a Listas de Cartas void CardList_InsertCard (CardList **pList, Card *pCard); void CardList_InsertCardList(CardList **pList, CardList *pNew); CardList * CardList_GetSubset (CardList **pList, Card *pCard); Card * CardList_GetCard (CardList **pList); #endif // BARALHO_H_INCLUDED paciencia.c #include <stdio.h> #include "baralho.h" void PrintCard(Card *pCard) { printf("%d %s\n", pCard->iValue, Card_GetSuitString(pCard)); } int main(void) { Card *pCard = Card_Create(3, Spade); CardList *pList = NULL, *pSubset; if(pCard != NULL) { printf("Carta criada! Valor: "); PrintCard(pCard); } else { printf("Erro ao criar carta!!!\n"); return 1; } CardList_InsertCard(&pList, Card_Create(1, Club )); CardList_InsertCard(&pList, Card_Create(3, Club )); CardList_InsertCard(&pList, Card_Create(8, Heart )); CardList_InsertCard(&pList, Card_Create(9, Diamond)); CardList_InsertCard(&pList, pCard); CardList_InsertCard(&pList, Card_Create(2, Heart )); CardList_InsertCard(&pList, Card_Create(4, Spade )); pSubset = CardList_GetSubset(&pList, pCard); pCard = CardList_GetCard (&pList); printf("Removida carta da lista principal: "); PrintCard(pCard); printf("Cartas na lista principal:\n"); while(pList != NULL) { PrintCard(pList->pCard); pList = pList->pNext; } printf("Cartas na sublista:\n"); while(pSubset != NULL) { PrintCard(pSubset->pCard); pSubset = pSubset->pNext; } return 0; } Abraços, Marcelo Utikawa da Fonseca
  17. Mas o que está dando errado? Coloque o código aqui para eu ver... E o que você precisa fazer é o que eu dei de exemplo na minha resposta! Abraços, Marcelo Utikawa da Fonseca
  18. Oi! Você diz criar a pilha, funções de inserir, remover, é isso? Ou você já tem isso e precisa criar um vetor com várias pilhas? Para criar um vetor alocado dinamicamente você deve usar um ponteiro: int *ponteiro; ponteiro = (int *)malloc(sizeof(int)*10); ponteiro[0] = 25; ponteiro[1] = 8; Nesse código criei um vetor para int com 10 posições. Use uma variável no lugar do número 10 e terá quantas posições quiser... :) E mude o int para o tipo que quiser. Abraços, Marcelo Utikawa da Fonseca
  19. Boa tarde! Eu estou usando poucas bibliotecas. Apenas a stdio.h (para o printf, você também usa) e a malloc.h (para alocar memória pois não estou usando vetores de tamanho fixo mas sim ponteiros com alocação dinâmica). O typedef é apenas para criar um "apelido" para o nome do tipo, pode ser retirado. Além disso faz parte da linguagem, não é de nenhuma biblioteca. O ifdef também é da linguagem e é usado apenas por causa do arquivo .h. Isso é praxe. Se você abrir qualquer arquivo .h verá que existe isso. Serve para que o arquivo .h não tenha o seu conteúdo incluído mais de uma vez. Em projetos maiores isso é indispensável mas nesse caso pode ser removido sem problema. No seu caso, se o professor não deixa usar (o que não acredito, tente falar com ele), você pode retirar tudo isso, é bem simples. Eu não vou retirar pois minha intenção é terminar esse programa e deixar como referência aqui na parte de tutoriais do fórum. Assim é melhor que ele seja feito conforme manda o figurino... :P Agora estou no celular então não tenho como programar mas se você quiser posso tentar tirar suas dúvidas! Edit: esqueci de responder! O -> é operador de referência.serve para acessar os membros de uma estrutura, classe, etc através de um ponteiro. É o mesmo que o operador ponto, que é utilizado para acessar membros de variáveis diretamente.exemplo: struct coordenada { int x; int y; }; struct coordenada direto, *ponteiro; direto.x = 10; direto.y = 35; ponteiro = &direto; ponteiro->x = 10; ponteiro->y = 35; Abraços, Marcelo Utikawa da Fonseca
  20. De nada! A intenção é de ajudar mesmo... :) Precisando de algo mais é só perguntar. E a única ajuda que espero é a boa vontade das pessoas em aprender. Com certeza isso já será o bastante... B) Sobre fechar o tópico: Tente alterar o título do tópico adicionando [RESOLVIDO] no início. Abraços, Marcelo Utikawa da Fonseca
  21. Oi! A conversão em si é apenas com relação à exibição dos valores pois o número é o mesmo sempre. Assim imagino que o que você precisa é receber um texto que deverá ser convertido para um valor numérico (no caso o que foi chamado de valor na base 10) e depois criar a nova string na base escolhida. Primeiro crie a função que receba um int (número inteiro) e escreva a string na base solicitada. Depois você faz o programa que converte uma string em um valor numérico. Mas tente fazer algo primeiro! Você sabe como criar um programa? Criar uma função? A partir do que foi feito é mais fácil para ajudar a mostrar o que falta! Abraços, Marcelo Utikawa da Fonseca
  22. Oi de novo! Desculpe mas não tenho muito tempo para ajudar mas o que conseguir vou passando. Tenho cerca de meia hora por dia apenas! Por enquanto consegui fazer o baralho.h, baralho.c e paciencia.c Ainda não faz muita coisa mas acho que dá para você entender o que precisa ser feito! Veja se consegue criar algo a partir do que foi feito. Eu testei e compilei no Linux e por isso fiz um script para compilar os arquivos. Mas como usei apenas ANSI C deve funcionar em qualquer SO. Seguem os arquivos: baralho.h #ifndef BARALHO_H_INCLUDED #define BARALHO_H_INCLUDED typedef enum { Diamond, Spade, Heart, Club } Suit; typedef struct { int iValue; Suit eSuit; } Card; typedef struct strCardList CardList; struct strCardList { Card *pCard; CardList *pNext; }; Card * Card_Create (int iValue, Suit eSuit); void Card_Free (Card *pCard); char * Card_GetSuitString(Card *pCard); #endif // BARALHO_H_INCLUDED baralho.c #include <malloc.h> #include "baralho.h" Card * Card_Create(int iValue, Suit eSuit) { Card *pNew = (Card *)malloc(sizeof(Card)); if(pNew != NULL) { pNew->iValue = iValue; pNew->eSuit = eSuit; } return pNew; } void Card_Free(Card *pCard) { if(pCard != NULL) { free(pCard); } } char * Card_GetSuitString(Card *pCard) { if(pCard != NULL) { switch(pCard->eSuit) { case Diamond: return "Ouros" ; case Spade : return "Espadas"; case Heart : return "Copas" ; case Club : return "Paus" ; } } return ""; } paciencia.c #include <stdio.h> #include "baralho.h" int main(void) { Card *pCard = Card_Create(3, Spade); if(pCard != NULL) { printf("Carta criada! Valor: %d, Naipe: %s\n", pCard->iValue, Card_GetSuitString(pCard)); } else { printf("Erro ao criar carta!!!\n"); } return 0; } compila.sh #!/bin/sh gcc -Wall -c -o baralho.o baralho.c gcc -Wall -o paciencia paciencia.c baralho.o Ao rodar o programa é exibido na tela: Carta criada! Valor: 3, Naipe: Espadas Espero conseguir fazer um pouco por dia. Se você conseguir algo coloque também pois assim é mais provável de você ter algo para aprensentar até dia primeiro. Abraços, Marcelo Utikawa da Fonseca
  23. Olá! O problema é com a função Fatorial que não retorna o valor. Ela tem return apenas para quando n for 1! O correto seria: double Fatorial ( int n ) { if ( n == 1 ) { return 1; } else { return n * Fatorial ( n - 1 ); } } Outro problema que vejo na sua lógica é que, na função Potencia, se y tiver valor negativo, a função não retorna nada. Traduzindo: retornará lixo! O correto seria retornar algum valor nesse caso como demonstrado abaixo: double Potencia ( double x , int y ) // Calcula a potência de x elevado a y. OBS : y é um inteiro , negativo ou positivo { if ( y == 0 ) { return 1; } // Caso y = 0 , todo número elevado a zero = 1 if ( y >= 1 ) // Caso y > 1 onde será necessário multiplicações sucessivas { double Potencia = x; while ( y > 1 ) { Potencia *= x; y--; } return Potencia; } return 0; } Abraços, Marcelo Utikawa da Fonseca
  24. Ok... Eu perguntei pois achava que você tinha conhecimentos mais básicos mesmo! Mas ou o professor exagerou ou você não conseguiu acompanhar pois esse programa exige no mínimo um conhecimento intermediário na linguagem... E desenvolver até o dia primeiro acho que você mesmo percebeu que é complicado!!! Eu não gosto de passar código pronto pois acho que estou mais atrapalhando que ajudando pois você pede a oportunidade de aprender e não sente o gosto da conquista. Mas como já está em cima da hora vou ajudar no que for possível... Primeiro vamos trabalhar apenas no baralho.c e depois a gente faz o jogo em si. Pode usar ponteiros no projeto? Tem alguma restrição ou exigência? Abraços, Marcelo Utikawa da Fonseca
  25. Entendi, ótima idéia!!! :) Já editei o código lá em cima para incluir a sua idéia. O que fiz foi mudar a função ExecuteFile para aceitar nulo como nome de arquivo. Nesse caso ele usa stdin. O que alterei foi o main.c para passar nulo quando não receber o argumento com o nome do arquivo e um if no interpretador, conforme a seguir: if(szFile == NULL) { pFile = stdin; } else { // Abre o arquivo e retorna erro se não conseguir pFile = fopen(szFile, "r"); if(pFile == NULL) { return iRet; } } Agora é possível executar o programa assim: cat teste.txt | ./interpretador Obrigado! Abraços, Marcelo Utikawa da Fonseca
×
×
  • Criar Novo...