Created
April 22, 2018 13:59
-
-
Save Fumesover/54f986a2b4ac61d6addf97d9fc1b7731 to your computer and use it in GitHub Desktop.
421 - ISN Game
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <conio.h> | |
#include <math.h> | |
#include <windows.h> | |
#include <string.h> | |
#define sleep(x) Sleep(x) | |
#include <locale.h> | |
// Pour les sockets : | |
#include <winsock2.h> | |
typedef int socklen_t; | |
#define PORT 23 | |
int dernierscore = 0, meilleurscore = 0, erreur; | |
char ip_serveur[16] = "127.0.0.1"; | |
char nom_du_joueur[16] = "User"; | |
char display_pseudo[16]; | |
int use_server = 0; | |
int use_folder = 0; | |
struct socketSTRUCT{ | |
int err; | |
int connection_reussie; | |
SOCKET sock; | |
SOCKADDR_IN sin; | |
}sockets; | |
struct player | |
{ | |
char pseudo[16]; | |
char pseudo_alonged[32]; | |
int result; | |
int place; | |
}player[10]; | |
//typedef struct player player; | |
void big_print(char* to_print){ | |
printf("/-----------------------------------------------------------------------------\\\n"); | |
printf("| |\n"); | |
printf("| Info |\n"); | |
printf("| |\n"); | |
printf("|-----------------------------------------------------------------------------|\n"); | |
printf("| |\n"); | |
printf("| |\n"); | |
printf("| |\n"); | |
printf("|%s|\n", to_print); | |
printf("| |\n"); | |
printf("| |\n"); | |
printf("| |\n"); | |
printf("\\-----------------------------------------------------------------------------/\n"); | |
} | |
void ligne(){ | |
printf("*******************************************************************************\n\n"); | |
} // Compliqué ? C'est juste une ligne pourtant !! | |
void sendscore(int score, char pseudo[16]){ | |
// imput est le score a envoyer au serveur | |
char buffer[256]; int erreur = 0; | |
snprintf(buffer, sizeof(buffer), "%s:%d", pseudo, score); | |
if(!erreur) | |
{ | |
/* Si l'on a réussi à se connecter et qu'il n'y a pas d'erreur*/ | |
if(sockets.connection_reussie != SOCKET_ERROR) | |
{ | |
//printf("Connection à %s sur le port %d reussie\n", inet_ntoa(sockets.sin.sin_addr), htons(sockets.sin.sin_port)); | |
/* Si l'on reçoit des informations : on les affiche à l'écran */ | |
sockets.err = send(sockets.sock, buffer, strlen(buffer), 0); // On envoie les données saisies a la main | |
if(sockets.err != SOCKET_ERROR) { | |
//printf("Chaine envoyée : %s\n", buffer); | |
} else { | |
//printf("Erreur de transmission\n"); | |
use_server = 0; | |
} | |
} | |
/* sinon, on affiche "Impossible de se connecter" */ | |
else | |
{ | |
//printf("Impossible de se connecter\n"); | |
use_server = 0; | |
} | |
} | |
} | |
void clean(const char *buffer, FILE *fp) { // Fonction permettant d'éliminer les \n des chaines | |
char *p = strchr(buffer,'\n'); | |
if (p != NULL) | |
*p = 0; | |
else | |
{ | |
int c; | |
while ((c = fgetc(fp)) != '\n' && c != EOF); | |
} | |
} | |
void mathinit(){ // Initialisation mathématique de la fonction alléatoire | |
srand(time(NULL)); | |
} | |
void initialisation(){ | |
sockets.sin.sin_addr.s_addr = inet_addr(ip_serveur); | |
sockets.sin.sin_family = AF_INET; | |
sockets.sin.sin_port = htons(PORT); | |
mathinit(); | |
int i, nb = alea(); | |
for(i = 0; i < nb; i ++){ | |
snprintf(nom_du_joueur, sizeof(nom_du_joueur), "%s%d",nom_du_joueur, alea()); | |
} | |
} | |
void reglages(){ | |
char choix; | |
while(choix != 27){ | |
system("cls"); | |
ligne(); | |
printf(" Echap pour quitter \n"); | |
printf(" 1 -- Ip serveur : %s \n", ip_serveur); | |
printf(" 2 -- Pseudo joueur : %s \n", nom_du_joueur); | |
printf(" 3 -- Utiliser le serveur : %s \n", use_server ? "Oui" : "Non"); | |
printf(" 4 -- Sauvegarder les scores : %s \n", use_folder ? "Oui" : "Non"); | |
choix = getch(); | |
if(choix == '1'){ | |
printf("Ip du serveur : "); | |
scanf("%15s", ip_serveur); | |
if(use_server == 1) { | |
closesocket(sockets.sock); | |
use_server = 0; | |
} | |
/* Configuration de la connexion */ | |
sockets.sin.sin_addr.s_addr = inet_addr(ip_serveur); | |
} else if (choix == '2'){ | |
printf("Votre pseudo : "); | |
fgets(nom_du_joueur, sizeof(nom_du_joueur), stdin); | |
clean(nom_du_joueur, stdin); | |
} else if (choix == '3'){ | |
printf("Utiliser un serveur ? : 1 = Oui | 2 = Non"); | |
choix = getch(); | |
if(choix == '1'){ | |
if(use_server == 1) { | |
closesocket(sockets.sock); | |
} | |
use_server = 1; | |
/* Création de la socket */ | |
sockets.sock = socket(AF_INET, SOCK_STREAM, 0); | |
/* On tente de se connecter */ | |
sockets.connection_reussie = connect(sockets.sock, (SOCKADDR*)&sockets.sin, sizeof(sockets.sin)); | |
if(sockets.connection_reussie != SOCKET_ERROR){ | |
system("cls"); | |
big_print(" Connection réussie "); | |
Sleep(1000); | |
} else { | |
system("cls"); | |
big_print(" Connection ratée "); | |
Sleep(1000); | |
use_server = 0; | |
} | |
} else if (choix == '2'){ | |
use_server = 0; | |
closesocket(sockets.sock); | |
} | |
} else if (choix == '4'){ | |
if(use_folder == 1){ | |
use_folder = 0; | |
} else { | |
use_folder = 1; | |
} | |
} | |
} | |
} | |
void printscoreboard(int scores[10]){ | |
int i; | |
for(i = 0; i < 10; i++){ | |
while(16 > strlen(player[i].pseudo)){ | |
strcat(player[i].pseudo, " "); | |
} | |
} | |
char serveur[21]; | |
char port[5]; | |
sprintf(port,"%ld", htons(sockets.sin.sin_port)); | |
strcpy(serveur, inet_ntoa(sockets.sin.sin_addr)); | |
strcat(serveur,":"); | |
strcat(serveur, port); | |
while(16 > strlen(serveur)){ | |
strcat(serveur, " "); | |
} | |
// printf("Connection à %s sur le port %d reussie\n", inet_ntoa(sockets.sin.sin_addr), htons(sockets.sin.sin_port)); | |
printf("/-----------------------------------------------------------------------------\\\n"); | |
printf("| |\n"); | |
printf("| ScoreBoard du serveur |\n"); | |
printf("| %s |\n",serveur); | |
printf("| |\n"); | |
printf("|-----------------------------------------------------------------------------|\n"); | |
printf("| |\n"); | |
printf("| |\n"); | |
printf("| %der : %s -> %d %s %s |\n",player[0].place,player[0].pseudo,scores[0],scores[0] > 9 ? "" : " ", strncmp(nom_du_joueur,player[0].pseudo, strlen(nom_du_joueur)) == 0 ? "!!" : ".." ); | |
for(i=1;i < 10; i++){ | |
printf("| %de %s : %s -> %d %s %s |\n", player[i].place, player[i].place != 10 ? " " : "",player[i].pseudo,scores[i], scores[i] > 9 ? "" : " ", strncmp(nom_du_joueur,player[i].pseudo, strlen(nom_du_joueur)) == 0 ? "!!" : ".."); | |
} | |
printf("| |\n"); | |
printf("| |\n"); | |
printf("| |\n"); | |
printf("\\-----------------------------------------------------------------------------/\n"); | |
} | |
void scoreboardaff(){ | |
char *buffer = "Scores"; int err, i; int scores[10]; | |
system("cls"); | |
err = send (sockets.sock, buffer, strlen (buffer), 0); | |
if (err != SOCKET_ERROR) | |
{ | |
for(i = 0; i < 10; i++){ | |
recv(sockets.sock, &player[i], sizeof(player), 0); | |
scores[i] = player[i].result; // Pour une raison inconue, les scores sont rezet lorsque l'on passe a l'affichage des scores alors ils sont passés a la fonction via un tableau ... | |
} | |
printscoreboard(scores); | |
} | |
else | |
{ | |
big_print (" Erreur - Non connecté ou problème de communication "); | |
use_server = 0; | |
} | |
getch(); | |
} | |
void credits(){ | |
int i; | |
system("cls"); | |
ligne(); | |
printf(" _____________ \n\n"); | |
printf(" Crédits \n"); | |
printf(" _____________ \n\n\n\n"); | |
for(i=1;i<50;i++){ | |
if(kbhit()){ // si on appuie sur une touche alors on arrete les credits | |
break; | |
} | |
printf("Développement serveur ::: Albin Parou \n"); | |
sleep(500); | |
if(kbhit()){ // si on appuie sur une touche alors on arrete les credits | |
break; | |
} | |
printf("Interface utilisateur ::: Gabriel Delepine \n"); | |
Sleep(500); | |
if(kbhit()){ // si on appuie sur une touche alors on arrete les credits | |
break; | |
} | |
printf("Développement du jeu ::: Albin Parou, Gabriel Delepine \n"); | |
Sleep(500); | |
if(kbhit()){ // si on appuie sur une touche alors on arrete les credits | |
break; | |
} | |
} | |
getch(); | |
} | |
void init(){ // Affiche le menu principal | |
printf("\n\n ~* Jeu du 421 *~"); | |
printf("\n\n ___________________\n\n"); | |
printf(" | 1- Jouer | \n\n"); | |
printf(" | 2- Regles |\n\n"); | |
printf(" * 3- Scoreboard *\n\n"); | |
printf(" * 4- Credits *\n\n"); | |
printf(" | 5- Réglages |\n\n"); | |
printf(" | Echap - Quitter |\n"); | |
printf(" ___________________\n"); | |
} // affiche le menu principal | |
void regles(){ //Partie du programme qui s'occupe des règles | |
system("cls"); | |
ligne(); | |
printf(" _____________ \n\n"); | |
printf(" Règles du jeu \n"); | |
printf(" _____________ \n\n\n\n"); | |
printf("Le joueur lancera une série de trois dés 5 fois. L'objectif est de réaliser le meilleur score possible sachant que :\n \n"); | |
printf(" -réaliser deux chiffres identiques rapporte 2 points \n"); | |
printf(" -réaliser trois chiffres identiques rapporte la somme des trois dés\n"); | |
printf(" -réaliser un 4, un 2 et un 1 en un lancer rapporte 20 points\n\n"); | |
getch(); | |
system("cls"); | |
} // affriche les règles | |
int alea(){ // retourne un nombre aléatoire entre 1 et 6 | |
int value_return = rand()%6 + 1; | |
return value_return; | |
} | |
int result(int de1, int de2, int de3){ // Retourne le score en fonction des 3 dés | |
// On comence par tester si il y a des doubles | |
int score = 0; | |
if(de1 == de2){ | |
if(de2 == de3){ // si on a un brelan | |
score = 12; | |
} else { // si on a juste une paire | |
score = 2; | |
} | |
} else if (de2 == de3){ // pour les paires on fait les tests restants | |
score = 2; | |
} else if (de1 == de3){ // le dernier | |
score = 2; | |
} else { // On test si on a un 421 -> il faut donc ne pas avoir de paire d'ou le else | |
if(de1*de2*de3 == 8){ | |
if(de1 == 1 || de2 == 1 || de3 ==1){ | |
if(de1 == 2 || de2 == 2 || de3 ==2){ | |
if(de1 == 4 || de2 == 4 || de3 ==4){ | |
score = 20; | |
} | |
} | |
} | |
} | |
} | |
return score; | |
} | |
void remplirfichier(int score){ // Remplis le ficher scores.txt avec les données : La date / heure et le score | |
FILE* fichier = NULL; | |
fichier = fopen("scores.txt", "a"); | |
time_t heure = time(NULL); | |
if(fichier != NULL){ | |
fprintf(fichier,"%s Score : %d par %s \n",asctime(localtime(&heure)),score, nom_du_joueur); | |
fclose(fichier); | |
} | |
} | |
void accueiljeu(){ | |
ligne(); | |
printf(" - Pour jouer appuyez sur J | Score precedent : %d\n", dernierscore); | |
printf(" - Pour quitter appuyez sur Echap | Meilleur score : %d\n\n", meilleurscore); | |
ligne(); | |
} // Juste du texte | |
void printscore(int de1, int de2, int de3, int score){ | |
printf("/---\\ /---\\ /---\\ \n"); | |
printf("| %d | | %d | | %d | Votre score actuel : %d\n",de1,de2,de3,score); | |
printf("\\---/ \\---/ \\---/ \n"); | |
} | |
void jeu(){ // Jeu solo | |
char touche; | |
int nbdee = 0, de1, de2, de3, score = 0; | |
while (touche != 27 && nbdee < 5){ | |
de1 = alea(); // |-----------------------------------------------------------| // | |
de2 = alea(); // | On récupère la valeur des dés entre 1 et 6 pour le joueur | // | |
de3 = alea(); // |-----------------------------------------------------------| // | |
score = score + result(de1, de2, de3); // On calcule le score en fonction des résultats des dés | |
printscore(de1, de2, de3, score); // On affiche les résultats des dés et le score actuel | |
touche = getch(); // On attends une touche entre chaque lancé | |
nbdee++; // Compteur de lancés qui est incrémenté | |
} | |
dernierscore = score; | |
if (score > meilleurscore){ | |
meilleurscore = score; | |
} | |
if (use_folder == 1){ | |
remplirfichier(score); | |
} | |
if(use_server == 1){ | |
sendscore(score,nom_du_joueur); | |
} | |
} | |
void jouer(){ | |
char choix; | |
system("cls"); | |
while (1){ | |
accueiljeu(); | |
choix = getch(); | |
if(choix == 27){ | |
break; // Si echap on quitte | |
} else if(choix == 106){ | |
jeu(sockets); | |
system("cls"); // Quand on sort de la partie on efface l'écran et on réaffiche l'écran de jeu | |
} | |
} | |
system("cls"); | |
} | |
int main(int argc, char *argv[]) { | |
setlocale(LC_ALL, ""); | |
system("color 73"); | |
WSADATA WSAData; | |
erreur = WSAStartup(MAKEWORD(2,2), &WSAData); | |
initialisation(); | |
while (1) { | |
system("cls"); | |
init(); | |
char choix = getch(); // fonctionnement propre -> recup touche | |
if (choix == '1') { | |
jouer(); | |
} else if (choix == '2') { | |
regles(); | |
} else if (choix == '3'){ | |
scoreboardaff(); | |
} else if (choix == '4'){ | |
credits(); | |
} else if (choix == '5'){ | |
reglages(); | |
} else if (choix == 27){ | |
break; | |
} | |
} | |
/* On ferme la socket */ | |
if(use_server){ | |
closesocket(sockets.sock); | |
} | |
WSACleanup(); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifdef __cplusplus | |
#error Be sure you are using a C compiler... | |
#endif | |
#if defined (WIN32) || defined (_WIN32) | |
#include <winsock2.h> | |
#elif defined (linux) || defined (_POSIX_VERSION) || defined (_POSIX2_C_VERSION)\ | |
|| defined (_XOPEN_VERSION) | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <netinet/in.h> | |
#include <arpa/inet.h> | |
#include <unistd.h> /* close */ | |
#define INVALID_SOCKET -1 | |
#define SOCKET_ERROR -1 | |
#define closesocket(s) close (s) | |
typedef int SOCKET; | |
typedef struct sockaddr_in SOCKADDR_IN; | |
typedef struct sockaddr SOCKADDR; | |
#else | |
#error not defined for this platform | |
#endif | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <pthread.h> | |
/* macros ============================================================== */ | |
#define TELNET 23 | |
/* we want to listen to the TELNET port */ | |
#define PORT TELNET | |
#define ESC 27 | |
/* constants =========================================================== */ | |
int nombre_de_clients = 0; | |
/* types =============================================================== */ | |
/* structures ========================================================== */ | |
struct cli | |
{ | |
pthread_t thread; | |
SOCKADDR_IN sin; | |
int recsize; | |
SOCKET sock; | |
int err; | |
}; | |
struct player | |
{ | |
char pseudo[16]; | |
char pseudo_alonged[32]; | |
int result; | |
int place; | |
}; | |
typedef struct player player; | |
struct player_to //Liste des joueurs a trier -> BUFFER | |
{ | |
char pseudo[16]; | |
int score; | |
}; | |
struct player_to buffer_player[50]; | |
int bufferplace = 0; | |
struct player scores[10]; | |
/* private data ======================================================== */ | |
/* private functions =================================================== */ | |
static void *wait_exit(void *p_data){ | |
char touche; | |
do{ | |
if(kbhit()){ | |
touche = getch(); | |
} else { | |
Sleep(100); | |
} | |
} while(touche != 27); | |
WSACleanup (); | |
exit(EXIT_SUCCESS); | |
} | |
static void *trier_scoreboard(void *p_data){ | |
int place = 0, i; | |
while(1){ | |
if(place != bufferplace){ | |
place++; | |
if(place > 49) { place = 0;} | |
if(buffer_player[place].score > scores[9].result){ | |
if(buffer_player[place].score > scores[8].result){ | |
if(buffer_player[place].score > scores[7].result){ | |
if(buffer_player[place].score > scores[6].result){ | |
if(buffer_player[place].score > scores[5].result){ | |
if(buffer_player[place].score > scores[4].result){ | |
if(buffer_player[place].score > scores[3].result){ | |
if(buffer_player[place].score > scores[2].result){ | |
if(buffer_player[place].score > scores[1].result){ | |
if(buffer_player[place].score > scores[0].result){ | |
scores[9].result = scores[8].result; | |
scores[8].result = scores[7].result; | |
scores[7].result = scores[6].result; | |
scores[6].result = scores[5].result; | |
scores[5].result = scores[4].result; | |
scores[4].result = scores[3].result; | |
scores[3].result = scores[2].result; | |
scores[2].result = scores[1].result; | |
scores[1].result = scores[0].result; | |
scores[0].result = buffer_player[place].score; | |
strcpy(scores[9].pseudo, scores[8].pseudo); | |
strcpy(scores[8].pseudo, scores[7].pseudo); | |
strcpy(scores[7].pseudo, scores[6].pseudo); | |
strcpy(scores[6].pseudo, scores[5].pseudo); | |
strcpy(scores[5].pseudo, scores[4].pseudo); | |
strcpy(scores[4].pseudo, scores[3].pseudo); | |
strcpy(scores[3].pseudo, scores[2].pseudo); | |
strcpy(scores[2].pseudo, scores[1].pseudo); | |
strcpy(scores[1].pseudo, scores[0].pseudo); | |
strcpy(scores[0].pseudo, buffer_player[place].pseudo); | |
} else { | |
scores[9].result = scores[8].result; | |
scores[8].result = scores[7].result; | |
scores[7].result = scores[6].result; | |
scores[6].result = scores[5].result; | |
scores[5].result = scores[4].result; | |
scores[4].result = scores[3].result; | |
scores[3].result = scores[2].result; | |
scores[2].result = scores[1].result; | |
scores[1].result = buffer_player[place].score; | |
strcpy(scores[9].pseudo, scores[8].pseudo); | |
strcpy(scores[8].pseudo, scores[7].pseudo); | |
strcpy(scores[7].pseudo, scores[6].pseudo); | |
strcpy(scores[6].pseudo, scores[5].pseudo); | |
strcpy(scores[5].pseudo, scores[4].pseudo); | |
strcpy(scores[4].pseudo, scores[3].pseudo); | |
strcpy(scores[3].pseudo, scores[2].pseudo); | |
strcpy(scores[2].pseudo, scores[1].pseudo); | |
strcpy(scores[1].pseudo, buffer_player[place].pseudo); | |
} | |
} else { | |
scores[9].result = scores[8].result; | |
scores[8].result = scores[7].result; | |
scores[7].result = scores[6].result; | |
scores[6].result = scores[5].result; | |
scores[5].result = scores[4].result; | |
scores[4].result = scores[3].result; | |
scores[3].result = scores[2].result; | |
scores[2].result = buffer_player[place].score; | |
strcpy(scores[9].pseudo, scores[8].pseudo); | |
strcpy(scores[8].pseudo, scores[7].pseudo); | |
strcpy(scores[7].pseudo, scores[6].pseudo); | |
strcpy(scores[6].pseudo, scores[5].pseudo); | |
strcpy(scores[5].pseudo, scores[4].pseudo); | |
strcpy(scores[4].pseudo, scores[3].pseudo); | |
strcpy(scores[3].pseudo, scores[2].pseudo); | |
strcpy(scores[2].pseudo, buffer_player[place].pseudo); | |
} | |
} else { | |
scores[9].result = scores[8].result; | |
scores[8].result = scores[7].result; | |
scores[7].result = scores[6].result; | |
scores[6].result = scores[5].result; | |
scores[5].result = scores[4].result; | |
scores[4].result = scores[3].result; | |
scores[3].result = buffer_player[place].score; | |
strcpy(scores[9].pseudo, scores[8].pseudo); | |
strcpy(scores[8].pseudo, scores[7].pseudo); | |
strcpy(scores[7].pseudo, scores[6].pseudo); | |
strcpy(scores[6].pseudo, scores[5].pseudo); | |
strcpy(scores[5].pseudo, scores[4].pseudo); | |
strcpy(scores[4].pseudo, scores[3].pseudo); | |
strcpy(scores[3].pseudo, buffer_player[place].pseudo); | |
} | |
} else { | |
scores[9].result = scores[8].result; | |
scores[8].result = scores[7].result; | |
scores[7].result = scores[6].result; | |
scores[6].result = scores[5].result; | |
scores[5].result = scores[4].result; | |
scores[4].result = buffer_player[place].score; | |
strcpy(scores[9].pseudo, scores[8].pseudo); | |
strcpy(scores[8].pseudo, scores[7].pseudo); | |
strcpy(scores[7].pseudo, scores[6].pseudo); | |
strcpy(scores[6].pseudo, scores[5].pseudo); | |
strcpy(scores[5].pseudo, scores[4].pseudo); | |
strcpy(scores[4].pseudo, buffer_player[place].pseudo); | |
} | |
} else { | |
scores[9].result = scores[8].result; | |
scores[8].result = scores[7].result; | |
scores[7].result = scores[6].result; | |
scores[6].result = scores[5].result; | |
scores[5].result = buffer_player[place].score; | |
strcpy(scores[9].pseudo, scores[8].pseudo); | |
strcpy(scores[8].pseudo, scores[7].pseudo); | |
strcpy(scores[7].pseudo, scores[6].pseudo); | |
strcpy(scores[6].pseudo, scores[5].pseudo); | |
strcpy(scores[5].pseudo, buffer_player[place].pseudo); | |
} | |
} else { | |
scores[9].result = scores[8].result; | |
scores[8].result = scores[7].result; | |
scores[7].result = scores[6].result; | |
scores[6].result = buffer_player[place].score; | |
strcpy(scores[9].pseudo, scores[8].pseudo); | |
strcpy(scores[8].pseudo, scores[7].pseudo); | |
strcpy(scores[7].pseudo, scores[6].pseudo); | |
strcpy(scores[6].pseudo, buffer_player[place].pseudo); | |
} | |
} else { | |
scores[9].result = scores[8].result; | |
scores[8].result = scores[7].result; | |
scores[7].result = buffer_player[place].score; | |
strcpy(scores[9].pseudo, scores[8].pseudo); | |
strcpy(scores[8].pseudo, scores[7].pseudo); | |
strcpy(scores[7].pseudo, buffer_player[place].pseudo); | |
} | |
} else { | |
scores[9].result = scores[8].result; | |
scores[8].result = buffer_player[place].score; | |
strcpy(scores[9].pseudo, scores[8].pseudo); | |
strcpy(scores[8].pseudo, buffer_player[place].pseudo); | |
} | |
} else { | |
scores[9].result = buffer_player[place].score; | |
strcpy(scores[9].pseudo, buffer_player[place].pseudo); | |
} | |
} | |
} else { | |
Sleep(50); | |
} | |
} | |
} | |
static void *affichage(void *p_data){ | |
int i; | |
while(1){ | |
for(i = 0; i < 10; i++){ | |
strcpy(scores[i].pseudo_alonged,scores[i].pseudo); | |
while(16 > strlen(scores[i].pseudo_alonged)){ | |
strcat(scores[i].pseudo_alonged, " "); | |
} | |
} | |
system("cls"); | |
printf("/-----------------------------------------------------------------------------\\\n"); | |
printf("| Echap pour quitter |\n"); | |
printf("| |\n"); | |
printf("| |\n"); | |
printf("| 421 Serveur - Alb & Gab |\n"); | |
printf("| |\n"); | |
printf("| |\n"); | |
printf("| |\n"); | |
printf("|-----------------------------------------------------------------------------|\n"); | |
printf("| |\n"); | |
printf("| Il y a : %d clients %s |\n", nombre_de_clients, nombre_de_clients > 9 ? "":" "); | |
printf("| |\n"); | |
printf("| %der : %s -> %d %s |\n",scores[0].place,scores[0].pseudo_alonged,scores[0].result, scores[0].result > 9 ? "" : " "); | |
for(i=1;i < 10; i++){ | |
printf("| %de %s : %s -> %d %s |\n", scores[i].place,scores[i].place != 10 ? " " : "", scores[i].pseudo_alonged,scores[i].result, scores[i].result > 9 ? "" : " "); | |
} | |
printf("| |\n"); | |
printf("\\-----------------------------------------------------------------------------/\n"); | |
Sleep(2000); | |
} | |
} | |
static void initscores(){ | |
int i, j = 0; | |
for(i=0; i<10; i++){ | |
strcpy(scores[i].pseudo, "Null"); | |
scores[i].result = 0; | |
scores[i].place = i + 1; | |
} | |
} | |
/* thread client function */ | |
static void *client (void *p_data) | |
{ | |
nombre_de_clients++; | |
struct cli *p_cli = p_data; | |
if (p_cli != NULL) | |
{ | |
int end = 0; | |
do | |
{ | |
/* wait for the receive of a data block */ | |
unsigned char data[128]; | |
int sock_err = recv (p_cli->sock, data, (sizeof data - 1), 0); | |
if (sock_err != SOCKET_ERROR) | |
{ | |
size_t nb_rec = sock_err; | |
if (nb_rec > 0) | |
{ | |
/* convert to string */ | |
data[nb_rec] = 0; | |
fflush (stdout); | |
if (data[0] == ESC){ | |
end = 1; | |
} else if (data != ESC){ | |
if(data[0] == 83 && //Si la requette est score -- on controle bit a bit suite a des erreurs liées a du bit-flopping de fin de string | |
data[1] == 99 && | |
data[2] == 111 && | |
data[3] == 114 && | |
data[4] == 101 && | |
data[5] == 115 ){ | |
/* send some YES-TO-ALL answer */ | |
int i; | |
char buff[128]; | |
for(i = 0; i < 10; i++){ | |
send(p_cli->sock, &scores[i], sizeof(player), 0); | |
} | |
} else { | |
char data2[128]; | |
strcpy(data2, data); | |
char* pseudo = strtok (data,":"); | |
char *scoree = data2 + (strlen(pseudo) + 1); | |
bufferplace++; | |
if(bufferplace > 49) { bufferplace = 0;} | |
strcpy(buffer_player[bufferplace].pseudo, pseudo); | |
buffer_player[bufferplace].score = atoi(scoree); | |
} | |
} | |
} | |
else | |
{ | |
end = 1; | |
} | |
} | |
else | |
{ | |
p_cli->err = 1; | |
end = 1; | |
} | |
} | |
while (!end); | |
shutdown (p_cli->sock, 2); | |
closesocket (p_cli->sock), p_cli->sock = INVALID_SOCKET; | |
/* the memory is now under the control of the thread */ | |
free (p_cli), p_cli = NULL; | |
} | |
nombre_de_clients--; | |
return NULL; | |
} | |
static int clients (SOCKET sock) | |
{ | |
int err = 0; | |
int end = 0; | |
do | |
{ | |
{ | |
/* create a new client context */ | |
struct cli *p_cli = malloc (sizeof *p_cli); | |
if (p_cli != NULL) | |
{ | |
p_cli->recsize = (int) sizeof p_cli->sin; | |
p_cli->sock = | |
accept (sock, (SOCKADDR *) &p_cli->sin, &p_cli->recsize); | |
if (p_cli->sock != INVALID_SOCKET) | |
{ | |
/* send ...*/ | |
pthread_create (&p_cli->thread, NULL, client, p_cli); | |
/* ... and forget */ | |
p_cli = NULL; | |
} | |
else | |
{ | |
perror ("socket.accept"); | |
err = 1; | |
} | |
} | |
else | |
{ | |
fprintf (stderr, "client creation failed : memory error\n"); | |
} | |
} | |
} | |
while (!end); | |
return err; | |
} | |
/* --------------------------------------------------------------------- | |
--------------------------------------------------------------------- */ | |
static int app (void) | |
{ | |
int err = 0; | |
/* open a socket in TCP/IP mode. */ | |
SOCKET sock = socket (AF_INET, SOCK_STREAM, 0); | |
if (sock != INVALID_SOCKET) | |
{ | |
//printf ("socket %d is now opened in TCP/IP mode\n", sock); | |
/* we want to listen on the TELNET port */ | |
{ | |
int sock_err; | |
/* assign the listening port */ | |
SOCKADDR_IN sin = { 0 }; | |
/* automatic IP address */ | |
sin.sin_addr.s_addr = htonl (INADDR_ANY); | |
/* protocol family (IP) */ | |
sin.sin_family = AF_INET; | |
/* listening port */ | |
sin.sin_port = htons (PORT); | |
/* bind */ | |
sock_err = bind (sock, (SOCKADDR *) &sin, sizeof sin); | |
if (sock_err != SOCKET_ERROR) | |
{ | |
/* start listening (server mode) */ | |
sock_err = listen (sock, 5); | |
if (sock_err != SOCKET_ERROR) | |
{ | |
err = clients (sock); | |
} | |
else | |
{ | |
err = 1; | |
} | |
} | |
else | |
{ | |
perror ("socket.bind"); | |
err = 1; | |
} | |
/* close the socket. */ | |
sock_err = closesocket (sock), sock = INVALID_SOCKET; | |
if (sock_err) | |
{ | |
perror ("socket.close"); | |
err = 1; | |
} | |
} | |
} | |
else | |
{ | |
perror ("socket.open"); | |
err = 1; | |
} | |
return err; | |
} | |
/* entry point ========================================================= */ | |
/* --------------------------------------------------------------------- | |
--------------------------------------------------------------------- */ | |
int main (void) | |
{ | |
int ret; | |
WSADATA wsa_data; | |
int err = WSAStartup (MAKEWORD (2, 2), &wsa_data); | |
pthread_t exit_t, aff_t, tri_t; | |
pthread_create(&exit_t, NULL, wait_exit, NULL); | |
pthread_create(&aff_t, NULL, affichage, NULL); | |
pthread_create(&tri_t, NULL, trier_scoreboard, NULL); | |
initscores(); | |
if (!err) | |
{ | |
puts ("WIN: winsock2: OK"); | |
err = app (); | |
WSACleanup (); | |
} | |
if (err) | |
{ | |
ret = EXIT_FAILURE; | |
} | |
else | |
{ | |
ret = EXIT_SUCCESS; | |
} | |
system ("pause"); | |
return ret; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment