記事ディレクトリ
序文
この記事では、Xiaobi を始めるための練習ケース、つまり、簡単な二色玉くじの当選判定プログラムを提供します。コンピューター プログラミングの初心者は、100 の実践的なケースを実践することで、プログラミングの基本的な概念とスキルを徐々に習得するのに役立ちます。この記事では、Python を使用して実際の問題を解決するコードを作成する方法を示す具体的な事例を読者に提供します。詳細な説明と手順を通じて、読者はプログラムの動作原理を理解し、必要に応じて修正したり拡張したりできます。初心者でも開発経験者でも、こうした事例を実践することでプログラミング能力や問題解決能力を向上させることができます。したがって、この記事は、実践を通じてプログラミング スキルを向上させたいと考えているすべての初心者に適しています。
必要なモジュールをインポートする
import random
from itertools import permutations
import sys
random
乱数の生成、permutations
順列の計算、プログラムの終了などに必要なモジュールがインポートされますsys
。
宝くじ番号を初期化する
kaijiang_red = [x for x in range(1, 21)]
kaijiang_red_ball = random.sample(kaijiang_red, 5)
kaijiang_blue = [x for x in range(1, 11)]
kaijiang_blue_ball = random.choice(kaijiang_blue)
宝くじ番号を初期化します。リスト内包表記を使用して赤いボール番号 1 20 を生成し、`random.sample` 関数を使用してそこから現在の宝くじの赤いボール番号として 5 つの数字をランダムに選択します; 青いボール番号 1 10 を生成し、関数を使用して現在の宝くじの青いrandom.choice
ボール番号として数字をランダムに選択します。
双世丘の賭けのルールと勝ちのルール
print("若城双色球\n双色球投注规则具体规定如下:\n需要投注5个红色球号码和1个蓝色球号码,提示输入后输入5个红球号码(5个号码各不相同)和1个蓝球号码,"
"红球输入数值为1~20,蓝球输入数值为1~10,每个号码之间用逗号或空格隔开。"
"\n双色球中奖规则具体规定如下:\n一等奖:投注号码与当期开奖号码全部相同(顺序不限,下同),即中奖;"
"\n二等奖:投注号码与当期开奖号码中的5个红色球号码相同,即中奖;"
"\n三等奖:投注号码与当期开奖号码中的任意4个红色球号码和1个蓝色球号码相同,即中奖;"
"\n四等奖:投注号码与当期开奖号码中的任意3个红色球号码和1个蓝色球号码相同,即中奖;"
"\n例:假如当期开奖号码为:红球为1,8,13,15,18,蓝球为10,"
"小明投注号码为:红球为1,8,13,15,18,蓝球为10。则与当期号码全部相同,中一等奖。")
Shuangseqiu の賭けルールと勝利ルールを印刷します。
当選賞品の順位を計算する
jiang12 = list(permutations(kaijiang_red_ball, 5))
jiang3_4 = list(permutations(kaijiang_red_ball, 4))
jiang3 = []
for i in range(1, 6):
for j in range(1, 21):
for x in range(len(jiang3_4)):
list1 = list(jiang3_4[x])
list1.insert(i-1, j)
jiang3.append(list1)
jiang4_3 = list(permutations(kaijiang_red_ball, 3))
jiang4_4 = []
for i in range(1, 5):
for j in range(1, 21):
for x in range(len(jiang4_3)):
list1 = list(jiang4_3[x])
list1.insert(i-1, j)
jiang4_4.append(list1)
jiang4 = []
for i in range(1, 6):
for j in range(1, 21):
for x in range(len(jiang4_4)):
list1 = list(jiang4_4[x])
list1.insert(i-1, j)
jiang4.append(list1)
当選賞品の順列を計算します。jiang12
1等当選の状況、つまり赤玉5個が同じであること、3等当選のjiang3
状況、すなわち赤玉4個と青玉1個の数が同じこと、4等当選状態、すなわち赤玉3個と青玉1個の数が同じことを示しているjiang4
。
ユーザーが入力した赤玉番号を受け取る
x = input('请输入红球号码(用逗号或空格隔开): ')
x = x.replace(" ", ",") # 将空格替换为逗号
user_red_number = x.split(",")
user_red = [int(num) for num in user_red_number if num.strip()] # 去除空字符串和多余的空格
ユーザーが入力した赤いボールの番号をカンマまたはスペースで区切って受け取ります。スペースをカンマに置き換え、split
関数を使用して文字列を分割し、リスト内包表記を使用して文字列型の数値を整数型に変換します。
ユーザーが入力した赤玉番号が規定に準拠しているかどうかを判断します
if len(user_red) != 5 or len([x for x in user_red if x > 20 or x < 1]) or len(user_red) != len(set(user_red)):
print("您输入的值不符合规定")
sys.exit()
else:
print("成功输入红球号码")
ユーザーが入力した赤玉番号が要件を満たしているかどうかを判断します。赤玉番号の数は 5 つである必要があり、各赤玉番号の範囲は 1 ~ 20 であり、赤玉番号は重複できません。要件を満たしていない場合は、エラー メッセージを出力してプログラムを終了し、そうでない場合は、正常に入力された赤いボール番号を出力します。
ユーザーが入力した青いボール番号を受け取ります
y = int(input('请输入蓝球号码: '))
if y > 10 or y < 1:
print("您输入的值不符合规定")
sys.exit()
else:
print("成功输入蓝球号码")
ユーザーが入力したバスケットボールの番号を受け取り、それを整数型に変換します。バスケットボールの番号が規定を満たしているかどうかの判定: バスケットボールの番号は 1 から 10 まであります。要件を満たしていない場合は、エラー メッセージを出力してプログラムを終了し、そうでない場合は、入力された青いボール番号を正常に出力します。
ユーザーが宝くじに当選したかどうかを判断する
user_red_tuple = tuple(user_red)
if y == kaijiang_blue_ball:
if user_red_tuple in jiang12:
print("恭喜您中了一等奖")
elif user_red_tuple in jiang3:
print("恭喜您中了三等奖")
elif user_red_tuple in jiang4:
print("恭喜您中了四等奖")
elif user_red_tuple in jiang12:
print("恭喜您中了二等奖")
else:
print("很遗憾,您没有中奖")
ユーザーが賞品を獲得したかどうかを判断します。まず、ユーザーの赤いボール番号をタプル型に変換します。ユーザが選択した青玉番号が宝くじの青玉番号と同じである場合には、ユーザの赤玉番号が1等、3等、4等と同じかどうかを判定し、同じであれば対応する当選情報を印刷する。ユーザが選択した青玉番号が宝くじの青玉番号と異なる場合には、1等に当選するか否かが判定される。満足できない場合は、勝ちがないという情報を出力します。
現在の宝くじ番号を印刷する
print("本期红球号码为:", kaijiang_red_ball)
print("本期蓝球号码为:", kaijiang_blue_ball)
赤のボール番号の可能なすべての組み合わせを生成し、ユーザーが選択した宝くじを削除します
blue = []
red = [x for x in range(1, 21)]
for rad_ball_permutation in permutations(red, 5):
blue.append(rad_ball_permutation)
all_tickets = [blue] * 10
index_one = all_tickets[y - 1].index(user_red_tuple)
del all_tickets[y - 1][index_one]
データベース内の宝くじデータをリストでシミュレートし、考えられるすべての赤いボール番号の組み合わせを生成します。blue
リストには赤玉番号のすべての組み合わせが格納されており、red
リストは1から20までの赤玉番号のリストです。permutations
関数を使用してred
リストを整理し、赤いボールの番号のすべての組み合わせを取得し、blue
リストに追加します。最終的に 10 個の要素を含むリストが作成されますall_tickets
。各要素はblue
リストへの参照です。
次に、ユーザーが選択した青玉番号と赤玉番号に従って、対応するインデックス位置を見つけ、そのインデックス位置にある宝くじを削除します。
完全なコード
from itertools import permutations
import sys
# 初始化开奖号码
kaijiang_red = [x for x in range(1, 21)]
kaijiang_red_ball = random.sample(kaijiang_red, 5) # 从kaijiang_red中随机选取5个数作为红球号码
kaijiang_blue = [x for x in range(1, 11)]
kaijiang_blue_ball = random.choice(kaijiang_blue) # 从kaijiang_blue中随机选择一个数作为蓝球号码
# 双色球说明
print("若城双色球\n双色球投注规则具体规定如下:\n需要投注5个红色球号码和1个蓝色球号码,提示输入后输入5个红球号码(5个号码各不相同)和1个蓝球号码,"
"红球输入数值为1~20,蓝球输入数值为1~10,每个号码之间用逗号或空格隔开。"
"\n双色球中奖规则具体规定如下:\n一等奖:投注号码与当期开奖号码全部相同(顺序不限,下同),即中奖;"
"\n二等奖:投注号码与当期开奖号码中的5个红色球号码相同,即中奖;"
"\n三等奖:投注号码与当期开奖号码中的任意4个红色球号码和1个蓝色球号码相同,即中奖;"
"\n四等奖:投注号码与当期开奖号码中的任意3个红色球号码和1个蓝色球号码相同,即中奖;"
"\n例:假如当期开奖号码为:红球为1,8,13,15,18,蓝球为10,"
"小明投注号码为:红球为1,8,13,15,18,蓝球为10。则与当期号码全部相同,中一等奖。")
# 计算排列情况
jiang12 = list(permutations(kaijiang_red_ball, 5)) # 计算5个红色球号码的全排列
jiang3_4 = list(permutations(kaijiang_red_ball, 4)) # 计算4个红色球号码的全排列
jiang3 = []
for i in range(1, 6):
for j in range(1, 21):
for x in range(len(jiang3_4)):
list1 = list(jiang3_4[x])
list1.insert(i-1, j)
jiang3.append(list1) # 将其中一个位置插入1-20之间的数,生成符合条件的三等奖的号码
jiang4_3 = list(permutations(kaijiang_red_ball, 3)) # 计算3个红色球号码的全排列
jiang4_4 = []
for i in range(1, 5):
for j in range(1, 21):
for x in range(len(jiang4_3)):
list1 = list(jiang4_3[x])
list1.insert(i-1, j)
jiang4_4.append(list1) # 将其中一个位置插入1-20之间的数,生成符合条件的四等奖的号码
jiang4 = []
for i in range(1, 6):
for j in range(1, 21):
for x in range(len(jiang4_4)):
list1 = list(jiang4_4[x])
list1.insert(i-1, j)
jiang4.append(list1) # 将其中一个位置插入1-20之间的数,生成符合条件的四等奖的号码
# 用户输入
x = input('请输入红球号码(用逗号或空格隔开): ')
x = x.replace(" ", ",") # 将空格替换为逗号
user_red_number = x.split(",") # 使用逗号分割字符串得到红球号码列表
user_red = [int(num) for num in user_red_number if num.strip()] # 去除空字符串和多余的空格,并将数字转换为整数
if len(user_red) != 5 or len([x for x in user_red if x > 20 or x < 1]) or len(user_red) != len(set(user_red)):
print("您输入的值不符合规定")
sys.exit()
else:
print("成功输入红球号码")
y = int(input('请输入蓝球号码: '))
if y > 10 or y < 1:
print("您输入的值不符合规定")
sys.exit()
else:
print("成功输入蓝球号码")
# 判断是否中奖
user_red_tuple = tuple(user_red)
if y == kaijiang_blue_ball:
if user_red_tuple in jiang12:
print("恭喜您中了一等奖")
elif user_red_tuple in jiang3:
print("恭喜您中了三等奖")
elif user_red_tuple in jiang4:
print("恭喜您中了四等奖")
elif user_red_tuple in jiang12:
print("恭喜您中了二等奖")
else:
print("很遗憾,您没有中奖")
print("本期红球号码为:", kaijiang_red_ball)
print("本期蓝球号码为:", kaijiang_blue_ball)
# 用all列表模拟在数据库中删除用户买过的彩票
blue = []
red = [x for x in range(1, 21)]
for rad_ball_permutation in permutations(red, 5):
blue.append(rad_ball_permutation) # 生成所有可能的红球号码和对应的全排列存入blue列表
all_tickets = [blue] * 10 # 生成包含10个blue列表的all_tickets列表
index_one = all_tickets[y - 1].index(user_red_tuple) # 找到用户买过的彩票在all_tickets中的位置
del all_tickets[y - 1][index_one] # 删除用户买过的彩票