Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1752to1756
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Multiplayer-Spiel über VBA

Multiplayer-Spiel über VBA
19.04.2020 15:50:30
Jubel
Hi Leute,
ich programmiere seit einer Weile an einem kleinen Spiel auf Basis von Excel und entsprechenden VBA-Oberflächen. Das Spiel selbst ist für mehrere Personen ausgelegt, d.h. mehrere Personen benötigen die Daten von den jeweils anderen Mitspielern, weil sie jeweils auf einem eigenen Gerät im selben Heimnetzwerk spielen.
Ich habe bisher versucht, dass über eine zentrale, freigegebene Mappe im Netzwerk zu realisieren. Entsprechend toll lief es... Zwar gelingen die Zugriffe ganz gut, doch das ständige Speichern der "Hauptdatei" im Netzwerk (um diese auf jedem Gerät zu aktualisieren), sorgt für unglaublich lange Ladezeiten auf den VBA-Oberflächen und immer mal wieder Kollisionen beim Speicherzeitpunkt der verschiedenen Nutzer. Unterm Strich: Relativ unschön und ziemlich unperformant.
Meine Frage wäre: Wie bekommt man das besser hin? Hat Excel bzw. VBA irgendeine Möglichkeit, Daten von einem anderen Excel-Workbook auf einem anderen Gerät zu empfangen, ohne ständig freigegebene Mappen speichern zu müssen? Oder gibt es ein anderes Programm (mir fiele z.B. Access ein), dass eine beständig aktualisierende Datenbank bilden könnte, auf die dann das Excel/VBA aller Geräte ordentlich zugreifen könnte?
Vermutlich wären andere Programmiersprachen für das ganze Unterfangen besser geeignet, aber da ich mich mittlerweile in VBA ganz gut reingefuchst habe (und der Code für das Spiel mittlerweile schon sehr, sehr groß ist), würde ich es gerne dort belassen, wenn das möglich ist.
Ich hoffe, ihr habt eine Idee, wie man es versuchen kann.

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Multiplayer-Spiel über VBA
19.04.2020 16:26:44
Daniel
Du hättest doch vor kurzem mal ne Frage, wie du in einer Userform eine Karte mit anklickbaren Ländern realisieren kannst...
Wie ist denn das Thema weiter gegangen, hast du dort eine Lösung gefunden, wenn ja welche?
Du hättest dann auf meine Rückfrage nicht mehr geantwortet...
Gruß Daniel
AW: Multiplayer-Spiel über VBA
19.04.2020 16:38:58
Jubel
Hi Daniel,
deine späteren Antworten dort hatte ich bisher gar nicht gesehen. Habe dir zu dem Thema dort geantwortet.
Grüße
JDB
AW: Multiplayer-Spiel über VBA
20.04.2020 11:31:39
Daniel
Dieser Thread ist jetzt altersbedingt aus der aktuellen Forumsliste rausgefallen.
Wenn du noch fragen zu dem Thema "Anklickbare Landkarte" hast, müsstest du einen neuen Thread aufmachen.
Anzeige
AW: Multiplayer-Spiel über VBA
20.04.2020 18:51:36
Jubel
Hi Daniel,
danke für den Hinweis. Diese Forumsstruktur bei Herber hat mich schon ein paar Mal überfordert. Ich habe im Laufe der Jahre schon zig Mal den Antwortbutton in einem archivierten Thema gesucht. Nun weiß ich also: Da gibt es nichts mehr zu finden. In anderen Foren würden sie einen lynchen, wenn man zum gleichen Thema immer wieder ein neues Thema aufmacht ;)
Was die Landkarte angeht: Ich habe bei deiner Lösung ein Problem entdeckt. Als zweiten Schritt wollte ich es so gestalten, dass eingenommene Regionen auch eine andere Farbe erhalten. Das schaffe ich wahrscheinlich wirklich nur mit meiner GIF-Puzzle-Lösung, oder? Die ist zwar unglaublich aufwändig, aber dann kann man zumindest jede Region einzeln färben, indem man ein gefärbtes Bild laden lässt (was natürlich auch die Bilderdatenbank des Programms erheblich vergrößert).
Aber insgesamt ist diese MouseDown-Funktion mit einer Mauscursor-Landkarte sehr spannend! Ich bin mir sicher, da komme ich noch mal auf dich zurück, sobald ich das irgendwo anbauen möchte. Derzeit habe ich leider einige Baustellen gleichzeitig bei dem Projekt offen (insbesondere die Netzwerkfrage treibt mich um), die ich erst mal beheben muss.
Danke auf jeden Fall fürs das Angebot.
Grüße
JDB
Anzeige
AW: Multiplayer-Spiel über VBA
19.04.2020 17:23:14
Daniel
ich hatte mal ein ähnliches Problem.
da ging es darum, für einen organisierten Basarverkauf mit Annahme, Verkauf und Rückgabe/Auszahlung ein Kassensystem miT mehren Rechnern und gemeinsamer Datenbank zu erstellen.
dabei lag aber der Schwerpunkt weniger auf Performance, sondern auf Sicherheit, insbesondere war die Anforderung, dass bei einem unerkannten Netzwerk ausfall (Stecker gezogen) keine Datenverluste auftreten durften und ein weiterarbeiten bis zur Behebung der Störung möglich sein sollte.
gelöst habe ich die Aufgabe dann so, dass es eben keine Zentrale Datenbank gab, sondern jeder Rechner ein Aktionsprotokoll seiner Aktivitäten in einer separaten Datei auf dem gemeinsamen Verzeichnis abgelegt hat.
Jeder Rechner hat dann die Aktionsprotokolle der anderen Rechner gelesen und aus diesen Aktionsprotokollen die Gesamt Datenbank generiert.
auf diese Weise waren die einzelnen Rechner unabhängig und es gab keine gemeinsamen Schreibzugriffe auf dieselbe Datei denn nur dieser ist problematisch.
auch wenns ein anderes Problem ist, vielleicht ist dies ein Ansatz, um auf freigegebene Mappen verzichten zu können.
Gruß Daniel
Anzeige
AW: Multiplayer-Spiel über VBA
20.04.2020 19:00:01
Jubel
Hi,
ich habe es nun wie folgt versucht: Jedes Tablet schreibt in eine freigegebene Zweitdatei neben der eigentlichen Spieldatei. Diese ist relativ klein und als XLSB formatiert. Durch die geringe Größe, hoffe ich die über das Netzwerk ausgelösten, ständigen Speicherungen der Datei schneller zu machen, die ich ja brauche, um die Daten in der freigegebenen Datei zu aktualisieren. Ein Refresh-Befehl (ohne Speicherung) wäre Gold wert, denn das Speichern geschieht über das Netzwerk relativ langsam und holperig.
Dann habe ich eine zentrale XLSM-Steuerungsdatei auf einem anderen Rechner laufen. Diese greift in die Netzwerkpfade aller Tablets auf die jeweils freigegebenen Zweitdateien und hat nur eine Aufgabe: Jede Sekunde einen Code auszulösen, der alle Zweitdateien speichert und dann die Daten aller Zweitdateien miteinander synchronisiert (also in jede Zweitdatei die Daten der anderen hineinschreibt). Die Spalten sind dabei strikt getrennt, so dass es zu keinen Schreibkonflikten kommen kann. Dadurch haben dann alle Tablets Zugriff auf die Daten der anderen, ohne aber selbst im Netzwerk kommunizieren zu müssen (dies überfordert die Rechenleistung schnell und drückt dadurch die Performance auf den Tablets erheblich).
Die Lösung ist nicht schön, zumal durch das ständige Aktualisieren der Zweitdatei auch immer ein Verzug in den Daten entsteht. Das ärgerlichste ist aber, dass ich kein ereignisorientiertes Lesen und Speichern der Steuerungsdatei vornehmen kann, sondern die eben wirklich jede Sekunde rödeln muss, um sicher zu sein, alles aktuell zu haben. Toll wäre es, wenn die Tablets eine Art Ping an die Steuerungsdatei schicken können, dass bestimmte Daten in der lokalen Zweitdatei neu sind und abgeholt werden können.
Wer also eine bessere Idee hat: Gerne her damit :)
Grüße
JDB
Anzeige
AW: Multiplayer-Spiel über VBA
20.04.2020 20:27:25
Daniel
hi
ich weiß ja nicht was für ein Spiel du da hast, für nen Online-Shooter ist es eher nix.
die Anforderung war Sicherheit, nicht Geschwindigkeit.
vielleicht läuft folgender Ablauf "fluffiger"
1. die zweit-Dateien bleiben geöffnet und werden auf der rechnereigenen Festplatte gespeichert und zwar nur dann, wenn sich etwas ändert.
nach dem Speichern werden die Zweitdateien von der Festplatte auf den gemeinsamen Server kopiert.
2. die einzelnen Hauptdateien holen sich selber die Daten. Dabei wird im sekundenrythmus nur das speicherdatum+Zeit der Datei mit der Zeit der letzten Aktualisierung verglichen und eine Aktualisierung erfolgt nur wenn notwendig.
das reduziert die Anzahl der Aktualisierungen. Wenn ein abstand von mehrern Sekunden reicht, kannst du einzelnen Spieler ja zeitversetz aktualisieren lassen (spieler 1 bei 0 und 5, Spieler 2 bei 1 und 6)
eine andere Möglichkeit wäre, dass du die zweitdateien als CSV speicherst und diese in die Hauptdatei importierst. dann geht die Aktualisierung automatisch über die Importeinstellungen.
gruß Daniel
Anzeige
AW: Multiplayer-Spiel über VBA
20.04.2020 21:20:17
Jubel
Nein, kein Shooter :D Es ist nur eine Art Strategiespiel (nach Marke Risiko, aber eben deutlich komplexer), das auf einem Brett gespielt wird, aber durch eine (mittlerweile recht umfangreiche und komplexe) "App" ergänzt wird.
Der erste fluffige Vorschlag war auch mal meine Idee. Leider kamen mir da die Tablets dazwischen. Es handelt sich um Dell Venue 11 Pro-Gerät. Prinzipiell finde ich die recht flott (für Tablets), allerdings haben sie alle vier so ihre Probleme mit dem Netzwerk. Auf sie kann zwar jederzeit von einem fünften Rechner zugegriffen werden, doch wenn sie auf einander oder auf einen anderen, fünften Rechner zugreifen sollen, zieren sie sich gerne mal. Das klappt hin und wieder, bei zweien sogar recht sicher, bei den anderen beiden aber oft nicht. Die Freigabe/Netzwerkeinstellungen sind bei allen vier Tablets gleich, sie sind auch von der gleichen Modellart und nutzen alle Windows 10 Pro 64-bit in aktuellster Version. Dennoch reagieren sie leider unterschiedlich.
Von daher bin ich limitiert: Die Tablets können von außen gerufen und verändert werden, aber sie können selbst keine Daten zu einem fünften PC schicken. Was sie können (seltsamerweise), ist das Schicken von Daten an einen NAS. Doch als NAS habe ich nur meine Fritz-Box und die ist leider sehr langsam. Besonders Speicherzugriffe auf die Box (und die müssen ja leider sein, um freigegebene Excelmappen zu aktualisieren) sind quälend langsam und zerlegen mir die Performance komplett.
Daher eben mein Ansatz, die Tablets nur auf "hauseigene" Daten zugreifen zu lassen und einen fünften, außenstehenden PC die Synchronisierung übernehmen zu lassen.
Vielleicht ist dein zweiter Ansatz aber eine Möglichkeit: Wenn man eine CSV-Datei in eine XLSM importiert und dann die CSV von außen (also vom fünften Rechner) speichern lassen will (um die neu hineingeschriebenen Daten für das Tablet erkennbar zu machen), wird dann nur die kleine CSV-Datei gespeichert? Oder die große "Hauptdatei", in die sie importiert wurde? Denn die ist mittlerweile fast 1,5 MB groß (durch Dutzende Userformen, tausende Zeilen Code etc.), was wegen der "Datenmenge" beim Speichern performanceseitig spürbar werden würde.
Anzeige
AW: Multiplayer-Spiel über VBA
20.04.2020 21:31:26
Daniel
hi
gut, deine Besonderheiten kenne ich nicht.
aber wenn es leichter so geht das ein 5. rechner das Dateimanagement übernimmt, warum nicht.
ich würde hier zum Speichern der Gesamtdaten eine neue leere Datei anlegen, dort die Daten reinkopieren und dann diese Datei als CSV auf den 4 anderen rechnern speichern.
dann sind da auch wieder nur Daten untwrwegs.
AW: etwas bizar?
19.04.2020 19:52:11
Fennek
Hallo,
in einem LAN sollte es relativ gut möglich sein:
Alle Spieler kommunizieren direkt realtime über Socket.
Unter Linux ist das sehr einfach: nc 192.168.178.22 5000 (netcat); aus Excel ist es eher kompliziert über Win API eine Socket-Kommunikation zu installieren.
mfg
Anzeige
AW: etwas bizar?
20.04.2020 19:01:55
Jubel
Hallo Fennek,
das klingt interessant, allerdings habe ich kein Linux, sondern das Spiel läuft auf einem Desktop und Tablets unter Windows 10 und Excel 2016. Ich weiß leider auch nicht, was eine Socket-Kommunikation ist und ob/wie ich die an mein Excel/VBA-Programm anbinden kann.
Ist das eine Möglichkeit? Was müsste man dafür tun?
AW: Beispiel
21.04.2020 08:53:44
Fennek
Hallo,
@Luc: Danke, diese Erklärung war besser als mein Kommentar.
Z.Zt würde ich immer Python oder Powershell (oder netcat) für einen Test mit "Socket" nutzen. Vor recht langer Zeit hatte ich nach den Stichworten "Socket VBA" gesucht und den folgenden Code gefunden. Das erschien mir so komplex, das ich es nicht weiter verfolgt habe.

Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1
Private Declare Function WSAStartup Lib "wsock32.dll" ( _
ByVal wVersionRequested As Integer, _
lpWSAData As WSAData) As Long
Private Declare Function socket Lib "wsock32.dll" (ByVal af As Long, _
ByVal prototype As Long, ByVal protocol As Long) As Long
Private Declare Function inet_addr Lib "wsock32.dll" ( _
ByVal cp As String) As Long
Private Declare Function htons Lib "wsock32.dll" ( _
ByVal hostshort As Integer) As Integer
Private Declare Function connect Lib "wsock32.dll" (ByVal s As Long, _
name As SOCKADDR, ByVal namelen As Long) As Long
Private Declare Function ioctlsocket Lib "wsock32.dll" (ByVal s As Long, _
ByVal cmd As Long, argp As Long) As Long
Private Declare Function closesocket Lib "wsock32.dll" (ByVal s As Long) As Long
Private Declare Function WSACleanup Lib "wsock32.dll" () As Long
Private Declare Function gethostbyname Lib "wsock32.dll" ( _
ByVal name As String) As Long
Private Declare Sub MoveMemory Lib "kernel32" _
Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
Private Type WSAData
wVersion As Integer
wHighVersion As Integer
szDescription As String * 257
szSystemStatus As String * 129
iMaxSockets As Long
iMaxUdpDg As Long
lpVendorInfo As Long
End Type
Private Type HOSTENT
hname As Long
haliases As Long
haddrtype As Integer
hlength As Integer
haddrlist As Long
End Type
Private Type SOCKADDR
sin_family As Integer
sin_port As Integer
sin_addr As Long
sin_zero As String * 8
End Type
' eine der HOSTENT-haddrtype-Konstanten
Private Const AF_INET = 2 ' Internet Protokoll (UDP/IP oder TCP/IP).
' socket prototype-Konstanten
Private Const SOCK_STREAM = 1 ' 2-wege Stream. Bei AF_INET ist es das
' TCP/IP Protokoll
Private Const SOCK_DGRAM = 2 ' Datagramm Basierende verbindung. Bei AF_INET
' ist es das UDP Protokoll
Dim hSock As Long
' Winsocksitzung starten
Public Sub WinSock_Starten() 'Form_Load()
Dim Retval As Long, WSD As WSAData
Retval = WSAStartup(&H202, WSD)
'0: Ok; Fehlermeldungen; MUSS 1. Befehl sein; MUSS mit WSACleanup beendet werden
'If Retval 
Wenn Du dich da einarbeiten möchtest, werde ich dir (mit sehr wenig Zeiteinsatz) helfen.
mfg
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige