tubeCoding
Python
Java demo
한국어(ko)
English(en)
한국어(ko)
로그인
회원가입
새 파일
CSV 파일 추가
파일 이름
취소
파일 생성
코드 실행
해당 파일은 텍스트 편집기에서 표시할 수 없습니다.
콘솔 출력
[{"type": "TextFile", "filename": "main.py", "content": "import turtle\r\nimport random\r\nimport math\r\nimport time\r\n# \uc124\uc815\uac12\r\nHEIGHT = 10\r\nWIDTH = 20\r\nCELL_SIZE = 30\r\nPLAYER_COLOR = 'blue'\r\nLANE_COLOR = 'black'\r\nBG_COLOR = 'white'\r\nONCOMING_CAR_COLOR = 'red'\r\nSAFE_DISTANCE = 80\r\n# \ub3c4\ub85c \uacbd\uacc4\r\nROAD_LEFT = -WIDTH // 2 * CELL_SIZE\r\nROAD_RIGHT = (WIDTH // 2 - 1) * CELL_SIZE\r\nROAD_CENTER = 0\r\n# turtle \uc138\ud305\r\nscreen = turtle.Screen()\r\nscreen.setup(width=WIDTH * CELL_SIZE + 40, height=HEIGHT * CELL_SIZE + 40)\r\nscreen.bgcolor(BG_COLOR)\r\nscreen.title(\"\uc790\uc728\uc8fc\ud589 \ub808\ubca8 1: ACC\")\r\nscreen.tracer(0)\r\n# \ucc28\uc120 \uadf8\ub9ac\uae30\uc6a9 turtle\r\nlane = turtle.Turtle()\r\nlane.hideturtle()\r\nlane.penup()\r\nlane.pensize(3)\r\nlane.color(LANE_COLOR)\r\n# \ud50c\ub808\uc774\uc5b4 \ucc28\ub7c9 \uc0dd\uc131\r\nplayer_car = turtle.Turtle()\r\nplayer_car.shape(\"square\")\r\nplayer_car.shapesize(stretch_wid=3, stretch_len=2)\r\nplayer_car.color(PLAYER_COLOR)\r\nplayer_car.penup()\r\nplayer_car.goto(0, -HEIGHT // 2 * CELL_SIZE + CELL_SIZE // 2)\r\nplayer_car.showturtle()\r\n# \uc0c1\ub300 \ucc28\ub7c9\ub4e4\uc744 \uc800\uc7a5\ud560 \ub9ac\uc2a4\ud2b8\r\noncoming_cars = []\r\n# \ucc28\ub7c9 \uc0dd\uc131 \ud0c0\uc774\uba38 \ubc0f \uc81c\ud55c \uc124\uc815\r\ncar_spawn_timer = 0\r\ncar_spawn_interval = 100\r\nmax_cars = 2\r\n# \uc0c1\ub300 \ucc28\ub7c9 \uc0dd\uc131 \ud568\uc218\r\ndef create_oncoming_car():\r\n car_obj = turtle.Turtle()\r\n car_obj.shape(\"square\")\r\n car_obj.shapesize(stretch_wid=3, stretch_len=2)\r\n car_obj.color(ONCOMING_CAR_COLOR)\r\n car_obj.penup()\r\n # \uc6b0\uce21 \ucc28\uc120\uc5d0\uc11c\ub9cc \ucc28\ub7c9 \uc0dd\uc131\r\n x = random.randint(int(ROAD_CENTER + CELL_SIZE), int(ROAD_RIGHT - CELL_SIZE))\r\n y = HEIGHT // 2 * CELL_SIZE + 50\r\n car_obj.goto(x, y)\r\n car_obj.showturtle()\r\n car_obj.speed = 2\r\n car_obj.is_stopped = False\r\n car_obj.original_color = ONCOMING_CAR_COLOR\r\n return car_obj\r\n# \ucd08\uae30 \uc0c1\ub300 \ucc28\ub7c9\ub4e4 \uc0dd\uc131\r\noncoming_cars = [create_oncoming_car()]\r\n# \ucc28\uc120 \uadf8\ub9ac\uae30 \ud568\uc218\r\ndef draw_lanes():\r\n lane.clear()\r\n # \uc88c\uce21 \ucc28\uc120\r\n lane.color(LANE_COLOR)\r\n lane.goto(ROAD_LEFT, HEIGHT // 2 * CELL_SIZE)\r\n lane.pendown()\r\n lane.goto(ROAD_LEFT, -HEIGHT // 2 * CELL_SIZE)\r\n lane.penup()\r\n # \uc911\uc559\uc120\r\n lane.color('orange')\r\n lane.goto(ROAD_CENTER, HEIGHT // 2 * CELL_SIZE)\r\n lane.pendown()\r\n lane.goto(ROAD_CENTER, -HEIGHT // 2 * CELL_SIZE)\r\n lane.penup()\r\n # \uc6b0\uce21 \ucc28\uc120\r\n lane.color(LANE_COLOR)\r\n lane.goto(ROAD_RIGHT, HEIGHT // 2 * CELL_SIZE)\r\n lane.pendown()\r\n lane.goto(ROAD_RIGHT, -HEIGHT // 2 * CELL_SIZE)\r\n lane.penup()\r\n# \uc548\uc804 \uac70\ub9ac \ud45c\uc2dc\uc6a9 turtle\r\nsafe_distance_indicator = turtle.Turtle()\r\nsafe_distance_indicator.hideturtle()\r\nsafe_distance_indicator.penup()\r\nsafe_distance_indicator.color('yellow')\r\nsafe_distance_indicator.pensize(2)\r\ndef draw_safe_distance():\r\n \"\"\"\ud50c\ub808\uc774\uc5b4 \ucc28\ub7c9 \uc55e\ub4a4\uc5d0 \uc548\uc804 \uac70\ub9ac \ud45c\uc2dc\"\"\"\r\n safe_distance_indicator.clear()\r\n px, py = player_car.xcor(), player_car.ycor()\r\n # \uc55e\ucabd \uc548\uc804 \uac70\ub9ac \ub77c\uc778 (\ube68\uac04\uc0c9)\r\n safe_distance_indicator.color('red')\r\n safe_distance_indicator.penup()\r\n safe_distance_indicator.goto(px - 20, py + SAFE_DISTANCE)\r\n safe_distance_indicator.pendown()\r\n safe_distance_indicator.goto(px + 20, py + SAFE_DISTANCE)\r\n # \ub4a4\ucabd \uc548\uc804 \uac70\ub9ac \ub77c\uc778 (\ub178\ub780\uc0c9)\r\n safe_distance_indicator.color('yellow')\r\n safe_distance_indicator.penup()\r\n safe_distance_indicator.goto(px - 20, py - SAFE_DISTANCE)\r\n safe_distance_indicator.pendown()\r\n safe_distance_indicator.goto(px + 20, py - SAFE_DISTANCE)\r\n# \uc0c8\ub85c\uc6b4 \ucda9\ub3cc \uace0\ub824 \ud568\uc218 - X\ucd95 \uc704\uce58\uc640 Y\ucd95 \uac70\ub9ac \uae30\ubc18\r\ndef should_car_stop(car):\r\n \"\"\"\ucc28\ub7c9\uc774 \uc815\uc9c0\ud574\uc57c \ud558\ub294\uc9c0 \ud310\ub2e8 (X\ucd95 \uc704\uce58\uc640 Y\ucd95 \uac70\ub9ac \uae30\ubc18)\"\"\"\r\n player_x = player_car.xcor()\r\n player_y = player_car.ycor()\r\n car_x = car.xcor()\r\n car_y = car.ycor()\r\n # X\ucd95: \uac19\uc740 \ucc28\uc120\uc5d0 \uc788\ub294\uc9c0 \ud655\uc778 (\ucc28\ub7c9 \ud3ed \uace0\ub824)\r\n car_width = 40 # stretch_len * 20\r\n x_overlap = abs(player_x - car_x) < car_width\r\n # Y\ucd95: \uc548\uc804 \uac70\ub9ac \ub0b4\uc5d0 \uc788\ub294\uc9c0 \ud655\uc778\r\n y_distance = abs(player_y - car_y)\r\n y_too_close = y_distance < SAFE_DISTANCE\r\n # \uac19\uc740 \ucc28\uc120\uc5d0 \uc788\uace0 \uc548\uc804 \uac70\ub9ac \ub0b4\uc5d0 \uc788\uc73c\uba74 \uc815\uc9c0\r\n return x_overlap and y_too_close\r\n# \uc0c1\ub300 \ucc28\ub7c9\ub4e4 \uc5c5\ub370\uc774\ud2b8 \ud568\uc218\r\ndef update_oncoming_cars():\r\n global oncoming_cars, car_spawn_timer\r\n # \ucc28\ub7c9 \uc0dd\uc131\r\n car_spawn_timer += 1\r\n active_cars = sum(1 for car in oncoming_cars if car.isvisible())\r\n if car_spawn_timer >= car_spawn_interval and active_cars < max_cars:\r\n oncoming_cars.append(create_oncoming_car())\r\n car_spawn_timer = 0\r\n # \uac01 \ucc28\ub7c9 \uc5c5\ub370\uc774\ud2b8\r\n for i, car in enumerate(oncoming_cars):\r\n if not car.isvisible():\r\n continue\r\n # \uc0c8\ub85c\uc6b4 \ucda9\ub3cc \uace0\ub824 \ud568\uc218 \uc0ac\uc6a9\r\n if should_car_stop(car):\r\n car.is_stopped = True\r\n car.color('orange')\r\n else:\r\n car.is_stopped = False\r\n car.color(car.original_color)\r\n # \uc774\ub3d9\r\n if not car.is_stopped:\r\n car.sety(car.ycor() - car.speed)\r\n # \ud654\uba74 \ubc16\uc73c\ub85c \ub098\uac00\uba74 \uc81c\uac70\r\n if car.ycor() < -HEIGHT // 2 * CELL_SIZE - 50:\r\n car.hideturtle()\r\n oncoming_cars.remove(car)\r\n break\r\n # \uc2e4\uc81c \ucda9\ub3cc \uac10\uc9c0 (\ucc28\ub7c9\uc774 \uacb9\uce58\ub294 \uacbd\uc6b0)\r\n player_x, player_y = player_car.xcor(), player_car.ycor()\r\n car_x, car_y = car.xcor(), car.ycor()\r\n x_collision = abs(player_x - car_x) < 30 # \ucc28\ub7c9 \ud3ed\uc758 \uc808\ubc18\r\n y_collision = abs(player_y - car_y) < 30 # \ucc28\ub7c9 \ub192\uc774\uc758 \uc808\ubc18\r\n if x_collision and y_collision:\r\n game_over()\r\n# \uac8c\uc784 \uc624\ubc84 \ud568\uc218\r\ndef game_over():\r\n game_over_text = turtle.Turtle()\r\n game_over_text.hideturtle()\r\n game_over_text.penup()\r\n game_over_text.color('red')\r\n game_over_text.goto(0, 0)\r\n game_over_text.write(\"Simulation is OVER!\", align=\"center\", font=(\"Arial\", 24, \"bold\"))\r\n screen.update()\r\n time.sleep(2)\r\n screen.bye()\r\n# \ud50c\ub808\uc774\uc5b4 \ucc28\ub7c9 \uc774\ub3d9 \ud568\uc218\ub4e4\r\ndef move_left():\r\n player_car.setx(player_car.xcor() - CELL_SIZE)\r\n update()\r\ndef move_right():\r\n player_car.setx(player_car.xcor() + CELL_SIZE)\r\n update()\r\n# \uc2e0\ud638\ub4f1 \uadf8\ub9ac\uae30 \ud568\uc218\r\ndef draw_signal():\r\n signal = turtle.Turtle()\r\n signal.hideturtle()\r\n signal.penup()\r\n radius = 15\r\n x = ROAD_RIGHT + 2 * radius\r\n y = HEIGHT // 2 * CELL_SIZE - 2 * radius\r\n signal.goto(x, y)\r\n signal.pendown()\r\n signal.fillcolor('green')\r\n signal.begin_fill()\r\n signal.circle(radius)\r\n signal.end_fill()\r\n signal.penup()\r\n# UI \uc815\ubcf4 \ud45c\uc2dc\r\ndef draw_ui():\r\n ui = turtle.Turtle()\r\n ui.hideturtle()\r\n ui.penup()\r\n ui.color('black')\r\n ui.goto(-WIDTH // 2 * CELL_SIZE, HEIGHT // 2 * CELL_SIZE + 20)\r\n active_cars = sum(1 for car in oncoming_cars if car.isvisible())\r\n ui.write(f\"\uc548\uc804\uac70\ub9ac: {SAFE_DISTANCE}px | \ud65c\uc131\ucc28\ub7c9: {active_cars}/{max_cars} | \uc870\uc791: \u2190 \u2192 | ESC: \uc885\ub8cc\", font=(\"Arial\", 12, \"normal\"))\r\n\r\n# \uc5c5\ub370\uc774\ud2b8 \ud568\uc218\r\ndef update():\r\n draw_lanes()\r\n draw_safe_distance()\r\n draw_signal()\r\n draw_ui()\r\n update_oncoming_cars()\r\n screen.update()\r\n\r\n# \uac8c\uc784 \uc885\ub8cc \ud568\uc218\r\ndef exit_game():\r\n screen.bye()\r\n\r\n# \uc790\ub3d9 \uc5c5\ub370\uc774\ud2b8 \ud568\uc218\r\ndef auto_update():\r\n update()\r\n screen.ontimer(auto_update, 50)\r\n\r\n# \ud0a4 \ubc14\uc778\ub529\r\nscreen.listen()\r\nscreen.onkeypress(move_left, \"Left\")\r\nscreen.onkeypress(move_right, \"Right\")\r\nscreen.onkeypress(exit_game, \"Escape\")\r\n\r\n# \ucd08\uae30 \ud654\uba74 \uadf8\ub9ac\uae30\r\ndraw_lanes()\r\ndraw_safe_distance()\r\ndraw_signal()\r\ndraw_ui()\r\n\r\n# \uc790\ub3d9 \uc5c5\ub370\uc774\ud2b8 \uc2dc\uc791\r\nauto_update()\r\nscreen.mainloop()", "locked": true}]