首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >甲鱼记忆游戏

甲鱼记忆游戏
EN

Code Review用户
提问于 2014-11-24 18:17:49
回答 1查看 4.2K关注 0票数 2

一段时间前,我不得不用Python为学校做一个项目,创建一个游戏或一些有趣的东西。我决定做一个记忆游戏。代码并不是很好,变量名也不是很好。它不应该看起来很好,重要的是它的功能。我在甲鱼身上做了很多动作,所以再来一次,缩短动作并不是我真正的目标。密码太多了,我没什么好紧张的了。我所要求的只是你对它是如何完成和如何工作的总体看法。

代码语言:javascript
复制
from turtle import *
import time
from random import *
from tkinter import *

speed(0)
def mj(x, y):
    return x, y

def crtanje2(x, y):
    global pon
    global m
    global klik
    global tocnih
    pon += 1
    klik += 1
    for i in range(20):
        if x >= unutar[i][0] and x <= unutar[i][0]+100 and y <= unutar[i][1]+100 and y >= unutar[i][1]:
            pu()
            goto(unutar[i][0]+50, unutar[i][1]+25)
            pd()
            rj = l.index(i)
            rj2 = l.index(i)
            if rj % 2 != 0:
                rj -= 1
            crtanje(rj, boja[rj//2])
            m[1-pon%2] = rj2
            break
    if pon % 2 == 0 and pon != 0 and m[0] != -101 and m[1] != -100 and abs(m[0]-m[1]) != 1 or abs(m[0]-m[1]) == 1 and min(m[0], m[1]) % 2 != 0:
        tracer(True)
        time.sleep(1)
        tracer(False)
        pu()
        goto(unutar[l[m[0]]][0]+1, unutar[l[m[0]]][1]+1)
        pd()
        pencolor('white')
        fillcolor('white')
        begin_fill()
        for i in range(4):
             fd(98)
             lt(90)
        end_fill()
        pu()
        goto(unutar[l[m[1]]][0]+1, unutar[l[m[1]]][1]+1)
        pd()
        pencolor('white')
        fillcolor('white')
        begin_fill()
        for i in range(4):
            fd(98)
            lt(90)
        end_fill()
    if abs(m[0]-m[1]) == 1 and min(m[0], m[1]) % 2 == 0:
        tocnih += 1
    if pon % 2 == 0:
        m = [-101, -100]
    pencolor('black')
    if tocnih == 10:
        import sys; sys.exit('\n----------------------\nSolved in {} steps!\n----------------------'.format(pon//2))
    return


def tablica():
    hideturtle()
    pu()
    goto(-250, 100)
    pd()
    for i in range(20):
        if i % 5 == 0 and i != 0:
            bk(500)
            rt(90)
            fd(100)
            lt(90)
        kvadrat()
        fd(100)

def kvadrat():
    for i in range(4):
        fd(100)
        lt(90)

def pravokutnik():
    pu()
    bk(25)
    lt(90)
    fd(12.5)
    rt(90)
    pd()
    begin_fill()
    for i in range(4):
        if i % 2 == 0:
            fd(50)
        else:
            fd(25)
        lt(90)

def zvijezda():
    pu()
    lt(90)
    fd(37.5)
    lt(90)
    fd(25)
    rt(180)
    pd()
    begin_fill()
    for i in range(5):
        fd(50)
        rt(144)

def paralelogram():
    pu()
    lt(90)
    fd(12.5)
    rt(90)
    pd()
    for i in range(4):
        if i % 2 == 0:
            fd(25)
            lt(140)
        else:
            fd(25)
            lt(40)

def trapez():
    pu()
    lt(90)
    fd(12.5)
    rt(90)
    bk(17.5)
    pd()
    begin_fill()
    fd(50)
    lt(140)
    fd(25)
    lt(40)
    fd(25)
    lt(40)
    fd(25)
    lt(140)
    fd(25)

def polukrug():
    pu()
    fd(25)
    lt(90)
    fd(12.5)
    pd()
    begin_fill()
    circle(25, extent = 180)
    lt(90)
    fd(50)

def crtanje(br, boja):
    fillcolor(boja)
    if br == 0:
        begin_fill()
        circle(25, steps = 4)
    elif br == 2:
        begin_fill()
        circle(25)
    elif br == 4:
        begin_fill()
        circle(25, steps = 3)
    elif br == 6:
        pravokutnik()
    elif br == 8:
        pu()
        bk(20)
        lt(90)
        fd(12.5)
        rt(90)
        pd()
        rt(45)
        begin_fill()
        circle(25, steps = 4)
        lt(45)
    elif br == 10:
        pu()
        bk(20)
        lt(90)
        fd(20)
        rt(90)
        pd()
        begin_fill()
        for i in range(5):
            circle(5)
            pu()
            fd(10)
            pd()
    elif br == 12:
        zvijezda()
    elif br == 14:
        begin_fill()
        paralelogram()
    elif br == 16:
        trapez()
    else:
        polukrug()
    end_fill()

tracer(False)
l = sample(range(0, 20), 20)
tablica()
colormode(255)
boja = []
for i in range(0, 20, 2):
    boja.append((randint(0, 255), randint(0, 255), randint(0, 255)))
    for j in range(i, i+2):
        pu()
        goto(-200+((l[j]%5)*100), 125-((l[j]//5)*100))
        pd()
        crtanje(i, boja[i//2])
tracer(True)
time.sleep(10)
reset()
tracer(False)
tablica()
unutar = [(-250, 100), (-150, 100), (-50, 100), (50, 100), (150, 100), (-250, 0), (-150, 0), (-50, 0), (50, 0), (150, 0), (-250, -100), (-150, -100), (-50, -100), (50, -100), (150, -100), (-250, -200), (-150, -200), (-50, -200), (50, -200), (150, -200)]
tocno = 0
tracer(True)
tracer(False)
pon = 0
tocnih = 0
m = [-101, -100]
klik = 0
poz = onscreenclick(crtanje2)
mainloop()
EN

回答 1

Code Review用户

回答已采纳

发布于 2014-12-08 21:44:55

我所要求的只是你对它是如何完成和如何工作的总体看法。

不太好。您的代码几乎违反了所有关于好代码的规则。但不要难过,你是幸运的,因为你现在可以学习一些好的原则,并在未来编写更好的代码。

代码语言:javascript
复制
from turtle import *
import time
from random import *
from tkinter import *

请不要使用import *,而是使用import long_long_name as short

crtanje2(x, y)crtanje(br, boja)有50行长。将它们划分为较小的函数。

删除以下内容,因为它从未被使用过。

代码语言:javascript
复制
def mj(x, y):
    return x, y
代码语言:javascript
复制
global pon
global m
global klik
global tocnih

不要使用全局变量,而是将需要的变量作为参数传递给函数。

这里用英语编写的代码是最受欢迎的,您的代码不是,请考虑将您的函数名翻译成英语。

代码语言:javascript
复制
pu()
lt(90)
fd(37.5)
lt(90)
fd(25)
rt(180)
pd()

您的代码使用了大量的两个字母名称,通常首选较长的名称。

通常的做法是定义一个main函数,该函数实际上执行一些操作,然后执行:

代码语言:javascript
复制
if __name__ == "__main__":
    main()

这样您就可以import模块了。

代码语言:javascript
复制
unutar = [(-250, 100), (-150, 100), (-50, 100), (50, 100), (150, 100), (-250, 0), (-150, 0), (-50, 0), (50, 0), (150, 0), (-250, -100), (-150, -100), (-50, -100), (50, -100), (150, -100), (-250, -200), (-150, -200), (-50, -200), (50, -200), (150, -200)]

这是一个很长的列表,也许可以用列表理解生成。

你是给程序的所有信息,以绘制自己的图像,这是相当耗时和很难改变。

为正确的工作使用正确的工具

Pygame支持sprite (图像的一个高级术语)加载,因此您可以拥有一个资源文件夹,其中包含您想要绘制的对象的所有图像,您可以随时更改它们。

当您修复了所有更严重的问题时,请修复PEP8告诉您修复的内容。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/70731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档