FormulaT - Pitboss
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
VERSION
$Id: FormulaT-pitboss.nlogo 44496 2009-09-27 21:09:30Z nholbert $
WHAT IS IT?
FormulaT Racing is a NetLogo racing simulation designed to move the playerÕs qualitative understanding of velocity and acceleration beyond early intuitive interpretations. The game design is based on qualitative research data of kids playing racing games and highlights important design components uncovered in these interviews and observation sessions. The design components themselves are subtle alterations of typical commercial game designs that should nudge the player to connect intuitive interpretations to more formally acceptable explanations.
HOW TO USE IT
This model in FormulaT takes racing in a very different direction. Here the player will step into the shoes of the pitboss and do their best to help the player car reach the finish line. The player has two main options: they can create a graph to dictate the speed and velocity to the player car, or they can "paint the track." Their choice is determined by the DATA-SOURCE chooser.
Before doing anything else, the player should decide which track they are going to race on by selecting the track in the CHOOSE-TRACK chooser, and then choose how they will direct their car in the DATA-SOURCE chooser--either "Graph" or "Paint." Then press the SETUP button.
Because this track presents a very different challenge you may find your first graph or track painting doesn't work. Keep trying! Think of each crash as a learning opportunity!
Driving by graph:
If you choose to drive using a graph as a data source, your must first create a graph in the FormulaT-graphing model. If you've already done this, once you choose your track and press SETUP, simply press the LOAD DATA button, select the .txt file that contains your graph data, click "Open" and then click "OK" when you see the "File Loading Complete" dialogue. Your graph data is now loaded and you're ready to race!
If you haven't yet created a graph, press the "Graph Tool" button to go to the FormulaT-graphing model.
Driving by paint:
If you choose to drive by paint, you have an addition choice to make. Do you want your paint job to tell the car how to accelerate, or do you want the paint to tell the car what it's top speed should be? Make your choice using the PAINT-SETS chooser.
After pressing SETUP to create the track, press the PATCH-DRAW button to begin painting. Select your BRUSH-SIZE using the slider and your SPEED-COLOR using the chooser. Notice the "scale" below that explains what each color means. When you're ready to paint simply move your mouse over the track and click to paint! If you need to change a section you've already painted, simply paint over it with a different color (or choose "Black" to "erase"). If you've made too many mistakes, or you decide to drive by graph, feel free to press the CLEAR PAINT button to reload the original track.
---Buttons and Controls---
Buttons:
- SETUP is usually the first button to press. This sets up the track and gives the player model goals.
- GO starts the race!
- LOAD DATA loads data from a .txt file created in the FormulaT-graphing model for driving by graph.
- RESET CAR resets the car to the starting line without completely wiping the track and marker turtle's data. Very useful if you've crashed and you want to make a small change before trying again.
- NEXT TRACK automatically opens the next model in the game.
- PATCH-DRAW click to allow the user to paint on the track using their mouse
- CLEAR PAINT reloads the original track
- EXPORT VIEW press to save the view as an image file (be sure to add .png to the end of your file name)
Switches:
- FULL-GRAPH? when "On" turns on "autoplot" for the graph, when "Off" sets the graph to scroll with the most recent data
Sliders:
- BRUSH-SIZE sets the brush size when painting the track
Monitors:
- CAR-STATS plots the player car's speed
- TIMER a constant timer that resets when you press the GO button
- LAST-TIME shows the time of your most recent run
- BEST-TIME shows the time of your best run
Choosers:
- CHOOSE-TRACK choose the track to race on!
- DATA-SOURCE choose whether you'll use a graph or paint to determine your car's velocity and acceleration.
- PAINT-SETS choose whether the color of the track determines how the car accelerates or the car's max-speed.
- SPEED-COLOR choose the color of your "paint brush" (notice the scale below the chooser when painting!)
THINGS TO NOTICE
Take a look at the plot after the race. Does the plot look like what you expected? Can you explain the high and low points? If you're having trouble finishing a race use the information from the plot to help you understand what you may be doing wrong.
Notice anything strange about the plot behavior when you're painting the max-speed. Why does the graph look like this? How does this effect your painting choices?
If you're driving by graph, compare the race plot to the graph you made in the graphing model. Do they look the same? How are they different? Can you explain why it is different in certain points?
If you're crashing a lot when driving by paint, consider adjusting your speed earlier. The speed the car is going at each marker greatly impacts the path it will take later on.
THINGS TO TRY
There are an infinite number of ways to "win" a race, however, some methods are faster than others. If you find a method that works (allows you to complete the track) try tweaking your method until you get the fast time possible!
Try all three methods of control: graphing, painting max-speed, and painting acceleration. You'll find that they each require you to think about motion very differently.
Feel free to "look under the hood" and play in the procedure's tab. Remove the crashing procedure, add or subtract from the slide variable, change the painting colors, or add competition cars to race against!
EXTENDING THE MODEL
Add new maps by creating a new image of a race track.
Try changing the equations governing your car and the competition's movement.
Add more competition or alter the way the competition drives around the track.
Add a timer to change the goal of the game to be about beating your best time.
RELATED MODELS
FormulaT models are all labeled with FormulaT at the beginning. The following all belong to the FormulaT racing simulation:
FormulaT - pass
FormulaT - constantacc
FormulaT - matchvelocity
FormulaT - passthenmatch
FormulaT - finishsolo
FormulaT - competition
FormulaT - editable
FormulaT - graphing
FormulaT - pitboss
Also try out the RaceTrack model created by Seth Tissue.
CREDITS AND REFERENCES
Created by Nathan R. Holbert 6/6/09
Comments and Questions
extensions [ sound ] globals [ speed-out speed-out2 slide best-time last-time previous-heading velocity-data car-ahead next-turtle ] turtles-own [ speed speed-other max-speed ring-done? square-done? hard-done? vel-data acc-data min-speed sound-flag? old-heading ] breed [ player-cars player-car ] breed [ other-cars other-car ] ;;;;;;;;;;;;;;;;;;;;;; ;; Setup procedures ;; ;;;;;;;;;;;;;;;;;;;;;; to setup clear-all reset-timer set-up-track make-cars speed-legend create-markers user-message "Ok kid now lets see if you've got what it takes to be a pitboss! You have two main options, you can drive by paint, or drive by graph. If you choose to paint, choose whether you're painting velocity or acceleration. If you're going to drive by graphing, be sure to make a velocity graph in the FormulaT-graphing model. Good luck! " end to make-cars create-player-cars 1 [ ;; set up the player's car set size 20 set shape "car" set heading 0 set color blue set xcor max-pxcor * 0.85 set ycor 6 set speed 0 set max-speed 12 set sound-flag? false ] end to set-up-track if Choose-Track = "Ring" [ ;; load maps import-pcolors "ringtrack.png" ] if Choose-Track = "Square" [ import-pcolors "squaretrack.png" ] if Choose-Track = "Hard" [ import-pcolors "hardtrack.png" ] ask patches with [ pcolor = 0.3 ] [ ;; tweak patch colors so they're easier to identify (may not be necessary) set pcolor black ] ask patches with [ pcolor = 64.4 ] [ set pcolor green ] ask patches with [pxcor > 200 and abs pycor <= 5 and pcolor = black] [ ;; make finishing line set pcolor yellow ] end to load-data ;; Loads data from previously made .txt file let file user-file ;; user chooses file from a pop up window if ( file != false ) [ set velocity-data [] ;; creates a list and dumps the graphing data into the list file-open file while [ not file-at-end? ] [ set velocity-data sentence velocity-data (list (list file-read file-read file-read)) ] user-message "File loading complete!" file-close ] end to train-turtles ;; takes the data from the list we just created and sets turtle variables ifelse ( is-list? velocity-data ) [ foreach velocity-data [ ask turtle first ? [ set vel-data item 1 ? set acc-data last ? ] ] ] ;; [ # (turtle who) # (vel-data) # (acc-data) ]...find the turtle then set the variables [ user-message "You need to load in patch data first!" ] end to speed-legend ifelse paint-sets = "Max-Speed" [ output-print " Max-Speed" output-print "Violet 1" output-print "Blue 2" output-print "Cyan 3" output-print "Orange 4" output-print "Red 5" output-print "Black Max" ] [ output-print " Acceleration" output-print "Violet -0.07" output-print "Blue -0.05" output-print "Cyan -0.03" output-print "Orange +0.03" output-print "Red +0.05" output-print "Black 0" ] end ;;;;;;;;;;;;;;;;;;; ;; go procedures ;; ;;;;;;;;;;;;;;;;;;; to go ask turtle 0 [ ;; reset timer at the beginning of the race if speed = 0 [ reset-timer ] ] if time-limit? = true [ ask turtle 0 [ ;; reset timer at the beginning of the race if speed = 0 [ reset-timer ] if Choose-Track = "Ring" [ ;; sets an effective time limit for races depending on the track if timer > 6 ;; this is done to encourage the player to get around the track at the highest speed possible [ set speed 0 set shape "x" user-message "You took too long! Try again letting the car get a bit faster this time! Press 'Halt' and 'Reset Car'." ] ] if Choose-Track = "Square" [ if timer > 5 [ set speed 0 set shape "x" user-message "You took too long! Try again letting the car get a bit faster this time! Press 'Halt' and 'Reset Car'." ] ] if Choose-Track = "Hard" [ if timer > 7 [ set speed 0 set shape "x" user-message "You took too long! Try again letting the car get a bit faster this time! Press 'Halt' and 'Reset Car'." ] ] ] ] if data-source = "Graph" ;; look at the chooser to see which data method to use [ drive-by-graph ] if data-source = "Paint" [ drive-by-color ] ask turtle 0 [ if any? patches in-cone 5 30 with [ pcolor = yellow ] ;; win if you cross the yellow line [ set speed 0 set last-time timer ;; set up last-time and best-times if best-time = 0 or last-time < best-time [ set best-time last-time ] set shape "face happy" if choose-track = "Ring" ;; a flag that gets set when the player finishes each track [ set ring-done? true ] if choose-track = "Square" [ set square-done? true ] if choose-track = "Hard" [ set hard-done? true ] ] if shape = "face happy" ;; checks to see how many tracks you've finished [ ifelse Ring-done? = true ;; player has to finish all tracks to move on [ ifelse Square-done? = true [ ifelse Hard-done? = true [ sound:play-sound "win.wav" user-message "You completed all the tracks! There are no more challenges! You are the FormulaT Champion!" ] [ user-message "You completed this track! Press 'Halt' choose a new track, then press 'Reset Track' to attempt the next track!"] ] [ user-message "You completed this track! Press 'Halt' choose a new track, then press 'Reset Track' to attempt the next track!"] ] [ user-message "You completed this track! Press 'Halt' choose a new track, then press 'Reset Track' to attempt the next track!"] ] ] ask player-cars [ if [pcolor] of patch-ahead 1 = green ;; if the pach ahead is grass, report a crash [ set speed 0 set shape "x" if sound-flag? = false [ sound:play-sound "crashed.wav" set sound-flag? true ] user-message "You crashed! Press 'halt' then 'Next Track' to try again!" ] set slide speed * 1.5 ;; slide increases as speed increases (this number may still need adjusting) ] end ;;;;;;;;;;;;;;;;;;;;;; ;; DRIVE BY GRAPH ;; If the player chooses this option they will be using the loaded graph data to determine the vehicle's speed and acceleration ;;;;;;;;;;;;;;;;;;;;;; to drive-by-graph ask player-car 0 [ let acc-factor 0.03 ;; uses a variable for acceleration so it can be easily tweaked if next-turtle = 0 [ ;; sets next-turtle variable to 1 set next-turtle 1 ] if distance turtle next-turtle > 50 and next-turtle = 1 ;; if no turtle in range, gradually speed up (so the car doesn't get stuck in the beginning) [ set speed speed + acc-factor face turtle next-turtle fd speed ] if distance turtle next-turtle < 50 ;; checks to see if "next-turtle" is in range [ set vel-data [vel-data] of turtle next-turtle ;; sets vel-data & acc-data of player-car to the data in the marker turtle set acc-data [acc-data] of turtle next-turtle if speed < vel-data [ set max-speed vel-data ] ;; sets max-speed to the vel-data if going slower than data if speed > vel-data [ set min-speed vel-data ] ;; sets min-speed to the vel-data if going faster than data if speed != vel-data ;; if the player-car isn't going the correct speed according to the graph [ set speed speed + (acc-data * acc-factor) ] ;; adjusts speed using the acc-data (multiplied by the acc-factor for tweaking purposes) if speed = vel-data [ set speed vel-data ] ifelse turtle (next-turtle + 1) = nobody ;; looks for the last marker-turtle, if we're on it [ set next-turtle 1 face turtle next-turtle ;; turn towards turtle 1 and adjust heading based on speed set heading (heading + (speed ^ 1.5) ) ] [ if distance turtle next-turtle < 25 [ ;; look ahead to see if next-turtle + 1 is getting close... set next-turtle (next-turtle + 1) ;; if it is, make that the new "next-turtle" set old-heading heading ;; saves this heading to use in the following procedures face turtle next-turtle ifelse (heading - old-heading) < 190 [ ;; check to make sure the car is making a slight turn if old-heading > heading [ ;; if it is and it's turning left set heading (heading + (speed ^ 1.5) ) ;; add to the heading a random value between 0 and speed squared ] if old-heading < heading [ ;; if it's turning right set heading (heading - (speed ^ 1.5) ) ;; subtract to the heading a random value between 0 and speed squared ] ] [ if old-heading > heading [ ;; if this is a big turn (greater than 190 degree turn) set heading (heading + (speed ^ 3) ) ;; do the same kind of stuff but make it a random value between 0 and speed to the fourth ] if old-heading < heading [ set heading (heading - (speed ^ 3) ) ] ] fd speed ] ] ] if speed > max-speed [ ;; keeps the car from going above max-speed set speed speed - acc-factor ] if speed < min-speed [ ;; keeps the car from going below the min-speed set speed min-speed ] if speed != vel-data [ set speed speed + (acc-data * acc-factor) ] if speed < 0 [ ;; keeps speed from going negative (probably don't need anymore...) set speed 0 ] fd speed ] colortrail tick do-plots end ;;;;;;;;;;;;;;;;;;;;;; ;; DRIVE BY COLOR ;; ;;;;;;;;;;;;;;;;;;;;;; to drive-by-color ask player-car 0 [ if paint-sets = "Acceleration" ;; if paint-acceleration? switch is true, paint changes the car's rate of deceleration [ if [pcolor] of patch-here = violet [ set speed speed - 0.07 ] if [pcolor] of patch-here = blue [ set speed speed - 0.05 ] if [pcolor] of patch-here = cyan [ set speed speed - 0.03 ] if [pcolor] of patch-here = orange [ set speed speed + 0.03 ] if [pcolor] of patch-here = red [ set speed speed + 0.05 ] ] if paint-sets = "Max-Speed" [ if [pcolor] of patch-here = violet ;; if paint-acceleration? switch is false, paint changes the car's max speed [ set max-speed 1 ] if [pcolor] of patch-here = blue [ set max-speed 2 ] if [pcolor] of patch-here = cyan [ set max-speed 3 ] if [pcolor] of patch-here = orange [ set max-speed 4 ] if [pcolor] of patch-here = red [ set max-speed 5 ] if [pcolor] of patch-here = black [ set max-speed 20 ] set speed speed + 0.03 ;; gradually speeds up ] if ( speed - max-speed ) >= 3 ;; crashes if the player tries to lower the max-speed too quickly (only happens when painting max-speed) [ set speed 0 set shape "face sad" user-message "You can't slow down that fast! Press 'Halt' then 'Next Track' to try again!" ] if speed > max-speed [ ;; keeps the car from going above max-speed set speed speed - 0.1 ] if speed < 0 [ ;; keeps speed from going negative set speed 0 ] if next-turtle = 0 [ ;; sets next-turtle variable to 1 set next-turtle 1 ] if distance turtle next-turtle > 50 and next-turtle = 1 ;; if no turtle in range, gradually speed up (so the car doesn't get stuck in the beginning) [ face turtle next-turtle fd speed ] if distance turtle next-turtle < 60 ;; checks to see if "next-turtle" is in range [ fd speed ifelse turtle (next-turtle + 1) = nobody ;; looks for the last marker-turtle, if we're on it [ set next-turtle 1 face turtle next-turtle ;; turn towards turtle 1 and adjust heading based on speed set heading (heading + (speed ^ 1.5) ) ] [ if distance turtle next-turtle < 25 [ ;; look ahead to see if next-turtle + 1 is getting close... set next-turtle (next-turtle + 1) ;; if it is, make that the new "next-turtle" set old-heading heading ;; saves this heading to use in the following procedures face turtle next-turtle ifelse (heading - old-heading) < 190 [ ;; check to make sure the car is making a slight turn if old-heading > heading [ ;; if it is and it's turning left set heading (heading + (speed ^ 1.5) ) ;; add to the heading a random value between 0 and speed squared ] if old-heading < heading [ ;; if it's turning right set heading (heading - (speed ^ 1.5) ) ;; subtract to the heading a random value between 0 and speed squared ] ] [ if old-heading > heading [ ;; if this is a big turn (greater than 190 degree turn) set heading (heading + (speed ^ 3) ) ;; do the same kind of stuff but make it a random value between 0 and speed to the fourth ] if old-heading < heading [ set heading (heading - (speed ^ 3) ) ] ] fd speed ] ;; set next-turtle (next-turtle + 1) ;; set old-heading heading ;; face turtle next-turtle ] ] fd speed ] tick do-plots end to do-plots set-current-plot "Car-Stats" set-current-plot-pen "velocity" plot [speed] of player-car 0 ;; plot the velocity of your car ask player-car 0 [ ;; pen color based on speed of car if speed <= 1 [ set-plot-pen-color 115 ] if ( speed > 1 and speed <= 2 ) [ set-plot-pen-color 105 ] if ( speed > 2 and speed <= 3 ) [ set-plot-pen-color 85 ] if ( speed > 3 and speed <= 4 ) [ set-plot-pen-color 25 ] if ( speed > 4 and speed <= 5 ) [ set-plot-pen-color 15 ] if speed > 5 [ set-plot-pen-color 0 ]] if graph-mode = "Scrolling Graph" [ if ticks > 50 ;; creates a rolling plot if full-graph? is turned off [ set-plot-x-range (ticks - 50) ticks ] ] end ;;;;;;;;;;;;;;;;;;;;; ;; button commands ;; ;;;;;;;;;;;;;;;;;;;;; to patch-draw if mouse-down? ;; reports true or false to indicate whether mouse button is down [ if speed-color = "Violet" [ ;; sets color based on chooser ask patch mouse-xcor mouse-ycor ;; paints at location of mouse [ ask patches in-radius 20 ;; size of painted area based on slider [ if pcolor != green and pcolor != yellow ;; doesn't paint over grass [ set pcolor violet ] ] ] ] if speed-color = "Blue" [ ask patch mouse-xcor mouse-ycor [ ask patches in-radius 20 [ if pcolor != green and pcolor != yellow [ set pcolor blue ] ] ] ] if speed-color = "Cyan" [ ask patch mouse-xcor mouse-ycor [ ask patches in-radius 20 [ if pcolor != green and pcolor != yellow [ set pcolor cyan ] ] ] ] if speed-color = "Orange" [ ask patch mouse-xcor mouse-ycor [ ask patches in-radius 20 [ if pcolor != green and pcolor != yellow [ set pcolor orange ] ] ] ] if speed-color = "Red" [ ask patch mouse-xcor mouse-ycor [ ask patches in-radius 20 [ if pcolor != green and pcolor != yellow [ set pcolor red ] ] ] ] if speed-color = "Black" [ ask patch mouse-xcor mouse-ycor [ ask patches in-radius 20 [ if pcolor != green and pcolor != yellow [ set pcolor black ] ] ] ] ] end to reset-track ;; resets track without reseting flags clear-all-plots set-up-track ask player-car 0 [ set size 20 set shape "car" set heading 0 set color blue set xcor max-pxcor * 0.85 set ycor 6 set speed 0 ] end to save-track-image let file user-new-file if ( file != false ) [ if file-exists? file [ ;; overwrites files of the same name file-delete file ] export-view file ] end to next-race run "__magic-open \\"FormulaT-graphing\\"" ;; should open the next race... end ;;;;;;;;;;;;;;;;;;;;;; ;; COLOR TRAIL CODE ;; Leaves a trail of color behind the player car that corresponds to the vehicle's velocity ;;;;;;;;;;;;;;;;;;;;;; to colortrail ask player-car 0 [ rt 180 if speed <= 1 [ ask patches in-cone 6 120 [ set pcolor violet ] ] if speed <= 2 and speed > 1 [ ask patches in-cone 6 120 [ set pcolor blue ] ] if speed <= 3 and speed > 2 [ ask patches in-cone 6 120 [ set pcolor cyan ] ] if speed <= 4 and speed > 3 [ ask patches in-cone 6 120 [ set pcolor orange ] ] if speed <= 5 and speed > 4 [ ask patches in-cone 6 120 [ set pcolor red ] ] if speed > 5 [ ask patches in-cone 6 120 [ set pcolor black ] ] rt 180 ] end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; MARKER MAKING AND MOVING PROCEDURE ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to create-markers ;; creates turtles to split up the track into 20 equal parts if Choose-Track = "Ring" or Choose-Track = "Square" [ set previous-heading 0 ;; sets to zero so the first turtle is in the correct spot repeat 3 [ crt 1 [ set heading 90 ;; tweaks heading so numbers start from starting line set size 5 set color black set label who ;; shows turtle number left previous-heading + 14 ;; sets up a recursion procedure so that turtles at different areas of the track adjust by different amounts set previous-heading previous-heading + 14 ] ] repeat 4 [ crt 1 [ set heading 90 set size 5 set color black set label who left previous-heading + 24 set previous-heading previous-heading + 24 ] ] repeat 6 [ crt 1 [ set heading 90 set size 5 set color black set label who left previous-heading + 14 set previous-heading previous-heading + 14 ] ] repeat 4 [ crt 1 [ set heading 90 set size 5 set color black set label who left previous-heading + 24 set previous-heading previous-heading + 24 ] ] repeat 3 [ crt 1 [ set heading 90 set size 5 set color black set label who left previous-heading + 14 set previous-heading previous-heading + 14 ] ] ask turtles with [ who > 0] [ repeat 300 [ ifelse ([pcolor] of patch-here = black or [pcolor] of patch-here = yellow) and ([pcolor] of patch-ahead 30 = green) ;; they need to be on black first, then close to the edge of the green [ stop ] ;; stop once they're in the correct spot [ fd 1 ] ] ] ] if Choose-Track = "Hard" [ crt 20 [ set size 5 set color black set label who ] ask turtle 1 [ setxy 282 84 ] ask turtle 2 [ setxy 229 153 ] ask turtle 3 [ setxy 121 161 ] ask turtle 4 [ setxy 27 127 ] ask turtle 5 [ setxy -78 155 ] ask turtle 6 [ setxy -279 121 ] ask turtle 7 [ setxy -288 -10 ] ask turtle 8 [ setxy -286 -134 ] ask turtle 9 [ setxy -237 -139 ] ask turtle 10 [ setxy -170 -20 ] ask turtle 11 [ setxy -181 36 ] ask turtle 12 [ setxy -154 85 ] ask turtle 13 [ setxy -84 56 ] ask turtle 14 [ setxy -3 -39 ] ask turtle 15 [ setxy -79 -141 ] ask turtle 16 [ setxy -14 -160 ] ask turtle 17 [ setxy 33 -121 ] ask turtle 18 [ setxy 202 -165 ] ask turtle 19 [ setxy 280 -73 ] ask turtle 20 [ setxy 283 0 ] ] end
There is only one version of this model, created over 14 years ago by Uri Wilensky.
Attached files
No files
This model does not have any ancestors.
This model does not have any descendants.