Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Ongelma ristinollassa Python

Indexivirhe [01.03.2014 17:01:52]

#

Oon tässä koodaillu ristinollaa jonku tutoriaalin pohjalta, ja nyt on käytnyt ilmi, että toimii muuten paitsi, kun tietokone voittaa ohjelma ei keskeydy vaan voin silti syöttää omat siirtoni ja täten myös voittaa, koodi on siis pythonia

import random

board = [0,1,2,
3,4,5,
6,7,8]

def nayta():
	print board[0], '|',board[1],'|',board[2]
	print '----------'
	print board[3], '|',board[4],'|',board[5]
	print '----------'
	print board[6], '|',board[7],'|',board[8]

def checkLine(char, spot1, spot2, spot3):
	if (board[spot1] == char) and (board[spot2] == char) and (board [spot3] == char)	:
		return True
	else:
		return False

def checkAll(char):
	ret = False
	if checkLine(char, 0, 1, 2):
		ret = True
	if checkLine(char, 0,3, 6):
		ret = True
	if checkLine(char, 1, 4, 7):
		ret = True
	if checkLine(char, 2, 5, 8):
		ret = True
	if checkLine(char, 6, 7, 8):
		ret = True
	if checkLine(char, 3, 4, 5):
		ret = True
	if checkLine(char, 2, 4, 6):
		ret = True
	if checkLine(char, 0, 4, 8):
		ret = True
	return ret

moves = range(9)
numindex = 1
ratkennut = False
while moves:
	nayta()

	input = raw_input("Sijoita x: ")
	try:
		val = int(input)
		input = int(input)
	except ValueError:
		print("Syota numero")
		input = raw_input("Sijoita x: ")
		input = int(input)
	if input in moves:
		moves.remove(input)

	if board [input] != 'x' and board[input] != 'o':
		board[input] = 'x'

		if checkAll('x') == True:
			print "~~ X Voitti ~~"
			ratkennut = True
			break;

		while moves:
			random.seed() #Arpooo vastustajan liikkeen
			opponent = random.choice(moves)
			moves.remove(opponent)

			if board[opponent] != 'o' and board[opponent] != 'x':
				board[opponent] = 'o'

				if checkAll('o') == True:
					print "~~ O Voitti ~~"
					ratkennut = True
				break;
	else:
		print 'Tama paikka on varattu'
else:
	print "Tasapeli"

The Alchemist [01.03.2014 17:07:11]

#

En jaksa edes lukea koodia, koska ratkaisu on niin itsestään selvä. Tarkista tarvittavissa paikoissa pelin tila ja salli käyttäjän siirrot vain silloin, kun tila on sopiva.

Tiloja voi olla kaksi tai useampia. Loogisimmat kaksi vaadittua tilaa: peli käynnissä, peli ei käynnissä. Miksi tämä piti sanoa erikseen?

Indexivirhe [01.03.2014 17:11:53]

#

Siis tarkoitin sitä että peli ei lopu siihen kun vasustaja voittaa vaan jatkuu siitä eteenpäin..

Metabolix [01.03.2014 19:22:35]

#

Pelissäsi on silmukka ”while moves”, jolloin on täysin luonnollista, että peli jatkuu niin kauan, kuin mahdollisia siirtoja on jäljellä (eli lauta ei ole täynnä). Jos haluat, että peli loppuu voittoon, sinun pitää silmukan ehdossa tarkistaa, että peliä ei ole vielä voitettu, tai sinun pitää voiton yhteydessä tyhjentää mahdollisten siirtojen lista.

Chiman [02.03.2014 13:29:19]

#

Bonusvinkkinä lyhyempi suoratarkistusfunktio:

def checkLine(char, spot1, spot2, spot3):
	return char == board[spot1] == board[spot2] == board[spot3]

checkAll tarkistaa turhaan kaikki suorat joka kerta. Lisäksi random.seed() on tarpeeton, etenkin silmukan sisällä.

Halutessasi voisit koodata siirron kyselyn while-silmukkaan, josta ei poistuta ennen oikean arvon saamista.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta