見出し画像

#43 メモリーゲーム

● 問題

記憶力ゲームです。
出題がおかしいようです。

13個のマーク(●○◎▲△▼▽◆◇■□★☆)の位置を5秒間で覚え,ランダムに出題されるマークの位置を答えます。
正解するごとに表示されるマークの数が増えます(最大で7つ)。

import random
import time

memory_mark = ['●','○','◎','▲','△','▼','▽','◆','◇','■','□','★','☆']
position = '①②③④⑤⑥⑦'
question_number = 1
level = 3
times = 1
gameover = False

while gameover != True:
    random.shuffle(memory_mark)
    question_mark = ''.join(memory_mark)
    print('\r覚える記号は   '+question_mark[0:level],end='')
    time.sleep(5)
    print('\r',end='')
    
    question_number = random.randint(0,level)
    result = input(question_mark[question_number]+'は左から何番目 '+position[0:level]+' ? ')
    if question_number == int(result)-1:
        print('\r'+'正解',end='')
        time.sleep(1)
        if level < 7:
            level += 1
    else:
        print('残念')
        gameover = True
    times += 1
print('ゲームオーバー')
print(question_mark[0:level])

● 解答

実行してみるときちんとうごいているようなのですが,何度か繰り返していると,次のような現象になることがあります。

覚える記号は◎▲●
▽は左から何番目?

覚える記号の中に▽はありません。
実は,▽は●の次,左から4番目(question_mark[3])にセットされてるのです。
question_mark[0:level]は文字列から範囲(スライス)を指定して部分文字列を抽出しています。
level = 3のとき,question_mark[0:level] は question_mark[0:3] なので,文字列question_markの0番目~3番目までの文字列を取り出していると考えてしまいますが,実際には0番目~2番目までになります。
[ start : end ]とすると、start <= x < end の範囲が抽出され,endの値が含まれません。
一方で,random.randint(0,level) は random.randint(0,3) となり,0,1,2,3の乱数を作成します。

random.randint(0,3) では3が含まれるが,question_mark[0:3]では3が含まれない。
似ているのに微妙に動作が異なるので,非常に気がつきにくいエラーになります。

import random
import time

memory_mark = ['●','○','◎','▲','△','▼','▽','◆','◇','■','□','★','☆']
position = '①②③④⑤⑥⑦'
question_number = 1
level = 3
times = 1
gameover = False

while gameover != True:
    random.shuffle(memory_mark)
    question_mark = ''.join(memory_mark)
    print('\r覚える記号は   '+question_mark[0:level],end='')
    time.sleep(5)
    print('\r',end='')
    
    question_number = random.randint(0,level-1# 修正
    result = input(question_mark[question_number]+'は左から何番目 '+position[0:level]+' ? ')
    if question_number == int(result)-1:
        print('\r'+'正解',end='')
        time.sleep(1)
        if level < 7:
            level += 1
    else:
        print('残念')
        gameover = True
    times += 1
print('ゲームオーバー')
print(question_mark[0:level])

#Python  #プログラミング

この記事が気に入ったらサポートをしてみませんか?