Quiz-Spiele sind seit vielen Jahren äußerst beliebt. Egal, ob im linearen Fernsehen, auf YouTube oder in geselliger Runde mit Freunden und Familie: Das Wetteifern um die richtigen Antworten bereitet meist großes Vergnügen. Warum also nicht Dein eigenes Spiel entwickeln?
Das wäre doch großartig, oder? Freunde kommen zu Besuch, um einen unterhaltsamen Abend zu verbringen. Und Du hast da auch schon etwas vorbereitet: Dein eigenes Quiz-Spiel! Den Laptop an den Fernseher oder Projektor angeschlossen, und schon kann es losgehen. Die Spieler haben die Wahl zwischen mehreren Kategorien – oder sie wählen einfach alle aus. Jede Frage muss innerhalb weniger Sekunden beantwortet werden. Wer am Ende die meisten Punkte hat, gewinnt.
Um das zu realisieren, habe ich einen kleinen Prototyp gebastelt, den Du nach Belieben verändern und erweitern kannst. Alles, was Du brauchst, ist die kostenlose Version von GameMaker Studio 2, den Download des Prototyps (findest Du unten) und ein bisschen Zeit. Vor allem, um zahlreiche Fragen und Antworten vorzubereiten.
Was kann der Prototyp?
Ich habe vier Kategorien mit jeweils 20 Fragen vorbereitet. Das ist zwar nicht viel, aber immerhin ein Anfang. Die Kategorien sind:
- Allgemeinwissen
- Geschichte
- Wissenschaft
- Sport
Die Spieler können entweder eine Kategorie wählen oder alle. Du kannst natürlich auch Deine eigenen Kategorien erstellen. Zum Beispiel, wenn Du ein Quiz für eine Hochzeit oder einen Geburtstag entwerfen möchtest. Oder für die Schule, Studenten, ein Firmenjubiläum oder Deinen Sportverein.
Die Anzahl der gestellten Fragen und die Zeit pro Frage sind anpassbar. Standardmäßig werden fünf Fragen gestellt, und jede muss innerhalb von 15 Sekunden beantwortet werden. Je schneller geantwortet wird, desto mehr Punkte gibt es. Am Ende wird die Gesamtpunktzahl angezeigt. Außerdem wird darauf geachtet, dass pro Runde keine Frage doppelt gestellt wird.
Farben und Schriften kannst Du ganz einfach anpassen. Ebenso die Fragen und Antworten, die in einem Array hinterlegt sind. Neben der Frage und den Antwortmöglichkeiten siehst Du die aktuelle Punktzahl, die verbleibende Zeit und die Anzahl der bisher gestellten Fragen. Unten läuft sogar ein Zeitbalken, um das Ganze ein wenig spannender zu machen.
Steuerung
Du kannst das Spiel entweder per Tastatur (Nummern) oder per Maus steuern. Dank der Maussteuerung sollte auch eine Touch-Bedienung funktionieren – das konnte ich allerdings nicht testen.
Nur ein Prototyp!
Ich habe versucht, einen guten Kompromiss zwischen Funktionalität, Anpassbarkeit und Übersichtlichkeit zu finden. Das bedeutet, dass wahrscheinlich einige Features fehlen. Es gibt auch nur einen Einspielermodus. Das heißt: In einer Gruppe kann nacheinander gespielt und die Punkte notiert werden. Eine Highscore-Liste und andere Kinkerlitzchen fehlen ebenfalls.
Eine sinnvolle Verbesserung wäre eine kurze Pause zwischen den Fragen, in der klar signalisiert wird, ob die Antwort richtig oder falsch war und, wenn falsch, was die richtige Antwort gewesen wäre. Aber das sollte kein großer Aufwand sein, falls Du es nachträglich realisieren möchtest.
Gegebenenfalls wäre auch noch eine Gamepad-Steuerung sinnvoll, aber dies zu ergänzen ist in GameMaker Studio nicht sonderlich schwierig.
Im Folgenden werde ich den Aufbau und den Code erklären. Du kannst aber auch einfach ganz nach unten scrollen und den Prototyp herunterladen.
Aufbau
Wir haben nur einen Raum und zwei Objekte.
obj_menu
: Das Hauptmenü mit dem Titel. Hier wählt der Spieler die Kategorie aus.
obj_quiz
: Das eigentliche Spiel mit der Spiellogik.
Wir starten also mit obj_menu
. Der Spieler wählt die Kategorie aus. Dann wird obj_menu
gelöscht und obj_quiz
erstellt. Wenn das Quiz vorbei ist, kann der Spieler wählen, ob er zurück zum Menü will um eine neue Kategorie zu wählen oder eine neue Runde spielen möchte. Dabei lässt sich alles per Tastendruck (Zahlen) oder Maus steuern.
Schauen wir uns den Code an.
obj_menu
Wir haben insgesamt fünf Events.
Event Create
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | // Globale Variablen globalvar all_categories, all_questions, categorie, max_questions; all_categories = []; all_questions = []; categorie = 5; // 1-4 einzelne Kategorie, 5=alle max_questions = 5; init_questions(); menu_categories = all_categories; // Wir laden die Kategorien array_push(menu_categories, "Alle Kategorien"); // Und fügen die zusätzliche Option hinzu x_center = room_width/2; y_center = room_height/2; // Position Kategorien categories_y = 355; // Startposition categories_height = 64; // Höhe jeder Kategorie categories_padding = 16; // Abstand zwischen den Kategorien box_padding = 20; // Padding für die Boxen // Farbanpassungen color_background_start = #5D4C52; // Hintergrund 1 color_background_end = #0F0D0E; // Hintergrund 2 color_title = #F2EBC0; // Titel color_categorie_box = #F2EBC0; // Antwortboxen color_categorie_text = #4B493D; // Antworten color_select = #D5C45B; // Markierung der Antwort |
Hier haben wir die wichtigsten Einstellungen. Werte, die wir später im Quiz brauchen, sind global.
Event Step
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // Tastatureingabe optimiert if keyboard_check_released(vk_anykey) { var _key_pressed = keyboard_lastkey; if (_key_pressed >= ord("1") && _key_pressed <= ord("5")) { set_category_and_destroy(_key_pressed - ord("0")); // Konvertiert die Taste '1'-'5' in Kategorie 1-5 } } // Mausabfrage optimiert if (mouse_check_button_released(mb_left)) { var _categories_y_step = categories_y; for (var _i = 0; _i < array_length(menu_categories); _i++) { if (point_in_rectangle(mouse_x, mouse_y, x_center-400, _categories_y_step, x_center+400, _categories_y_step+categories_height)) { set_category_and_destroy(_i + 1); // Kategorien starten bei 1 break; // Sobald eine Kategorie gewählt wurde, ist keine weitere Schleifeniteration nötig } _categories_y_step += categories_height + categories_padding; } } |
Das ist lediglich Tastatur und Maussteuerung. Sobald gewählt wurde, lassen wir die Instanz sterben.
Event Draw
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // Transparenz und Ausrichtung draw_set_alpha(1); draw_set_halign(fa_center); draw_set_valign(fa_middle); draw_set_font(fnt_title); // Hintergrund für den gesamten Raum draw_rectangle_color(0, 0, room_width, room_height, color_background_start, color_background_start, color_background_end, color_background_end, false); draw_set_color(color_title); draw_text(x_center, 132, "QUIZ CHAMPION"); // Kategorien draw_set_font(fnt_answer); // Zeichne die Kategorien mit Hintergrund var _categories_y_step = categories_y; for (var _i = 0; _i < array_length(menu_categories); _i++) { if (point_in_rectangle(mouse_x, mouse_y, x_center-400, _categories_y_step, x_center+400, _categories_y_step+categories_height)) { draw_set_color(color_select); } else { draw_set_color(color_categorie_box); } draw_rectangle(x_center-400, _categories_y_step-box_padding, x_center+400, _categories_y_step+categories_height+box_padding, false); draw_set_color(color_categorie_text); // Textfarbe draw_text(x_center, _categories_y_step+(categories_height/2)-6, $"{_i + 1}: {menu_categories[_i]}"); _categories_y_step += categories_height+categories_padding; // Position für die nächste Kategorie } |
In der Schleife werden nacheinander die Kategorien aufgelistet. Je nachdem, wo die Maus ist, wird das Rechteck dahinter in einer anderen Farbe gezeichnet. Wer genau hinschaut, wird bemerken, dass ich Template Strings verwende.
Escape-Taste losgelassen
1 2 3 4 | /// @description Game End if (!os_browser) { game_end(); } |
Wenn wir nicht im Browser sind, wird das Spiel geschlossen.
Event Destroy
1 2 3 | if (!instance_exists(obj_quiz)) { instance_create_layer(0, 0, "Instances", obj_quiz); } |
Bevor die Instanz zerstört wird, erstellen wir das Quiz-Objekt.
obj_quiz
Auch hier haben wir fünf Events. Alle Funktionen, die wir verwenden, schauen wir uns weiter unten an.
Event Create
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | init_questions(); randomize(); score = 0; current_question = 0; asked_questions = 0; max_time = 15; time_left = max_time; game_over = false; used_questions = []; // Liste der bereits gestellten Fragen pro Runde answer_options = []; x_center = room_width/2; y_center = room_height/2; // Position Antworten answer_y = 355; // Startposition für die Antworten answer_height = 64; // Höhe jedes Antwortfelds answer_padding = 16; // Abstand zwischen den Antwortfeldern box_padding = 20; // Padding für die Boxen // Farbanpassungen color_background = #5D4C52; // Hintergrund 1 color_background_fade = #0F0D0E; // Hintergrund 2 color_question = #F2EBC0; // Text der Frage color_answer_box = #F2EBC0; // Antwortboxen color_answer_text = #4B493D; // Antworten color_info_bg = #F3B462; // Info-Hintergrundbox color_time_bar = #F3B462; // Zeit-Balken color_gameover_text = #f4EDC6; // Text am Spielende color_buttons = #1E90FF; // Buttons color_white = #FFFFFF; // Allgemeine Textelemente color_select = #D5C45B; // Markierung der Antwort // Lade die erste Frage load_question(categorie); |
Hier kann man einige Dinge anpassen, etwa Positionen, Farben oder die Zeit pro Frage.
Event Step
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | if (!game_over) { time_left -= delta_time/1000000; // In Sekunden // Wenn die Zeit abgelaufen ist, wird die nächste Frage geladen if (time_left <= 0) { asked_questions += 1; if (asked_questions < max_questions) { load_question(categorie); } else { game_over = true; // Spiel endet, alle Fragen wurden beantwortet used_questions = []; } } // Tastatureingabe if keyboard_check_released(vk_anykey) { var _key_pressed = keyboard_lastkey; if (_key_pressed >= ord("1") && _key_pressed <= ord("4")) { check_answer(_key_pressed - ord("0")-1); // Konvertiert die Taste '1'-'5' in Antworten 1-5 } } // Mausabfrage if (mouse_check_button_released(mb_left)) { var _answer_y_step = answer_y; for (var _i = 0; _i < array_length(answer_options); _i++) { if (point_in_rectangle(mouse_x, mouse_y, x_center-400, _answer_y_step, x_center+400, _answer_y_step+answer_height)) { check_answer(_i); } _answer_y_step += answer_height+answer_padding; // Position für die nächste Antwort } } } else { // Tastatureingabe if (keyboard_check_released(ord("1"))) { instance_destroy(); // Menü } else if (keyboard_check_released(ord("2"))) { new_round(); // Neue Runde } if (mouse_check_button_released(mb_left)) { // Menü if (point_in_rectangle(mouse_x, mouse_y, x_center-500, y_center+90, x_center-100, y_center+160)) { instance_destroy(); } // Neue Runde if (point_in_rectangle(mouse_x, mouse_y, x_center+100, y_center+90, x_center+500, y_center+160)) { new_round(); } } } |
Zunächst unterscheiden wir, ob das Spiel vorbei ist (game_over
) oder nicht. Wenn das Spiel läuft, läuft auch die Zeit runter (time_left
). Anschließend kommt die Abfrage der Steuerung.
Wenn das Spiel vorbei ist, werden zwei Buttons angezeigt, dessen Steuerung wir hier ebenfalls kontrollieren (Tastatur und Maus). Dargestellt wird das natürlich im Draw-Event.
Event Draw
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | // Transparenz und Ausrichtung draw_set_alpha(1); draw_set_halign(fa_center); draw_set_valign(fa_middle); draw_set_font(fnt_question); // Hintergrund für den gesamten Raum draw_rectangle_color(0, 0, room_width, room_height, color_background, color_background, color_background_fade, color_background_fade, false); if (!game_over) { draw_set_color(color_question); // Fragefarbe var _max_question_width = room_width-100; // Maximale Breite für die Frage var _line_height = 46; // Abstand zwischen den Zeilen // Zeichne die Frage mit automatischen Zeilenumbrüchen draw_text_ext(x_center, 164, question_text, _line_height, _max_question_width); draw_set_font(fnt_answer); // Zeichne die Antwortfelder mit Hintergrund var _answer_y_step = answer_y; for (var _i = 0; _i < array_length(answer_options); _i++) { // Hintergrundfarbe für die Antwortboxen // Selektiert oder nicht? if (point_in_rectangle(mouse_x, mouse_y, x_center-400, _answer_y_step, x_center+400, _answer_y_step+answer_height)) { draw_set_color(color_select); } else { draw_set_color(color_answer_box); } draw_rectangle(x_center-400, _answer_y_step-box_padding, x_center+400, _answer_y_step+answer_height+box_padding, false); draw_set_color(color_answer_text); // Textfarbe // Zentriere den Text in der Mitte der Box draw_text(x_center, _answer_y_step+(answer_height/2)-6, $"{_i + 1}: {answer_options[_i]}"); _answer_y_step += answer_height+answer_padding; // Position für die nächste Antwort } // Zeit und Punkte mit Hintergrund var _info_bg_height = 80; // Höhe für den Hintergrund draw_set_color(color_info_bg); // Hintergrundfarbe für die Infoleiste draw_rectangle(0, 0, room_width, _info_bg_height, 0); draw_set_font(fnt_score); draw_set_halign(fa_center); draw_set_color(color_white); // Setze die Textfarbe auf Weiß draw_text(x_center, 40, $"{asked_questions+1}/{max_questions}"); draw_set_halign(fa_left); draw_text(32, 40, $"Zeit übrig: {round(time_left)}"); draw_set_halign(fa_right); draw_text(room_width-32, 40, $"Punkte: {score}"); // Ladebalken var _bar_height = 40; // Höhe des Ladebalkens var _bar_x = 0; // X-Position des Balkens var _bar_y = room_height-_bar_height; // Y-Position des Balkens var _bar_width = room_width*(time_left/max_time); // Breite basierend auf der verbleibenden Zeit draw_set_color(color_time_bar); // Grüner Ladebalken draw_rectangle(_bar_x, _bar_y, _bar_x+_bar_width, _bar_y+_bar_height, false); } else { draw_set_color(color_buttons); draw_button(x_center-500, y_center+90, x_center-100, y_center+160, !mouse_check_button(mb_left)); draw_button(x_center+100, y_center+90, x_center+500, y_center+160, !mouse_check_button(mb_left)); draw_set_color(color_gameover_text); // Textfarbe für das Spielende draw_text(x_center, y_center-200, $"Das Spiel ist vorbei!\n\nDu hast {score} Punkte."); draw_text(x_center-300, y_center+125, "Menü (1)"); draw_text(x_center+300, y_center+125, "Neue Runde (2)"); } |
Das Prinzip ist hier ganz ähnlich wie im Menü, nur das wir, wie im Step-Event, erneut zwei Zustände haben. Die GML-Buttons sind wirklich nicht toll, aber ich wollte das man bei einem Projekt verwenden.
Escape-Taste losgelassen
1 2 | /// @description zum Hauptmenü instance_destroy(); |
Wenn wir nicht im Browser sind, wird die Instanz gelöscht.
Event Destroy
1 2 3 | if (!instance_exists(obj_menu)) { instance_create_layer(0, 0, "Instances", obj_menu); } |
Bevor die Instanz zerstört wird, erstellen wir das Menü-Objekt.
Jetzt schauen wir uns noch die Skripte an.
Skripte
init_questions
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | // Kategorien und Fragen function init_questions() { // Kategorien all_categories = [ "Allgemeinwissen", "Geschichte", "Wissenschaft", "Sport" ]; all_questions = [ // Allgemeinwissen [ ["Was ist die Hauptstadt von Frankreich?", ["Berlin", "Madrid", "Paris", "Rom"], 2], ["Welcher Planet ist der Erde am nächsten?", ["Venus", "Mars", "Merkur", "Jupiter"], 0], ["Wie viele Kontinente gibt es auf der Erde?", ["5", "6", "7", "8"], 2], ["Wer malte die Mona Lisa?", ["Vincent van Gogh", "Pablo Picasso", "Leonardo da Vinci", "Claude Monet"], 2], ["Was ist das größte Land der Welt?", ["Kanada", "USA", "Russland", "China"], 2], ["Wie viele Tage hat ein Schaltjahr?", ["365", "366", "367", "364"], 1], ["Wer erfand das Telefon?", ["Thomas Edison", "Alexander Graham Bell", "Nikola Tesla", "Albert Einstein"], 1], ["Was ist die chemische Formel für Wasser?", ["CO2", "O2", "H2", "H2O"], 3], ["Welches Tier ist das größte Landtier?", ["Elefant", "Nashorn", "Giraffe", "Pferd"], 0], ["In welchem Jahr landeten die ersten Menschen auf dem Mond?", ["1965", "1969", "1972", "1961"], 1], ["Was ist die Währung in Japan?", ["Yuan", "Won", "Yen", "Baht"], 2], ["Wie viele Farben hat ein Regenbogen?", ["5", "6", "7", "8"], 2], ["Wer schrieb 'Die Verwandlung'?", ["Hermann Hesse", "Thomas Mann", "Goethe", "Franz Kafka"], 3], ["Was ist die kleinste Einheit des Lebens?", ["Molekül", "Zelle", "Atom", "Organismus"], 1], ["Was ist das Hauptbestandteil von Erdöl?", ["Methan", "Ethan", "Butan", "Propangas"], 0], ["Welches Element hat das chemische Symbol 'O'?", ["Gold", "Silber", "Sauerstoff", "Zink"], 2], ["Was ist der längste Fluss der Welt?", ["Amazonas", "Nil", "Yangtse", "Mississippi"], 1], ["In welchem Land liegt die Pyramide von Gizeh?", ["Mexiko", "Ägypten", "Griechenland", "Türkei"], 1], ["Wie viele Spieler hat eine Fußballmannschaft?", ["9", "10", "11", "12"], 2], ["Was ist der größte Ozean der Erde?", ["Atlantischer Ozean", "Indischer Ozean", "Arktischer Ozean", "Pazifischer Ozean"], 3], ["Wer war der erste Präsident der Vereinigten Staaten?", ["George Washington", "Abraham Lincoln", "Thomas Jefferson", "John Adams"], 0] ], // Geschichte [ ["Wer war der erste römische Kaiser?", ["Julius Caesar", "Augustus", "Nero", "Tiberius"], 1], ["In welchem Jahr begann der Zweite Weltkrieg?", ["1937", "1939", "1941", "1945"], 1], ["Welches Land war das erste, das Frauen das Wahlrecht gab?", ["USA", "Neuseeland", "Schweiz", "Frankreich"], 1], ["Wer war der Hauptautor der Unabhängigkeitserklärung der USA?", ["Benjamin Franklin", "George Washington", "Thomas Jefferson", "John Adams"], 2], ["Welcher berühmte englische König wurde 1215 gezwungen, die Magna Carta zu unterzeichnen?", ["Richard Löwenherz", "Johann Ohneland", "Heinrich VIII.", "Edward I."], 1], ["Wer entdeckte Amerika?", ["Leif Erikson", "Christoph Kolumbus", "Ferdinand Magellan", "Hernán Cortés"], 1], ["Welches Ereignis führte zur Französischen Revolution?", ["Der Sturz der Bastille", "Der Erste Weltkrieg", "Die Erklärung der Menschenrechte", "Der Amerikanische Bürgerkrieg"], 0], ["Welches Reich erstreckte sich über drei Kontinente zur Zeit seiner größten Ausdehnung?", ["Das Römische Reich", "Das Mongolische Reich", "Das Osmanische Reich", "Das Britische Empire"], 3], ["Wer war der Anführer der Sowjetunion während des Zweiten Weltkriegs?", ["Joseph Stalin", "Vladimir Lenin", "Leon Trotsky", "Nikita Chruschtschow"], 0], ["In welchem Jahr fiel die Berliner Mauer?", ["1987", "1989", "1991", "1993"], 1], ["Welches berühmte Dokument wurde 1776 verabschiedet?", ["Die Bill of Rights", "Die Verfassung der Vereinigten Staaten", "Die Unabhängigkeitserklärung", "Die Magna Carta"], 2], ["Wer war die erste weibliche Premierministerin des Vereinigten Königreichs?", ["Margaret Thatcher", "Angela Merkel", "Indira Gandhi", "Golda Meir"], 0], ["Welches antike Wunder befand sich in Babylon?", ["Die Pyramiden von Gizeh", "Der Koloss von Rhodos", "Die Hängenden Gärten", "Der Tempel der Artemis"], 2], ["In welchem Jahr fand die erste Mondlandung statt?", ["1965", "1969", "1972", "1980"], 1], ["Wer war der berühmte Führer der Indianer während der Trail of Tears?", ["Sitting Bull", "Geronimo", "Chief Joseph", "Andrew Jackson"], 3], ["Was war die Ursache des Amerikanischen Bürgerkriegs?", ["Sklaverei", "Wirtschaftskrisen", "Territorialkonflikte", "Frauenrechte"], 0], ["In welchem Land fand die erste industrielle Revolution statt?", ["USA", "Frankreich", "Deutschland", "Vereinigtes Königreich"], 3], ["Wer war der erste Mensch im Weltraum?", ["Yuri Gagarin", "Neil Armstrong", "Buzz Aldrin", "John Glenn"], 0], ["In welchem Jahr wurde die NATO gegründet?", ["1945", "1949", "1952", "1960"], 1], ["Wer war der berühmte Anführer der französischen Truppen während der Napoleonischen Kriege?", ["Napoleon Bonaparte", "Louis XIV.", "Charlemagne", "Henri IV."], 0], ["Was war das Hauptziel der Kreuzzüge?", ["Die Kontrolle über Jerusalem", "Die Verbreitung des Christentums", "Die Errichtung von Handelsrouten", "Die Bekämpfung von Heiden"], 0] ], // Wissenschaft [ ["Wer entdeckte das Penicillin?", ["Marie Curie", "Alexander Fleming", "Louis Pasteur", "Robert Koch"], 1], ["Was ist die chemische Formel für Salzsäure?", ["H2", "O2", "CO2", "HCl"], 3], ["Welche Farbe hat Chlorophyll?", ["Rot", "Blau", "Grün", "Gelb"], 2], ["Wer entwickelte die Relativitätstheorie?", ["Isaac Newton", "Albert Einstein", "Galileo Galilei", "Stephen Hawking"], 1], ["Wie viele Planeten hat unser Sonnensystem?", ["7", "8", "9", "10"], 1], ["Welches Element hat das chemische Symbol 'Ag'?", ["Osmium", "Oxygen", "Gold", "Silber"], 3], ["Wer erfand das Periodensystem der Elemente?", ["Dmitri Mendelejew", "Marie Curie", "Ernest Rutherford", "Niels Bohr"], 0], ["Wie lautet die Formel für die Berechnung der Energie in Einsteins berühmter Gleichung?", ["E = m²", "E = mc²", "E = mv²", "E = mc"], 1], ["Welches Gas ist am häufigsten in der Erdatmosphäre?", ["Sauerstoff", "Kohlenstoffdioxid", "Stickstoff", "Wasserstoff"], 2], ["Wie nennt man das Studium von Pflanzen?", ["Zoologie", "Botanik", "Geologie", "Astronomie"], 1], ["Welche Säure befindet sich im menschlichen Magen?", ["Schwefelsäure", "Zitronensäure", "Salzsäure", "Essigsäure"], 2], ["Welcher Planet ist der größte in unserem Sonnensystem?", ["Erde", "Mars", "Jupiter", "Saturn"], 2], ["Was ist die Lichtgeschwindigkeit?", ["300.000 km/h", "300.000 m/s", "300.000 km/s", "300.000 mi/s"], 2], ["Welches Organ pumpt Blut durch den menschlichen Körper?", ["Leber", "Lunge", "Herz", "Niere"], 2], ["Was ist der kleinste chemisch unteilbare Baustein?", ["Atom", "Zelle", "Molekül", "Protein"], 0], ["Wer entdeckte die DNA-Struktur?", ["Gregor Mendel", "Watson und Crick", "Marie Curie", "Charles Darwin"], 1], ["Wie viele Chromosomen hat der Mensch?", ["23", "46", "22", "44"], 1], ["Welches Element wird für die Herstellung von Computerchips verwendet?", ["Kupfer", "Gold", "Silicium", "Eisen"], 2], ["Was ist das schwerste natürliche Element auf der Erde?", ["Gold", "Uran", "Blei", "Eisen"], 1], ["Wie nennt man die Lehre vom Verhalten und Aufbau des Universums?", ["Biologie", "Geologie", "Kosmologie", "Astronomie"], 3] ], // Sport [ ["Welches Land hat die meisten Fußball-Weltmeisterschaften gewonnen?", ["Deutschland", "Brasilien", "Italien", "Argentinien"], 1], ["In welchem Jahr fanden die ersten modernen Olympischen Spiele statt?", ["1896", "1900", "1920", "1948"], 0], ["Wie oft wurde der FC Schalke 04 Deutscher Meister?", ["1", "3", "5", "7"], 3], ["Wer gewann die Schachweltmeisterschaft 1972?", ["Michail Botwinnik", "Boris Spasski", "Bobby Fischer", "Garri Kasparow"], 2], ["Welcher Tennisspieler hat die meisten Grand-Slam-Titel gewonnen?", ["Rafael Nadal", "Roger Federer", "Novak Djokovic", "Pete Sampras"], 2], ["Wie lange dauert ein Rugby-Spiel normalerweise?", ["60 Minuten", "70 Minuten", "80 Minuten", "90 Minuten"], 2], ["Welche Sportart wird auf Eis mit Schlägern und einem Puck gespielt?", ["Eishockey", "Curling", "Eiskunstlauf", "Snowboarding"], 0], ["In welchem Jahr gewann die deutsche Fußballnationalmannschaft zuletzt die Fußballweltmeisterschaft?", ["2006", "2010", "2014", "2018"], 2], ["Wie viele Figuren stehen zu Spielbeginn auf einem Schachbrett?", ["8", "16", "32", "64"], 2], ["Wie viele Runden gibt es in einem Boxkampf?", ["10", "12", "15", "20"], 1], ["Welcher Golfer hat die meisten Major-Titel gewonnen?", ["Jack Nicklaus", "Tiger Woods", "Arnold Palmer", "Phil Mickelson"], 0], ["Wer hält den aktuellen 100-Meter-Weltrekord bei den Männern?", ["Carl Lewis", "Yohan Blake", "Usain Bolt", "Tyson Gay"], 2], ["In welcher Stadt fanden die Olympischen Sommerspiele 2008 statt?", ["London", "Peking", "Sydney", "Athen"], 1], ["Welches Team gewann die UEFA Champions League 2020/2021?", ["FC Chelsea", "Real Madrid", "Manchester City", "FC Liverpool"], 0], ["Welches Land hat die meisten Medaillen bei den Olympischen Winterspielen gewonnen?", ["Deutschland", "USA", "Norwegen", "Russland"], 2], ["Wie viele Minuten dauert ein Basketballspiel in der NBA?", ["48 Minuten", "60 Minuten", "72 Minuten", "40 Minuten"], 0], ["Wie viele Grand-Slam-Turniere gibt es im Tennis pro Jahr?", ["2", "3", "4", "5"], 2], ["Welcher deutsche Formel-1-Fahrer gewann sieben Weltmeisterschaften?", ["Sebastian Vettel", "Michael Schumacher", "Nico Rosberg", "Heinz-Harald Frentzen"], 1], ["Welches Land hat die Tour de France am häufigsten gewonnen?", ["Spanien", "Frankreich", "Italien", "USA"], 1], ["In welcher Sportart gibt es die 'Sizilianische Verteidigung'?", ["Fußball", "Basketball", "Schach", "Baseball"], 2] ] ]; } |
Die Kategorien sind ein einfaches Array. Die Fragen sind wie folgt aufgebaut:
["Frage", ["Antwort 1", "Antwort 2", "Antwort 3", "Antwort 4"], 0]
Die Zahl am Ende gibt an, welche Antwort richtig ist. Bitte berücksichtigen, dass die Zählung bei Null beginnt!
set_category_and_destroy
1 2 3 4 5 | // Funktion zur Kategorieauswahl und Instanzzerstörung function set_category_and_destroy(_category) { categorie = _category; instance_destroy(); } |
Diese Funktion wird im Step-Event des Menüs aufgerufen. Wir legen die Zahl der Kategorie fest und zerstören die Instanz.
load_question
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | function load_question(_selected_category) { if (categorie == 5) { // Wähle eine zufällige Kategorie (1 bis 4) _selected_category = irandom(3); // irandom(3) gibt 0 bis 3 zurück, was den Kategorien 1 bis 4 entspricht } else { // Setze die ausgewählte Kategorie direkt _selected_category = categorie-1; // Ziehe 1 ab, da die Indizes bei 0 beginnen } // Wähle die Fragenliste der gewählten Kategorie var _question_list = all_questions[_selected_category]; // Überprüfen, ob alle Fragen bereits gestellt wurden if (array_length(used_questions) == array_length(_question_list)) { // Alle Fragen wurden gestellt, also leere die Liste der verwendeten Fragen used_questions = []; } // Wähle eine neue Frage, die noch nicht verwendet wurde do { current_question = irandom(array_length(_question_list) - 1); // Zufälligen Index auswählen } until (!array_contains(used_questions, current_question)); // Stelle sicher, dass die Frage noch nicht verwendet wurde // Füge die gewählte Frage zur Liste der verwendeten Fragen hinzu array_push(used_questions, current_question); // Frage abrufen var _question_data = _question_list[current_question]; question_text = _question_data[0]; answer_options = _question_data[1]; correct_answer = _question_data[2]; // Starte den Timer time_left = max_time; } |
Hier wird die nächste Frage geladen und dabei berücksichtigt, dass keine Frage doppelt gestellt wird. Die nächste Frage, Antworten und richtige Antwort wird in den Variablen question_text
, answer_options
und correct_answer
gespeichert. Am Ende setzen wir die Zeit zurück auf max_time
.
check_answer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function check_answer(_selected_answer) { if (_selected_answer == correct_answer) { score += round(time_left); // Punkte basierend auf der verbleibenden Zeit } asked_questions += 1; if (asked_questions < max_questions) { load_question(categorie); // Lade die nächste Frage } else { game_over = true; // Spiel endet, alle Fragen wurden beantwortet used_questions = []; } } |
Mit dieser Funktion überprüfen wir, ob die Antwort richtig war. Wenn alle Fragen gestellt wurden, wird die Runde beendet. Übrigens: Gleich am Anfang wird mit score += round(time_left);
die Punktzahl addiert.
new_round
1 2 3 4 5 6 7 8 9 10 | function new_round() { score = 0; time_left = max_time; current_question = 0; asked_questions = 0; game_over = false; used_questions = []; answer_options = []; load_question(categorie); } |
Hier setzen wir einfach nur die Ausgangsvariablen zurück, wenn wir eine neue Runde starten.
Das war es bereits.
Download
Quiz Champion Prototyp
Weiterführende Links
Projekt Snake
Projekt Tic-Tac-Toe – Teil 1
Memory im GameMaker
Casino Würfel – Das Ein-Objekt-Spiel
Farb-Themes für eigene Spiele