Remastering complet du jeu, suppression quasi totale du hasard, partie plus courte, objectifs de victoire clairs
|
@ -1,24 +1,24 @@
|
|||
# SpacePaper
|
||||
The free 4x paper game designed by Jne[CrAcK]
|
||||
![logo](https://raw.githubusercontent.com/dahut87/SpacePaper/master/images/logo.png)
|
||||
|
||||
## En cours de développement
|
||||
|
||||
**Cette version du jeu n'est pas terminée, de nombreuses corrections orthographiques et un équilibre du jeu est nécessaire avant que le jeu soit pleinement jouable.**
|
||||
**Cette version du jeu est en cours de test. De nombreuses corrections orthographiques et un équilibrage du jeu est nécessaire avant que le jeu soit pleinement jouable.**
|
||||
|
||||
**Les nouvelles règles sont en cours d'écriture**
|
||||
|
||||
## Création
|
||||
|
||||
SpacePaper est né le 7 juin 2018 dans l’esprit d’un trentenaire fanatique de jeux de plateau (Projet Gaïa et Terra Mystica) et de jeux vidéos 2x et 4x (exploration, expansion, exploitation et extermination). L’idée de base était de calquer la profondeur stratégique d’un jeux vidéo 4x sur un jeux de plateau tout en gardant la possibilité de pouvoir l’imprimer aisément sur du simple papier coloré. Seul un dé et quelques marqueurs (cailloux ou pions) seront utiles pour jouer.
|
||||
Spacepaper est né le 7 juin 2018 dans l’esprit d’un trentenaire fanatique de jeux de plateau et de jeux vidéos 2x et 4x (exploration, expansion, exploitation et extermination). L’idée de base était de calquer la profondeur stratégique d’un jeux vidéo 4x sur un jeux de plateau tout en gardant la possibilité de pouvoir l’imprimer aisément sur du simple papier coloré. Seul quelques jetons colorés (cailloux ou pions) seront utiles pour jouer.
|
||||
|
||||
## Licence et gratuité [![Licence Creative Commons CC-BY-NC-SA](https://i.creativecommons.org/l/by-nc-sa/4.0/80x15.png)](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.fr)
|
||||
|
||||
SpacePaper est gratuit et il peut être modifié (règle et visuel) et republié sous un autre nom du moment que le nom SpacePaper apparaît quelque part dans le titre, ex : « SpacePaper, un nouvel horizon » ou « SpacePaper II ». Il ne doit en aucun cas faire l’objet de commerce ou de toute autre activité lucrative que ce soit.
|
||||
Spacepaper est gratuit et il peut être modifié (règle et visuel) et republié sous un autre nom du moment que le nom Spacepaper apparaît quelque part dans le titre, ex : « Spacepaper, un nouvel horizon » ou « Spacepaper II ». Il ne doit en aucun cas faire l’objet de commerce ou de toute autre activité lucrative que ce soit.
|
||||
|
||||
Vous pouvez êtes donc libre de l’imprimer et d’y jouer en tout sérénité sans vous acquitter de la moindre somme d’argent.
|
||||
|
||||
## L’univers SpacePaper
|
||||
## L’univers Spacepaper
|
||||
|
||||
SpacePaper se déroule en 2120 après J.C, à l’aube du voyage interstellaire. Plusieurs races sont sur le point de partir à la conquête de notre galaxie. Ainsi, les Terriens, les Ethers, les Vulcains, les Kelvins et les Mécas se préparent à lancer leurs premiers vaisseaux vers de nouveaux systèmes planétaires. Le jeu est basé sur 3 ressources stratégiques à optimiser (recherche, énergie et or) ainsi que 3 ressources minières (antimatière, oganesson, corindon) d’importance mineure. C’est un jeu de 2 à 5 joueurs dans lequel l'immensité du plateau de jeu devient rapidement écrasante ! A vous de manier correctement les 10 systèmes politiques afin d'assurer la stabilité et la prospérités de vos colonies. Le choix d’un des 10 dirigeants proposés conditionnera de façon importante l’orientation de votre partie. A bord de 3 types de
|
||||
vaisseaux (transport, croiseur, éclaireur), vous découvrirez les 37 objets célestes différents qui peuplent l’univers au fur et à mesure de votre progression. 90 technologies permettent de développer votre civilisation dans 4 grandes disciplines : déplacement, combat, habitabilité et économie. Vous arpentez la galaxie en recherche de la fortune, de la connaissance, de conquêtes, de combats afin de vous mener vers la victoire (conditions de victoires différentes).
|
||||
Spacepaper se déroule en 2120 après J.C, à l’aube du voyage interstellaire. Plusieurs races sont sur le point de partir à la conquête de notre galaxie. Ainsi, les Terriens, les Ethers, les Vulcains, les Kelvins et les Mécas se préparent à lancer leurs premiers vaisseaux vers de nouveaux systèmes planétaires. Le jeu est basé sur 2 ressources stratégiques à optimiser (science, culture) ainsi que 3 ressources minières d’importance mineure (or, uranium et acier). C’est un jeu de 2 à 4 joueurs dans lequel l'immensité du monde à explorer devient rapidement écrasante ! A vous de manier correctement les 10 systèmes politiques afin d'assurer la stabilité et la prospérités de vos colonies. A bord de 3 types de vaisseaux (transport, croiseur, chasseur), vous découvrirez les 6 types de planète qui peuplent l’univers au fur et à mesure de votre progression. 6 orientations technologiques vous permettrons de développer votre civilisation dans 3 grandes disciplines : déplacement, combat, politico-économique. Vous arpenterez la galaxie en recherche de fortune, de connaissance afin de de voguer progressivement vers la victoire !
|
||||
|
||||
## Imprimer le jeu
|
||||
|
||||
|
@ -28,9 +28,10 @@ Pour imprimer le jeux il faut se rendre en fin de ce manuel pour trouver les pla
|
|||
|
||||
**Le ficher final.pdf contient le jeu ainsi que les règles.**
|
||||
|
||||
* création - avant la création du jeu, calculs d'équilibrage & probabilités...
|
||||
* planches - les plateaux, tables et marqueurs au format INKSCAPE
|
||||
* pdf - les version prête à être imprimée au format PDF
|
||||
* images - images utilisées
|
||||
* polices - polices de caractère utilisées
|
||||
* planches - les plateaux, tables, tuiles et marqueurs au format INKSCAPE
|
||||
* pdf - les version prêtes à imprimer au format PDF
|
||||
* photos - quelques photos d'illustration
|
||||
* plateau - le plateau principal
|
||||
* règles - les règles du jeu au format ODT
|
||||
|
|
|
@ -1,185 +0,0 @@
|
|||
from random import *
|
||||
|
||||
def proba2D6(seuil):
|
||||
liste = [1.0/36,2.0/36,3.0/36,4.0/36,5.0/36,6.0/36,5.0/36,4.0/36,3.0/36,2.0/36,1.0/36]
|
||||
try:
|
||||
index=seuil.index('-')
|
||||
bas=int(seuil[0:index])
|
||||
haut=int(seuil[index+1:])
|
||||
except:
|
||||
bas=haut=int(seuil)
|
||||
return sum(liste[bas-2:haut-1])
|
||||
|
||||
def getseuil(seuil):
|
||||
try:
|
||||
index=seuil.index('-')
|
||||
bas=int(seuil[0:index])
|
||||
haut=int(seuil[index+1:])
|
||||
except:
|
||||
bas=haut=int(seuil)
|
||||
return (bas,haut)
|
||||
|
||||
def lance():
|
||||
return randint(1,6)+randint(1,6)
|
||||
|
||||
def getresult(de,liste):
|
||||
for seuil,result in liste.iteritems():
|
||||
seuils = getseuil(seuil)
|
||||
if de>=seuils[0] and de<=seuils[1]:
|
||||
return result
|
||||
|
||||
def makedict():
|
||||
dict = {}
|
||||
for i in range(2,13):
|
||||
for j in range(i+1,13):
|
||||
seuil=str(i)+'-'+str(j)
|
||||
proba=round(proba2D6(seuil),3)
|
||||
#print "%d-%d : %s %f" % (i,j,seuil,proba)
|
||||
if dict.has_key(proba):
|
||||
dict[proba].append(seuil)
|
||||
else:
|
||||
dict[proba]=[seuil]
|
||||
for i in range(2,13):
|
||||
seuil=str(i)
|
||||
proba=round(proba2D6(seuil),3)
|
||||
#print "%d-%d : %s %f" % (i,j,seuil,proba)
|
||||
if dict.has_key(proba):
|
||||
dict[proba].append(seuil)
|
||||
else:
|
||||
dict[proba]=[seuil]
|
||||
dict[0]=['0']
|
||||
return dict
|
||||
|
||||
def mini(liste):
|
||||
result=[]
|
||||
for i in range(len(liste)):
|
||||
result.append(liste[i][1])
|
||||
return result
|
||||
|
||||
def closeast(values,liste):
|
||||
final = []
|
||||
for i in range(len(values)):
|
||||
prop = []
|
||||
for j in range(len(liste)):
|
||||
prop.append((abs(values[i]-liste[j]),liste[j]))
|
||||
final.append(sorted(prop))
|
||||
return final
|
||||
|
||||
def tester(liste):
|
||||
somme=sum(liste)
|
||||
if abs(somme-1.0)>0.001:
|
||||
print "ERREUUUUUUR : %f" % (somme)
|
||||
exit()
|
||||
|
||||
def least(liste,indices):
|
||||
mini=1
|
||||
column=-1
|
||||
for i in range(len(liste)):
|
||||
if liste[i][indices[i]][0]<mini:
|
||||
mini=liste[i][indices[i]][0]
|
||||
column=i
|
||||
return column
|
||||
|
||||
def testlist(liste,indices):
|
||||
sum=0
|
||||
for i in range(len(liste)):
|
||||
sum=liste[i][indices[i]][1]+sum
|
||||
return sum
|
||||
|
||||
def testdicelist(liste):
|
||||
full=[0]*11
|
||||
for i in range(len(liste)):
|
||||
if liste[i]!='0':
|
||||
seuils=getseuil(liste[i])
|
||||
#print seuils
|
||||
for j in range(seuils[0]-2,seuils[1]-1):
|
||||
if full[j]==0:
|
||||
full[j]=1
|
||||
else:
|
||||
return False
|
||||
#print full
|
||||
if sum(full)==11:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def returnlist(liste,indices):
|
||||
list=[]
|
||||
for i in range(len(liste)):
|
||||
list.append(liste[i][indices[i]][1])
|
||||
return list
|
||||
|
||||
def closeastlist(liste,resultats):
|
||||
indices=[0]*len(liste)
|
||||
near=closeast(liste,resultats)
|
||||
#print near
|
||||
while abs(testlist(near,indices)-1.0)>0.0011:
|
||||
print "Somme:%f, proche:%d" % (abs(testlist(near,indices)-1.0),least(near,indices))
|
||||
print indices
|
||||
retenue=True
|
||||
for i in range(0,len(indices)):
|
||||
if retenue:
|
||||
indices[i]=indices[i]+1
|
||||
if indices[i]==len(resultats):
|
||||
indices[i]=0
|
||||
retenue=True
|
||||
else:
|
||||
break
|
||||
if len(resultats) in indices:
|
||||
print "impossible !"
|
||||
exit()
|
||||
#print "Somme:%f, proche:%d" % (testlist(near,indices),least(near,indices))
|
||||
list=returnlist(near,indices)
|
||||
return list
|
||||
|
||||
def brutlist(liste,dict):
|
||||
tester(liste)
|
||||
resultats=list(dict)
|
||||
resultats.sort()
|
||||
#print resultats
|
||||
liste=closeastlist(liste,resultats)
|
||||
print "Approche probabiliste"
|
||||
print liste
|
||||
proba=[]
|
||||
for i in range(len(liste)):
|
||||
proba.append(dict[liste[i]])
|
||||
print "Arrangements possibles"
|
||||
print proba
|
||||
#raw_input("...")
|
||||
indices=[0]*len(liste)
|
||||
test=[]
|
||||
for i in range(len(liste)):
|
||||
test.append(proba[i][indices[i]])
|
||||
print "Solutions"
|
||||
while True:
|
||||
if testdicelist(test):
|
||||
print test
|
||||
retenue=True
|
||||
for i in range(0,len(indices)):
|
||||
if retenue:
|
||||
if i==len(indices)-1:
|
||||
print "fin des solutions"
|
||||
exit()
|
||||
indices[i]=indices[i]+1
|
||||
if indices[i]==len(proba[i]):
|
||||
indices[i]=0
|
||||
retenue=True
|
||||
else:
|
||||
break
|
||||
test=[]
|
||||
for i in range(len(liste)):
|
||||
test.append(proba[i][indices[i]])
|
||||
#print test
|
||||
|
||||
|
||||
import sys
|
||||
if len(sys.argv)<2:
|
||||
print "Manque argument: liste a atteindre"
|
||||
exit()
|
||||
liste= sys.argv[1].split(",")
|
||||
for i in range(len(liste)):
|
||||
liste[i]=float(liste[i])
|
||||
dict=makedict()
|
||||
#print dict
|
||||
essai=brutlist(liste,dict)
|
||||
print essai
|
124
création/test.py
|
@ -1,124 +0,0 @@
|
|||
from random import *
|
||||
|
||||
def proba2D6(seuil):
|
||||
liste = [1.0/36,2.0/36,3.0/36,4.0/36,5.0/36,6.0/36,5.0/36,4.0/36,3.0/36,2.0/36,1.0/36]
|
||||
try:
|
||||
index=seuil.index('-')
|
||||
bas=int(seuil[0:index])
|
||||
haut=int(seuil[index+1:])
|
||||
except:
|
||||
bas=haut=int(seuil)
|
||||
return sum(liste[bas-2:haut-1])
|
||||
|
||||
def getseuil(seuil):
|
||||
try:
|
||||
index=seuil.index('-')
|
||||
bas=int(seuil[0:index])
|
||||
haut=int(seuil[index+1:])
|
||||
except:
|
||||
bas=haut=int(seuil)
|
||||
return (bas,haut)
|
||||
|
||||
def testdicelist(liste):
|
||||
full=[0]*11
|
||||
for i in range(len(liste)):
|
||||
if liste[i]!='0':
|
||||
seuils=getseuil(liste[i])
|
||||
#print seuils
|
||||
for j in range(seuils[0]-2,seuils[1]-1):
|
||||
if full[j]==0:
|
||||
full[j]=1
|
||||
else:
|
||||
return False
|
||||
#print full
|
||||
if sum(full)==11:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def lance():
|
||||
return randint(1,6)+randint(1,6)
|
||||
|
||||
def getresult(de,liste):
|
||||
for seuil,result in liste.iteritems():
|
||||
seuils = getseuil(seuil)
|
||||
if de>=seuils[0] and de<=seuils[1]:
|
||||
return result
|
||||
|
||||
lancer=1000000
|
||||
prob=0
|
||||
print "Evaluations statistiques sur %d lances" % lancer
|
||||
etoiles={'2':'Naine Brune','6-7':'Naine Rouge','8-9':'Naine Jaune','3-4':'Geante rouge','5':'Geante bleue','11':'Super geante R','12':'Etoile double','10':'Trou noir'}
|
||||
types={
|
||||
'Naine Brune': {'2':'Tellurique','10-12':'Gazeuse','5-7':'Gelee','4':'Oceanique','8-9':'Sterile','3':'Lave','0':'Vivante'},
|
||||
'Naine Rouge': {'11-12':'Tellurique','9-10':'Gazeuse','6-7':'Gelee','8':'Oceanique','2-4':'Sterile','5':'Lave','0':'Vivante'},
|
||||
'Naine Jaune': {'7-8':'Tellurique','10':'Gazeuse','9':'Gelee','5-6':'Oceanique','3-4':'Sterile','11-12':'Lave','2':'Vivante'},
|
||||
'Geante rouge': {'10-12':'Tellurique','5-6':'Gazeuse','3':'Gelee','4':'Oceanique','9':'Sterile','7-8':'Lave','2':'Vivante'},
|
||||
'Geante bleue': {'12':'Tellurique','5-6':'Gazeuse','3':'Gelee','4':'Oceanique','7-8':'Sterile','9-11':'Lave','2':'Vivante'},
|
||||
'Super geante R': {'11':'Tellurique','2-4':'Gazeuse','0':'Gelee','12':'Oceanique','5':'Sterile','6-10':'Lave','0':'Vivante'},
|
||||
'Etoile double': {'2-4':'Tellurique','5-6':'Gazeuse','8-9':'Gelee','10':'Oceanique','7':'Sterile','11-12':'Lave','0':'Vivante'}}
|
||||
|
||||
nombres={
|
||||
'Naine Brune': {'5-8':1,'9-11':2,'4':3,'3':4,'2':5,'12':6},
|
||||
'Naine Rouge': {'11-12':1,'5-6':2,'7-8':3,'9-10':4,'3-4':5,'2':6},
|
||||
'Naine Jaune': {'12':1,'2-3':2,'4-5':3,'6-7':4,'8-9':5,'10-11':6},
|
||||
'Geante rouge': {'8-9':1,'6-7':2,'2-5':3,'10-11':4,'12':5,'0':6},
|
||||
'Geante bleue': {'6-7':1,'8-10':2,'2-5':3,'11-12':4,'0':5,'0':6},
|
||||
'Super geante R': {'7-11':1,'2-6':2,'12':3,'0':4,'0':5,'0':6},
|
||||
'Etoile double': {'2-3':1,'4-5':2,'6-7':3,'8-9':4,'10-11':5,'12':6}}
|
||||
probabilite={}
|
||||
allplanet=0
|
||||
print "Verification des intervals..."
|
||||
print "Recapitulatif \t %s" % (testdicelist(list(etoiles)))
|
||||
for type in list(types):
|
||||
print "%s \t %s : %s" % (type,testdicelist(list(types[type])),testdicelist(list(nombres[type])))
|
||||
raw_input("...")
|
||||
|
||||
for i in range(lancer):
|
||||
de=lance()
|
||||
result_etoile=getresult(de,etoiles)
|
||||
print "**************** \nDetermination etoile...%d : %s" % (de,result_etoile)
|
||||
prob="1."+result_etoile;
|
||||
if probabilite.has_key(prob):
|
||||
value=probabilite[prob]
|
||||
probabilite[prob]=value+1
|
||||
else:
|
||||
probabilite[prob]=1
|
||||
if result_etoile!="Trou noir":
|
||||
de=lance()
|
||||
result_nombre=getresult(de,nombres[result_etoile])
|
||||
print "Determination taille...%d : %s" % (de,result_nombre)
|
||||
prob="2."+str(result_nombre);
|
||||
if probabilite.has_key(prob):
|
||||
value=probabilite[prob]
|
||||
probabilite[prob]=value+1
|
||||
else:
|
||||
probabilite[prob]=1
|
||||
allplanet=allplanet+result_nombre
|
||||
for j in range(result_nombre):
|
||||
de=lance()
|
||||
result_type=getresult(de,types[result_etoile])
|
||||
print " Determination type...%d : %s" % (de,result_type)
|
||||
prob="3."+result_type;
|
||||
if probabilite.has_key(prob):
|
||||
value=probabilite[prob]
|
||||
probabilite[prob]=value+1
|
||||
else:
|
||||
probabilite[prob]=1
|
||||
resultats=list(probabilite)
|
||||
resultats.sort()
|
||||
print resultats
|
||||
for i in range(len(resultats)):
|
||||
if resultats[i][0]=='3':
|
||||
proba=probabilite[resultats[i]]/float(allplanet)*100.0;
|
||||
else:
|
||||
proba=probabilite[resultats[i]]/float(lancer)*100.0;
|
||||
print " Caracteristique %s : %d, %f" % (resultats[i],probabilite[resultats[i]],proba)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
28036
création/tests.svg
Before Width: | Height: | Size: 2.6 MiB |
After Width: | Height: | Size: 3.3 MiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 105 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 7.7 KiB |
BIN
pdf/carte1.pdf
BIN
pdf/carte2.pdf
BIN
pdf/carte3.pdf
BIN
pdf/carte4.pdf
BIN
pdf/carte5.pdf
BIN
pdf/combats.pdf
BIN
pdf/fiche1.pdf
BIN
pdf/fiche2.pdf
BIN
pdf/fiche3.pdf
BIN
pdf/fin.pdf
BIN
pdf/fin2.pdf
BIN
pdf/fin3.pdf
BIN
pdf/planetes.pdf
BIN
pdf/rosasse.pdf
BIN
pdf/table.pdf
BIN
pdf/victoire.pdf
Before Width: | Height: | Size: 4.6 MiB |
Before Width: | Height: | Size: 4.6 MiB |
Before Width: | Height: | Size: 2.8 MiB |
8030
planches/carte1.svg
Before Width: | Height: | Size: 842 KiB |
24528
planches/carte2.svg
Before Width: | Height: | Size: 2.3 MiB |
Before Width: | Height: | Size: 179 KiB |
Before Width: | Height: | Size: 110 KiB |
2437
planches/carte5.svg
Before Width: | Height: | Size: 411 KiB |
Before Width: | Height: | Size: 314 KiB |
After Width: | Height: | Size: 278 KiB |
After Width: | Height: | Size: 268 KiB |
After Width: | Height: | Size: 283 KiB |
After Width: | Height: | Size: 278 KiB |
After Width: | Height: | Size: 390 KiB |
After Width: | Height: | Size: 264 KiB |
3543
planches/combats.svg
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 251 KiB |
Before Width: | Height: | Size: 2.0 MiB After Width: | Height: | Size: 2.0 MiB |
After Width: | Height: | Size: 3.6 MiB |
7767
planches/fiche1.svg
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.0 MiB |
7300
planches/fiche2.svg
Before Width: | Height: | Size: 606 KiB After Width: | Height: | Size: 574 KiB |
6107
planches/fiche3.svg
Before Width: | Height: | Size: 722 KiB After Width: | Height: | Size: 263 KiB |
3337
planches/fin.svg
Before Width: | Height: | Size: 444 KiB |
After Width: | Height: | Size: 351 KiB |
6601
planches/fin2.svg
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 358 KiB |
Before Width: | Height: | Size: 448 KiB After Width: | Height: | Size: 303 KiB |
Before Width: | Height: | Size: 2.4 MiB |
4335
planches/rosasse.svg
Before Width: | Height: | Size: 565 KiB After Width: | Height: | Size: 369 KiB |
2424
planches/table.svg
Before Width: | Height: | Size: 321 KiB |
11493
planches/victoire.svg
Before Width: | Height: | Size: 2.1 MiB After Width: | Height: | Size: 1.9 MiB |
Before Width: | Height: | Size: 15 MiB |
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 1.6 MiB |