Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Webzeugs ::  [gelöst] Browsergame - direktes 1 vs. 1  
Gehen Sie zu Seite 1, 2, 3  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
DerBaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.11.2008
Beiträge: 146
Beitrag DerBaer Mitglied 10:00:59 10.03.2010   Titel:   [gelöst] Browsergame - direktes 1 vs. 1            Zitieren

Hi,

ihr habt die Frage sicherlich schon unendlich oft gehört: Welche Programmiersprache?

Ich würde für mein Browsergame HTML, JS, PHP und MySQL verwenden(sollte normalerweise funktionieren, oder?^^)

Allerdings will ich erreichen, dass 2 Leute direkt gegeneinander antreten können und jeder abwechselnd Aktionen durchführen kann. Also sowas wie Schach.
Meine Frage ist jetzt, ob sowas mit den "einfachen" Websprachen geht, oder ob man Flash oder so braucht.

Das Problem liegt ja dabei, dass der Browser von Spieler 1 nicht weiß, wann der Spieler 2 was gemacht hat. Also müsste man regelmäßig nachfragen => Refresh => hässlich.
Dann hab ich gelsen, man kann AJAX verwenden. Aber das ist doch dann auch nur regelmäßiges Abfragen, oder nicht(leider stand nicht dabei, wie man es realisiert)?

Eigentlich denke ich es ist nicht möglich, aber vielleicht(hoffentlich) irre ich mich?


PS.: Ich würde mich nachtürlich in neue Gebiete erstmal einarbeiten und weiß, dass ein BG lange braucht. Also bitte keine Antworten wie: "Vergiss es. Schaffst du sowieso nicht." oder so ;)

_________________
Die 3 größten Gefahren für einen Informatiker: Licht, frische Luft und Termine


Zuletzt bearbeitet von DerBaer am 11:50:33 10.03.2010, insgesamt 1-mal bearbeitet
Unregistrierter





Beitrag Unregistrierter 10:10:20 10.03.2010   Titel:              Zitieren

Hallo,

ja, grundsätzlich ist der Ansatz korrekt und auch der Einwurf mit AJAX geht in die richtige Richtung. Regelmäßige Request müssten den Status des jeweils anderen Spielers abfragen. Da du MySQL verwenden willst, macht es die ganze Sache sogar recht einfach. Eine Statusänderung des Gegenspielers könnte so ohne Weiteres in die Datenbank geschrieben und von dort auch wieder gelesen werden.

LG
TdZ
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.07.2007
Beiträge: 237
Beitrag TdZ Mitglied 10:16:02 10.03.2010   Titel:              Zitieren

Genau wie RandomAccess sagt gehen deine Überlegungen eigentlich genau in die richige Richtung. Du kannst AJAX verwenden, um in einem periodischen Zeitabstand nachzufragen, ob der Gegenspieler seinen Zug gemacht hat. Dies geschieht über die Abfrage eines oder mehrerer Werte in einer zentralen Datenbank, auf die beide Spieler (natürlich indirekt) Zugriff haben.

_________________
A picture is worth 0x100000 DWORDs.
Jockelx
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.12.2009
Beiträge: 499
Beitrag Jockelx Mitglied 10:16:46 10.03.2010   Titel:              Zitieren

Hi,

wie soll das Spiel denn aussehen?
Also im Sinne von: Wie synchron muss das denn sein?

Wenn es reicht einmal pro Sekunde zu refreshen, dann ist Ajax sicherlich gut.
Dann würdest du halt sekündlich eine Anfrage ala 'Gibt's was neues' schicken und der Server gibt nur ein yes oder no oder sowas zurück und bei yes käme dann ein
wirklicher Refresh-Aufruf.

Wenn es scheller aktuell sein muss, dann wirst du wohl ein Java-Applet oder Silverlight oder sowas nehmen müssen,
dass ein permanente Verbindung (in beide Richtungen) offen halten kann.
Silverlight kann glaube ich mittlerweile sogar Peer2Peer, was dann die schnellste Variante wäre.
DerBaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.11.2008
Beiträge: 146
Beitrag DerBaer Mitglied 10:24:25 10.03.2010   Titel:              Zitieren

also 1 Sekunde reicht schon(soll eine Art Kartenspiel werden).

Ich dachte nur, das auch der 1 Skunde refresh problematisch werden kann, aber wenn ihr meint, das frisst nicht die ganze Bandbreite und so,d ann versuche ich das mal.

Danke euch allen

_________________
Die 3 größten Gefahren für einen Informatiker: Licht, frische Luft und Termine
heini
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.09.2007
Beiträge: 326
Beitrag heini Mitglied 10:36:47 10.03.2010   Titel:              Zitieren

Ich vermute, dass ein 5-sekuendliches Update genuegt, da er sein Spiel mit Schach und aehnlichem verglichen hat.

Damit mehrere Spiele gleichzeitig stattfinden koennen, brauchst du zunaechst eine Spielertabelle, eine Sitzungstabelle und eine Tabelle, wo alle Spielablaeufe gespeichert werden.

Folgender Ablauf:
  • Bei Anmeldungen gibt es Benutzernamen.
  • Jeder Benutzername wird in der DB mit einer Session-ID verknuepft.
  • Ist ein bestimmter Timeout nicht abgelaufen, gilt der Benutzer als online.
  • In einer Liste kann man ein Spiel eroeffnen.
  • Andere Spieler koennen beitreten.
  • Ist die Spielerliste voll, beginnt das Spiel.
Mit der Session-ID sowie mit AJAX laesst sich das Ganze unkompliziert realisieren.

_________________
„Justiz für alle!“
Unregistrierter





Beitrag Unregistrierter 10:43:25 10.03.2010   Titel:              Zitieren

Hallo,

AJAX Request's beinhalten erstmal nur Text/XML-Daten. Die Sorgen garantiert nicht für Performance-Probleme (wenn doch hat der Entwickler etwas falsch gemacht). Den Anschließenden "Refresh" kannst du dir theoretisch sparen wenn der Rest des Spiels auf HTML / JS basiert.

Schema:
Zitat:

--> Javascript sendet AJAX Request an Server
--> PHP empfängt Request und wertet aus (Datenbankzugriff, Überprüfung, Ausgabe)
--> Clientseitig wartet AJAX auf eine Antwort
--> PHP ist fertig mit Auswerten und zeigt Ergebnis an (echo "Ergebnis ist da";)
--> AJAX empfängt Ergebnis (getResponse.requestText // requestXML) -> getResponse ist dabei der "Verweis" auf XMLRequest(AJAX)-Objekt.
--> Javascript verarbeitet Ergebnis und führt angepasste Funktionen aus


Beispiel vereinfacht:
Code:
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
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
<script>
var getRequest = XMLHttpObjectRequest();

function XMLHttpObjectRequest() {
  var request;
  if (window.XMLHttpRequest) request = new XMLHttpRequest();
  else if (window.ActiveXObject) request = new ActiveXObject("Microsoft.XMLHTTP");
  return request;
}

function sendRequest() // Abfrage auf Änderungen
{
  if (getRequest.readyState==4 || getRequest.readyState==0)
  {
    url = "request.php";
    getRequest.onreadystatechange = getAnswer; // Request gesendet, was dann?
    getRequest.open("POST" /*Methode*/, url, true);
    getRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    getRequest.send(/* Platz für Parameter z.B.: */ "id=1");
  }
}

function getAnswer() // Antwort abwarten und auswerten
{
  if (getRequest.readyState==4 || getRequest.readyState==0)
  {
    var response = getRequest.responseText; //responseXML
    alert(response); // Ausgabe der Antwort des Servers als "alert"
    /* ... Hier kann die Antwort dann Ausgewertet und verarbeitet werden ... */
  }    
}
Code:
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
<script>
var getRequest = XMLHttpObjectRequest();

function XMLHttpObjectRequest() {
var request;
if (window.XMLHttpRequest) request = new XMLHttpRequest();
else if (window.ActiveXObject) request = new ActiveXObject("Microsoft.XMLHTTP");
return request;
}

function sendRequest() // Abfrage auf Änderungen
{
if (getRequest.readyState==4 || getRequest.readyState==0)
{
url = "request.php";
getRequest.onreadystatechange = getAnswer; // Request gesendet, was dann?
getRequest.open("POST" /*Methode*/, url, true);
getRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
getRequest.send(/* Platz für Parameter z.B.: */ "id=1");
}
}

function getAnswer() // Antwort abwarten und auswerten
{
if (getRequest.readyState==4 || getRequest.readyState==0)
{
var response = getRequest.responseText; //responseXML
alert(response); // Ausgabe der Antwort des Servers als "alert"
/* ... Hier kann die Antwort dann Ausgewertet und verarbeitet werden ... */
}
}
Code:
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
<script>
var getRequest = XMLHttpObjectRequest();

function XMLHttpObjectRequest() {
  var request;
  if (window.XMLHttpRequest) request = new XMLHttpRequest();
  else if (window.ActiveXObject) request = new ActiveXObject("Microsoft.XMLHTTP");
  return request;
}

function sendRequest() // Abfrage auf Änderungen
{
  if (getRequest.readyState==4 || getRequest.readyState==0)
  {
    url = "request.php";
    getRequest.onreadystatechange = getAnswer; // Request gesendet, was dann?
    getRequest.open("POST" /*Methode*/, url, true);
    getRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    getRequest.send(/* Platz für Parameter z.B.: */ "id=1");
  }
}

function getAnswer() // Antwort abwarten und auswerten
{
  if (getRequest.readyState==4 || getRequest.readyState==0)
  {
    var response = getRequest.responseText; //responseXML
    alert(response); // Ausgabe der Antwort des Servers als "alert"
    /* ... Hier kann die Antwort dann Ausgewertet und verarbeitet werden ... */
  }    
}


// request.php:
PHP Code:
<?php
// request erhalten und z.B. ID übergeben bekommen
// Anhand der ID findet zum Beispiel eine Datenbankabfrage statt

$result = mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id='".$_POST['id']."'");
echo ($result[0]['ergebnis']); // Das bekommt der Client als "responseText"
?>
PHP Code:
<?php
// request erhalten und z.B. ID übergeben bekommen
// Anhand der ID findet zum Beispiel eine Datenbankabfrage statt

$result = mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id='".$_POST['id']."'");
echo ($result[0]['ergebnis']); // Das bekommt der Client als "responseText"
?>
PHP Code:
<?php
// request erhalten und z.B. ID übergeben bekommen
// Anhand der ID findet zum Beispiel eine Datenbankabfrage statt

$result = mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id='".$_POST['id']."'");
echo ($result[0]['ergebnis']); // Das bekommt der Client als "responseText"
?>


LG


Zuletzt bearbeitet von Unregistrierter am 10:44:05 10.03.2010, insgesamt 1-mal bearbeitet
DerBaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.11.2008
Beiträge: 146
Beitrag DerBaer Mitglied 11:50:16 10.03.2010   Titel:              Zitieren

Vielen Dank. :live: :live:
Das sieht doch wunderbar aus.
Jetzt werde ich aber erstmal Datenbank , Grundgerüst, etc. aufbauen.;)

Wird später dann später vermutlich noch Probleme geben, aber ich close diesen Beitrag erstmal.

Mfg
DerBaer

_________________
Die 3 größten Gefahren für einen Informatiker: Licht, frische Luft und Termine


Zuletzt bearbeitet von DerBaer am 11:53:16 10.03.2010, insgesamt 1-mal bearbeitet
Christoph
Moderator

Benutzerprofil
Anmeldungsdatum: 30.04.2001
Beiträge: 5592
Beitrag Christoph Moderator 15:22:39 10.03.2010   Titel:              Zitieren

RandomAccess85 schrieb:
// request.php:
PHP Code:
<?php
// request erhalten und z.B. ID übergeben bekommen
// Anhand der ID findet zum Beispiel eine Datenbankabfrage statt

$result = mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id='".$_POST['id']."'");
echo ($result[0]['ergebnis']); // Das bekommt der Client als "responseText"
?>
PHP Code:
<?php
// request erhalten und z.B. ID übergeben bekommen
// Anhand der ID findet zum Beispiel eine Datenbankabfrage statt

$result = mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id='".$_POST['id']."'");
echo ($result[0]['ergebnis']); // Das bekommt der Client als "responseText"
?>
PHP Code:
<?php
// request erhalten und z.B. ID übergeben bekommen
// Anhand der ID findet zum Beispiel eine Datenbankabfrage statt

$result = mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id='".$_POST['id']."'");
echo ($result[0]['ergebnis']); // Das bekommt der Client als "responseText"
?>
Es ist natürlich klar, dass man das so *niemals* macht. Damit ermöglichst du eine SQL injection. Was du mindestens machen musst, ist, $_POST['id'] nach int zu casten.

Auch in Beispiel-Code halte ich es für wichtig, das zu beachten. Denn Beispiel-Code landet leider viel zu oft per copy&paste in Produktiv-Code.

_________________
Wenn Word für Längeres geeignet wäre, würde es nicht Word, sondern Sentence, Page oder Article heißen.
Unregistrierter





Beitrag Unregistrierter 09:03:16 11.03.2010   Titel:              Zitieren

Hallo,

:live: Das ist natürlich absolut korrekt und sollte auch dringend beachtet werden.

Angepasst könnte das dann so aussehen:
PHP Code:
<?php
// request erhalten und z.B. ID übergeben bekommen
// Anhand der ID findet zum Beispiel eine Datenbankabfrage statt

$id = (int)$_POST['id']; // Damit wird in dem Fall sichergestellt das $_POST['id'] auch tatsächlich vom Typ "integer" ist.
$result = mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id=$id");
echo ($result[0]['ergebnis']); // Das bekommt der Client als "responseText"
?>
PHP Code:
<?php
// request erhalten und z.B. ID übergeben bekommen
// Anhand der ID findet zum Beispiel eine Datenbankabfrage statt

$id = (int)$_POST['id']; // Damit wird in dem Fall sichergestellt das $_POST['id'] auch tatsächlich vom Typ "integer" ist.
$result = mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id=$id");
echo ($result[0]['ergebnis']); // Das bekommt der Client als "responseText"
?>
PHP Code:
<?php
// request erhalten und z.B. ID übergeben bekommen
// Anhand der ID findet zum Beispiel eine Datenbankabfrage statt

$id = (int)$_POST['id']; // Damit wird in dem Fall sichergestellt das $_POST['id'] auch tatsächlich vom Typ "integer" ist.
$result = mysql_query("SELECT text AS ergebnis FROM tabelle WHERE id=$id");
echo ($result[0]['ergebnis']); // Das bekommt der Client als "responseText"
?>


LG
C/C++ Forum :: Webzeugs ::  [gelöst] Browsergame - direktes 1 vs. 1  
Gehen Sie zu Seite 1, 2, 3  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.