• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista wynikow gry - projekt w C

VPS Starter Arubacloud
+1 głos
249 wizyt
pytanie zadane 23 stycznia 2022 w C i C++ przez Raven2221 Nowicjusz (200 p.)
Dzien dobry!

Jestem studentem informatyki, moja przygode z programowaniem dopiero rozpoczynam. Mam do zrobienia projekt - gre Wisielec. Ocenie podlega kilka elementow, wiekszosc z nich juz zrobilem, ale zostala mi jedna rzecz ktorej nie potrafie ugryzc, nie wiem nawet jak zaczac. Gra ma zapamietywac ilosc wygranych i przegranych gier danego gracza i miec opcje wyswietlenia listy rankingowej.

Na pewno wyniki beda musialy byc zapisywane w osobnym pliku tekstowym - to nie problem. Mam problem z kilkoma krokami-

1)Jak zrobic zeby gra "zapamietywala" danego gracza? Chcialbym zeby jak gracz wpisze nazwe uzytkownika "Gracz1" wszystkie jego wygrane i przegrane byly doliczane do niego, a nie zeby tworzyl sie nowy wpis na liscie wynikow. Czy jedyna opcja jest przeszukiwanie calego pliku za kazdym razem w poszukiwaniu powtarzajacych sie nazw gracza?

2)Jak sprawic, zeby wynik sie zapamietywal i nadpisywal? Powiedzmy ze to moja 2 wygrana - jak zrobic, zeby program zamienil liczbe wygranych z 1 na 2? Jak zrobic zeby liczba zmienila sie w odpowiednim miejscu pliku tekstowego?

3)W ktorym momencie to wszystko posortowac? Bo chcialbym zeby wyniki sortowaly sie od najlepszego do najgorszego.

4)Jak sprawic zeby lista wyswietlala sie z poziomu programu?

Niestety nie mam kodu ktorym moglbym sie podzielic bo nawet nie wiem jak sie zabrac do tego. Wiem jak stworzyc nowy plik ktory bedzie dopisywal na koncu nazwe gracza i wynik, ale niewiele poza tym :(
komentarz 24 stycznia 2022 przez Wiciorny Ekspert (269,120 p.)
no to twoje studia, jesteś studentem więc powinieneś przerobić materiał, nauczyć się i stworzyć to co dostałeś na zadanie. Nikt tutaj gotowców nie napiszę, bo to zabronione według regulaminu, swoją drogą po co poszedłeś na studia w takim razie?

Zadanie na pewno nie padło z czapy, tylko jest one podyktowane materiałem z zajęć i tym co miałeś robić w domu
komentarz 24 stycznia 2022 przez Raven2221 Nowicjusz (200 p.)
O, super, dziękuję :) zapomniałem, że powinienem wszystko umieć i regulamin studiów zabrania mi zadawania jakichkolwiek pytań! Temat do zamknięcia :)
komentarz 24 stycznia 2022 przez TOWaD Mądrala (5,700 p.)
edycja 24 stycznia 2022 przez TOWaD
W C nie bardzo się czuję wiec ci nie pomogę. Ale użył bym zapisu binarnego bo wtedy nie przesuwa cię zawartości (jak zmienia się wartości ) i nie trzeba przepisywać pliku. Tą funkcją można skakać po pliku https://en.cppreference.com/w/c/io/ftell A każdy zawodnik powinien mieć swoją strukturę i ID w strukturze łatwy zapis i odczyt z danych z pliku (nowy -zawsze dodawany na końcu i z ostatnim ID), kopiowanie. Drugi plik do wyników tablicy wyników, trzeci do listy {node co tam - łatwo dodać i usunąć węzeł} wczytany na początku działania programu.

Edit:: i po co te nerwy po prostu c to trudny język i trzeba dużo własnego zaangażowania.

1 odpowiedź

+2 głosów
odpowiedź 25 stycznia 2022 przez mokrowski Mędrzec (155,460 p.)
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <time.h>
#include <string.h>

#define GAME_SCORES "scores.bin"
#define PLAYERS_COUNT 10
#define NAME_LENGTH   24

struct Player {
	char name[NAME_LENGTH];
	unsigned counter;
};

FILE * try_open_file(char * mode) {
	FILE * file = fopen(GAME_SCORES, mode);
	return file;
}

int read_score_table(FILE * file, struct Player * score_table, size_t count) {
	size_t cnt = fread(score_table, sizeof(struct Player), count, file);
	return cnt;
}

void write_file(FILE * file, const struct Player * score_table, size_t count) {
	fwrite(score_table, count, sizeof(struct Player), file);
}

void show_players(const struct Player * score_table, size_t count) {
	for (int i = 0; i < count; ++i) {
		printf( "----------------------\n"
			"Player: %s\n"
			"Score : %d\n",
			(char *)&(score_table[i].name),
			score_table[i].counter
		);
	}
}

void fill_example_players(struct Player * score_table, size_t count) {
	for (int i = 0; i < count; ++i) {
		memset(score_table[i].name, '\0', NAME_LENGTH - 1);
		char name[NAME_LENGTH] = {0};
		sprintf(name, "Player%d", i);
		strncpy((char *)&(score_table[i].name), name, NAME_LENGTH - 1);
		score_table[i].name[NAME_LENGTH - 1] = '\0';
		score_table[i].counter = rand() % 10;
	}
}

int compare_player_score(const void * p1, const void * p2) {
	const struct Player * player1 = p1;
	const struct Player * player2 = p2;
	int answer = 0;
	if (player1->counter == player2->counter) {
		answer = 0;
	} else if (player1->counter < player2->counter) {
		answer = 1;
	} else {
		answer = -1;
	}
	return answer;
}

void sort_players(struct Player * score_table, size_t count) {
	qsort(score_table, count, sizeof(struct Player), compare_player_score);
}

int main(void) {
	srand(time(0));

	struct Player score_table[PLAYERS_COUNT] = {0};

	fill_example_players(score_table, PLAYERS_COUNT);

	printf("***Before sort...***\n");
	show_players(score_table, PLAYERS_COUNT);
	sort_players(score_table, PLAYERS_COUNT);

	printf("***After sort...***\n");
	show_players(score_table, PLAYERS_COUNT);

	printf("***Write to file..***\n");
	FILE * file = try_open_file("w");
	if (file == NULL) {
		fprintf(stderr, "Error open %s file.\n", GAME_SCORES);
		exit(EXIT_FAILURE);
	}
	write_file(file, score_table, PLAYERS_COUNT);
	fclose(file);

	printf("***Read from file...***\n");
	struct Player other_score_table[PLAYERS_COUNT] = {0};
	file = try_open_file("r");
	if (file == NULL) {
		fprintf(stderr, "Error open %s file.\n", GAME_SCORES);
		exit(EXIT_FAILURE);
	}
	read_score_table(file, other_score_table, PLAYERS_COUNT);
	show_players(other_score_table, PLAYERS_COUNT);
	
	return 0;
}

 

Podobne pytania

+1 głos
1 odpowiedź 1,283 wizyt
0 głosów
1 odpowiedź 181 wizyt
pytanie zadane 23 października 2020 w C i C++ przez Colossus Mądrala (6,410 p.)
0 głosów
2 odpowiedzi 382 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...