L'éditeur php Yuezi remplace les sous-chaînes répétées dans une chaîne. C'est un problème courant de n'en remplacer qu'une seule. Dans le traitement des chaînes, nous devons parfois remplacer des sous-chaînes répétées dans une chaîne, mais nous ne voulons pas remplacer toutes les sous-chaînes répétées, mais une seule d'entre elles. Cela peut conserver d'autres sous-chaînes identiques tout en obtenant l'effet de remplacement souhaité. En PHP, nous pouvons répondre à cette exigence à l’aide de certaines fonctions et expressions régulières intégrées. Ci-dessous, nous présenterons en détail comment implémenter la méthode consistant à remplacer une seule des sous-chaînes répétées dans la chaîne.
Je crée un simple jeu du pendu avec go mais je rencontre un bug où la chaîne inconnue_string (qui sera affichée dans le code) a le caractère _ afin que les autres joueurs devinant les lettres puissent voir le longueur du mot, chaque fois que le joueur entre la bonne lettre, je veux qu'il remplace le nième (n dépend de l'index où se trouve la lettre dans le mot) _ caractère par cette lettre, cela a réussi, mais il y a un problème. Si un mot comporte deux lettres répétées, une seule d’entre elles est remplacée.
J'ai créé une fonction distincte appelée iterate (cette fonction a été créée parce que je voulais éviter le code imbriqué) pour parcourir tous les index. Mais ça ne marche pas, le code est le suivant :
package main import ( "fmt" "strings" ) var input string var word string var unknown_word []string var unknown_word_string string var index int var guesses int var change_unknown_word_string []byte func main() { fmt.Println("Welcome to hangman") fmt.Println("Player 1, choose a word!") fmt.Scan(&word) for i := 1; i <= len(word); i++ { unknown_word = append(unknown_word, "_") } unknown_word_string = strings.Join(unknown_word, "") for { fmt.Println("Player 2, guess a letter or a word") fmt.Println(unknown_word_string) fmt.Scan(&input) if guesses == 6 { fmt.Println("Player 2 lost! Player 1's word was: ", word) break } else if unknown_word_string == input { fmt.Println("Player 1 lost! Player 2 guessed the word by guessing the letter!") } if strings.Contains(word, input) && word != input { index = strings.Index(word, input) iterate() fmt.Println("You guessed a letter!") } else if word == input { fmt.Println("Player 1 lost! Player 2 guessed the word by guessing the whole word!") break } else { fmt.Println("Nothing found") guesses++ } } } func iterate() { change_unknown_word_string = []byte(unknown_word_string) for i := 0; i < len(change_unknown_word_string); i++ { if change_unknown_word_string[i] == change_unknown_word_string[index] { change_unknown_word_string[i] = []byte(input)[0] } } unknown_word_string = string(change_unknown_word_string) }
Comparaison if change_unknown_word_string[i] == change_unknown_word_string[index]
没有任何意义,因为 unknown_word_string
显然在这些位置包含 _
.
Vous devriez comparer word[i] == input[0]
en boucle.
Mais attention, ajoutez des string
转换为 byte
数组不支持 unicode。最好使用 rune
(points de code Unicode) pour ne plus être limité aux caractères latin1.
func iterate() { needle := []rune(input)[0] haystack := []rune(word) buf := []rune(unknown_word_string) for i := range haystack { if haystack[i] == needle { buf[i] = needle } } unknown_word_string = string(buf) }
P.S. Cette comparaison est fausse
if unknown_word_string == input { fmt.Println("Player 1 lost! Player 2 guessed the word by guessing the letter!") }
Ça devrait être ifunknown_word_string == word
并位于调用 iterate()
après.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!