鱼C论坛

 找回密码
 立即注册
查看: 824|回复: 13

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

[复制链接]
发表于 2020-5-24 16:47:02 | 显示全部楼层 |阅读模式

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

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

x
37讲课后作业,萌新初步实现要求,请大神指导哪里还可以优化?
最佳答案
2020-5-24 19:13:06
本帖最后由 Twilight6 于 2020-5-24 19:19 编辑

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

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

37-01测试版.zip

1.43 KB, 下载次数: 6

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

使用道具 举报

 楼主| 发表于 2020-5-24 16:54:53 | 显示全部楼层
再请教,代码在PyCharm里面运行至结束正常,直接运行py到判断吃鱼的时候会崩溃。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2020-5-24 18:46:07 From FishC Mobile | 显示全部楼层
飘花飞雪 发表于 2020-5-24 17:01
代码文件打开错了

你把代码直接贴出来,
没有人会因为这而下载你的附件的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[i] = (yuzu.yu_x,yuzu.yu_y)
    print("%s出生在【%d】,【%d】" % (i, yu[i][0], yu[i][1]))


#判断移动,体力消耗,乌龟吃鱼
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["乌龟"][0],wuguiz["乌龟"][1])     #乌龟移动
    if wugui.zhou == "x":
        print("乌龟向%s移动了%d步,位置到达【%d】,【%d】,体力还剩【%d】点" % (wugui.heng, wugui.buchang,wuguiz["乌龟"][0],wuguiz["乌龟"][1], wugui.tili))
    else:
        print("乌龟向%s移动了%d步,位置到达【%d】,【%d】,体力还剩【%d】点" % (wugui.shu, wugui.buchang,wuguiz["乌龟"][0],wuguiz["乌龟"][1], wugui.tili))
    for i in yu:    #鱼移动
        yu[i] = yuzu.yidong(yu[i][0],yu[i][1])
        if yuzu.zhou == "x":
            print("%s向%s移动了1步,位置到达【%d】,【%d】" % (i, yuzu.heng,yu[i][0],yu[i][1]))
        else:
            print("%s向%s移动了1步,位置到达【%d】,【%d】" % (i, yuzu.shu,yu[i][0],yu[i][1]))
    for i in list(yu.keys()):    #判断吃
        if wuguiz["乌龟"] == yu[i]:
            wugui.tili += 20
            if wugui.tili > 100:   #判断体力
                wugui.tili = 100
            print("%s被吃了,乌龟加20点体力,现有体力%d"%(i,wugui.tili))
            del yu[i]
if wugui.tili == 0:
    print("乌龟没有体力,游戏结束")
if len(yu) == 0:
    print("鱼被乌龟吃完了,游戏结束")


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

使用道具 举报

发表于 2020-5-24 19:13:06 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-5-24 19:19 编辑

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

keys 是对字典用的  你的yu 是元组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-24 19:21:29 | 显示全部楼层
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[0], yu[1]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-24 19:46:36 | 显示全部楼层

yu = {}  #定义字典
yuzu = Yu()
for i in range(1,11):
    yu.setdefault("鱼%d"%i)
for i in yu:
    yuzu.chusheng()
    yu[i] = (yuzu.yu_x,yuzu.yu_y)  #复制上来的源代码索引被吃了,我是这样写的,给【i】key赋值
    print("%s出生在【%d】,【%d】" % (i, yu[i][0], yu[i][1]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-24 19:47:21 | 显示全部楼层
yu = {}
yuzu = Yu()
for i in range(1,11):
    yu.setdefault("鱼%d"%i)
for i in yu:
    yuzu.chusheng()
    yu[i] = (yuzu.yu_x,yuzu.yu_y)
    print("%s出生在【%d】,【%d】" % (i, yu[i][0], yu[i][1]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-24 19:48:10 | 显示全部楼层

那应该就没什么问题了 很棒 比我当时做的好多了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-24 19:48:24 | 显示全部楼层
Twilight6 发表于 2020-5-24 19:13
报错

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

不好意思,第一次发帖子,不知道粘贴代码,字典的key值粘贴上来被吃掉了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[i] = (yuzu.yu_x,yuzu.yu_y)
    print("%s出生在【%d】,【%d】" % (i, yu[i][0], yu[i][1]))


#判断移动,体力消耗,乌龟吃鱼
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["乌龟"][0],wuguiz["乌龟"][1])     #乌龟移动
    if wugui.zhou == "x":
        print("乌龟向%s移动了%d步,位置到达【%d】,【%d】,体力还剩【%d】点" % (wugui.heng, wugui.buchang,wuguiz["乌龟"][0],wuguiz["乌龟"][1], wugui.tili))
    else:
        print("乌龟向%s移动了%d步,位置到达【%d】,【%d】,体力还剩【%d】点" % (wugui.shu, wugui.buchang,wuguiz["乌龟"][0],wuguiz["乌龟"][1], wugui.tili))
    for i in yu:    #鱼移动
        yu[i] = yuzu.yidong(yu[i][0],yu[i][1])
        if yuzu.zhou == "x":
            print("%s向%s移动了1步,位置到达【%d】,【%d】" % (i, yuzu.heng,yu[i][0],yu[i][1]))
        else:
            print("%s向%s移动了1步,位置到达【%d】,【%d】" % (i, yuzu.shu,yu[i][0],yu[i][1]))
    for i in list(yu.keys()):    #判断吃
        if wuguiz["乌龟"] == yu[i]:
            wugui.tili += 20
            if wugui.tili > 100:   #判断体力
                wugui.tili = 100
            print("%s被吃了,乌龟加20点体力,现有体力%d"%(i,wugui.tili))
            del yu[i]
if wugui.tili == 0:
    print("乌龟没有体力,游戏结束")
if len(yu) == 0:
    print("鱼被乌龟吃完了,游戏结束")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

如何正确地发代码、上传图片和附件?
https://fishc.com.cn/thread-52272-1-1.html
(出处: 鱼C论坛)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-24 20:33:50 | 显示全部楼层
Twilight6 发表于 2020-5-24 19:48
那应该就没什么问题了 很棒 比我当时做的好多了!

哥,我在想是不是使用了题目的漏洞,其实没有创建10条鱼的实例对象,而是使用一个实例对象创建了10个不同的坐标数据放在字典里,这样实现的话如果数据量大是不是就有问题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-21 04:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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