Форум сайта python.su
Мне нужно написать программу на Python. Но я не могу…на Паскале написала…а на Питоне не получается…ПОМОГИТЕ!!!!!!
В шашечном эндшпиле остались белая дамка и две черные пешки,позиции которых известны. Ход белых. Сможет ли дамка срубить одну или сразу обе пешки?
Программа на Паскале есть,если нужно,то скину.
Заранее спасибо)))
Офлайн
Программа на паскале))))
procedure Error (msg:string);
begin
writeln;
writeln (msg);
write ('Нажмите ENTER для выхода из программы');
reset (input); readln; halt;
end;
procedure ReadXY (msg:string; var x,y:integer);
var n:integer;
begin
repeat
writeln;
write (msg);
{$I-}read(n);{$I+}
if (IoResult<>0) or (n<11) or (n>88) then begin
writeln ('Недопустимый ввод! Введите координату клетки от 11 до 88');
continue;
end;
x := n div 10;
y := n mod 10;
if (x>8) or (y>8) then begin
writeln ('Ни одна из координат не может быть больше 8');
continue;
end;
if (x+y) mod 2 = 1 then begin
writeln ('Вы ввели координаты белой клетки, допустимы только черные');
continue;
end;
break;
until false;
end;
function OnEdge (x,y:integer):boolean;
begin
if (x=1) or (x=8) or (y=1) or (y=8) then OnEdge:=true
else OnEdge:=false;
end;
function Coord (x,y:integer):integer;
begin
Coord:=x*10+y;
end;
function OnDiag (x1,y1,x2,y2:integer):integer;
{Если шашки на одной диагонали, вернет расстояние в клетках
между ними, иначе 0}
var n:integer;
begin
n:=abs(Coord(x1,y1)-Coord(x2,y2));
if n mod 11=0 then OnDiag:=n div 11
else if n mod 9=0 then OnDiag:=n div 9
else OnDiag:=0;
end;
function DifferentSides(x1,y1,x0,y0,x2,y2:integer):boolean;
{истина, если (x0,y0) лежит между остальными 2 точками}
var n1,n0,n2:integer;
begin
n1:=Coord (x1,y1); n2:=Coord (x2,y2); n0:=Coord (x0,y0);
if (n1<n0) and (n0<n2) or (n2<n0) and (n0<n1) then DifferentSides:=true
else DifferentSides:=false;
end;
function CrossDiag(x1,y1,x2,y2,x0,y0:integer):boolean;
{Ищем точки пересечения (x,y) диагоналей шашек перебором -
для точки пересечения характерно то, что она принадлежит
диагоналям обеих шашек}
var x,y,k:integer;
begin
if (OnDiag(x1,y1,x2,y2)>0) then begin
{На одной диагноали не надо искать}
CrossDiag:=false;
Exit;
end;
x:=1; k:=0;
while x<9 do begin
if x mod 2=1 then y:=1 else y:=2;
while y<9 do begin {Перебор всех черных клеток доски}
if (OnDiag (x,y,x1,y1)>0) and (OnDiag (x,y,x2,y2)>0) then begin
if DifferentSides(x,y,x1,y1,x0,y0)=true then begin
CrossDiag:=true;
Exit;
end;
inc(k);
if k=2 then break; {Всего не более 2 точек пересечения}
end;
inc (y,2);
end;
inc(x);
end;
CrossDiag:=false;
end;
var x0,y0,x1,y1,x2,y2:integer;
is1,is2:boolean;
begin
{Вводим и проверяем координаты}
ReadXY ('Координаты дамки: ‘,x0,y0);
ReadXY (’Координаты 1-й шашки: ‘,x1,y1);
ReadXY (’Координаты 2-й шашки: ‘,x2,y2);
if (Coord(x0,y0)=Coord(x1,y1)) or (Coord(x0,y0)=Coord(x2,y2)) or
(Coord(x1,y1)=Coord(x2,y2)) then
Error (’Все 3 клетки должны быть разными!');
is1:=(OnEdge(x1,y1)=false) and (OnDiag (x1,y1,x2,y2)<>1) and
(OnDiag(x1,y1,x0,y0)>0);
is2:=(OnEdge(x2,y2)=false) and (OnDiag (x1,y1,x2,y2)<>1) and
(OnDiag(x2,y2,x0,y0)>0);
write ('Шашка 1 ‘);
if is1=true then writeln (’ рубится напрямую')
else if (is2=true) and (CrossDiag(x2,y2,x1,y1,x0,y0)=true)
and (OnEdge(x1,y1)=false) then writeln (' рубится после второй')
else writeln (' НЕ рубится');
write ('Шашка 2 ‘);
if is2=true then writeln (’ рубится напрямую')
else if (is1=true) and (CrossDiag(x1,y1,x2,y2,x0,y0)=true)
and (OnEdge(x2,y2)=false) then writeln (' рубится после первой')
else writeln (' НЕ рубится');
writeln;
write ('ENTER для выхода');
reset (input); readln;
end.
Вид шахматной доски
8 28 48 68 88
7 17 37 57 77
6 26 46 66 86
5 15 35 55 75
4 24 44 64 84
3 13 33 53 73
2 22 42 62 82
1 11 31 51 71
1 2 3 4 5 6 7 8
Одиночные числа это наименования столбцов и строк
Офлайн
Создание доски….а как дальше
import sys
from copy import deepcopy
sys.setrecursionlimit = 1000000
doska = [ for i in xrange(8)]
def print_doska(doska):
for i in doska:
print i
print ‘————————’
print_doska(doska)
horse =
n = input()
doska[horse][horse] = -1
print_doska(doska)
def step(N,n,x,y,doska):
if n == 0:
print_doska(doska)
else:
if x>=2 and y>=1:
step1 = deepcopy(doska)
step1 = N-n
step(N,n-1,x-2,y-1,step1)
if x>=2 and y<=6:
step2=deepcopy(doska)
step2 = N-n
step(N,n-1,x-2,y+1,step2)
if x>=1 and y<=5:
step3=deepcopy(doska)
step3=N-n
step(N,n-1,x-1,y+2,step3)
if x<=6 and y<=5:
step4=deepcopy(doska)
step4 = N-n
step(N,n-1,x+1,y+2,step4)
if x<=5 and y<=6:
step5=deepcopy(doska)
step5=N-n
step(N,n-1,x+2,y+1,step5)
if x<=5 and y>=1:
step6=deepcopy(doska)
step6=N-n
step(N,n-1,x+2,y-1,step6)
if x<=6 and y>=2:
step7=deepcopy(doska)
step7=N-n
step(N,n-1,x+1,y-2,step7)
if x>=1 and y>=2:
step8=deepcopy(doska)
step8=N-n
step(N,n-1,x-1,y-2,step8)
step(n,n,horse,horse,doska)
Офлайн
Прошу помогите….а то из-за этой глупости не хочу вылетать из инста…нам дали на изучение питона 10 дней так что поймите правильноо
Офлайн
import sys
from math import fabs
def error(msg):
print msg
print 'Fatal erroe'
sys.exit()
def readxy(msg):
while True:
print msg
n = input()
if not ((type(n) == int) and (11 <= n) and (n <= 88)):
print 'IO error. Enter a number from 11 to 88'
continue
x = int(str(n)[0])
y = int(str(n)[1])
if divmod(x+y,2)[1] == 1:
print "You've entered the coordinates of white fields, but only black fields are avaliable"
continue
print x, y
return x, y
break
def onedge(x, y):
if x == 1 or x == 8 or y == 1 or y == 8: return True
else: return False
def coord(x, y):
return x*10 + y
def ondiag(x1, y1, x2, y2):
n = fabs(coord(x1,y1)-coord(x2,y2))
if divmod(n, 11)[1] == 0: return divmod(n, 11)[0]
elif divmod(n, 9)[1] == 0: return divmod(n, 9)[0]
else: return 0
def differentsides(x1, y1, x0, y0, x2, y2):
n1 = coord(x1, y1)
n2 = coord(x2, y2)
n0 = coord(x0, y0)
if (n1 < n0 and n0 < n2) or (n2 < n0 and n0 < n1): return True
else: return False
def crossdiag(x1, y1, x2, y2, x0, y0):
if ondiag(x1, y1, x2, y2) > 0: return False
x, k = 1, 0
while x < 9:
if divmod(x, 2)[1] == 1: y = 1
else: y = 2
while y < 9:
if ondiag(x, y, x1, y1) > 0 and ondiag(x, y, x2, y2) > 0:
if differentsides(x, y, x1, y1, x0, y0) == True:
return True
sys.exit()
k = k + 1
if k == 2: break
y = y + 2
x = x + 1
x0,y0,x1,y1,x2,y2,is1,is2 = 0,0,0,0,0,0,True,True
x0, y0 = readxy('King coord: ')
x1, y1 = readxy('Draught #1: ')
x2, y2 = readxy('Draught #2: ')
if coord(x0, y0) == coord(x1, y1) or coord(x0, y0) == coord(x2, y2) or \
coord(x1, y1) == coord(x2, y2):
error('All 3 fields must be different!')
is1 = (onedge(x1, y1) == False) and (ondiag(x1, y1, x2, y2) <> 1) and \
(ondiag(x1, y1, x0, y0) > 0)
is2 = (onedge(x2, y2) == False) and (ondiag(x1, y1, x2, y2) <> 1) and \
(ondiag(x2, y2, x0, y0) > 0)
print 'Draught #1'
if is1 == True: print 'rubitsya na pryamuyu O_o //hard to translate...'
elif is2 == True and crossdiag(x2, y2, x1, y1, x0, y0) == True and \
onedge(x1, y1) == False: print 'rubitsya posle vtoroy O_o //hard to translate....'
else: print 'ne rubitsya O_o //hard to translate....'
print 'Draught #2'
if is2 == True: print 'rubitsya na pryamuyu O_o //hard to translate....'
elif is1 == True and crossdiag(x1, y1, x2, y2, x0, y0) == True and \
onedge(x2, y2) == False: print 'rubitsya posle pervoy O_o //hard to translate....'
else: print 'ne rubyatsa O_o //hard to translate....'
Отредактировано (Июль 8, 2011 15:57:46)
Офлайн