Instantly share code, notes, and snippets.
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
Save ejherran/48b84d2e5524ed10c059339ca9eaf891 to your computer and use it in GitHub Desktop.
Astucia naval, con arreglos. Concepto
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import random as rnd | |
class Naval(): | |
def __init__(self): | |
self.tabM = Naval.createBoard(8, 8, "·") # Tableros | |
self.tabJ = Naval.createBoard(8, 8, "·") | |
self.barM = [] # Barcos | |
self.barJ = [] | |
self.disM = [] # Disparos | |
self.disJ = [] | |
self.punM = 0 # Puntos | |
self.punJ = 0 | |
self.ulti = [] # Ultima coordenada exitosa | |
self.posi = [] # Posibles coordenadas de los barcos | |
self.modo = 0 # Modo de escaneo | |
def createBoard(zH, zW, ini): # zH = Filas, zW = Columnas | |
res = [] | |
for i in range(zH): | |
tmp = [] | |
for j in range(zW): | |
tmp.append(ini) | |
res.append(tmp) | |
return res | |
def drawBoard(mat): | |
tags = "ABCDEFGH" | |
ccol = [] | |
for i in range(1, 9): | |
ccol.append(str(i)) | |
print(" "+" ".join(ccol)) | |
for i in range(8): | |
print(tags[i]+" "+" ".join(mat[i])) | |
def coorToIndex(c): | |
tags = "ABCDEFGH" | |
r = tags.index(c[0]) | |
c = int(c[1])-1 | |
return (r,c) | |
def indexToCoor(i): | |
tags = "ABCDEFGH" | |
r = tags[i[0]] | |
c = str(i[1]+1) | |
return r+c | |
def inLine(arr): | |
flr = True | |
flc = True | |
inr = arr[0][0] | |
inc = arr[0][1] | |
for c in arr: | |
if(inr != c[0]): | |
flr = False | |
if(inc != c[1]): | |
flc = False | |
flag = True | |
if(flr): # Horizontal | |
for k in range(len(arr)-1): | |
ant = Naval.coorToIndex(arr[k]) | |
sig = Naval.coorToIndex(arr[k+1]) | |
dif = abs(sig[1]-ant[1]) | |
if(dif != 1): | |
flag = False | |
break | |
elif(flc): # Vertical | |
for k in range(len(arr)-1): | |
ant = Naval.coorToIndex(arr[k]) | |
sig = Naval.coorToIndex(arr[k+1]) | |
dif = abs(sig[0]-ant[0]) | |
if(dif != 1): | |
flag = False | |
break | |
else: | |
flag = False | |
return flag | |
def noCollide(o, d, s, u): # d = 1 -> Arriba, d = 2 -> Derecha, d = 3 -> Abajo, d = 4 -> Izquierda | |
r = o[0] | |
c = o[1] | |
flag = True | |
if(d == 1 and not( r-s+1 >= 0 )): | |
return False | |
elif(d == 2 and not( c+s-1 <= 7 )): | |
return False | |
elif(d == 3 and not( r+s-1 <= 7 )): | |
return False | |
elif(d == 4 and not( c-s+1 >= 0 )): | |
return False | |
else: | |
for k in range(1, s): | |
if(d == 1): | |
tmp = Naval.indexToCoor( (r-k, c) ) | |
if(tmp in u): | |
flag = False | |
break | |
elif(d == 2): | |
tmp = Naval.indexToCoor( (r, c+k) ) | |
if(tmp in u): | |
flag = False | |
break | |
elif(d == 3): | |
tmp = Naval.indexToCoor( (r+k, c) ) | |
if(tmp in u): | |
flag = False | |
break | |
elif(d == 4): | |
tmp = Naval.indexToCoor( (r, c-k) ) | |
if(tmp in u): | |
flag = False | |
break | |
return flag | |
def evalHit(r, c, s, mat, bar): | |
fin = False # Si golpee | |
fun = False # Si Hundio | |
if(mat[r][c] == "#"): | |
mat[r][c] = "o" | |
fin = True | |
for i in range(len(bar)): | |
try: | |
ind = bar[i].index(s) | |
del(bar[i][ind]) | |
if(len(bar[i]) == 0): | |
fun = True | |
except: | |
pass | |
else: | |
mat[r][c] = "x" | |
return (fin, fun) | |
def disPlayer(self): | |
sec = [4, 3, 3, 2] | |
while(True): | |
try: | |
cc = 0 | |
repe = [] | |
gru = [] | |
#data = input("Please locate your boats: ") | |
data = "A1 A2 A3 A4 F7 F6 F5 C3 C4 C5 B6 B7" | |
data = data.upper() | |
data = data.split(" ") | |
ant = 0 | |
for s in sec: | |
tmp = data[ant:ant+s] | |
if(Naval.inLine(tmp)): | |
flag = True | |
for c in tmp: | |
ind = Naval.coorToIndex(c) | |
if( not( (ind[0] >= 0 and ind[0] <= 7) and (ind[1] >= 0 and ind[1] <= 7) ) ): | |
if( c in repe ): | |
flag = False | |
break | |
if(flag): | |
repe = repe+tmp | |
gru.append(tmp) | |
cc = cc+s | |
else: | |
break | |
else: | |
break | |
ant = ant + s | |
if(cc == 12): | |
self.barJ = gru | |
for c in repe: | |
ind = Naval.coorToIndex(c) | |
self.tabJ[ ind[0] ][ ind[1] ] = "#" | |
break | |
except: | |
pass | |
def disMachine(self): | |
sec = [4, 3, 3, 2] | |
cs = 0 | |
cc = 0 | |
repe = [] | |
gru = [] | |
while(cc < 12): | |
r = rnd.randint(0, 7) | |
c = rnd.randint(0, 7) | |
tmp = [Naval.indexToCoor( (r,c) )] | |
flag = True | |
if( not( Naval.indexToCoor( (r,c) ) in repe ) ): | |
d = rnd.randint(1, 4) | |
lim = sec[cs] | |
if(d == 1): | |
if( (r-lim+1 >= 0) and Naval.noCollide( (r,c), d, lim, repe ) ): | |
for k in range(1, lim): | |
tmp.append(Naval.indexToCoor( (r-k, c) )) | |
else: | |
flag = False | |
elif(d == 2): | |
if( (c+lim-1 <= 7) and Naval.noCollide( (r,c), d, lim, repe ) ): | |
for k in range(1, lim): | |
tmp.append(Naval.indexToCoor( (r, c+k) )) | |
else: | |
flag = False | |
elif(d == 3): | |
if( (r+lim-1 <= 7) and Naval.noCollide( (r,c), d, lim, repe ) ): | |
for k in range(1, lim): | |
tmp.append(Naval.indexToCoor( (r+k, c) )) | |
else: | |
flag = False | |
elif(d == 4): | |
if( (c-lim+1 <= 7) and Naval.noCollide( (r,c), d, lim, repe ) ): | |
for k in range(1, lim): | |
tmp.append(Naval.indexToCoor( (r, c-k) )) | |
else: | |
flag = False | |
else: | |
flag = False | |
if(flag): | |
repe = repe + tmp | |
gru.append(tmp) | |
cc = cc + sec[cs] | |
cs = cs+1 | |
self.barM = gru | |
for c in repe: | |
ind = Naval.coorToIndex(c) | |
self.tabM[ ind[0] ][ ind[1] ] = "#" | |
def shootMachine(self): | |
if( self.modo > 0): | |
if(self.modo == 1): | |
i = rnd.randint(0, len(self.posi)-1) | |
o = self.posi[i] | |
del(self.posi[i]) | |
s = Naval.indexToCoor(o) | |
self.disM.append(s) | |
est = Naval.evalHit(o[0], o[1], s, self.tabJ, self.barJ) | |
if(est[0]): | |
self.punM = self.punM + 1 | |
self.ulti.append(o) | |
self.generateCoor(o[0], o[1]) | |
if(est[1]): | |
print("Sunken Ship") | |
self.ulti = [] | |
self.posi = [] | |
if(len(self.ulti) == 2): | |
self.generateCoorInLine() | |
self.modo = 2 | |
if(len(self.posi) == 0): | |
self.modo = 0 | |
elif(self.modo == 2): | |
o = self.posi[0] | |
del(self.posi[0]) | |
s = Naval.indexToCoor(o) | |
self.disM.append(s) | |
est = Naval.evalHit(o[0], o[1], s, self.tabJ, self.barJ) | |
if(est[0]): | |
self.punM = self.punM + 1 | |
self.ulti[1] = o | |
self.generateCoor(o[0], o[1]) | |
self.generateCoorInLine() | |
if(est[1]): | |
print("Sunken Ship") | |
self.posi = [] | |
if(len(self.posi) == 0): | |
self.ulti = [] | |
self.modo = 0 | |
else: # Ataque aleatorio | |
while(True): | |
r = rnd.randint(0, 7) | |
c = rnd.randint(0, 7) | |
s = Naval.indexToCoor( (r,c) ) | |
if( not(s in self.disM) ): | |
self.disM.append(s) | |
est = Naval.evalHit(r, c, s, self.tabJ, self.barJ) | |
if(est[0]): # Si golpee | |
self.punM = self.punM + 1 | |
self.ulti.append( (r,c) ) | |
self.generateCoor(r, c) | |
self.modo = 1 | |
if(est[1]): # Si hundi | |
print("Sunken Ship!") | |
self.posi = [] | |
self.ulti = [] | |
self.modo = 0 | |
break | |
def generateCoor(self, r, c): | |
opts = [ (r-1, c), (r, c+1), (r+1, c), (r, c-1) ] | |
for o in opts: | |
if( ( o[0] >= 0 and o[0] <=7 ) and ( o[1] >= 0 and o[1] <=7 ) ): | |
if( not( Naval.indexToCoor( o ) in self.disM ) and not( o in self.posi ) ): | |
self.posi.append(o) | |
def generateCoorInLine(self): | |
opts = [] | |
if(self.ulti[0][0] == self.ulti[1][0]): # Filas iguales, Horizontal | |
if(self.ulti[0][1] > self.ulti[1][1]): | |
opts.append( (self.ulti[0][0], self.ulti[0][1]+1) ) | |
opts.append( (self.ulti[1][0], self.ulti[1][1]-1) ) | |
else: | |
opts.append( (self.ulti[1][0], self.ulti[1][1]+1) ) | |
opts.append( (self.ulti[0][0], self.ulti[0][1]-1) ) | |
elif(self.ulti[0][1] == self.ulti[1][1]): # Columnas iguales, Vertical | |
if(self.ulti[0][0] > self.ulti[1][0]): | |
opts.append( (self.ulti[0][0]+1, self.ulti[0][1]) ) | |
opts.append( (self.ulti[1][0]-1, self.ulti[1][1]) ) | |
else: | |
opts.append( (self.ulti[1][0]+1, self.ulti[1][1]) ) | |
opts.append( (self.ulti[0][0]-1, self.ulti[0][1]) ) | |
oks = [] | |
for o in opts: | |
if( ( o[0] >= 0 and o[0] <=7 ) and ( o[1] >= 0 and o[1] <=7 ) ): | |
if( not( Naval.indexToCoor( o ) in self.disM )): | |
oks.append(o) | |
if(o in self.posi): | |
ind = self.posi.index(o) | |
del(self.posi[ind]) | |
for o in oks: | |
self.posi = [o]+self.posi | |
n = Naval() | |
n.disPlayer() | |
n.disMachine() | |
while(n.punJ < 12 and n.punM < 12): | |
print("MACHINE:", n.punM, "PLAYER:", n.punJ) | |
Naval.drawBoard(n.tabM) | |
print("=================") | |
Naval.drawBoard(n.tabJ) | |
while(True): | |
at = input("Ataque?: ") | |
at = at.upper() | |
ind = Naval.coorToIndex(at) | |
if( ( ind[0] >= 0 and ind[0] <=7 ) and ( ind[1] >= 0 and ind[1] <=7 ) ): | |
if(not(at in n.disJ)): | |
n.disJ.append(at) | |
break | |
est = Naval.evalHit(ind[0], ind[1], at, n.tabM, n.barM) | |
if(est[0]): | |
n.punJ = n.punJ+1 | |
if(est[1]): | |
print("Sunken Ship") | |
n.shootMachine() | |
Naval.drawBoard(n.tabM) | |
print("=================") | |
Naval.drawBoard(n.tabJ) | |
if(n.punJ == 12): | |
print("PLAYER WINS") | |
else: | |
print("PLAYER LOSSES") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment