Posts: 1,145
Threads: 114
Joined: Sep 2019
May-05-2022, 07:10 PM
(This post was last modified: May-05-2022, 07:20 PM by menator01.)
13 lines. I really not like lines being over 80 - 100 characters but, it works
from turtle import Turtle, Screen, colormode
from random import randint
class Turtles(Turtle):
def __init__(self):
super().__init__()
self.speed('fastest'), self.shapesize(5), colormode(255), Screen(), Screen().onclick(self.click), self.ondrag(self.draw), Screen().onkey(self.colors, 'c'), Screen().listen(), Screen().mainloop()
def colors(self):
self.color((randint(0, 255), randint(0, 255), randint(0, 255)))
def click(self, x, y):
self.penup(), self.goto(x,y), self.pendown()
def draw(self, x, y):
self.ondrag(None), self.goto(x, y), self.ondrag(self.draw, btn=1)
Turtles()
Posts: 1,145
Threads: 114
Joined: Sep 2019
One more. Change background color with button click in tkinter.
import tkinter as tk
from random import randint
def rgb(label):
color = tuple(randint(0, 255) for i in range(3))
label['bg'] = f'#%02x%02x%02x' % color
root = tk.Tk()
label = tk.Label(root, width=50, height=20, relief='groove')
label.pack(padx=5, pady=4)
button = tk.Button(root, text='change color', command=lambda:rgb(label)).pack(expand=True, fill='both', padx=5, pady=4)
root.mainloop()
Posts: 23
Threads: 2
Joined: May 2022
(May-06-2022, 07:33 PM)menator01 Wrote: One more.
All right Menator01, I've got one for you. Since you seem to like a challenge I off you this one. It is the classic turtle race example that I have expanded to show a practical use for arrays. Can you get this one down below 25 lines?
#Turtle race - An example of using all of the topics
#with an introduction to using lists
from turtle import *
from random import *
turtlecnt = 10 #number of turtles in the race
linetop = turtlecnt * 30 / 2 #location of top line
linebottom = 0 - linetop - 30 #location of bottom line
hideturtle() #setup the screen
penup()
speed("fastest")
goto(-200,linetop)
pendown()
goto(-200,linebottom)
penup()
goto(200,linetop)
pendown()
goto(200,linebottom)
racers = [] #a list to hold our turtles
for i in range(0,turtlecnt): #for each position in the list
newturtle = Turtle() #create the turtle
racers.append(newturtle) #add it to the turtle list
#a list of colors to randomly choose from
colors = ["yellow", "gold", "orange", "red", "maroon", "violet", "pink", "magenta",
"purple", "navy", "blue", "skyblue", "cyan", "turquoise", "lightgreen",
"green", "darkgreen", "chocolate", "brown", "gray", "black"]
#Setup the turtles
for i in range(0,turtlecnt): #for each turtle in the list
clrnum = randint(0,len(colors)-1) #choose a random color
racers[i].color(colors[clrnum]) #set the turtle to the color
colors.pop(clrnum) #remove the color from the list (avoid repeats)
racers[i].shapesize(2) #increase the turtles size
racers[i].penup() #no drawing during the race
racers[i].goto(-200, (i * 30) - (turtlecnt * 30 / 2)) #goto the starting line
racers[i].speed("fastest") #set the speed (same as 0)
#repeat until on of the turtles reaches the finish line
racing = True #the race is running
i = 0 #start at the first turtle
tracer(0) #do not automatically update window
while racing: #while the race is running
racerdist = randint(0,5) #choose a random distance to travel
racers[i].forward(racerdist) #for the current turtle, move the random distance
if racers[i].xcor() >= 200: #check if that move won the race
racing = False #the race is over
winpos = i #this turtle won
i = i + 1 #setting up for the next turtle
if i >= turtlecnt: #have we reached the end of the turtle list?
i = 0 #yes? wrap to the beginning
update() #manually update the window (needed when tracer is 0)
penup() #relocate the default turtle
goto(-200,racers[winpos].ycor()) #display the winner
write("The winner is turtle " + str(winpos),font=("",25,""))
Posts: 23
Threads: 2
Joined: May 2022
And here is another offering of my own -- I took the random maze idea from youTube's 8-bit guy and combined it with a random maze idea of my own. I had to do a little research as I've never had a reason to use the single line if/else before (as a teacher, readability is important).
from random import randint
if randint(0,1) == 0:
cnt = 0
while True:
str = "/" if randint(0,1) == 0 else "\\"
print(str,end="")
cnt = cnt + 1
if cnt % 80 == 0: print()
else:
flag = 0
rooms = 30
while True:
flag = 1 if flag == 0 else 0
print("|",end="")
for i in range(0,rooms):
wall = randint(0,1)
if flag == 0:
str = "--+" if wall == 0 else " +"
else:
str = " |" if wall == 0 or i == rooms - 1 else " "
print(str,end="")
print("")
Posts: 26
Threads: 1
Joined: Mar 2022
(May-09-2022, 12:17 PM)codingCat Wrote: And here is another offering of my own -- I took the random maze idea from youTube's 8-bit guy and combined it with a random maze idea of my own. I had to do a little research as I've never had a reason to use the single line if/else before (as a teacher, readability is important).
from random import randint
if randint(0,1) == 0:
cnt = 0
while True:
str = "/" if randint(0,1) == 0 else "\\"
print(str,end="")
cnt = cnt + 1
if cnt % 80 == 0: print()
else:
flag = 0
rooms = 30
while True:
flag = 1 if flag == 0 else 0
print("|",end="")
for i in range(0,rooms):
wall = randint(0,1)
if flag == 0:
str = "--+" if wall == 0 else " +"
else:
str = " |" if wall == 0 or i == rooms - 1 else " "
print(str,end="")
print("")
Hello,
from random import randint
if randint(0,1) == 0:
while True:
for cnt in range(1, 81):
print("/" if randint(0,1) == 0 else "\\", end="" if cnt != 80 else "\n")
flag = 0
while True:
flag = 1 if flag == 0 else 0
print("|",end="")
for i in range(0,rooms:=30):
wall = randint(0,1)
if flag == 0:
print("--+" if wall == 0 else " +", end="" if i !=29 else "\n")
else:
print(" |" if wall == 0 or i == rooms - 1 else " ", end="" if i!=29 else "\n")
I speak Python but I don't speak English (I just read it a little). If I express myself badly, please blame the translator^^.
Posts: 23
Threads: 2
Joined: May 2022
(May-09-2022, 01:11 PM)Coricoco_fr Wrote: from random import randint
for cnt in range(1, 81):
print("/" if randint(0,1) == 0 else "\\", end="" if cnt != 80 else "\n")
for i in range(0,rooms:=30):
wall = randint(0,1)
if flag == 0:
print("--+" if wall == 0 else " +", end="" if i !=29 else "\n")
else:
print(" |" if wall == 0 or i == rooms - 1 else " ", end="" if i!=29 else "\n")
Wow, those for loops hurt my brain.
Posts: 1,145
Threads: 114
Joined: Sep 2019
May-09-2022, 06:04 PM
(This post was last modified: May-09-2022, 07:01 PM by menator01.)
If you remove comments and spacing, got it to 31 lines.
from random import choice, randint
from turtle import Turtle, write, goto, penup, pendown, speed, hideturtle
from time import sleep
# List of 10 colors
colors = ['yellow', 'orange', 'red', 'pink', 'purple', 'blue', 'green', 'brown', 'gray', 'black']
# Hide the turtle and draw the start and finish line
hideturtle(), speed('fastest')
penup(), goto(-200, 10*30/2), pendown(), goto(-200, 0-270)
penup(), goto(200, 10*30/2), pendown(), goto(200, 0-270)
class MyTurtle(Turtle):
'''Create turtle objects and set properties'''
def __init__(self, pos):
super().__init__()
color = colors.pop(randint(0, len(colors)-1)) if colors else None
self.color(color), self.shapesize(2)
self.penup()
self.goto(-200, (pos*30) - (10*30/2))
# Create a list of turtle objects
turtles = list(MyTurtle(i-2.5) for i in range(1, 11))
# Set a variable for accessing turtle objects
i = 0
# Setup a while loop
racing = True
while racing:
# Create a random distance to travel and icrease i
turtles[i := (i + 1) % len(turtles)].forward(randint(0, 5))
# Track movement of turtle object in list
# First to line wins goes to home and writes winner
# Sleep for five seconds to see the winner
if turtles[i].xcor() >= 200:
winner = turtles[i]
winner.write(f'winner: turtle {i+1}', font=('system', 25, 'bold'))
sleep(5)
racing = False
Updated code. Now 25 lines without spaces and comments
Posts: 4,804
Threads: 77
Joined: Jan 2018
May-09-2022, 06:30 PM
(This post was last modified: May-09-2022, 06:32 PM by Gribouillis.)
@ menator01 You can remove line 36 if you replace line 37 with
i = (i + 1) % len(turtles)
Posts: 23
Threads: 2
Joined: May 2022
(May-09-2022, 06:04 PM)menator01 Wrote: If you remove comments and spacing, got it to 31 lines.
hideturtle(), speed('fastest')
penup(), goto(-200, 10*30/2), pendown(), goto(-200, 0-270)
penup(), goto(200, 10*30/2), pendown(), goto(200, 0-270)
There is another technique that is new to me... can you explain the comma separator between the commands? Does python let you separate commands with a comma the way MS BASIC did with the colon, or is there a special case I am missing?
Posts: 1,145
Threads: 114
Joined: Sep 2019
Thanks Gribouillis. 30 lines now
|