鱼C论坛

 找回密码
 立即注册
查看: 1203|回复: 12

[作品展示] 一个简陋的24点游戏(更新至1.7版)

[复制链接]
发表于 2018-8-8 18:54:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 WonderBlueFox 于 2018-9-5 20:03 编辑

终于解决了升学考试,摸个鱼...
与鱼油们分享一个我自己使用python编写的二十四点游戏,有很多不完善或可以优化的地方,欢迎大家指出
主要思路:

    生成四个数字
    用户输入
    使用字符串方法整理用户的输入
    检查用户输入(输入的算式是否正确等)
    计算
    检查结果

游戏规则:
玩家要在给出的四个数中进行加减乘除运算,使结果等于二十四同时用掉所有数字

已知问题或可以优化的点:
更好的界面
返回上一步的功能

我有在试用easygui写一个图形版的,可惜没弄完...

  1. #二十四点游戏
  2. #verson 1.7
  3. import random
  4. import os
  5. import os.path
  6. #记分板
  7. if os.name == 'posix':
  8.     os.chdir('/storage/emulated/0')#安卓底层目录无法写入,更改目录
  9. if os.path.exists('mark.txt'):
  10.     mark = open('mark.txt','r')
  11.     past_mark = mark.read()
  12.     mark.close
  13.     if past_mark == '':
  14.         past_mark = 0
  15.     else:
  16.         print('总分:%s分' % (past_mark))
  17. else:
  18.     past_mark = 0   
  19. randon_number = list()  #保存随机数
  20. available_number = list()         #保存计算结果
  21. whole_number = list()           #所有数字
  22. clear_list = list()     #清除使用过的数字
  23. total_mark = 0
  24. reset = list()         #用于撤回
  25. step_amount = 0         #保存步数
  26. sign = ('r','c','/',' ','+','-','*','÷','^','q')
  27. recall = False        #保存撤回状态
  28. #检查用户输入正误
  29. def check_module(alist):
  30.     chars = alist.split()
  31.     for each in chars:
  32.         if ((each not in str(randon_number)) and ((each not in sign) and (each not in str(available_number)))):
  33.             print('输入有误,你输入了一个不存在或用过的数啦')
  34.             return True
  35.         else:
  36.             continue
  37.     return False
  38. #计算模块
  39. def cacul_module(x):
  40.     if  x[1] == '+':
  41.         return int(x[0]) + int(x[2])
  42.     elif  x[1] == '-':
  43.         return int(x[0]) - int(x[2])
  44.     elif  x[1] == '*':
  45.         return int(x[0]) * int(x[2])
  46.     elif  x[1] == '÷' or x[1] == '/':
  47.         return int(x[0]) / int(x[2])
  48.     elif x[1] == '^':
  49.         return pow(int(x[0]),int(x[2]))
  50. def number():
  51.     for x in range(4):
  52.         global randon_number
  53.         global whole_number
  54.         randon_number.append(random.randint(1,10))
  55.         whole_number.append(randon_number[x])
  56.     print("你的四个数为:",sorted(randon_number))      
  57. def callback(load,number):
  58.     global recall
  59.     if step_amount == 0:
  60.         pass
  61.     else:
  62.         if recall == True:
  63.             number -= 1
  64.         available_number.pop()
  65.         whole_number.pop()
  66.         for x in load:
  67.             print(x,number)
  68.             if x[2] == number:
  69.                 if x[0] == 'a':
  70.                     available_number.append(x[1])
  71.                 elif x[0] == 'r':
  72.                     randon_number.append(x[1])               
  73.         print(available_number,randon_number,whole_number)
  74.         recall = True
  75. print('–––––––——————二十四点游戏——————–––––––')
  76. print('JuneFox present')
  77. #生成四个随机数              
  78. number()
  79. #判断
  80. while True:
  81.     #输入
  82.     input_list = input( "输入字符r可以重新生成一组数字\n输入字符q可以退出\n在这输入算式\t" )
  83.     #输入正误检查
  84.     while (check_module(input_list)):
  85.         input_list = input( "在这输入算式\t" )
  86.     use_list = input_list.split()
  87.     #输入处理
  88.     if "r" in use_list:
  89.         whole_number = []
  90.         randon_number = []
  91.         number()
  92.         continue
  93.     elif 'q' in use_list:
  94.         print('退出中...')
  95.         break
  96.     elif 'c' in use_list:
  97.         callback(reset,step_amount)
  98.     else:
  99.         step_amount += 1
  100.         recall = False        
  101.         print('算式为:',input_list)
  102.         #清除用过的数
  103.         clear_list = use_list[:]
  104.         for x in whole_number:
  105.             if str(x) in clear_list:
  106.                 if x in available_number:
  107.                     available_number.remove(x)
  108.                     clear_list.remove(str(x))
  109.                     reset.append(['a',x,step_amount])
  110.                 elif x in randon_number:
  111.                     randon_number.remove(x)
  112.                     clear_list.remove(str(x))
  113.                     reset.append(['r',x,step_amount])
  114.         print(reset)
  115.         #计算
  116.         try:
  117.             x = cacul_module(use_list)
  118.             available_number.append(x)
  119.             whole_number.append(x)
  120.         except IndexError:
  121.             print('输入有误')
  122.             break
  123.         print("当前可用结果:",sorted(available_number))        
  124.         #检测结果
  125. #       print(available_number,randon_number,whole_number,clear_list)
  126.         if (len(randon_number) + len(available_number) <= 1):
  127.             if 24 in available_number:
  128.                 print("成功\n你用了%d步" % (step_amount))
  129.                 total_mark += 1
  130.             else:
  131.                 print("失败")
  132.             randon_number = list()
  133.             available_number = list()         
  134.             whole_number = list()           
  135.             clear_list = list()
  136.             step_amount = list()
  137.             number()
  138.             continue            
  139. print('本次得分:',total_mark)
  140. mark = open('mark.txt','w')
  141. total_mark = str(total_mark + int(past_mark))
  142. mark.write(total_mark)
  143. mark.close()
复制代码


使用方法
例如:
你的四个数为: [2,4,4,4]
输入:
2空格*空格4
得到8
输入:
4空格*空格4
得到16
就有8和16这两个结果可用
输入:
8空格+空格16
得到24,结束
输入字符c就可以撤回一步,但多次撤回就会有碧油鸡,正在修复
PS:除号要输÷而不是/,我大部分用QPYTHON写的所以直接用除号啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-8 21:01:09 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-10 18:52:59 | 显示全部楼层
本帖最后由 WonderBlueFox 于 2018-8-12 16:14 编辑

最初版本 1.0
  1.     #二十四点游戏
  2.     #verson 1.0
  3.     import random

  4.     randon_number = list()  #保存随机数
  5.     answer = list()         #保存计算结果
  6.     temp = list()           #用于输入检查,清除使用过的数字
  7.     clear_list = list()     #清除使用过的数字

  8.     #检查用户输入正误
  9.     def check_module(chars):
  10.         for each in chars:
  11.            if ((each not in str(randon_number)) and ((each not in ['r',' ','+','-','*','÷','^']) and (each not in str(answer)))):
  12.                print('输入有误,你输入了一个不存在或用过的数啦')
  13.                return True
  14.            else:
  15.                continue
  16.         return False

  17.     #计算模块
  18.     def cacul(x):
  19.         if  x[1] == '+':
  20.             return int(x[0]) + int(x[2])
  21.         elif  x[1] == '-':
  22.             return int(x[0]) - int(x[2])
  23.         elif  x[1] == '*':
  24.             return int(x[0]) * int(x[2])
  25.         elif  x[1] == '÷':
  26.             if (int(x[0]) == 0) or (int(x[2]) == 0):
  27.                 return -1
  28.             elif ((int(x[0]) % int(x[2])) == 0):
  29.                 return int(x[0]) // int(x[2])
  30.             else:
  31.                 return -1

  32.     print('——————二十四点游戏——————')
  33.     print('JuneFox present')

  34.     #生成四个随机数              
  35.     for x in range(4):
  36.         randon_number.append(random.randint(1,10))
  37.         temp.append(randon_number[x])
  38.     print("你的四个数为:",randon_number)
  39.     #输入
  40.     print("请输入算式,示例:8乘五请输入8 * 5")
  41.     input_list = input( "在这输入算式\n输入字符r可以重新生成一组数字\t" )
  42.     #输入正误检查
  43.     while (check_module(input_list)):
  44.                     input_list = input( "在这输入算式\t" )

  45.     use_list = input_list.split()
  46.     print('算式为:',input_list)
  47.     #判断
  48.     while True:
  49.         if "r" in use_list:
  50.             temp = []
  51.             randon_number = []
  52.             for x in range(4):
  53.                 randon_number.append(random.randint(1,10))
  54.                 temp.append(randon_number[x])
  55.             print(randon_number)
  56.             input_list = input( "在这输入算式\n输入字符r可以重新生成一组数字\t" )
  57.             while (check_module(input_list)):
  58.                     input_list = input( "在这输入算式\t" )

  59.             use_list = input_list.split()
  60.             print('算式为:',input_list)
  61.         else:
  62.             clear_list = use_list[:]
  63.             for x in temp:
  64.                 if str(x) in u:
  65.                     if x in answer:
  66.                         answer.remove(x)
  67.                         clear_list.remove(str(x))
  68.                     elif x in randon_number:
  69.                         randon_number.remove(x)
  70.                         clear_list.remove(str(x))
  71.             answer.append(cacul(use_list))
  72.             temp.append(cacul(use_list))
  73.             print("当前可用结果:",answer)
  74.             
  75.             if -1 in answer:
  76.                 print("失败")
  77.                 break
  78.             elif (len(randon_number) + len(answer) <= 1):
  79.                 if 24 in answer:
  80.                     print("成功")
  81.                     break
  82.                 else:
  83.                     print("失败")
  84.                     break
  85.             else:
  86.                 input_list = input( "在这输入算式\t" )
  87.                 while (check_module(input_list)):
  88.                     input_list = input( "在这输入算式\t" )
  89.                 use_list = input_list.split()
  90.                 print('算式为:',input_list)

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-10 18:54:01 | 显示全部楼层
本帖最后由 WonderBlueFox 于 2018-8-12 16:13 编辑

8/10版本更新 1.1
更新了:
1.可以保存得分了
修复了:
1.变量名错误导致的崩溃BUG
2.优化部分代码
待优化:
1.更友好的用户交互
2.更多功能
  1. #二十四点游戏
  2. #verson 1.1
  3. import random
  4. import os
  5. import os.path

  6. #记分板
  7. if os.path.exists('mark.txt'):
  8.     mark = open('mark.txt','r')
  9.     print('总分:')
  10.     past_mark = mark.read(100)
  11.     print(past_mark)
  12.     mark.close
  13.     mark = open('mark.txt','w')
  14. else:
  15.     mark = open('mark.txt','w')
  16.     past_mark = 0

  17. randon_number = list()  #保存随机数
  18. answer = list()         #保存计算结果
  19. temp = list()           #用于输入检查,清除使用过的数字
  20. clear_list = list()     #清除使用过的数字
  21. total_mark = 0

  22. #检查用户输入正误
  23. def check_module(chars):
  24.     for each in chars:
  25.        if ((each not in str(randon_number)) and ((each not in ['r',' ','+','-','*','÷','^']) and (each not in str(answer)))):
  26.            print('输入有误,你输入了一个不存在或用过的数啦')
  27.            return True
  28.        else:
  29.            continue
  30.     return False

  31. #计算模块
  32. def cacul(x):
  33.     if  x[1] == '+':
  34.         return int(x[0]) + int(x[2])
  35.     elif  x[1] == '-':
  36.         return int(x[0]) - int(x[2])
  37.     elif  x[1] == '*':
  38.         return int(x[0]) * int(x[2])
  39.     elif  x[1] == '÷':
  40.         if (int(x[0]) == 0) or (int(x[2]) == 0):
  41.             return -1
  42.         elif ((int(x[0]) % int(x[2])) == 0):
  43.             return int(x[0]) // int(x[2])
  44.         else:
  45.             return -1

  46. print('——————二十四点游戏——————')
  47. print('JuneFox present')

  48. #生成四个随机数              
  49. for x in range(4):
  50.     randon_number.append(random.randint(1,10))
  51.     temp.append(randon_number[x])
  52. print("你的四个数为:",randon_number)
  53. #输入
  54. print("请输入算式,示例:8乘五请输入8 * 5")
  55. input_list = input( "在这输入算式\n输入字符r可以重新生成一组数字\t" )
  56. #输入正误检查
  57. while (check_module(input_list)):
  58.                 input_list = input( "在这输入算式\t" )

  59. use_list = input_list.split()
  60. print('算式为:',input_list)
  61. #判断
  62. while True:
  63.     if "r" in use_list:
  64.         temp = []
  65.         randon_number = []
  66.         for x in range(4):
  67.             randon_number.append(random.randint(1,10))
  68.             temp.append(randon_number[x])
  69.         print(randon_number)
  70.         input_list = input( "在这输入算式\n输入字符r可以重新生成一组数字\t" )
  71.         while (check_module(input_list)):
  72.                 input_list = input( "在这输入算式\t" )

  73.         use_list = input_list.split()
  74.         print('算式为:',input_list)
  75.     else:
  76.         clear_list = use_list[:]
  77.         for x in temp:
  78.             if str(x) in clear_list:
  79.                 if x in answer:
  80.                     answer.remove(x)
  81.                     clear_list.remove(str(x))
  82.                 elif x in randon_number:
  83.                     randon_number.remove(x)
  84.                     clear_list.remove(str(x))
  85.         try:
  86.             answer.append(cacul(use_list))
  87.             temp.append(cacul(use_list))
  88.         except IndexError as reason:
  89.             print('输入有误',str(reason))
  90.             break
  91.         print("当前可用结果:",answer)
  92.         
  93.         if -1 in answer:
  94.             print("失败")
  95.             break
  96.         elif (len(randon_number) + len(answer) <= 1):
  97.             if 24 in answer:
  98.                 print("成功")
  99.                 total_mark += 1
  100.                 break
  101.             else:
  102.                 print("失败")
  103.                 break
  104.         else:
  105.             input_list = input( "在这输入算式\t" )
  106.             while (check_module(input_list)):
  107.                 input_list = input( "在这输入算式\t" )
  108.             use_list = input_list.split()
  109.             print('算式为:',input_list)
  110. print('本次得分:',total_mark)
  111. total_mark = str(total_mark + int(past_mark))
  112. mark.write(total_mark)
  113. mark.close()

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-12 16:21:00 | 显示全部楼层
本帖最后由 WonderBlueFox 于 2018-8-12 17:02 编辑

8/12版本更新1.2
更新了:
1.优化了部分代码
修复了:
1.无法保存得分的碧油鸡
2.代码顺序错误引发的碧油鸡
待优化:
1.安卓(反正我用的那个安卓)系统保存得分会崩溃,原因似乎是在系统根目录创建的文件是只读的无法修改
  1. #二十四点游戏
  2. #verson 1.2
  3. import random
  4. import os
  5. import os.path

  6. #记分板
  7. if os.path.exists('mark.txt'):
  8.     mark = open('mark.txt','r')
  9.     print('总分:')
  10.     past_mark = mark.read()
  11.     print(past_mark)
  12.     mark.close
  13.     mark = open('mark.txt','w')
  14. else:
  15.     mark = open('mark.txt','w')
  16.     past_mark = 0
  17. randon_number = list()  #保存随机数
  18. answer = list()         #保存计算结果
  19. temp = list()           #用于输入检查,清除使用过的数字
  20. clear_list = list()     #清除使用过的数字
  21. total_mark = 0

  22. #检查用户输入正误
  23. def check_module(chars):
  24.     for each in chars:
  25.        if ((each not in str(randon_number)) and ((each not in ['r',' ','+','-','*','÷','^']) and (each not in str(answer)))):
  26.            print('输入有误,你输入了一个不存在或用过的数啦')
  27.            return True
  28.        else:
  29.            continue
  30.     return False

  31. #计算模块
  32. def cacul(x):
  33.     if  x[1] == '+':
  34.         return int(x[0]) + int(x[2])
  35.     elif  x[1] == '-':
  36.         return int(x[0]) - int(x[2])
  37.     elif  x[1] == '*':
  38.         return int(x[0]) * int(x[2])
  39.     elif  x[1] == '÷':
  40.         if (int(x[0]) == 0) or (int(x[2]) == 0):
  41.             return -1
  42.         elif ((int(x[0]) % int(x[2])) == 0):
  43.             return int(x[0]) // int(x[2])
  44.         else:
  45.             return -1

  46. print('——————二十四点游戏——————')
  47. print('JuneFox present')

  48. #生成四个随机数              
  49. for x in range(4):
  50.     randon_number.append(random.randint(1,10))
  51.     temp.append(randon_number[x])
  52. print("你的四个数为:",randon_number)
  53. #判断
  54. while True:
  55.     #输入
  56.     print("请输入算式,示例:8乘五请输入8 * 5")
  57.     input_list = input( "在这输入算式\n输入字符r可以重新生成一组数字\t" )
  58.     #输入正误检查
  59.     while (check_module(input_list)):
  60.         input_list = input( "在这输入算式\t" )
  61.     use_list = input_list.split()
  62.     print('算式为:',input_list)
  63.     #输入处理
  64.     if "r" in use_list:
  65.         temp = []
  66.         randon_number = []
  67.         for x in range(4):
  68.             randon_number.append(random.randint(1,10))
  69.             temp.append(randon_number[x])
  70.         print(randon_number)
  71.         continue
  72.     else:
  73.         #清除用过的数
  74.         clear_list = use_list[:]
  75.         for x in temp:
  76.             if str(x) in clear_list:
  77.                 if x in answer:
  78.                     answer.remove(x)
  79.                     clear_list.remove(str(x))
  80.                 elif x in randon_number:
  81.                     randon_number.remove(x)
  82.                     clear_list.remove(str(x))
  83.         #计算
  84.         try:
  85.             answer.append(cacul(use_list))
  86.             temp.append(cacul(use_list))
  87.         except IndexError:
  88.             print('输入有误')
  89.             break
  90.         print("当前可用结果:",answer)
  91.         #检测结果
  92.         if -1 in answer:
  93.             print("失败")
  94.             break
  95.         elif (len(randon_number) + len(answer) <= 1):
  96.             if 24 in answer:
  97.                 print("成功")
  98.                 total_mark += 1
  99.                 break
  100.             else:
  101.                 print("失败")
  102.                 break
  103. print('本次得分:',total_mark)
  104. total_mark = str(total_mark + int(past_mark))
  105. mark.write(total_mark)
  106. mark.close()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-12 21:42:55 From FishC Mobile | 显示全部楼层
所以说为什么不用pydroid3?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-13 08:48:26 | 显示全部楼层
学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-13 15:58:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-14 16:58:13 | 显示全部楼层
8/14版本更新1.3
更新了:
1.成功或失败后不需要再次重启游戏了
2.优化部分代码
修复了:
1.再次游戏没有生成新数字的碧油鸡
2.再次游戏结果未清空的碧油鸡
待优化:
直接退出游戏再启动会出现碧油鸡
  1. #二十四点游戏
  2. #verson 1.3
  3. import random
  4. import os
  5. import os.path

  6. #记分板
  7. if os.name == 'posix':
  8.     os.chdir('/storage/emulated/0')#安卓底层目录无法写入,更改目录
  9. if os.path.exists('mark.txt'):
  10.     mark = open('mark.txt','r')
  11.     print('总分:')
  12.     past_mark = mark.read()
  13.     print(past_mark)
  14.     mark.close
  15.     mark = open('mark.txt','w')
  16. else:
  17.     mark = open('mark.txt','w')
  18.     past_mark = 0

  19. randon_number = list()  #保存随机数
  20. answer = list()         #保存计算结果
  21. temp = list()           #用于输入检查,清除使用过的数字
  22. clear_list = list()     #清除使用过的数字

  23. total_mark = 0
  24. sign = ('r',' ','+','-','*','÷','^','q')
  25. #检查用户输入正误
  26. def check_module(chars):
  27.     for each in chars:
  28.        if ((each not in str(randon_number)) and ((each not in sign) and (each not in str(answer)))):
  29.            print('输入有误,你输入了一个不存在或用过的数啦')
  30.            return True
  31.        else:
  32.            continue
  33.     return False

  34. #计算模块
  35. def cacul(x):
  36.     if  x[1] == '+':
  37.         return int(x[0]) + int(x[2])
  38.     elif  x[1] == '-':
  39.         return int(x[0]) - int(x[2])
  40.     elif  x[1] == '*':
  41.         return int(x[0]) * int(x[2])
  42.     elif  x[1] == '÷':
  43.         if (int(x[0]) == 0) or (int(x[2]) == 0):
  44.             return -1
  45.         elif ((int(x[0]) % int(x[2])) == 0):
  46.             return int(x[0]) // int(x[2])
  47.         else:
  48.             return -1
  49. def number():
  50.     for x in range(4):
  51.         global randon_number
  52.         global temp
  53.         randon_number.append(random.randint(1,10))
  54.         temp.append(randon_number[x])
  55.     print("你的四个数为:",randon_number)

  56. print('——————二十四点游戏——————')
  57. print('JuneFox present')

  58. #生成四个随机数              
  59. number()
  60. #判断
  61. while True:
  62.     #输入
  63.     print("请输入算式,示例:8乘五请输入8 * 5")
  64.     input_list = input( "在这输入算式\n输入字符r可以重新生成一组数字\n输入字符q可以退出\t" )
  65.     #输入正误检查
  66.     while (check_module(input_list)):
  67.         input_list = input( "在这输入算式\t" )
  68.     use_list = input_list.split()
  69.     print('算式为:',input_list)
  70.     #输入处理
  71.     if "r" in use_list:
  72.         temp = []
  73.         randon_number = []
  74.         for x in range(4):
  75.             randon_number.append(random.randint(1,10))
  76.             temp.append(randon_number[x])
  77.         print(randon_number)
  78.         continue
  79.     elif 'q' in use_list:
  80.         print('退出中...')
  81.         break
  82.     else:
  83.         #清除用过的数
  84.         clear_list = use_list[:]
  85.         for x in temp:
  86.             if str(x) in clear_list:
  87.                 if x in answer:
  88.                     answer.remove(x)
  89.                     clear_list.remove(str(x))
  90.                 elif x in randon_number:
  91.                     randon_number.remove(x)
  92.                     clear_list.remove(str(x))
  93.         #计算
  94.         try:
  95.             answer.append(cacul(use_list))
  96.             temp.append(cacul(use_list))
  97.         except IndexError:
  98.             print('输入有误')
  99.             break
  100.         print("当前可用结果:",answer)
  101.         #检测结果
  102.         if -1 in answer:
  103.             print("失败")
  104.             break
  105.         elif (len(randon_number) + len(answer) <= 1):
  106.             if 24 in answer:
  107.                 print("成功")
  108.                 total_mark += 1
  109.                 number()
  110.                 answer = list()   
  111.                 temp = list()           
  112.                 clear_list = list()
  113.                 continue
  114.             else:
  115.                 print("失败")
  116.                 number()
  117.                 answer = list()         
  118.                 temp = list()           
  119.                 clear_list = list()
  120.                 continue
  121.                 continue
  122. print('本次得分:',total_mark)
  123. total_mark = str(total_mark + int(past_mark))
  124. mark.write(total_mark)
  125. mark.close()
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-18 10:22:23 | 显示全部楼层
8/18版本更新1.4
更新了:
1.优化部分代码
2.可以强制退出后再次运行不出碧油鸡
3.优化界面
修复了:
1.再次开始游戏时无法获胜的碧油鸡
2.缺少分数导致的崩溃碧油鸡

  1. #二十四点游戏
  2. #verson 1.4
  3. import random
  4. import os
  5. import os.path
  6. #记分板
  7. if os.name == 'posix':
  8.     os.chdir('/storage/emulated/0')#安卓底层目录无法写入,更改目录
  9. if os.path.exists('mark.txt'):
  10.     mark = open('mark.txt','r')
  11.     past_mark = mark.read()
  12.     mark.close
  13.     if past_mark == '':
  14.         past_mark = 0
  15.     else:
  16.         print('总分:%s分' % (past_mark))
  17. else:
  18.     past_mark = 0   
  19. randon_number = list()  #保存随机数
  20. answer = list()         #保存计算结果
  21. temp = list()           #用于输入检查,清除使用过的数字
  22. clear_list = list()     #清除使用过的数字
  23. total_mark = 0
  24. sign = ('r',' ','+','-','*','÷','^','q')
  25. #检查用户输入正误
  26. def check_module(chars):
  27.     for each in chars:
  28.        if ((each not in str(randon_number)) and ((each not in sign) and (each not in str(answer)))):
  29.            print('输入有误,你输入了一个不存在或用过的数啦')
  30.            return True
  31.        else:
  32.            continue
  33.     return False
  34. #计算模块
  35. def cacul(x):
  36.     if  x[1] == '+':
  37.         return int(x[0]) + int(x[2])
  38.     elif  x[1] == '-':
  39.         return int(x[0]) - int(x[2])
  40.     elif  x[1] == '*':
  41.         return int(x[0]) * int(x[2])
  42.     elif  x[1] == '÷':
  43.         if (int(x[0]) == 0) or (int(x[2]) == 0):
  44.             return -1
  45.         elif ((int(x[0]) % int(x[2])) == 0):
  46.             return int(x[0]) // int(x[2])
  47.         else:
  48.             return -1
  49. def number():
  50.     for x in range(4):
  51.         global randon_number
  52.         global temp
  53.         randon_number.append(random.randint(1,10))
  54.         temp.append(randon_number[x])
  55.     print("你的四个数为:",randon_number)
  56. print('–––––––——————二十四点游戏——————–––––––')
  57. print('JuneFox present')
  58. #生成四个随机数              
  59. number()
  60. #判断
  61. while True:
  62.     #输入
  63.     print("请输入算式")
  64.     input_list = input( "在这输入算式\n输入字符r可以重新生成一组数字\n输入字符q可以退出\t" )
  65.     #输入正误检查
  66.     while (check_module(input_list)):
  67.         input_list = input( "在这输入算式\t" )
  68.     use_list = input_list.split()
  69.     #输入处理
  70.     if "r" in use_list:
  71.         temp = []
  72.         randon_number = []
  73.         number()
  74.         continue
  75.     elif 'q' in use_list:
  76.         print('退出中...')
  77.         break
  78.     else:
  79.         print('算式为:',input_list)
  80.         #清除用过的数
  81.         clear_list = use_list[:]
  82.         for x in temp:
  83.             if str(x) in clear_list:
  84.                 if x in answer:
  85.                     answer.remove(x)
  86.                     clear_list.remove(str(x))
  87.                 elif x in randon_number:
  88.                     randon_number.remove(x)
  89.                     clear_list.remove(str(x))
  90.         #计算
  91.         try:
  92.             answer.append(cacul(use_list))
  93.             temp.append(cacul(use_list))
  94.         except IndexError:
  95.             print('输入有误')
  96.             break
  97.         print("当前可用结果:",answer)        
  98.         #检测结果
  99.         if -1 in answer:
  100.             print("失败")
  101.             break
  102.         elif (len(randon_number) + len(answer) <= 1):
  103.             if 24 in answer:
  104.                 print("成功")
  105.                 total_mark += 1
  106.                 randon_number = list()
  107.                 answer = list()   
  108.                 temp = list()           
  109.                 clear_list = list()
  110.                 number()
  111.             else:
  112.                 print("失败")
  113.                 randon_number = list()
  114.                 answer = list()         
  115.                 temp = list()           
  116.                 clear_list = list()
  117.                 number()
  118.             continue
  119. print('本次得分:',total_mark)
  120. mark = open('mark.txt','w')
  121. total_mark = str(total_mark + int(past_mark))
  122. mark.write(total_mark)
  123. mark.close()
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-21 01:41:09 | 显示全部楼层
8/21版本更新1.5
更新了:
1.可以进行平方(^)运算了
2.优化部分代码


  1. #二十四点游戏
  2. #verson 1.5
  3. import random
  4. import os
  5. import os.path
  6. #记分板
  7. if os.name == 'posix':
  8.     os.chdir('/storage/emulated/0')#安卓底层目录无法写入,更改目录
  9. if os.path.exists('mark.txt'):
  10.     mark = open('mark.txt','r')
  11.     past_mark = mark.read()
  12.     mark.close
  13.     if past_mark == '':
  14.         past_mark = 0
  15.     else:
  16.         print('总分:%s分' % (past_mark))
  17. else:
  18.     past_mark = 0   
  19. randon_number = list()  #保存随机数
  20. result = list()         #保存计算结果
  21. temp = list()           #用于输入检查,清除使用过的数字
  22. clear_list = list()     #清除使用过的数字
  23. total_mark = 0
  24. sign = ('r',' ','+','-','*','÷','^','q')
  25. #检查用户输入正误
  26. def check_module(chars):
  27.     for each in chars:
  28.        if ((each not in str(randon_number)) and ((each not in sign) and (each not in str(result)))):
  29.            print('输入有误,你输入了一个不存在或用过的数啦')
  30.            return True
  31.        else:
  32.            continue
  33.     return False
  34. #计算模块
  35. def cacul(x):
  36.     if  x[1] == '+':
  37.         return int(x[0]) + int(x[2])
  38.     elif  x[1] == '-':
  39.         return int(x[0]) - int(x[2])
  40.     elif  x[1] == '*':
  41.         return int(x[0]) * int(x[2])
  42.     elif  x[1] == '÷':
  43.         if (int(x[0]) == 0) or (int(x[2]) == 0):
  44.             return -1
  45.         elif ((int(x[0]) % int(x[2])) == 0):
  46.             return int(x[0]) // int(x[2])
  47.         else:
  48.             return -1
  49.     elif x[1] == '^':
  50.         if (int(x[0]) == 0) and (int(x[2]) == 0):
  51.             return -1
  52.         else:
  53.             return pow(int(x[0]),int(x[2]))
  54. def number():
  55.     for x in range(4):
  56.         global randon_number
  57.         global temp
  58.         randon_number.append(random.randint(1,10))
  59.         temp.append(randon_number[x])
  60.     print("你的四个数为:",randon_number)
  61. print('–––––––——————二十四点游戏——————–––––––')
  62. print('JuneFox present')
  63. #生成四个随机数              
  64. number()
  65. #判断
  66. while True:
  67.     #输入
  68.     input_list = input( "输入字符r可以重新生成一组数字\n输入字符q可以退出\n在这输入算式\t" )
  69.     #输入正误检查
  70.     while (check_module(input_list)):
  71.         input_list = input( "在这输入算式\t" )
  72.     use_list = input_list.split()
  73.     #输入处理
  74.     if "r" in use_list:
  75.         temp = []
  76.         randon_number = []
  77.         number()
  78.         continue
  79.     elif 'q' in use_list:
  80.         print('退出中...')
  81.         break
  82.     else:
  83.         print('算式为:',input_list)
  84.         #清除用过的数
  85.         clear_list = use_list[:]
  86.         for x in temp:
  87.             if str(x) in clear_list:
  88.                 if x in result:
  89.                     result.remove(x)
  90.                     clear_list.remove(str(x))
  91.                 elif x in randon_number:
  92.                     randon_number.remove(x)
  93.                     clear_list.remove(str(x))
  94.         #计算
  95.         try:
  96.             result.append(cacul(use_list))
  97.             temp.append(cacul(use_list))
  98.         except IndexError:
  99.             print('输入有误')
  100.             break
  101.         print("当前可用结果:",result)        
  102.         #检测结果
  103.         if -1 in result:
  104.             print("失败")
  105.             break
  106.         elif (len(randon_number) + len(result) <= 1):
  107.             if 24 in result:
  108.                 print("成功")
  109.                 total_mark += 1
  110.             else:
  111.                 print("失败")
  112.             randon_number = list()
  113.             result = list()         
  114.             temp = list()           
  115.             clear_list = list()
  116.             number()
  117.             continue
  118. print('本次得分:',total_mark)
  119. mark = open('mark.txt','w')
  120. total_mark = str(total_mark + int(past_mark))
  121. mark.write(total_mark)
  122. mark.close()
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-25 11:56:35 | 显示全部楼层
8/25版本更新1.6
修复了:
1.检查正误时数字相同就通过的碧油鸡
2.优化部分代码
更新了:
1.支持单步撤回,输入字符c即可回到上一步
2.增加了计步器

  1. #二十四点游戏
  2. #verson 1.6
  3. import random
  4. import os
  5. import os.path
  6. #记分板
  7. if os.name == 'posix':
  8.     os.chdir('/storage/emulated/0')#安卓底层目录无法写入,更改目录
  9. if os.path.exists('mark.txt'):
  10.     mark = open('mark.txt','r')
  11.     past_mark = mark.read()
  12.     mark.close
  13.     if past_mark == '':
  14.         past_mark = 0
  15.     else:
  16.         print('总分:%s分' % (past_mark))
  17. else:
  18.     past_mark = 0   
  19. randon_number = list()  #保存随机数
  20. available_number = list()         #保存计算结果
  21. whole_number = list()           #所有数字
  22. clear_list = list()     #清除使用过的数字
  23. total_mark = 0
  24. reset = list()          #用于撤回
  25. step_amount = 0         #保存步数
  26. sign = ('r','c','/',' ','+','-','*','÷','^','q')
  27. #检查用户输入正误
  28. def check_module(chars):
  29.     for each in chars:
  30.         if ((each not in str(randon_number)) and ((each not in sign) and (each not in str(available_number)))):
  31.             print('输入有误,你输入了一个不存在或用过的数啦')
  32.             return True
  33.         else:
  34.             continue
  35.     return False
  36. #计算模块
  37. def cacul(x):
  38.     if  x[1] == '+':
  39.         return int(x[0]) + int(x[2])
  40.     elif  x[1] == '-':
  41.         return int(x[0]) - int(x[2])
  42.     elif  x[1] == '*':
  43.         return int(x[0]) * int(x[2])
  44.     elif  x[1] == '÷' or x[1] == '/':
  45.         return int(x[0]) / int(x[2])
  46.     elif x[1] == '^':
  47.             return pow(int(x[0]),int(x[2]))
  48. def number():
  49.     for x in range(4):
  50.         global randon_number
  51.         global whole_number
  52.         randon_number.append(random.randint(1,10))
  53.         whole_number.append(randon_number[x])
  54.     print("你的四个数为:",sorted(randon_number))      
  55. print('–––––––——————二十四点游戏——————–––––––')
  56. print('JuneFox present')
  57. #生成四个随机数              
  58. number()
  59. #判断
  60. while True:
  61.     #输入
  62.     input_list = input( "输入字符r可以重新生成一组数字\n输入字符q可以退出\n在这输入算式\t" )
  63.     #输入正误检查
  64.     while (check_module(input_list)):
  65.         input_list = input( "在这输入算式\t" )
  66.     use_list = input_list.split()
  67.     #输入处理
  68.     if "r" in use_list:
  69.         whole_number = []
  70.         randon_number = []
  71.         number()
  72.         continue
  73.     elif 'q' in use_list:
  74.         print('退出中...')
  75.         break
  76.     elif 'c' in use_list:
  77.         if step_amount == 0:
  78.             pass
  79.         else:
  80.             available_number.pop()
  81.             whole_number.pop()
  82.             for x in reset:
  83.                 if x[0] == 'r':
  84.                     randon_number.append(x[1])
  85.                 elif x[0] == 'a':
  86.                     available_number.append(x[1])
  87.             reset = list()
  88.     else:
  89.         reset = list()
  90.         print('算式为:',input_list)
  91.         #清除用过的数
  92.         clear_list = use_list[:]
  93.         for x in whole_number:
  94.             if str(x) in clear_list:
  95.                 if x in available_number:
  96.                     available_number.remove(x)
  97.                     clear_list.remove(str(x))
  98.                     reset.append(['a',x])
  99.                 elif x in randon_number:
  100.                     randon_number.remove(x)
  101.                     clear_list.remove(str(x))
  102.                     reset.append(['r',x])
  103. #       print(reset)
  104.         #计算
  105.         try:
  106.             x = cacul(use_list)
  107.             available_number.append(x)
  108.             whole_number.append(x)
  109.         except IndexError:
  110.             print('输入有误')
  111.             break
  112.         print("当前可用结果:",sorted(available_number))        
  113.         #检测结果
  114. #       print(available_number,randon_number,whole_number,clear_list)
  115.         step_amount += 1
  116.         if (len(randon_number) + len(available_number) <= 1):
  117.             if 24 in available_number:
  118.                 print("成功\n你用了%d步" % (step_amount))
  119.                 total_mark += 1
  120.             else:
  121.                 print("失败")
  122.             randon_number = list()
  123.             available_number = list()         
  124.             whole_number = list()           
  125.             clear_list = list()
  126.             number()
  127.             continue
  128. print('本次得分:',total_mark)
  129. mark = open('mark.txt','w')
  130. total_mark = str(total_mark + int(past_mark))
  131. mark.write(total_mark)
  132. mark.close()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-5 19:51:31 | 显示全部楼层
9/5版本更新1.7[/
  1. [/code]size]
  2. [size=1]又TMD开学了,军训手机更新格式错乱见谅[/size]
  3. 修复了:
  4. 1.优化部分代码
  5. 更新了:
  6. 1.支持两次撤回

  7. [code]#二十四点游戏
  8. #verson 1.7
  9. import random
  10. import os
  11. import os.path
  12. #记分板
  13. if os.name == 'posix':
  14.     os.chdir('/storage/emulated/0')#安卓底层目录无法写入,更改目录
  15. if os.path.exists('mark.txt'):
  16.     mark = open('mark.txt','r')
  17.     past_mark = mark.read()
  18.     mark.close
  19.     if past_mark == '':
  20.         past_mark = 0
  21.     else:
  22.         print('总分:%s分' % (past_mark))
  23. else:
  24.     past_mark = 0   
  25. randon_number = list()  #保存随机数
  26. available_number = list()         #保存计算结果
  27. whole_number = list()           #所有数字
  28. clear_list = list()     #清除使用过的数字
  29. total_mark = 0
  30. reset = list()         #用于撤回
  31. step_amount = 0         #保存步数
  32. sign = ('r','c','/',' ','+','-','*','÷','^','q')
  33. recall = False        #保存撤回状态
  34. #检查用户输入正误
  35. def check_module(alist):
  36.     chars = alist.split()
  37.     for each in chars:
  38.         if ((each not in str(randon_number)) and ((each not in sign) and (each not in str(available_number)))):
  39.             print('输入有误,你输入了一个不存在或用过的数啦')
  40.             return True
  41.         else:
  42.             continue
  43.     return False
  44. #计算模块
  45. def cacul_module(x):
  46.     if  x[1] == '+':
  47.         return int(x[0]) + int(x[2])
  48.     elif  x[1] == '-':
  49.         return int(x[0]) - int(x[2])
  50.     elif  x[1] == '*':
  51.         return int(x[0]) * int(x[2])
  52.     elif  x[1] == '÷' or x[1] == '/':
  53.         return int(x[0]) / int(x[2])
  54.     elif x[1] == '^':
  55.         return pow(int(x[0]),int(x[2]))
  56. def number():
  57.     for x in range(4):
  58.         global randon_number
  59.         global whole_number
  60.         randon_number.append(random.randint(1,10))
  61.         whole_number.append(randon_number[x])
  62.     print("你的四个数为:",sorted(randon_number))      
  63. def callback(load,number):
  64.     global recall
  65.     if step_amount == 0:
  66.         pass
  67.     else:
  68.         if recall == True:
  69.             number -= 1
  70.         available_number.pop()
  71.         whole_number.pop()
  72.         for x in load:
  73.             print(x,number)
  74.             if x[2] == number:
  75.                 if x[0] == 'a':
  76.                     available_number.append(x[1])
  77.                 elif x[0] == 'r':
  78.                     randon_number.append(x[1])               
  79.         print(available_number,randon_number,whole_number)
  80.         recall = True
  81. print('–––––––——————二十四点游戏——————–––––––')
  82. print('JuneFox present')
  83. #生成四个随机数              
  84. number()
  85. #判断
  86. while True:
  87.     #输入
  88.     input_list = input( "输入字符r可以重新生成一组数字\n输入字符q可以退出\n在这输入算式\t" )
  89.     #输入正误检查
  90.     while (check_module(input_list)):
  91.         input_list = input( "在这输入算式\t" )
  92.     use_list = input_list.split()
  93.     #输入处理
  94.     if "r" in use_list:
  95.         whole_number = []
  96.         randon_number = []
  97.         number()
  98.         continue
  99.     elif 'q' in use_list:
  100.         print('退出中...')
  101.         break
  102.     elif 'c' in use_list:
  103.         callback(reset,step_amount)
  104.     else:
  105.         step_amount += 1
  106.         recall = False        
  107.         print('算式为:',input_list)
  108.         #清除用过的数
  109.         clear_list = use_list[:]
  110.         for x in whole_number:
  111.             if str(x) in clear_list:
  112.                 if x in available_number:
  113.                     available_number.remove(x)
  114.                     clear_list.remove(str(x))
  115.                     reset.append(['a',x,step_amount])
  116.                 elif x in randon_number:
  117.                     randon_number.remove(x)
  118.                     clear_list.remove(str(x))
  119.                     reset.append(['r',x,step_amount])
  120.         print(reset)
  121.         #计算
  122.         try:
  123.             x = cacul_module(use_list)
  124.             available_number.append(x)
  125.             whole_number.append(x)
  126.         except IndexError:
  127.             print('输入有误')
  128.             break
  129.         print("当前可用结果:",sorted(available_number))        
  130.         #检测结果
  131. #       print(available_number,randon_number,whole_number,clear_list)
  132.         if (len(randon_number) + len(available_number) <= 1):
  133.             if 24 in available_number:
  134.                 print("成功\n你用了%d步" % (step_amount))
  135.                 total_mark += 1
  136.             else:
  137.                 print("失败")
  138.             randon_number = list()
  139.             available_number = list()         
  140.             whole_number = list()           
  141.             clear_list = list()
  142.             step_amount = list()
  143.             number()
  144.             continue            
  145. print('本次得分:',total_mark)
  146. mark = open('mark.txt','w')
  147. total_mark = str(total_mark + int(past_mark))
  148. mark.write(total_mark)
  149. mark.close()
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 01:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表