飘花飞雪 发表于 2020-5-24 16:47:02

37讲课后作业,萌新初步实现要求,请大神指导哪里还可以优化?

37讲课后作业,萌新初步实现要求,请大神指导哪里还可以优化?

飘花飞雪 发表于 2020-5-24 16:54:53

再请教,代码在PyCharm里面运行至结束正常,直接运行py到判断吃鱼的时候会崩溃。

飘花飞雪 发表于 2020-5-24 17:01:36

飘花飞雪 发表于 2020-5-24 16:54
再请教,代码在PyCharm里面运行至结束正常,直接运行py到判断吃鱼的时候会崩溃。

代码文件打开错了{:5_104:}

_2_ 发表于 2020-5-24 18:46:07

飘花飞雪 发表于 2020-5-24 17:01
代码文件打开错了

你把代码直接贴出来,
没有人会因为这而下载你的附件的{:10_269:}

飘花飞雪 发表于 2020-5-24 19:00:22

_2_ 发表于 2020-5-24 18:46
你把代码直接贴出来,
没有人会因为这而下载你的附件的

import random


def cjyd(temp):             #判断是否超出边界,确定在<10,>0的范围内
    if temp > 10:
      temp = 20 - temp
      return temp
    elif temp < 0:
      temp = 0 - temp
      return temp
    else:
      return temp


class Wugui:         #乌龟出生点初始化和移动上下左右的判断和输出
    tili = 100
    def chusheng(self):
      self.wugui_x = random.randint(0, 10)
      self.wugui_y = random.randint(0, 10)
      print("乌龟出生在【%d】,【%d】" % (self.wugui_x, self.wugui_y))

    def yidong(self,x,y):
      self.tili -= 1
      self.zhou = random.choice(["x","y"])
      self.buchang = random.randint(1,2)
      if self.zhou == "x":
            self.heng = random.choice(["左","右"])
            if self.heng == "左":
                x = cjyd(x - self.buchang)
            else:
                x = cjyd(x + self.buchang)
      else:
            self.shu = random.choice(["上","下"])
            if self.shu == "下":
                y = cjyd(y - self.buchang)
            else:
                y = cjyd(y + self.buchang)
      return x, y



class Yu:         #鱼的出生点位和移动判断和输出
    def chusheng(self):
      self.yu_x = random.randint(0, 10)
      self.yu_y = random.randint(0, 10)
    def yidong(self,x,y):
      self.zhou = random.choice(["x", "y"])
      if self.zhou == "x":
            self.heng = random.choice(["左","右"])
            if self.heng == "左":
                x = cjyd(x - 1)
            else:
                x = cjyd(x + 1)
      else:
            self.shu = random.choice(["上","下"])
            if self.shu == "下":
                y = cjyd(y - 1)
            else:
                y = cjyd(y + 1)
      return x,y


#生成鱼和乌龟并放入字典
wugui = Wugui()
wugui.chusheng()
wuguiz = {}
wuguiz.setdefault("乌龟",(wugui.wugui_x,wugui.wugui_y))
yu = {}
yuzu = Yu()
for i in range(1,11):
    yu.setdefault("鱼%d"%i)
for i in yu:
    yuzu.chusheng()
    yu = (yuzu.yu_x,yuzu.yu_y)
    print("%s出生在【%d】,【%d】" % (i, yu, yu))


#判断移动,体力消耗,乌龟吃鱼
jishu = 0
while 1:
    jishu += 1
    if wugui.tili == 0 or len(yu) == 0 :#判断结束,鱼等于0或者乌龟体力为0
      break
    print("\n\n第【%d】次移动" % jishu)
    input("按回车进入下一次移动")
    wuguiz["乌龟"] = wugui.yidong(wuguiz["乌龟"],wuguiz["乌龟"])   #乌龟移动
    if wugui.zhou == "x":
      print("乌龟向%s移动了%d步,位置到达【%d】,【%d】,体力还剩【%d】点" % (wugui.heng, wugui.buchang,wuguiz["乌龟"],wuguiz["乌龟"], wugui.tili))
    else:
      print("乌龟向%s移动了%d步,位置到达【%d】,【%d】,体力还剩【%d】点" % (wugui.shu, wugui.buchang,wuguiz["乌龟"],wuguiz["乌龟"], wugui.tili))
    for i in yu:    #鱼移动
      yu = yuzu.yidong(yu,yu)
      if yuzu.zhou == "x":
            print("%s向%s移动了1步,位置到达【%d】,【%d】" % (i, yuzu.heng,yu,yu))
      else:
            print("%s向%s移动了1步,位置到达【%d】,【%d】" % (i, yuzu.shu,yu,yu))
    for i in list(yu.keys()):    #判断吃
      if wuguiz["乌龟"] == yu:
            wugui.tili += 20
            if wugui.tili > 100:   #判断体力
                wugui.tili = 100
            print("%s被吃了,乌龟加20点体力,现有体力%d"%(i,wugui.tili))
            del yu
if wugui.tili == 0:
    print("乌龟没有体力,游戏结束")
if len(yu) == 0:
    print("鱼被乌龟吃完了,游戏结束")


Twilight6 发表于 2020-5-24 19:13:06

本帖最后由 Twilight6 于 2020-5-24 19:19 编辑

飘花飞雪 发表于 2020-5-24 19:00
import random




    for i in list(yu.keys()):
报错

keys 是对字典用的你的yu 是元组

Twilight6 发表于 2020-5-24 19:21:29

飘花飞雪 发表于 2020-5-24 19:00
import random




yu = {}# 定义成字典
yuzu = Yu()
for i in range(1,11):
    yu.setdefault("鱼%d"%i)
for i in yu:
    yuzu.chusheng()
    yu = (yuzu.yu_x,yuzu.yu_y)# 这边又被你赋值 覆盖了你之前的字典
    print("%s出生在【%d】,【%d】" % (i, yu, yu))

飘花飞雪 发表于 2020-5-24 19:46:36

Twilight6 发表于 2020-5-24 19:21


yu = {}#定义字典
yuzu = Yu()
for i in range(1,11):
    yu.setdefault("鱼%d"%i)
for i in yu:
    yuzu.chusheng()
    yu = (yuzu.yu_x,yuzu.yu_y)#复制上来的源代码索引被吃了,我是这样写的,给【i】key赋值
    print("%s出生在【%d】,【%d】" % (i, yu, yu))

飘花飞雪 发表于 2020-5-24 19:47:21

Twilight6 发表于 2020-5-24 19:21


yu = {}
yuzu = Yu()
for i in range(1,11):
    yu.setdefault("鱼%d"%i)
for i in yu:
    yuzu.chusheng()
    yu = (yuzu.yu_x,yuzu.yu_y)
    print("%s出生在【%d】,【%d】" % (i, yu, yu))

Twilight6 发表于 2020-5-24 19:48:10

飘花飞雪 发表于 2020-5-24 19:47


那应该就没什么问题了 很棒 比我当时做的好多了!

飘花飞雪 发表于 2020-5-24 19:48:24

Twilight6 发表于 2020-5-24 19:13
报错

keys 是对字典用的你的yu 是元组

不好意思,第一次发帖子,不知道粘贴代码,字典的key值粘贴上来被吃掉了

飘花飞雪 发表于 2020-5-24 19:48:56

import random


def cjyd(temp):             #判断是否超出边界,确定在<10,>0的范围内
    if temp > 10:
      temp = 20 - temp
      return temp
    elif temp < 0:
      temp = 0 - temp
      return temp
    else:
      return temp


class Wugui:         #乌龟出生点初始化和移动上下左右的判断和输出
    tili = 100
    def chusheng(self):
      self.wugui_x = random.randint(0, 10)
      self.wugui_y = random.randint(0, 10)
      print("乌龟出生在【%d】,【%d】" % (self.wugui_x, self.wugui_y))

    def yidong(self,x,y):
      self.tili -= 1
      self.zhou = random.choice(["x","y"])
      self.buchang = random.randint(1,2)
      if self.zhou == "x":
            self.heng = random.choice(["左","右"])
            if self.heng == "左":
                x = cjyd(x - self.buchang)
            else:
                x = cjyd(x + self.buchang)
      else:
            self.shu = random.choice(["上","下"])
            if self.shu == "下":
                y = cjyd(y - self.buchang)
            else:
                y = cjyd(y + self.buchang)
      return x, y



class Yu:         #鱼的出生点位和移动判断和输出
    def chusheng(self):
      self.yu_x = random.randint(0, 10)
      self.yu_y = random.randint(0, 10)
    def yidong(self,x,y):
      self.zhou = random.choice(["x", "y"])
      if self.zhou == "x":
            self.heng = random.choice(["左","右"])
            if self.heng == "左":
                x = cjyd(x - 1)
            else:
                x = cjyd(x + 1)
      else:
            self.shu = random.choice(["上","下"])
            if self.shu == "下":
                y = cjyd(y - 1)
            else:
                y = cjyd(y + 1)
      return x,y


#生成鱼和乌龟并放入字典
wugui = Wugui()
wugui.chusheng()
wuguiz = {}
wuguiz.setdefault("乌龟",(wugui.wugui_x,wugui.wugui_y))
yu = {}
yuzu = Yu()
for i in range(1,11):
    yu.setdefault("鱼%d"%i)
for i in yu:
    yuzu.chusheng()
    yu = (yuzu.yu_x,yuzu.yu_y)
    print("%s出生在【%d】,【%d】" % (i, yu, yu))


#判断移动,体力消耗,乌龟吃鱼
jishu = 0
while 1:
    jishu += 1
    if wugui.tili == 0 or len(yu) == 0 :#判断结束,鱼等于0或者乌龟体力为0
      break
    print("\n\n第【%d】次移动" % jishu)
    input("按回车进入下一次移动")
    wuguiz["乌龟"] = wugui.yidong(wuguiz["乌龟"],wuguiz["乌龟"])   #乌龟移动
    if wugui.zhou == "x":
      print("乌龟向%s移动了%d步,位置到达【%d】,【%d】,体力还剩【%d】点" % (wugui.heng, wugui.buchang,wuguiz["乌龟"],wuguiz["乌龟"], wugui.tili))
    else:
      print("乌龟向%s移动了%d步,位置到达【%d】,【%d】,体力还剩【%d】点" % (wugui.shu, wugui.buchang,wuguiz["乌龟"],wuguiz["乌龟"], wugui.tili))
    for i in yu:    #鱼移动
      yu = yuzu.yidong(yu,yu)
      if yuzu.zhou == "x":
            print("%s向%s移动了1步,位置到达【%d】,【%d】" % (i, yuzu.heng,yu,yu))
      else:
            print("%s向%s移动了1步,位置到达【%d】,【%d】" % (i, yuzu.shu,yu,yu))
    for i in list(yu.keys()):    #判断吃
      if wuguiz["乌龟"] == yu:
            wugui.tili += 20
            if wugui.tili > 100:   #判断体力
                wugui.tili = 100
            print("%s被吃了,乌龟加20点体力,现有体力%d"%(i,wugui.tili))
            del yu
if wugui.tili == 0:
    print("乌龟没有体力,游戏结束")
if len(yu) == 0:
    print("鱼被乌龟吃完了,游戏结束")

Twilight6 发表于 2020-5-24 19:49:48

飘花飞雪 发表于 2020-5-24 19:48
不好意思,第一次发帖子,不知道粘贴代码,字典的key值粘贴上来被吃掉了

没事,下次尽量发代码,别发文件,因为代码复制比下载方便了好几倍噢

如何正确地发代码、上传图片和附件?
https://fishc.com.cn/thread-52272-1-1.html
(出处: 鱼C论坛)

飘花飞雪 发表于 2020-5-24 20:33:50

Twilight6 发表于 2020-5-24 19:48
那应该就没什么问题了 很棒 比我当时做的好多了!

哥,我在想是不是使用了题目的漏洞,其实没有创建10条鱼的实例对象,而是使用一个实例对象创建了10个不同的坐标数据放在字典里,这样实现的话如果数据量大是不是就有问题?
页: [1]
查看完整版本: 37讲课后作业,萌新初步实现要求,请大神指导哪里还可以优化?