Ero sivun ”Python 2/Wikishakkisivu” versioiden välillä

Poistettu sisältö Lisätty sisältö
Raimondo (keskustelu | muokkaukset)
Raimondo (keskustelu | muokkaukset)
Rivi 479:
==== Toisen vaiheen ratkaisu ====
Ratkaisu on työnalla. Nyt ohjelmaan lisätään parametrointi ja parametrinä annetun siirron toteutus. Siirron toteutus voidaan ohjelmoida kolmessa vaiheessa
#* Parametri annetaan pitkällä algebrallisella notaatiolla, jolloin siitä saadaan sekä lähtö että kohderuutu.
{{hidden begin|title=Neljas karvalakkiversio|toggle=right}}
# Parametri annetaan lyhyellä algebrallisella notaatiolla, jolloin lähtöruutu pitää päätellä nappulakirjaimen ja kohderuudun sekä mahdollisen lisävihjeen perusteella.
 
# Lopuksi ohjelmaan voidaan lisätä vielä annetun siirron oikeellisuuden tarkistus.
Seuraava ohjelma lukee kommentteja sisältävän shakkilautamallineen parametrinä annetusta syötetiedostosta asema0, tallettaa yläotsikkorivit sellaisenaan tulostiedosyoon, talletaa sisältörivit matriisiin, suorittaa pitkalla algebrallisella notaatiolla annetun siirron matriisissa, tallettaa muokatun matriisin tulostiedostoon ja tallettaa alaotsikkorivit sellaisenaan tulostiedostoon.
 
;Koodi:
<source lang="Python">
# -*- coding: cp1252 -*-
 
import numpy as N
def shakkisiirto (asema0, asema1, siirto='ei siirtoa'):
 
#------------------------------------------------------------------
# Syotetiedoston testiluku ja tulostus
#------------------------------------------------------------------
f_syote = open(asema0, 'r') # Avataan lukemista varten
syote = f_syote.read() # Luetaan tiedosto merkkijonoksi
f_syote.close() # Suljetaan tiedosto
print " \n ==== Syotetiedosto ==== \n"
print(syote) # Tulostetaan merkkijono
#---------------------------------------------------------------------------------------
# Matriisin sl eli shakkilauta alustus ruutujen posititiotunuksilla, seka sisaltorivien
# alku- ja loppuosen tilavarauksilla. Matriisin sisalto ylikirjoitetaan myohemmin alkuaseman
# mukaisella sisaltodatalla.
#------------------------------------------------------------------------------------------
sl = N.array(([' ', 'a8', 'b8', 'c8', 'd8', 'e8', 'f8', 'g8', 'h8', ' '],
[' ', 'a7', 'b7', 'c7', 'd7', 'e7', 'f7', 'g7', 'h7', ' '],
[' ', 'a6', 'b6', 'c6', 'd6', 'e6', 'f6', 'g6', 'h6', ' '],
[' ', 'a5', 'b5', 'c5', 'd5', 'e5', 'f5', 'g5', 'h5', ' '],
[' ', 'a4', 'b4', 'c4', 'd4', 'e4', 'f4', 'g4', 'h4', ' '],
[' ', 'a3', 'b3', 'c3', 'd3', 'e3', 'f3', 'g3', 'h3', ' '],
[' ', 'a2', 'b2', 'c2', 'd2', 'e2', 'f2', 'g2', 'h2', ' '],
[' ', 'a1', 'b1', 'c1', 'd1', 'e1', 'f1', 'g1', 'h1', ' ']))
#-------------------------------------------------------------------------------------------
# Matriisin solujen indeksit
#--------------------------------------------------------------------------------------------
# alkuosa a b c d e f g h loppuosa
# 8 sl[0][0] sl[0][1] sl[0][2] sl[0][3] sl[0][4] sl[0][5] sl[0][6] sl[0][7] sl[0][8] sl[0][9]
# 7 sl[1][0] sl[1][1] sl[1][2] sl[1][3] sl[1][4] sl[1][5] sl[1][6] sl[1][7] sl[1][8] sl[1][9]
# 6 sl[2][0] sl[2][1] sl[2][2] sl[2][3] sl[2][4] sl[2][5] sl[2][6] sl[2][7] sl[2][8] sl[2][9]
# 5 sl[3][0] sl[3][1] sl[3][2] sl[3][3] sl[3][4] sl[3][5] sl[3][6] sl[3][7] sl[3][8] sl[3][9]
# 4 sl[4][0] sl[4][1] sl[4][2] sl[4][3] sl[4][4] sl[4][5] sl[4][6] sl[4][7] sl[4][8] sl[4][9]
# 3 sl[5][0] sl[5][1] sl[5][2] sl[5][3] sl[5][4] sl[5][5] sl[5][6] sl[5][7] sl[5][8] sl[5][9]
# 2 sl[6][0] sl[6][1] sl[6][2] sl[6][3] sl[6][4] sl[6][5] sl[6][6] sl[6][7] sl[6][8] sl[6][9]
# 1 sl[7][0] sl[7][1] sl[7][2] sl[7][3] sl[7][4] sl[7][5] sl[7][6] sl[7][7] sl[7][8] sl[7][9]
#----------------------------------------------------------
# Talletetaan syötetiedoston sisaltorivit matriisiin
#----------------------------------------------------------
f_tulos = open(asema1, 'w') # Tyhjennetaan tulostiedosto.
f_tulos.close()
f_tulos = open(asema1, 'a') # Avataan lisayskirjoitusta varten.
f_rivi = open(asema0, 'r') # Avataan lukemista varten.
for j in range(0,4): # Luetaan ja talletaan otsikkorivit tulostiedostoon.
rivi = f_rivi.readline()
f_tulos.write(rivi)
for j in range(0,8): # Luetaan ja talletaan sisaltorivit matriisiin
rivi = f_rivi.readline()
r = rivi.split('|')
sl[j] = r
#----------------------------------------------------------
# Mariisin sisalto ennen siirtoa
#----------------------------------------------------------
print ' \n ====sisaltomatriisi ennen sirtoa==== \n'
print sl
#----------------------------------------------------------------
# Suoritetaan pitkalla algebrallisella notaatiolla annetu siirto
#----------------------------------------------------------------
# Parametrina annetun siirtomerkinnan tulostus
print(' \n ==== Siirto ==== \n')
print(siirto)
# Siirron toteutus
# poimitaan siirtonotaatiosta lahto- ja kohderuutujen indeksimerkinnat
for i in range(0, len(siirto)):
if siirto[i] in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']:
# print siirto[i], siirto[i+1], siirto[i+3], siirto[i+4]
lr = siirto[i+1]; # print 'lr: ',lr
ls = siirto[i]; # print 'ls: ',ls
kr = siirto[i+4]; # print 'kr: ',kr
ks = siirto[i+3]; # print 'ks: ',ks
break
# Muunnetaan indeksimerkinnat matriisin lahtoruudun indekseiksi
lri = 0
lsi = 1
for si in ['a','b','c','d','e','f','g','h']:
if si == ls:
break
lsi =lsi+1
for ri in ['8','7','6','5','4','3','2','1']:
if ri == lr:
break
lri =lri+1
# Muunnetaan indeksimerkinnat matriisin kohderuudun indekseiksi
kri = 0
ksi = 1
for si in ['a','b','c','d','e','f','g','h']:
if si == ks:
break
ksi =ksi+1
for ri in ['8','7','6','5','4','3','2','1']:
if ri == kr:
break
kri =kri+1
# Toteutetaan siirto
sl[kri][ksi] = sl[lri][lsi] # lahtoruudun sisalto kohderuutuun
sl[lri][lsi] = ' ' # tyhjataan lahtoruutu
 
#----------------------------------------------------------
# Mariisin sisallon testitulostus siirron jalkeen
#----------------------------------------------------------
print ' \n ====sisaltomatriisi siirron jalkeen==== \n'
print sl
#----------------------------------------------------------
# Talletaan muokattu matriisi tulostiedostoon
#----------------------------------------------------------
for j in range(0,8):
for i in range(0,10):
# print sl[j][i],
if i==0:
jono = sl[j][i]
else:
jono = '|' + sl[j][i]
f_tulos.write(jono)
#------------------------------------------------------------------
# Talletaan alaotsikkorivit (3 kpl) tulostiedostoon
#------------------------------------------------------------------
for j in range(0,3):
rivi = f_rivi.readline()
f_tulos.write(rivi)
f_rivi.close() # suljetaan tiedosto
f_tulos.close() # suljetaan tiedosto
#------------------------------------------------------------------
# Tulostiedoston testiluku ja tulostus
#------------------------------------------------------------------
# Avataan tiedosto asema1.txt lukemista varten
f_tulos = open(asema1, 'r')
# Luetaan koko tiedosto merkkijonoksi s_peliasema
tulos = f_tulos.read()
# Suljetaan tiedosto f_peliaema - tiedosto voidaan sulkea heti kun se on luettu
f_tulos.close()
print " \n ==== Tulostiedosto ==== \n"
print(tulos)
 
</source>
 
;Testitulostus: siirrolle 1. Rg1-h3
 
<source lang="Python">
>>>
==== Syotetiedosto ====
 
{{Šakkilauta|=
|
|
|=
8 |rd|nd|bd|qd|kd|bd|nd|rd|=
7 |pd|pd|pd|pd|pd|pd|pd|pd|=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 |pl|pl|pl|pl|pl|pl|pl|pl|=
1 |rl|nl|bl|ql|kl|bl|nl|rl|=
a b c d e f g h
|
}}
 
====sisaltomatriisi ennen sirtoa====
 
[[' 8 ' 'rd' 'nd' 'bd' 'qd' 'kd' 'bd' 'nd' 'rd' '=\n']
[' 7 ' 'pd' 'pd' 'pd' 'pd' 'pd' 'pd' 'pd' 'pd' '=\n']
[' 6 ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '=\n']
[' 5 ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '=\n']
[' 4 ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '=\n']
[' 3 ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '=\n']
[' 2 ' 'pl' 'pl' 'pl' 'pl' 'pl' 'pl' 'pl' 'pl' '=\n']
[' 1 ' 'rl' 'nl' 'bl' 'ql' 'kl' 'bl' 'nl' 'rl' '=\n']]
==== Siirto ====
 
1. Rg1-h3
====sisaltomatriisi siirron jalkeen====
 
[[' 8 ' 'rd' 'nd' 'bd' 'qd' 'kd' 'bd' 'nd' 'rd' '=\n']
[' 7 ' 'pd' 'pd' 'pd' 'pd' 'pd' 'pd' 'pd' 'pd' '=\n']
[' 6 ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '=\n']
[' 5 ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '=\n']
[' 4 ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '=\n']
[' 3 ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'nl' '=\n']
[' 2 ' 'pl' 'pl' 'pl' 'pl' 'pl' 'pl' 'pl' 'pl' '=\n']
[' 1 ' 'rl' 'nl' 'bl' 'ql' 'kl' 'bl' ' ' 'rl' '=\n']]
==== Tulostiedosto ====
 
{{Šakkilauta|=
|
|
|=
8 |rd|nd|bd|qd|kd|bd|nd|rd|=
7 |pd|pd|pd|pd|pd|pd|pd|pd|=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | |nl|=
2 |pl|pl|pl|pl|pl|pl|pl|pl|=
1 |rl|nl|bl|ql|kl|bl| |rl|=
a b c d e f g h
|
}}
 
>>>
</source>
 
{{hidden end|toggle=right}}
 
* Parametri annetaan lyhyellä algebrallisella notaatiolla, jolloin lähtöruutu pitää päätellä nappulakirjaimen ja kohderuudun sekä mahdollisen lisävihjeen perusteella.
* Lopuksi ohjelmaan voidaan lisätä vielä annetun siirron oikeellisuuden tarkistus.
 
===Aiheesta muualla===