ich in einem Intro zu C-Klasse bin, und mein Professor hat uns ein Spiel namens „Tee-Code zugewiesen Party "für unseren aktuellen Auftrag. Ich bin mit der Programmierung des Spiels fertig und es funktioniert größtenteils, aber es gibt einige gewisse Fehler, die ich nicht zu lösen scheint.C Spiel: Erstellen, aber ich bin immer einen weg durch einen Fehler und einen Endlosschleife Fehler in bestimmten Fällen
Die Regeln des Spiels sind einfach: zwei Spieler abwechselnd die Spinner (emulierten durch Eingabe von „0“ und der Eingabetaste drücken) und das Sammeln alle 7 Artikel für die Tea-Party-Spinnen. Der erste Spieler, der alle 7 Gegenstände erhält, gewinnt. Der einzige Haken ist, dass Sie kein Sandwich, Obst oder Dessert sammeln können, es sei denn, Sie haben zuerst einen Teller. Wenn du auf dem LOSE A PIECE-Feld landest, musst du eines deiner Teile aufgeben. Beide Fehler kommen von der verlorenen Instanz im Spiel, also denke ich, dass der Fehler von der Funktion "get_lost_piece" stammen muss.
Einer davon ist, dass die Stücke aus den „Player“ array numeriert sind eigenartig dadurch, dass sie 1-Wert höher ist als sie sein sollten. Der andere Fehler ist, dass wenn ein Spieler versucht, ihre Platte zu entfernen, während sie einen Gegenstand haben, die die Platte benötigt, sollte es ausdrucken „Sorry, es schlechte Manieren ist, ohne eine Platte zu essen eine andere Wahl eingeben.“, Sondern ich Holen Sie sich eine Endlosschleife, die lautet: "Sie haben Gegenstand 1 verloren." Hier
ist der Code, den ich habe:
#include <stdio.h>
#include <time.h>
#define SLOW_MODE 1
#define NUMPLAYERS 2
#define NUMPIECES 7
#define MAXLEN 20
#define NO_WINNER -1
const char CHOICES[NUMPIECES+1][MAXLEN] = {"PLATE", "NAPKIN", "TEA CUP", "CREAM AND SUGAR", "SANDWICH", "FRUIT", "DESSERT", "LOSE A PIECE"};
void update_player(int player[], int square);
int get_lost_piece(int player[]);
int search(int piece_list[], int choice);
int get_spin();
void init_player(int player[]);
int get_winner(int players[][NUMPIECES]);
int get_next_player(int player_num);
int count_pieces(int player[]);
void print_player(int player[], int player_num);
int main() {
srand(time(0));
int players[NUMPLAYERS][NUMPIECES];
// Initialize each player in the game.
int i;
for (i=0; i<NUMPLAYERS; i++)
init_player(players[i]);
int player_number = 0;
// Play until we get a winner.
int status = get_winner(players);
while (status == NO_WINNER) {
int dummy;
// In slow mode, we stop before every spin.
if (SLOW_MODE) {
printf("Player %d, it is your turn. Type 0 and enter to spin.\n", player_number+1);
scanf("%d", &dummy);
}
// Get the current player's spin and print out her pieces.
int square = get_spin();
printf("Player %d, have landed on the square %s.\n", player_number+1, CHOICES[square]);
update_player(players[player_number], square);
print_player(players[player_number], player_number+1);
// Update the game status.
player_number = get_next_player(player_number);
status = get_winner(players);
printf("\n\n");
}
printf("Congrats player %d, you win!\n", status+1);
return 0;
}
// Pre-conditions: player stores the contents of one player and square is in between 0 and 7, inclusive.
// Post-conditions: The turn for player will be executed with the given square selected.
void update_player(int player[], int square) {
if (square == 7) {
if (count_pieces(player) == 0)
{
printf("There is no piece for you to lose. Lucky you, sort of.\n");
return;
}
else{
int q;
q = get_lost_piece(player);
player[q]= 0;
}
return;
}
player[square]=search(player, square);
// Restricted by having no plate!
if (player[0] == 0) {
if(square == 4 || square == 5 ||square == 6){
printf("Sorry, you can't obtain that item because you don't have a plate yet.\n");}
else{
if (player[square] == 0){
player[square]++;
}
}
}
// Process a regular case, where the player already has a plate.
else {
if (player[square] == 0){
player[square]++;
}
}
}
// Pre-conditions: player stores the contents of one player that has at least one piece.
// Post-conditions: Executes asking a player which item they want to lose, and reprompts them
// until they give a valid answer.
int get_lost_piece(int player[]) {
int choice = -1;
// Loop until a valid piece choice is made.
while (1) {
if (choice == -1){
printf("Which piece would you like to lose?\n");
print_player(player,choice);
scanf("%d", &choice);}
if (player[choice] == 0 && choice < 7 && choice >= 0){
printf("Sorry, that was not one of the choices");
scanf("%d", &choice);
}
if (player[0] == 1 && choice == 4 || choice == 5 ||choice == 6){
printf("Sorry, it is bad manners to eat without a plate. Enter another choice:\n");
scanf("%d", &choice);
}
else{
printf("You lost piece %d\n", choice);
}
}
return choice;
}
// Pre-conditions: piece_list stores the contents of one player
// Post-conditions: Returns 1 if choice is in between 0 and 6, inclusive and corresponds to
// an item in the piece_list. Returns 0 if choice is not valid or if the
// piece_list doesn't contain it.
int search(int piece_list[], int choice) {
int i;
for (i=0; i<NUMPIECES; i++){
if(piece_list[i]==choice){
return 1;}
else {return 0;}
}
}
// Pre-condition: None
// Post-condition: Returns a random value in between 0 and 7, inclusive.
int get_spin() {
return rand() % 8;
}
// Pre-condition: None
// Post-condition: Initializes a player to have no pieces.
void init_player(int player[]) {
int j;
for (j=0; j< NUMPIECES; j++)
player[j]=0;
}
// Pre-condition: players stores the current states of each player in the tea party game.
// Post-condition: If a player has won the game, their 0-based player number is returned.
// In the case of no winners, -1 is returned.
int get_winner(int players[][NUMPIECES]) {
int i =0;
for (i=0; i<NUMPLAYERS; i++){
if(count_pieces(players[i]) == NUMPIECES) {
return i;}
}
return -1;
}
// Pre-condition: 0 <= player_num < NUMPLAYERS
// Post-condition: Returns the number of the next player, in numerical order, with
// a wrap-around to the beginning after the last player's turn.
int get_next_player(int player_num) {
player_num++;
if (player_num == NUMPLAYERS){
player_num = 0;
}
return player_num;
}
// Pre-conditions: player stores the contents of one player
// Post-conditions: Returns the number of pieces that player has.
int count_pieces(int player[]) {
int y, counter;
counter = 0;
for (y = 0; y < 7; y++){
if(player[y] == 1){
counter++;
}
}
return counter;
}
// Pre-conditions: player stores the contents of one player and player_num is that
// player's 1-based player number.
// Post-conditions: Prints out each item the player has, numbered with the numerical
// "codes" for each item.
void print_player(int player[], int player_num) {
int i;
printf("\n");
printf("Player %d\n", player_num);
for (i=0; i < 7; i++){
if (player[i] == 1){
printf("%d. %s\n", i + 1, CHOICES[i]);
}
}
}
Danke für die Hilfe im Voraus. Ich habe das Gefühl, dass mir die Lösung direkt ins Gesicht schaut, aber nachdem ich ein paar Tage damit verbracht habe, habe ich Schwierigkeiten, das Problem zu erkennen.
Nun, das erste Problem, das ich ist zu sehen, dass es keine Möglichkeit gibt, aus dem 'while (1)' Schleife in 'get_lost_piece' zu brechen. Wahrscheinlich möchten Sie die 'return choice;' direkt nach 'printf (" Sie haben% d \ n verloren ", choice);'. – jwodder
Können Sie bitte Ihren Beitrag bearbeiten und den ersten Teil des Textes in lesbare Absätze aufteilen?So wie es ist, ist es fast unmöglich durchzuwaten, weil alles ein Durcheinander ist. Sie haben Absätze erstellt, um zu verhindern, dass dies zu einem Problem wird. :) Vielen Dank. –
Entschuldigung, Ken, ich hoffe es ist diesmal besser lesbar. – Batteries