16-05-2014, 12:32 PM
bonjour a tous
je suis en train de travailler sur le marcher Galactique de mon jeu. le système fonctionne en offre et demande (un peu comme la bourse).
mais je bloque au niveau de la procédure stockée, permettant de réaliser les échanges, faut dire c'est pas mon truc ^^
voici comment c'est organisée :
j'ai 2 table pour le marcher
- la première qui permet de visualiser les offre en cour, que ce soit pour de la vente ou de l'achat
- la seconde qui permet de visualiser les echange effectuer
dans ces 2 table "price" est le prix unitaire de vente
quand un joueur décide de vendre ou d'acheter , il émet une offre, celle-ci est enregistrée dans gametradeoffer, ensuite la procédure stockée est exécutée affin de vérifier les offre en cour, affin de les satisfaire.
Le système fonctionne, en premier arrivée premier servie :
par exemple si un joueur décide d'acheter 2000unitee de métal a 2.2credit, ce sera la première offre de vente de métal a 2.2 qui servira a satisfaire l'achat.
les offre sont cumulative :
un joueur décide d'acheter 2000u de métal a 2.2
un joueur vend 500u de métal a 2.2 (id = 1)
un joueur vend 3000u de métal a 2.2 (id = 2)
la transaction sera satisfaite par 2 joueur, mais le dernier arriver aura sont offre de modifier affin de changer la quantité en vente
si une offre n'est pas entièrement satisfaite elle est donc modifier en fonction de ce qui a été acheter ou vendu
voila pour la description du fonctionnement
j'ai commencer a écrire un début de procédure stockée, mais j'aurai besoin d'un peu, beaucoup d'aide pour la finaliser :
je suis en train de travailler sur le marcher Galactique de mon jeu. le système fonctionne en offre et demande (un peu comme la bourse).
mais je bloque au niveau de la procédure stockée, permettant de réaliser les échanges, faut dire c'est pas mon truc ^^
voici comment c'est organisée :
j'ai 2 table pour le marcher
- la première qui permet de visualiser les offre en cour, que ce soit pour de la vente ou de l'achat
Code :
CREATE TABLE IF NOT EXISTS `gametradeoffer` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`owner` int(11) unsigned NOT NULL,
`type` enum('sell','buy') NOT NULL,
`ressource` int(11) NOT NULL,
`quantity` double(50,0) NOT NULL,
`price` decimal(10,2) NOT NULL,
PRIMARY KEY (`id`),
KEY `owner` (`owner`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ;
- la seconde qui permet de visualiser les echange effectuer
Code :
CREATE TABLE IF NOT EXISTS `gametradehistory` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`seller` int(11) unsigned NOT NULL,
`buyer` int(11) unsigned NOT NULL,
`timestamp` datetime NOT NULL,
`ressource` int(11) NOT NULL,
`quantity` double NOT NULL,
`price` decimal(10,3) NOT NULL,
PRIMARY KEY (`id`),
KEY `buyer` (`buyer`),
KEY `seller` (`seller`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
dans ces 2 table "price" est le prix unitaire de vente
quand un joueur décide de vendre ou d'acheter , il émet une offre, celle-ci est enregistrée dans gametradeoffer, ensuite la procédure stockée est exécutée affin de vérifier les offre en cour, affin de les satisfaire.
Le système fonctionne, en premier arrivée premier servie :
par exemple si un joueur décide d'acheter 2000unitee de métal a 2.2credit, ce sera la première offre de vente de métal a 2.2 qui servira a satisfaire l'achat.
les offre sont cumulative :
un joueur décide d'acheter 2000u de métal a 2.2
un joueur vend 500u de métal a 2.2 (id = 1)
un joueur vend 3000u de métal a 2.2 (id = 2)
la transaction sera satisfaite par 2 joueur, mais le dernier arriver aura sont offre de modifier affin de changer la quantité en vente
si une offre n'est pas entièrement satisfaite elle est donc modifier en fonction de ce qui a été acheter ou vendu
voila pour la description du fonctionnement
j'ai commencer a écrire un début de procédure stockée, mais j'aurai besoin d'un peu, beaucoup d'aide pour la finaliser :
Code :
DELIMITER $$
DROP PROCEDURE IF EXISTS `checkTradeOffer` $$
DROP PROCEDURE IF EXISTS `sellOfferFirst` $$
DROP PROCEDURE IF EXISTS `BuyOfferFirst` $$
CREATE PROCEDURE sellOfferFirst()
BEGIN
DECLARE sellerID INTEGER;
DECLARE ressource INTEGER;
DECLARE quantity DOUBLE;
DECLARE rate DECIMAL;
DEClARE sellOfferCursor CURSOR FOR
SELECT owner, ressource, quantity, price AS rate FROM gametradeoffer WHERE `type` = 'sell';
OPEN sellOfferCursor;
get_sellOffer: LOOP
FETCH sellOfferCursor INTO sellerID, ressource, quantity, rate;
END LOOP get_sellOffer;
CLOSE sellOfferCursor;
END $$
CREATE PROCEDURE BuyOfferFirst()
BEGIN
DECLARE sellerID INTEGER;
DECLARE ressource INTEGER;
DECLARE quantity DOUBLE;
DEClARE buyOfferCursor CURSOR FOR
SELECT owner, ressource, quantity, price FROM gametradeoffer WHERE `type` = 'buy';
OPEN buyOfferCursor;
get_buyOffer: LOOP
FETCH buyOfferCursor INTO sellerID, ressource, quantity, rate;
END LOOP get_buyOffer;
CLOSE buyOfferCursor;
END $$
CREATE PROCEDURE checkTradeOffer()
BEGIN
DECLARE nbBuy INTEGER DEFAULT 0;
DECLARE nbSell INTEGER DEFAULT 0;
SELECT COUNT(*) AS counts INTO @nbBuy FROM gametradeoffer WHERE `type` = 'buy';
SELECT COUNT(*) AS counts INTO @nbSell FROM gametradeoffer WHERE `type` = 'sell';
IF (nbSell < nbBuy) THEN
CALL sellOfferFirst();
END IF;
IF (nbSell > nbBuy) THEN
CALL BuyOfferFirst();
END IF;
END $$
DELIMITER ;
Projet en Cour: Global Chaos