Форум сайта python.su
0
def tst (x,y,raspolojenie,chasti,nomerchasti):
Test=True
if raspolojenie==horisnontell:
for x1 in range (x-delnummer+1,x-nomerchasti+chasti+1):
Test=square_list[x1*10+y].test_free()
if Test==False:
break
else:
for y1 in range (y-delnummer+1,y-nomerchasti+chasti+1):
Test=square_list[x*10+y1].test_free()
if Test==False:
break
if Test==True:
if lage==True:
for y1 in range (y-1,y+2):
for x1 in range (x-delnummer,x-nomerchasti+chasti+2):
square_list[x1*10+y1].senkt()
else:
for x1 in range (x-1,x+2):
for y1 in range (y-delnummer,y-nomerchasti+chasti+2):
square_list[x1*10+y1].senkt()
class square():
def __init__(self,x,y,framerut): # Содаем ячейку с координатаоми x и y в GRID'e
bla-bla-bla
def senkt(self):
if self.touched==False:
self.rut['bg']='orange'
def test_free(self):
if self.rouched==True:
return True
else:
return False
Отредактировано (Ноя. 29, 2010 20:16:09)
Офлайн
0
Блин, до телепатии через междусетье ещё не додумалист же.
Ты в чём вообще делаешь - в консоли, в гуе каком-нибудь, в pygame или RenPy?
Ну а в общем я бы сделал так:
1) Есть двухмерная матрица поля, где каждая ячейка имеет логический атрибут “простреляна”.
2) Объекты-корабли содержат список занимаемых ячеек(индексов матрицы поля), тоже с атрибутами - секция корабля цела/уничтожена.
3) При попадании секция отмечается уничтоженной и проверяется список секций.
4) Если оказалось что уничтожены все - для каждой секции вызывается функция, ставящая “простреляна” в True её и восемь ячеек вокруг(от (-1,-1) до (+1,+1) к координатам секции в матрице).
Только не забудь поставить условие или перехватчик исключений IndexError чтобы не вылетала при уничтожении кораблей на краю карты.
P.S. Такая структура позволит реализовать и модификацию морского - космический бой.
Офлайн
0
Eliont
Да я, вроде, примерно так и делаю.
Я начал программировать с начала учебного года, так что словами объяснить трудно еще… =(
Вот код всей программы, если это поможет. Делаю в стандартном GUI
# -*- coding: utf-8 -*-
from Tkinter import *
import random
def tst (x,y,position,number_of_squares,square_number):
Test=True
if position==True:
for x1 in range (x-square_number+1,x-square_number+number_of_squares+1):
Test=square_list[x1*10+y].test_free()
if Test==False:
break
else:
for y1 in range (y-square_number+1,y-square_number+number_of_squares+1):
Test=square_list[x*10+y1].test_free()
if Test==False:
break
if Test==True:
if position==True:
for y1 in range (y-1,y+2):
for x1 in range (x-square_number,x-square_number+number_of_squares+2):
square_list[x1*10+y1].sink()
else:
for x1 in range (x-1,x+2):
for y1 in range (y-square_number,y-square_number+number_of_squares+2):
square_list[x1*10+y1].sink()
class Square():
def __init__(self,x,y,framesquare):
self.square=Button(framesquare,width=2, height=1, bg='grey', command=self.miss)
self.x=x
self.y=y
self.square.grid(row=x,column=y)
self.free=True
self.number_of_squares=0
self.horisontell=True
self.square_number=0
self.shooting=self.missing=0
def new_game(self, number_of_squares, position, square_number):
self.free=False
self.square['bg']='red'
self.square['command']=self.shoot
self.horisontell=position
self.free=False
self.number_of_squares=number_of_squares
self.square_number=square_number
def sink(self):
if self.missing==0:
self.square['bg']='orange'
def test_free(self):
if self.missing==1:
return True
else:
return False
def reset (self):
self.square['bg']='grey'
self.free=True
self.square['command']=self.miss
self.shooting=self.missing=0
def test (self):
if self.free==True:
return True
else:
return False
def miss(self):
self.square['bg']='green'
self.missing=1
def shoot(self):
self.square['bg']='blue'
self.shooting=1
self.missing=1
tst(self.x,self.y,self.horisontell,self.number_of_squares,self.square_number)
def skill1 (self):
return self.missing
def skill2 (self):
return self.shooting
def skill():
miss=shoot=0
for y in range (10):
for x in range (10):
miss+=square_list[x*10+y].skill1()
shoot+=square_list[x*10+y].skill2()
lab = Label(root, text=(shoot/(miss+0.000000000001)*100), font="Arial 10")
lab.pack(side='left')
def new_game():
for y in range (10):
for x in range (10):
square_list[x*10+y].reset()
horisontell=[True,False]
for number_of_squares in range (1,5):
for numbers in range(5-number_of_squares):
square_number=1
test=False
while test==False:
position=random.choice(horisontell)
if position==True:
x=random.randrange(0,11-number_of_squares)
y=random.randrange(10)
for y1 in range(y-1, y+2):
x1=x-1
for a in range(number_of_squares+2):
if y1<0:
y1+=1
if y1>9:
y1-=1
if x1<0:
x1+=1
if x1>9:
x1-=1
test=square_list[x1*10+y1].test()
x1+=1
if test==False:
break
if test==False:
break
else:
y=random.randrange(0,11-number_of_squares)
x=random.randrange(10)
for x1 in range(x-1, x+2):
y1=y-1
for a in range(number_of_squares+2):
if y1<0:
y1+=1
if y1>9:
y1-=1
if x1<0:
x1+=1
if x1>9:
x1-=1
test=square_list[x1*10+y1].test()
y1+=1
if test==False:
break
if test==False:
break
for numbers in range(number_of_squares):
square_list[x*10+y].new_game(number_of_squares, position, square_number)
square_number+=1
test=False
if position == True:
x+=1
else:
y+=1
root = Tk()
root.title('Sänka skepp')
frame=Frame()
frame.pack()
"""text="För att börja nytt spell, tryck Meny-New Game! \n =)"
lab = Label(root, text=text, font="Arial 10")
lab.pack(side='left')
ent = Entry(frame, text=’’, width=20,bd=3)
ent.pack()"""
menubar=Menu(frame)
menu=Menu(menubar)
menu.add_command(label="New game", command=new_game )
menu.add_command(label="Reset", )
menu.add_command(label='Quit', command=root.destroy)
menu.add_command(label="Skill", command=skill)
help_menu=Menu(menubar)
help_menu.add_command(label='About')
help_menu.add_command(label='Rules')
menubar.add_cascade(label="Menu", menu=menu)
menubar.add_cascade(label="About", menu=help_menu)
root.config(menu=menubar)
square_list=[]
framesquare=Frame(root)
#framesquare.pack()
for y in range (10):
for x in range (10):
b=Square(x,y,framesquare)
square_list.append(b)
framesquare.pack()
root.mainloop()

Отредактировано (Ноя. 30, 2010 20:28:58)
Офлайн
0
Такие ошибки вылазят:
File “/home/roman/Desktop/boot.py”, line 21, in tst
square_list.sink()
IndexError: list index out of range
File “/home/roman/Desktop/boot.py”, line 9, in tst
Test=square_list.test_free()
IndexError: list index out of range
Офлайн
0
romis
Я не сделал еще условие, если корабль находится на краю поля. Но сейчас мне нужна помощь для общего алгоритма. =(
Офлайн
857
def test_free(self):
if self.rouched==True:
return True
else:
return False
def test_free(self):
return self.rouched == True
def test_free(self):
return self.rouched
square_list[
Отредактировано (Дек. 1, 2010 06:22:58)
Офлайн
0
Посмотрел повнимательнее, покопался…
Вот, держи.
Офлайн
0
Eliont
Спасибо ;)
Офлайн
0
Пожалуйста ^_o
Морской бой в т-кинтере - интересная идея. Не менее интересная чем курсовик по имитационному моделированию выполненный на движке визуальных новелл RenPy.
Офлайн
0
Eliont
Твоя ирония, может, и оправдана, но т-кинтер - это единственная графическая библиотека, которую я знаю :P
Отредактировано (Дек. 2, 2010 21:13:23)
Офлайн