我试图编写一个简单的记忆游戏(用动物的名字)来练习Swift。 我真的成功地做到了,除了一件对我来说很奇怪的事情: 在内存中你选择了两个按钮,它们的内容会显示出来,如果它们是相同的,它们仍会被覆盖,否则它们会以覆盖模式返回。
这就是谜题:
当我选择具有相同动物的两个按钮时,它们确实显示了它们的内容,但是当第二个按钮与第一个按钮不同时,仅显示第一个而第二个不显示。
但是,在其下面的代码turn_button(...)
中,被调用以显示内容的函数是相同的。
我即将粘贴所有viewController.swift代码,但这里有3行不起作用(setTitle为按钮或标签):
pressed_start.setTitle("You Can Play!)", forState:UIControlState.Normal)
default: //cioè prima casella selezionata
if animals_alive[sender.tag-1] == 1 && couple_set_index[0] != sender.tag
{ //cioè se non tra i già morti e non è stato premuto in caso 0
couple_set[1] = animals_index[sender.tag-1] ; couple_set_index[1] = sender.tag
print(animals_in_table[couple_set_index[1]-1])
turn_button(couple_set_index[1], withwhat: animals_in_table[couple_set_index[1]-1]) //Non lo esegue! esegue però i due Print prima e dopo!!!
pressed_start.setTitle("Play Again!)", forState:UIControlState.Normal)
这里是整个代码:
import UIKit
class ViewController: UIViewController {
var animals: [String] = ["Dog", "Cat", "Cow", "Mouse", "Horse", "Chicken", "Sheep", "Pig"]
var animals_index = [Int](count: 16, repeatedValue: 0)
var animals_in_table: [String]=[]
var animals_alive = [Int](count:16, repeatedValue: 1)
var position = 0
var startGame_sent = 0
var couple_set = [0,0] //Qui serve che quando ne ha scelto 1 si possano scegliere solo gli altri e quando ne ha scelti 2 dopo 2 secondi o si azzerino le caselle o si eliminino le due scelte se uguali (e qui l'eliminazione e riapparizione per il gioco dopo non è banale!)
var couple_set_index = [0 , 0]
@IBOutlet weak var assign_animal_to_button_1: UIButton!
@IBOutlet weak var assign_animal_to_button_2: UIButton!
@IBOutlet weak var assign_animal_to_button_3: UIButton!
@IBOutlet weak var assign_animal_to_button_4: UIButton!
@IBOutlet weak var assign_animal_to_button_5: UIButton!
@IBOutlet weak var assign_animal_to_button_6: UIButton!
@IBOutlet weak var assign_animal_to_button_7: UIButton!
@IBOutlet weak var assign_animal_to_button_8: UIButton!
@IBOutlet weak var assign_animal_to_button_9: UIButton!
@IBOutlet weak var assign_animal_to_button_10: UIButton!
@IBOutlet weak var assign_animal_to_button_11: UIButton!
@IBOutlet weak var assign_animal_to_button_12: UIButton!
@IBOutlet weak var assign_animal_to_button_13: UIButton!
@IBOutlet weak var assign_animal_to_button_14: UIButton!
@IBOutlet weak var assign_animal_to_button_15: UIButton!
@IBOutlet weak var assign_animal_to_button_16: UIButton!
func turn_button(which_one: Int, withwhat: String) {
switch which_one {
case 1: assign_animal_to_button_1.setTitle(withwhat, forState:UIControlState.Normal)
case 2: assign_animal_to_button_2.setTitle(withwhat, forState:UIControlState.Normal)
case 3: assign_animal_to_button_3.setTitle(withwhat, forState:UIControlState.Normal)
case 4: assign_animal_to_button_4.setTitle(withwhat, forState:UIControlState.Normal)
case 5: assign_animal_to_button_5.setTitle(withwhat, forState:UIControlState.Normal)
case 6: assign_animal_to_button_6.setTitle(withwhat, forState:UIControlState.Normal)
case 7: assign_animal_to_button_7.setTitle(withwhat, forState:UIControlState.Normal)
case 8: assign_animal_to_button_8.setTitle(withwhat, forState:UIControlState.Normal)
case 9: assign_animal_to_button_9.setTitle(withwhat, forState:UIControlState.Normal)
case 10: assign_animal_to_button_10.setTitle(withwhat, forState:UIControlState.Normal)
case 11: assign_animal_to_button_11.setTitle(withwhat, forState:UIControlState.Normal)
case 12: assign_animal_to_button_12.setTitle(withwhat, forState:UIControlState.Normal)
case 13: assign_animal_to_button_13.setTitle(withwhat, forState:UIControlState.Normal)
case 14: assign_animal_to_button_14.setTitle(withwhat, forState:UIControlState.Normal)
case 15: assign_animal_to_button_15.setTitle(withwhat, forState:UIControlState.Normal)
case 16: assign_animal_to_button_16.setTitle(withwhat, forState:UIControlState.Normal)
default: break
}
}
@IBOutlet weak var pressed_start: UIButton!
@IBAction func startGame(sender: UIButton) {
startGame_sent = 1 // non esegue le due istruzioni sotto, perchè col tasto 1 va invece? per adesso imposto = 1 all'inizio
pressed_start.setTitle("You Can Play!)", forState:UIControlState.Normal)
var animals_ints = [1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8] //Indici degli animali da distribuire
let start_button_random = Int(arc4random_uniform(15)) ; print("start_button_random: \(start_button_random)")
position = start_button_random + 1 // così va da 1 a 16
repeat {
if animals_alive[position-1] == 1 {
animals_index[position-1] = animals_ints.removeLast()
animals_alive[position-1] = 0
}
let step = Int(arc4random_uniform(UInt32(animals_ints.count)+1))
print("Step: \(step)")
if position + step < 17 {position = position + step} else {position = position + step - 16}
print("Animals_index: \(animals_index)")
print("Animals_alive: \(animals_alive)")
print("position: \(position)")
} while animals_alive.contains(1) == true
animals_alive = [Int](count:16, repeatedValue: 1)
animals_in_table = [] //Azzerare per il secondo gioco
for index_table in 0...15 {
animals_in_table.append(animals[animals_index[index_table]-1])
print(animals_in_table)
}
startGame_sent = 1 // Prima di ricominciare, ma perchè c'è anche sopra???
}
@IBAction func pressed_button(sender: UIButton) { // Va in crash se clicco su Bottone prima di Start...
if startGame_sent == 1 {
let stato_del_gioco = couple_set[0] + couple_set[1]
switch stato_del_gioco
{case 0: //Nessuna casella selezionata --> Problema se scegli per primo casella 1 perchè lui la vede come 0 e dopo nn va avanti al Caso 1
if animals_alive[sender.tag-1] == 1 { //cioè se non tra i già morti
couple_set[0] = animals_index[sender.tag-1] ; couple_set_index[0] = sender.tag
turn_button(couple_set_index[0], withwhat: animals_in_table[couple_set_index[0]-1])
print("Caso 0 - Casella \(sender.tag) - Animale \(animals_in_table[sender.tag-1) - Coppia scelta: \(couple_set) e Coppia Scelta Index: \(couple_set_index)")
}
default: //cioè prima casella selezionata
if animals_alive[sender.tag-1] == 1 && couple_set_index[0] != sender.tag
{ //cioè se non tra i già morti e non è stato premuto in caso 0
couple_set[1] = animals_index[sender.tag-1] ; couple_set_index[1] = sender.tag
print(animals_in_table[couple_set_index[1]-1])
turn_button(couple_set_index[1], withwhat: animals_in_table[couple_set_index[1]-1]) //Non lo esegue! esegue però i due Print prima e dopo!!!
print("Caso 1 - Casella \(String(couple_set_index[1])) - Animale \(animals_in_table[couple_set_index[1]-1) - Coppia scelta: \(couple_set) e Coppia Scelta Index: \(couple_set_index)")
}
}
if couple_set_index[1] > 0 {turn_button(couple_set_index[1], withwhat: animals_in_table[couple_set_index[1]-1])} //Non so perchè ma pare lo esegua solo al giro dopo...
if couple_set_index[1] > 0 {//Ovvero solo se anche la seconda casella è selezionata
if couple_set[0] == couple_set[1] { //Ci hai preso! Animali uguali diventano "dead" in animals_alive
print("Sono uguali: Coppia Scelta = \(couple_set) - Etichetta sul pulsante premuto = \(sender.tag)")
animals_alive[couple_set_index[0]-1]=0 ; animals_alive[couple_set_index[1]-1]=0
}
else { //Sono diversi, la funzione initialize_buttons li ricoprirà lasciandoli vivi adesso in "animals_alive"
print("Sono diversi: Coppia Scelta = \(couple_set) e Coppia Scelta Index: \(couple_set_index) - Etichetta sul pulsante premuto = \(String(couple_set_index[1]))")
}
}
if couple_set_index[1] > 0
{ //Ovvero solo se anche la seconda casella è selezionata
turn_button(couple_set_index[1], withwhat: animals_in_table[couple_set_index[1]-1]) // Non va neanche qui!!!
initialize_buttons(animals_alive)
}
}
for index in 0...15 {
if couple_set_index[1]-1 == index {turn_button(index+1, withwhat: animals_in_table[index])} // Provo qui a scoprire gli animali del caso 1! non va!!!!!!!
}
}
func initialize_buttons(animals_alive_arg: Array<Int>) {
print(animals_alive)
// sleep(1)
for index in 0...15 {
if animals_alive_arg[index] == 1 {turn_button(index+1, withwhat: String(index+1))}
}
couple_set = [0,0]; couple_set_index = [0,0]
if animals_alive_arg.contains(1) == false {
pressed_start.setTitle("Play Again!)", forState:UIControlState.Normal)
startGame_sent = 0
animals_alive = [Int](count:16, repeatedValue: 1)
initialize_buttons(animals_alive)
}
}
}