Der Anfänger Thread
-
Du mußt dir mitschreiben, welche Zahlen schon gezogen wurden und im Notfall mochmal neu ziehen:
set<int> zahlen; int zzahl; if(zahlen.size()==100)// bereits alle möglichen Werte gefunden zzahl=random(100); else do zzahl = random(100); while(zahlen.find(zzahl)!=zahlen.end()); zahlen.insert(zzahl); ...(eine Alternative wäre es noch, einen vector mit allen möglichen Werten zu füllen und per random_shuffle zu verwürfeln)
-
Hallo
Zuerst musst du den Zufallsgenerator initialisieren:
srand(time(NULL));und zwar genau einmal (Programmstart)
Dann könntest du alle Zufallszahlen in einen Array packen und jede neue prüfen, ob sie bereits gezogen wurde:
std::vector<int> Zufallszahlen; //Ziehung der Zahl: int Zahl = rand()%100; //Zahlen zwischen 0 und 99 bool Vorhanden = false; //prüfen, ob Zahl bereits vorhanden for(int i=0; i<Zufallszahlen.size(); ++i) if(Zahl == Zufallszahl[i]) Vorhanden = true; if(!Vorhanden) { //diese Zahl nun in das Array schieben Zufallszahlen.push_back(Zahl); //und loslegen }Das ist nicht fertig. Du musst natürlich für jede Zahl die Prüfung machen und so weiter. Nur ein kleiner Denkanstoss.
chrische
-
da waehre auch eine KI denkbar, und zwar wenn er etwas getroffen hat das er in diesem umkreis weiterhin nach dem schiff sucht bis es versenkt ist
-
chrische5
vielen dank
jetzt muss ich mir nur was überlegen wie ich es anstelle dass automatisch schiffe per zufall gesetzt werden dann kann ich das gleich übernehmen.
Mr Evil
yoa das währe mein nächster schritt aber erst eines nach dem anderen
-
Du erzeugst das Schiff (Startposition x und y sowie Lage (N/S oder O/W)) mit Zufallswerten, prüfst nach, ob es an dieser Stelle Platz findet und trägst es in das Spielfeld des Computers ein (wenn du eine illegale Position getroffen hast - nochmal versuchen).
-
hab mich jetzt heut erst (ich weis is schon lange her) rangesetzt und wollte das mit den zufälligen schießen testen (hab es mir vorher eigentlich noch gar net angeschaut).
ich habe leider keinen plan vom programmieren mit vectoren (weis deshalb schonmal nicht was ich mit std::vector anfangen soll (da kommt ne fehlermeldung: 'vector' ist kein element von 'std')).
chrische5
deshalb wüsste ich nicht wie ich mit umgehen soll.
vllt währe da noch ein kleiner denkanstoss recht hilfreichich brauch das mit dem zufälligen ja auch noch, wenn die schiffe des PCs von allein gesetzt werden sollen, da darf auch nix doppelt sein.
P.S. wie gesagt ich bin blutiger anfänger und hab noch fast keine ahnung vom programmieren.
-
Hallo
Wenn du vector benutzen willst, musst du nich den Header <vector> inkludieren.
Für den Rest solltest du dir das durchlesen:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-143816.html
chrische
-
Du meinst "noch" und nicht "nich"?
-
hallo,
ich habe auch eine frage.
ich habe das buch Spieleprogrammieren mit C++ und Genesis3d für kids
jetzt frage ich ob mir jemand den gesammten quelltext für ein leeres "windowsfenster" gibt?
wäre nett
euer neuling
-
C++ kennt keine "windowsfenster". Da musst du schon im entsprechenden Forum für dein System bzw. deinem verwendeten Framework nachschauen.
-
jetzt frage ich ob mir jemand den gesammten quelltext für ein leeres "windowsfenster" gibt?
http://www.henkessoft.de/C++/WinAPI/WinAPI Kapitel 1 bis 6/api2.htm
Hierzu musst Du nur Zugriff auf "windows.h" haben.
-
Also im buch ist folgendes:
//-----------------------------------------------------------------------------
//Header mit Klassendeklaration von G3DGame
//-----------------------------------------------------------------------------
#include <windows.h>
#include "include\genesis.h"class TGame
{
public:
//Eigenschaften
geEngine *Engine;
geWorld *World;
geCamera *Camera;
geDriver *Driver;
geDriver_Mode *DMode;
geXForm3d XForm;
bool isRunning;
//Methoden
void CreateGame (void);
void RunGame (void);
void FreeGame (void);
void SetDriver (void);
void ExitError (char *Txt);
};//Pfad- und Dateinamen
const char *Pfad = ".\\levels\";
const char *BSP_Datei = "World0.bsp";
const char *GVersion = "GPlay1";
const int MaxWidth = 640;
const int MaxHeight = 480;HWND GHandle; //Handle des "Spielfensters"
#include "Skelett.h"
LRESULT CALLBACK WndProc (HWND hWnd,
UNIT iMessage, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain
(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS Win;
MSG msg;
Win.cbClsExtra = 0;
Win.cbWndExtra = 0;
Win.hInstance = hInstance;
Win.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
Win.hCursor = LoadCursor(NULL, IDC_ARROW);
Win.hbrBackground =
(HBRUSH)GetStockObject (BLACK_BRUSH);
Win.style = CS_HREDRAW | CS_VREDRAW;
Win.lpfnWndProc = WndProc;
LRESULT CALLBACK WndProc (HWND hWnd,
UINT iMessage, WPARAM wParam, LPARAM lParam)
{
switch (iMessage)
{
case WM_KEYDOWN;
{
switch (wParam)
{
case VK_ESCAPE:
{
PostMessage(hWnd, WM_QUIT, 0, 0);
}
}
}
default:
return DefWindowProc
(hWnd, iMessage, wParam, lParam);
}
return 0;
}
Win.lpszClassName = "???";
Win.lpszMenuName = NULL;
RegisterClass (&Win);
GHandle = CreateWindow (Win.lpszClassName,
"Windows Minimum - [Esc]=Ende", WS_TILED,
CW_USEDEFAULT, CW_USEDEFAULT, MaxWidth,
MaxHeight, NULL, NULL, hInstance, NULL);
if (!GHandle)
{
return 0;
}
ShowWindow (GHandle, nCmdShow);
UpdateWindow (GHandle);
isRunning = true;
while (isRunning)
{
while
(PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!GetMessage(&msg, NULL, 0, 0))
{
isRunning = false;
break;
}
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
return 1;
}aber bei mir geht das einfach nicht

-
"Geht nicht" ist keine Fehlerbeschreibung. Was erscheint denn im Protokollfenster, wenn du das Projekt baust? (Fehlermeldungen?)
-
[C++ Fehler] Fenster.cpp(5): E2209 include-Datei 'include\genesis.h' kann nicht geöffnet werden
[C++ Fehler] Fenster.cpp(11): E2303 Typname erwartet
[C++ Fehler] Fenster.cpp(11): E2139 In Deklaration fehlt ;
[C++ Fehler] Fenster.cpp(12): E2303 Typname erwartet
[C++ Fehler] Fenster.cpp(12): E2139 In Deklaration fehlt ;
[C++ Fehler] Fenster.cpp(13): E2303 Typname erwartet
[C++ Fehler] Fenster.cpp(13): E2139 In Deklaration fehlt ;
[C++ Fehler] Fenster.cpp(14): E2303 Typname erwartet
[C++ Fehler] Fenster.cpp(14): E2139 In Deklaration fehlt ;
[C++ Fehler] Fenster.cpp(15): E2303 Typname erwartet
[C++ Fehler] Fenster.cpp(15): E2139 In Deklaration fehlt ;
[C++ Fehler] Fenster.cpp(16): E2303 Typname erwartet
[C++ Fehler] Fenster.cpp(16): E2139 In Deklaration fehlt ;
[C++ Fehler] Fenster.cpp(35): E2209 include-Datei 'Skelett.h' kann nicht geöffnet werden
[C++ Fehler] Fenster.cpp(37): E2303 Typname erwartet
[C++ Fehler] Fenster.cpp(52): E2451 Undefiniertes Symbol 'WndProc'
[C++ Fehler] Fenster.cpp(53): E2108 Ungültige Verwendung von typedef 'LRESULT'
[C++ Fehler] Fenster.cpp(53): E2379 In Anweisung fehlt ;
[C++ Fehler] Fenster.cpp(87): E2451 Undefiniertes Symbol 'isRunning'
-
Deine Nachrichtenfunktion für das Hauptfenster steht ja mitten in WinMain. So geht das natürlich nicht. Setze diesen Teil
LRESULT CALLBACK WndProc (HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { switch (iMessage) { case WM_KEYDOWN; { switch (wParam) { case VK_ESCAPE: { PostMessage(hWnd, WM_QUIT, 0, 0); } } } default: return DefWindowProc (hWnd, iMessage, wParam, lParam); } return 0; }einfach mal vor WinMain. Und benutze das nächste mal bitte Code Tags. Ansonsten ist der Code einfach unleserlich, und keiner hat Lust, sich den anzuschauen.
-
[C++ Fehler] Fenster.cpp(5): E2209 include-Datei 'include\genesis.h' kann nicht geöffnet werden [C++ Fehler] Fenster.cpp(11): E2303 Typname erwartet [C++ Fehler] Fenster.cpp(11): E2139 In Deklaration fehlt ; [C++ Fehler] Fenster.cpp(12): E2303 Typname erwartet [C++ Fehler] Fenster.cpp(12): E2139 In Deklaration fehlt ; [C++ Fehler] Fenster.cpp(13): E2303 Typname erwartet [C++ Fehler] Fenster.cpp(13): E2139 In Deklaration fehlt ; [C++ Fehler] Fenster.cpp(14): E2303 Typname erwartet [C++ Fehler] Fenster.cpp(14): E2139 In Deklaration fehlt ; [C++ Fehler] Fenster.cpp(15): E2303 Typname erwartet [C++ Fehler] Fenster.cpp(15): E2139 In Deklaration fehlt ; [C++ Fehler] Fenster.cpp(16): E2303 Typname erwartet [C++ Fehler] Fenster.cpp(16): E2139 In Deklaration fehlt ; [C++ Fehler] Fenster.cpp(35): E2209 include-Datei 'Skelett.h' kann nicht geöffnet werden [C++ Fehler] Fenster.cpp(37): E2303 Typname erwartet [C++ Fehler] Fenster.cpp(38): E2040 Deklaration nicht ordnungsgemäß abgeschlossenso schon wieder ne schwette voller fehler..

-
'include\genesis.h' kann nicht geöffnet werden
'Skelett.h' kann nicht geöffnet werdenDas musst Du offenbar richtig einbinden. Schau erst mal bei Optionen oder Einstellungen oder Verzeichnissen, ob dort alles richtig eingestellt ist.
-
Entschuldigung, ich bin ein BlutigerAnfänger!
wie kann ich den dort das verzeichniss angeben?
-
Welcher Compiler bzw. welche IDE benutzt du?
In VC++ 2003 mußt du das Genesis-Include-Verzeichnis hier eintragen:
Extras->Optionen->Projects->C++ Verzeichnisse
Und dort in der Combobox Includeverzeichnisse.Genesis hat sicherlich auch Library-Dateien (*.lib), das Verzeichnis auch dort unter Bibliotheksdateien hinzufügen.
Aber sowas steht eigentlich meistens in den Readme's oder Dokumentation der Bibliotheken (in deineem Fall Genesis3D)... meistens jedenfalls.
-
Schau Dich bei Deinem "Werkzeug" genau im Menü um, sonst wirst Du ständig solche Pannen erleben.