[Cruce-commit] SF.net SVN: cruce:[36] C/trunk
Status: Beta
Brought to you by:
caiusb
|
From: <hor...@us...> - 2010-03-13 16:45:33
|
Revision: 36
http://cruce.svn.sourceforge.net/cruce/?rev=36&view=rev
Author: horiaradu
Date: 2010-03-13 16:45:25 +0000 (Sat, 13 Mar 2010)
Log Message:
-----------
Am adus clientul pana la pasul 5 inclusiv; am integrat modificarile facute de mine si de Lavinia.
Am facut modificarile propuse la protocol, introducand cele 3 noi coduri.
Clientul nu este inca functional, asamblarea sa efectiva urmand sa o facem mai tarziu.
Modified Paths:
--------------
C/trunk/client/client.c
C/trunk/protocol/protocol.c
C/trunk/protocol/protocol.h
Modified: C/trunk/client/client.c
===================================================================
--- C/trunk/client/client.c 2010-03-13 11:17:25 UTC (rev 35)
+++ C/trunk/client/client.c 2010-03-13 16:45:25 UTC (rev 36)
@@ -10,26 +10,41 @@
* NOT OK! Clientul si serverul depind numai de protocol
* si nu intre ele
*/
-#include "../server/server.h"
+#include "client.h"
#include "../protocol/protocol.h"
struct jucator player;
+void showCards() {
+ int i;
+ printf("Carti: ");
+ for (i = 0; i < player.carti_ramase; i++)
+ printf("%s ", player.carti[i].simbol);
+ printf("\n");
+}
+
+void deleteCard(int card) {
+ int i;
+ for (i = card; i < player.carti_ramase - 1; i++)
+ player.carti[i] = player.carti[i+1];
+ player.carti_ramase--;
+}
+
int join_game() {
- char message[1024];
+ char message[MSG_SIZE];
char answer = 'n';
while (answer != 'y') {
printf("Join game? [y|n]");
scanf("%c%*c", &answer);
}
- memset(message, 0, 1024);
+ memset(message, 0, MSG_SIZE);
sprintf(message, "%d %s", JOIN_GAME, player.nume);
pad(message);
- printf("%s\n",message);
write(player.sfd, &message, MSG_SIZE);
- memset(message, 0, 1024);
- read(player.sfd, &message, 1024);
+ memset(message, 0, MSG_SIZE);
+ read(player.sfd, &message, MSG_SIZE);
+ unpad(message);
int code = decode_message(message);
printf("Received %s from server\n", message);
if (code == NACK)
@@ -38,21 +53,36 @@
return 1;
}
+int waitAllPlayers() {
+ char message[MSG_SIZE];
+ int i;
+ for (i = 3; i > 0; i--) {
+ printf("%d more players to join the game...\n", i);
+ memset(message, 0, MSG_SIZE);
+ read(player.sfd, &message, MSG_SIZE);
+ int code = decode_message(message);
+ if (code == INFO_MSG)
+ printf("%s\n",message);
+ }
+ return 1;
+}
+
int start_game() {
- char message[1024];
+ char message[MSG_SIZE];
char answer = 'n';
while (answer != 'y') {
printf("Start game? [y|n]");
scanf("%c%*c", &answer);
}
- memset(message, 0, 1024);
+ memset(message, 0, MSG_SIZE);
sprintf(message, "%d", START_GAME);
pad(message);
write(player.sfd, &message, MSG_SIZE);
- memset(message, 0, 1024);
- read(player.sfd, &message, 1024);
+ memset(message, 0, MSG_SIZE);
+ read(player.sfd, &message, MSG_SIZE);
+ unpad(message);
int code = decode_message(message);
printf("Received %s from server\n", message);
if (code == NACK)
@@ -61,6 +91,196 @@
return 1;
}
+struct carte decodeCard(char *value, char *color) {
+ struct carte result;
+ result.culoare = color[0];
+ result.valoare = atoi(value);
+ if (result.valoare == 11)
+ strcpy(result.simbol, "A");
+ else if (result.valoare == 0)
+ strcpy(result.simbol, "9");
+ else
+ strcpy(result.simbol, value);
+ sprintf(result.simbol, "%s %c", result.simbol, color[0]);
+ return result;
+}
+
+int receiveCards() {
+ char message[MSG_SIZE];
+
+ player.carti_ramase = 0;
+
+ memset(message, 0, MSG_SIZE);
+ read(player.sfd, &message, MSG_SIZE);
+ unpad(message);
+
+ char cardString[MSG_SIZE];
+ strcpy(cardString, message);
+
+ int code = decode_message(message);
+ if (code != SEND_CARDS)
+ return 1;
+
+ int i;
+ strtok(cardString, " ");
+ for (i = 0; i < 6; i++) {
+ char *value = strtok(NULL, " ");
+ char *color = strtok(NULL, " ");
+ if (value != NULL && color != NULL)
+ player.carti[player.carti_ramase++] = decodeCard(value, color);
+ else
+ return 1;
+ }
+ return 0;
+}
+
+int accept_cards() {
+ char message[MSG_SIZE];
+
+ memset(message, 0, MSG_SIZE);
+ sprintf(message,"%d ", ACK);
+ pad(message);
+ write(player.sfd, &message, MSG_SIZE);
+
+ memset(message, 0, MSG_SIZE);
+ read(player.sfd, &message, MSG_SIZE);
+
+ int code = decode_message(message);
+ if (code == BEGIN_BID)
+ return 1;
+ return 0;
+}
+
+int reject_cards() {
+ char message[MSG_SIZE];
+
+ memset(message, 0, MSG_SIZE);
+ sprintf(message,"%d ", NACK);
+ pad(message);
+ write(player.sfd, &message, MSG_SIZE);
+
+ memset(message, 0, MSG_SIZE);
+ read(player.sfd, &message, MSG_SIZE);
+
+ int code = decode_message(message);
+ if (code == ACK) // odata cu trimiterea ACK-ului serverul trimite si cartile => send_cards()
+ return 0; // trebuie apelat receive_cards pentru a le primi
+ else if (code == NACK) // odata cu neacceptarea refuzului jucatorului de a primi cartile, acesta este indreptat spre bid
+ return 1;
+}
+
+int bidding() {
+ char message[MSG_SIZE];
+
+ int ok = 0;
+ while (!ok) {
+ memset(message, 0, MSG_SIZE);
+ read(player.sfd, &message, MSG_SIZE);
+ unpad(message);
+ int code = decode_message(message);
+
+ if (code == INFO_MSG)
+ printf("%s\n", message);
+
+ else if (code == BID) {
+ int bid = 0;
+ do {
+ printf("Cate faci? [0, 1, 2, 3, 4, 5, 6]\n");
+ scanf("%d%*c", &bid);
+ } while (bid < 0 || bid > 6);
+
+ memset(message, 0, MSG_SIZE);
+ sprintf(message, "%d %d", BID_RESP, bid);
+ pad(message);
+ write(player.sfd, &message, MSG_SIZE);
+ }
+ else if (code == END_BID) {
+ printf("castigator: %s", message);
+ ok = 1;
+ }
+
+ }
+
+ return 1;
+}
+
+int hand() {
+ char message[MSG_SIZE];
+
+ int endHand = 0;
+ int canAnnounce = 1;
+ while (!endHand) {
+ memset(message, 0, MSG_SIZE);
+ read(player.sfd, &message, MSG_SIZE);
+ unpad(message);
+
+ int code = decode_message(message);
+ if (code == INFO_MSG) {
+ printf("%s\n", message);
+ canAnnounce = 0;
+ }
+ else if (code == HIT && canAnnounce == 0) {
+ int ok = 0;
+ while (!ok) {
+ int card = 0;
+
+ showCards();
+
+ do {
+ printf("Da carte! (index-ul cartii 0->5)\n");
+ scanf("%d%*c", &card);
+ } while (card < 0 || card >= player.carti_ramase);
+
+ memset(message, 0, MSG_SIZE);
+ sprintf(message, "%d %d %c", CARD, player.carti[card].valoare, player.carti[card].culoare);
+ pad(message);
+ write(player.sfd, &message, MSG_SIZE);
+
+ read(player.sfd, &message, MSG_SIZE);
+ unpad(message);
+ int code2 = decode_message(message);
+ if (code2 == ACK) {
+ ok = 1;
+ deleteCard(card);
+ } else if (code2 == NACK)
+ printf("Ceva nu e bine, mai da o data!");
+ }
+ }
+ else if (code == HIT && canAnnounce == 1) {
+ int ok = 0;
+ while (!ok) {
+ int card = 0, anunt = 0;
+
+ showCards();
+
+ do {
+ printf("Da carte + anunt daca ai! (index-ul cartii 0->5)\n");
+ scanf("%d %d%*c", &card, &anunt);
+ } while (card < 0 || card >= player.carti_ramase);
+
+ memset(message, 0, MSG_SIZE);
+ sprintf(message, "%d %d %c %d", CARD_ANUNT, player.carti[card].valoare, player.carti[card].culoare, anunt);
+ pad(message);
+ write(player.sfd, &message, MSG_SIZE);
+
+ read(player.sfd, &message, MSG_SIZE);
+ unpad(message);
+ int code2 = decode_message(message);
+ if (code2 == ACK) {
+ ok = 1;
+ deleteCard(card);
+ } else if (code2 == NACK)
+ printf("Ceva nu e bine, mai da o data!");
+ }
+ }
+ else if (code == END_HAND) {
+ printf("%s\n", message);
+ endHand = 1;
+ }
+ }
+ return 1;
+}
+
/** adresa, port, nume **/
int main(int argc, char *argv[]) {
if (argc != 4) {
@@ -101,11 +321,34 @@
exit(1);
}
//wait for 4 messages about players
+ waitAllPlayers();
+
+
if(!start_game()) {
printf("couldn't start the game\n");
exit(1);
}
- printf("Now we play. Next time.\n");
+
+ char opt = ' ', ok = 0;
+ while (!ok) {
+ if (!receiveCards()) {
+ printf("couldn't receive cards\n");
+ exit(1);
+ }
+
+ do {
+ showCards();
+ printf("Do you like your cards? y|n");
+ scanf("%c", opt);
+ if (opt == 'y')
+ ok = accept_cards();
+ else if (opt == 'n')
+ ok = reject_cards();
+ } while(opt != 'y' && opt != 'n');
+ }
+
+ bidding();
+ hand();
//shutdown(player.sfd, SHUT_RDWR);
close(player.sfd);
Modified: C/trunk/protocol/protocol.c
===================================================================
--- C/trunk/protocol/protocol.c 2010-03-13 11:17:25 UTC (rev 35)
+++ C/trunk/protocol/protocol.c 2010-03-13 16:45:25 UTC (rev 36)
@@ -15,19 +15,17 @@
code = atoi(message);
strcpy(message, message + 2);
}
- /*
printf("Decoded this message:\n");
printf("code: %d\n", code);
printf("message: %s\n", message);
printf("---end---\n");
- */
return code;
}
void pad(char *msg) {
int size = strlen(msg);
int i;
- for (i=size;i<MSG_SIZE;i++)
+ for (i = size; i < MSG_SIZE; i++)
msg[i] = PAD_CHAR;
msg[MSG_SIZE-1] = '\0';
}
@@ -35,7 +33,7 @@
void unpad(char *msg)
{
int i = strlen(msg) - 1;
- for (;i>=0;i--)
+ for (; i >= 0; i--)
if (msg[i] != ' ')
break;
Modified: C/trunk/protocol/protocol.h
===================================================================
--- C/trunk/protocol/protocol.h 2010-03-13 11:17:25 UTC (rev 35)
+++ C/trunk/protocol/protocol.h 2010-03-13 16:45:25 UTC (rev 36)
@@ -11,8 +11,8 @@
#define START_GAME 5
#define SEND_CARDS 6
#define BEGIN_BID 7
-#define BID_? 8
-#define BID 9
+#define BID 8
+#define BID_RESP 9
#define HIT 10
#define CARD_ANUNT 11
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|