Der Anfänger Thread
-
vielen dank für die schnelle lösung.
hat ohne weitere Probleme geklappt.

was ich vergessen habe zu frage ist:
welche werte (ich geh mal davon aus das die auch normale ASCII Werte sind) haben die richtungstasten (links, rechts, oben und unten) und die Return (Enter) taste.ich weis nur das solche sondertasten 2 werte haben und dass der erste wert 0 sein sollte, soweit richtig?
//EDIT
hab grad kurz was ausprobiert.kann es sein das die werte folgende sind?
links: 075
rechts: 077
unten: 080
oben: 072
Return: 13
-
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39324.html
Ja, sind sie ( ohne die NULL am Anfang ) ...
Jetzt gehe ich aber schlafen :xmas1:
-
so ich habe wieder eine weitere Frage:
wie ist es möglich das er beim generieren einer zufallszahl im bereich von sagen wir mal 100 oder 1000 eine zahl nicht 2 mal erzeugt.
denn ich bin gerade drüber schiffe versenken zu programmieren und der PC soll nicht 2 mal ins selbe ziel schießen.
ich weis man braucht dafür:
randomize();
und
random(100);
währ klasse wenn mir jemand ein ausschlussverfahren für zufallszahlen erklären könnte bzw. mir ein fertiges zeigt.
-
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.