{"id":6242,"date":"2021-07-22T00:11:06","date_gmt":"2021-07-21T17:11:06","guid":{"rendered":"https:\/\/www.phidgets.com\/education\/?page_id=6242"},"modified":"2022-10-27T03:38:42","modified_gmt":"2022-10-26T20:38:42","slug":"pong","status":"publish","type":"page","link":"https:\/\/www.phidgets.com\/education\/learn\/projects\/pygame-zero-projects\/pong\/","title":{"rendered":"Pong"},"content":{"rendered":"<p>[et_pb_section bb_built=&#8221;1&#8243; specialty=&#8221;off&#8221; next_background_color=&#8221;#000000&#8243; _builder_version=&#8221;4.4.1&#8243; custom_padding=&#8221;||0px|&#8221; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;][et_pb_row _builder_version=&#8221;4.4.1&#8243; use_custom_gutter=&#8221;on&#8221; gutter_width=&#8221;3&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;][et_pb_column type=&#8221;1_2&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221;][et_pb_code admin_label=&#8221;Pong with Pygame Zero and Phidgets&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;]<\/p>\n<div class=\"ph-overline-text\"><!-- [et_pb_line_break_holder] -->    <a href=\"\/education\/learn\/projects\">Projects<\/a><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] --><\/p>\n<h1>Pong with Pygame Zero and Phidgets<\/h1>\n<p>[\/et_pb_code][et_pb_code admin_label=&#8221;Description&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;]<pee>Pygame Zero allows you to create simple games in Python. In this project, you will modify a Pong game to use the Slider Phidget!<\/pee>[\/et_pb_code][et_pb_code admin_label=&#8221;ph-button-cta: Start&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;]<a class=\"ph-button-cta\" href=\"#setup\"><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"ph-button-cta__icon\"><\/div>\n<p><!-- [et_pb_line_break_holder] -->  Start<!-- [et_pb_line_break_holder] --><\/a>[\/et_pb_code][\/et_pb_column][et_pb_column type=&#8221;1_2&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221;][et_pb_image _builder_version=&#8221;4.18.0&#8243; src=&#8221;https:\/\/www.phidgets.com\/education\/wp-content\/uploads\/2022\/10\/pong_title_center2.jpg&#8221; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; background_pattern_color=&#8221;rgba(0,0,0,0.2)&#8221; background_mask_color=&#8221;#ffffff&#8221; \/][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section bb_built=&#8221;1&#8243; specialty=&#8221;on&#8221; _builder_version=&#8221;4.4.1&#8243; use_custom_gutter=&#8221;on&#8221; gutter_width=&#8221;3&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; prev_background_color=&#8221;#000000&#8243;][et_pb_column type=&#8221;1_4&#8243;][et_pb_code admin_label=&#8221;ph-vertical-nav&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; saved_tabs=&#8221;all&#8221;]<\/p>\n<div class=\"ph-vertical-nav ph-vertical-sticky\"><!-- [et_pb_line_break_holder] -->  <a href=\"#prereq\" class=\"ph-vertical-nav-item\">Prerequisites<\/a><!-- [et_pb_line_break_holder] -->  <a href=\"#setup\" class=\"ph-vertical-nav-item\">Setup<\/a><!-- [et_pb_line_break_holder] -->  <a href=\"#install\" class=\"ph-vertical-nav-item\">Install<\/a><!-- [et_pb_line_break_holder] -->  <a href=\"#write-code\" class=\"ph-vertical-nav-item\">Write Code<\/a><!-- [et_pb_line_break_holder] -->  <a href=\"#review\" class=\"ph-vertical-nav-item\">Code Review<\/a><!-- [et_pb_line_break_holder] -->  <a href=\"#practice\" class=\"ph-vertical-nav-item\">Practice<\/a><!-- [et_pb_line_break_holder] --><\/div>\n<p>[\/et_pb_code][\/et_pb_column][et_pb_column type=&#8221;3_4&#8243; specialty_columns=&#8221;3&#8243;][et_pb_row_inner _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; module_id=&#8221;prereq&#8221;][et_pb_column_inner type=&#8221;4_4&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;Prerequisites&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; module_id=&#8221;setup&#8221;]<\/p>\n<h2>Prerequisites<\/h2>\n<p><!-- [et_pb_line_break_holder] --><pee>You should review the following before moving on:<\/pee><!-- [et_pb_line_break_holder] --><\/p>\n<ul><!-- [et_pb_line_break_holder] --><\/p>\n<li><a href=\"https:\/\/www.phidgets.com\/education\/learn\/projects\/pygame-zero-projects\/slider\/\" target=\"_blank\" rel=\"noopener noreferrer\">Slider Phidget with Pygame Zero.<\/a><\/li>\n<p><!-- [et_pb_line_break_holder] --><\/ul>\n<p>[\/et_pb_code][\/et_pb_column_inner][\/et_pb_row_inner][et_pb_row_inner _builder_version=&#8221;4.4.1&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; module_id=&#8221;setup&#8221;][et_pb_column_inner type=&#8221;4_4&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;Setup&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; module_id=&#8221;setup&#8221;]<\/p>\n<h2>Setup<\/h2>\n<p><!-- [et_pb_line_break_holder] --><pee>Before getting started, make sure you have the following parts.<\/pee>[\/et_pb_code][\/et_pb_column_inner][\/et_pb_row_inner][et_pb_row_inner _builder_version=&#8221;4.4.1&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; custom_padding=&#8221;||0px|&#8221;][et_pb_column_inner type=&#8221;1_3&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;Part: slider&#8221; _builder_version=&#8221;4.18.0&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; saved_tabs=&#8221;all&#8221; background_pattern_color=&#8221;rgba(0,0,0,0.2)&#8221; background_mask_color=&#8221;#ffffff&#8221;]<\/p>\n<div class=\"ph-part-card\"><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"ph-part-card__top\"><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"ph-part-card__type\"><!-- [et_pb_line_break_holder] -->      <\/p>\n<div class=\"ph-overline-text\"><!-- [et_pb_line_break_holder] -->        <a href=\"\">Sensors \/<\/a><!-- [et_pb_line_break_holder] -->        <a href=\"\">POT2001_0<\/a><!-- [et_pb_line_break_holder] -->      <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"ph-part-card__title\"><!-- [et_pb_line_break_holder] -->      <\/p>\n<h3>Slider Phidget<\/h3>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"ph-part-card__bottom\"><!-- [et_pb_line_break_holder] -->    <img decoding=\"async\" src=\"\/education\/wp-content\/uploads\/2022\/10\/sensor-slider-phidget2.png\"><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] --><\/div>\n<p>[\/et_pb_code][et_pb_code admin_label=&#8221;Part: usb cable&#8221; _builder_version=&#8221;4.4.1&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; saved_tabs=&#8221;all&#8221;]<\/p>\n<div class=\"ph-part-card\"><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"ph-part-card__top\"><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"ph-part-card__type\"><!-- [et_pb_line_break_holder] -->      <\/p>\n<div class=\"ph-overline-text\"><!-- [et_pb_line_break_holder] -->        <a href=\"\">Cables\/<\/a><!-- [et_pb_line_break_holder] -->        <a href=\"\">3018<\/a><!-- [et_pb_line_break_holder] -->      <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"ph-part-card__title\"><!-- [et_pb_line_break_holder] -->      <\/p>\n<h3>USB cable<\/h3>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"ph-part-card__bottom\"><!-- [et_pb_line_break_holder] -->    <img decoding=\"async\" src=\"\/education\/wp-content\/uploads\/2020\/04\/part-usb-cable.jpg\"><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] --><\/div>\n<p>[\/et_pb_code][\/et_pb_column_inner][et_pb_column_inner type=&#8221;1_3&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;Part: vint&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; saved_tabs=&#8221;all&#8221;]<\/p>\n<div class=\"ph-part-card\"><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"ph-part-card__top\"><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"ph-part-card__type\"><!-- [et_pb_line_break_holder] -->      <\/p>\n<div class=\"ph-overline-text\"><!-- [et_pb_line_break_holder] -->        <a href=\"\">Controllers \/<\/a><!-- [et_pb_line_break_holder] -->        <a href=\"\">hub0000<\/a><!-- [et_pb_line_break_holder] -->      <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"ph-part-card__title\"><!-- [et_pb_line_break_holder] -->      <\/p>\n<h3>VINT Hub<\/h3>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"ph-part-card__bottom\"><!-- [et_pb_line_break_holder] -->    <img decoding=\"async\" src=\"\/education\/wp-content\/uploads\/2020\/04\/part-vint.jpg\"><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] --><\/div>\n<p>[\/et_pb_code][\/et_pb_column_inner][et_pb_column_inner type=&#8221;1_3&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;Part: phidget cable&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; saved_tabs=&#8221;all&#8221;]<\/p>\n<div class=\"ph-part-card\"><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"ph-part-card__top\"><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"ph-part-card__type\"><!-- [et_pb_line_break_holder] -->      <\/p>\n<div class=\"ph-overline-text\"><!-- [et_pb_line_break_holder] -->        <a href=\"\">Cables\/<\/a><!-- [et_pb_line_break_holder] -->        <a href=\"\">3003<\/a><!-- [et_pb_line_break_holder] -->      <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"ph-part-card__title\"><!-- [et_pb_line_break_holder] -->      <\/p>\n<h3>Phidget cable<\/h3>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"ph-part-card__bottom\"><!-- [et_pb_line_break_holder] -->    <img decoding=\"async\" src=\"\/education\/wp-content\/uploads\/2020\/04\/part-phidget-cable.jpg\"><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] --><\/div>\n<p>[\/et_pb_code][\/et_pb_column_inner][\/et_pb_row_inner][et_pb_row_inner admin_label=&#8221;Row&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;][et_pb_column_inner type=&#8221;4_4&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][\/et_pb_column_inner][\/et_pb_row_inner][et_pb_row_inner admin_label=&#8221;Row&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; module_id=&#8221;install&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;][et_pb_column_inner type=&#8221;4_4&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;Install&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; module_id=&#8221;install&#8221;]<\/p>\n<h2>Install Pygame Zero<\/h2>\n<p><!-- [et_pb_line_break_holder] --><pee>In order to use Pygame Zero, you first have to install it. You do this in the same way you previously installed the Phidget22 library. Simply navigate to your package manager,  search for <strong>pgzero<\/strong> and press install!<\/pee>[\/et_pb_code][\/et_pb_column_inner][\/et_pb_row_inner][et_pb_row_inner admin_label=&#8221;Row&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; disabled=&#8221;off&#8221; disabled_on=&#8221;off|off|off&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;][et_pb_column_inner type=&#8221;1_2&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;Thonny&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;]<\/p>\n<h3>Thonny<\/h3>\n<p><!-- [et_pb_line_break_holder] --><pee>If you&#8217;re using Thonny, select Tools > Manage Packages and search for pgzero.<\/pee>[\/et_pb_code][\/et_pb_column_inner][et_pb_column_inner type=&#8221;1_2&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_image _builder_version=&#8221;4.6.6&#8243; src=&#8221;https:\/\/www.phidgets.com\/education\/wp-content\/uploads\/2021\/04\/pgzero_thonny.png&#8221; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; show_in_lightbox=&#8221;on&#8221; title_text=&#8221;Thonny&#8221; \/][\/et_pb_column_inner][\/et_pb_row_inner][et_pb_row_inner admin_label=&#8221;Row&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; disabled=&#8221;off&#8221; disabled_on=&#8221;off|off|off&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;][et_pb_column_inner type=&#8221;1_2&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;PyCharm&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;]<\/p>\n<h3>PyCharm<\/h3>\n<p><!-- [et_pb_line_break_holder] --><pee>If you&#8217;re using PyCharm, select File > Settings > Python Interpreter and use the <strong>+<\/strong> symbol to install pgzero.<\/pee>[\/et_pb_code][\/et_pb_column_inner][et_pb_column_inner type=&#8221;1_2&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_image _builder_version=&#8221;4.6.6&#8243; src=&#8221;https:\/\/www.phidgets.com\/education\/wp-content\/uploads\/2021\/04\/pgzero_pycharm.png&#8221; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; show_in_lightbox=&#8221;on&#8221; \/][\/et_pb_column_inner][\/et_pb_row_inner][et_pb_row_inner admin_label=&#8221;Row&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; disabled=&#8221;off&#8221; disabled_on=&#8221;off|off|off&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;][et_pb_column_inner type=&#8221;1_2&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;PyScripter&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;]<\/p>\n<h3>PyScripter<\/h3>\n<p><!-- [et_pb_line_break_holder] --><pee>If you&#8217;re using PyScripter, select Tools > Tools > Install Packages with pip and enter pgzero.<\/pee>[\/et_pb_code][\/et_pb_column_inner][et_pb_column_inner type=&#8221;1_2&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_image _builder_version=&#8221;4.6.6&#8243; src=&#8221;https:\/\/www.phidgets.com\/education\/wp-content\/uploads\/2021\/04\/pgzero_pyscripter.png&#8221; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; show_in_lightbox=&#8221;on&#8221; \/][\/et_pb_column_inner][\/et_pb_row_inner][et_pb_row_inner admin_label=&#8221;Row&#8221; disabled_on=&#8221;on|on|on&#8221; disabled=&#8221;on&#8221;][et_pb_column_inner type=&#8221;4_4&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221; (invisible anchor)&#8221; _builder_version=&#8221;4.4.1&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; module_id=&#8221;move&#8221; module_class=&#8221;ph-hidden-anchor&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; \/][\/et_pb_column_inner][\/et_pb_row_inner][et_pb_row_inner _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; module_id=&#8221;write-code&#8221;][et_pb_column_inner type=&#8221;4_4&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;Write code Python&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;]<\/p>\n<h2>Write code (Python)<\/h2>\n<p><!-- [et_pb_line_break_holder] --><pee>Copy the code below into your python script <i>pong.py<\/i>.<\/pee>[\/et_pb_code][et_pb_code admin_label=&#8221;Code Sample&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;]<!--Pong with Phidgets--><!-- [et_pb_line_break_holder] --><\/p>\n<pre class=\"language-python\"><!-- [et_pb_line_break_holder] -->  <code><!-- [et_pb_line_break_holder] -->#Add Phidgets Library<!-- [et_pb_line_break_holder] -->from Phidget22.Phidget import *<!-- [et_pb_line_break_holder] -->from Phidget22.Devices.VoltageRatioInput import *<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->import random<!-- [et_pb_line_break_holder] -->import pgzrun<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->WIDTH = 800<!-- [et_pb_line_break_holder] -->HEIGHT = 600<!-- [et_pb_line_break_holder] -->TITLE = 'Pong with Slider Phidget'<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --># a color used to draw things<!-- [et_pb_line_break_holder] -->MAIN_COLOR = 'yellow'<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --># width and height of a player paddle<!-- [et_pb_line_break_holder] -->PADDLE_WIDTH = 15<!-- [et_pb_line_break_holder] -->PADDLE_HEIGHT = 100<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --># radius of the tennis ball<!-- [et_pb_line_break_holder] -->TENNIS_BALL_RADIUS = 10<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->LEFT_PLAYER = \"left\"<!-- [et_pb_line_break_holder] -->RIGHT_PLAYER = \"right\"<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->class Paddle(Rect):<!-- [et_pb_line_break_holder] -->    \"\"\"<!-- [et_pb_line_break_holder] -->    Paddle represents one player on the screen.<!-- [et_pb_line_break_holder] -->    It is drawn like a long rectangle and positioned either left or<!-- [et_pb_line_break_holder] -->    right on the screen.<!-- [et_pb_line_break_holder] -->    Two helper methods move the paddle up or down.<!-- [et_pb_line_break_holder] -->    \"\"\"<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def __init__(self, start_x, start_y):<!-- [et_pb_line_break_holder] -->        super().__init__(start_x, start_y, PADDLE_WIDTH, PADDLE_HEIGHT)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def up(self):<!-- [et_pb_line_break_holder] -->        if self.y - 5 > 40:<!-- [et_pb_line_break_holder] -->            self.y -= 5<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def down(self):<!-- [et_pb_line_break_holder] -->        if self.y + self.height + 5 < HEIGHT - 40:<!-- [et_pb_line_break_holder] -->            self.y += 5<!-- [et_pb_line_break_holder] -->        <!-- [et_pb_line_break_holder] -->    #Phidgets Code Start <!-- [et_pb_line_break_holder] -->    def phidget_move(self, position):<!-- [et_pb_line_break_holder] -->        self.y = position * HEIGHT<!-- [et_pb_line_break_holder] -->    #Phidgets Code End<!-- [et_pb_line_break_holder] -->    <!-- [et_pb_line_break_holder] -->    def draw(self):<!-- [et_pb_line_break_holder] -->        screen.draw.filled_rect(self, MAIN_COLOR)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->class TennisBall():<!-- [et_pb_line_break_holder] -->    \"\"\"<!-- [et_pb_line_break_holder] -->    Represents a tennis ball on the screen<!-- [et_pb_line_break_holder] -->    \"\"\"<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def __init__(self, start_pos, dt):<!-- [et_pb_line_break_holder] -->        \"\"\"<!-- [et_pb_line_break_holder] -->        Initialize the tennis ball position and set the movement rate<!-- [et_pb_line_break_holder] -->        \"\"\"<!-- [et_pb_line_break_holder] -->        self.x, self.y = start_pos<!-- [et_pb_line_break_holder] -->        self.dx = self.dy = dt<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    @property<!-- [et_pb_line_break_holder] -->    def pos(self):<!-- [et_pb_line_break_holder] -->        return (self.x, self.y)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def move(self):<!-- [et_pb_line_break_holder] -->        self.x += self.dx<!-- [et_pb_line_break_holder] -->        self.y += self.dy<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def draw(self):<!-- [et_pb_line_break_holder] -->        screen.draw.filled_circle(self.pos, TENNIS_BALL_RADIUS, MAIN_COLOR)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->class Game():<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def __init__(self, player):<!-- [et_pb_line_break_holder] -->        self.active_player = player<!-- [et_pb_line_break_holder] -->        self.score_left = 0<!-- [et_pb_line_break_holder] -->        self.score_right = 0<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        self.in_progress = False<!-- [et_pb_line_break_holder] -->        self.computer_acting = False<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        # position paddles in the middle of the screen<!-- [et_pb_line_break_holder] -->        middle = HEIGHT\/2 - PADDLE_HEIGHT\/2<!-- [et_pb_line_break_holder] -->        self.left_paddle = Paddle(20, middle)<!-- [et_pb_line_break_holder] -->        self.right_paddle = Paddle(WIDTH-40, middle)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        self.set_ball(self.ball_pos)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    @property<!-- [et_pb_line_break_holder] -->    def ball_pos(self):<!-- [et_pb_line_break_holder] -->        if self.active_player == LEFT_PLAYER:<!-- [et_pb_line_break_holder] -->            return (20 + PADDLE_WIDTH + 10, self.left_paddle.centery)<!-- [et_pb_line_break_holder] -->        else:<!-- [et_pb_line_break_holder] -->            return (WIDTH - 35 - PADDLE_WIDTH, self.right_paddle.centery)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def set_ball(self, pos):<!-- [et_pb_line_break_holder] -->        # a ball is set on the paddle of last player that got a point<!-- [et_pb_line_break_holder] -->        dt = 5 if self.active_player == LEFT_PLAYER else -5<!-- [et_pb_line_break_holder] -->        self.tennis_ball = TennisBall(pos, dt)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def position_ball(self):<!-- [et_pb_line_break_holder] -->        # used when the player moves tha paddle and<!-- [et_pb_line_break_holder] -->        # game is not in progress<!-- [et_pb_line_break_holder] -->        self.tennis_ball.x, self.tennis_ball.y = self.ball_pos<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def score_for_left(self):<!-- [et_pb_line_break_holder] -->        self.in_progress = False<!-- [et_pb_line_break_holder] -->        self.active_player = LEFT_PLAYER<!-- [et_pb_line_break_holder] -->        self.score_left += 1<!-- [et_pb_line_break_holder] -->        self.set_ball(self.ball_pos)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def score_for_right(self):<!-- [et_pb_line_break_holder] -->        self.in_progress = False<!-- [et_pb_line_break_holder] -->        self.active_player = RIGHT_PLAYER<!-- [et_pb_line_break_holder] -->        self.score_right += 1<!-- [et_pb_line_break_holder] -->        self.set_ball(self.ball_pos)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def proceed(self):<!-- [et_pb_line_break_holder] -->        self.tennis_ball.move()<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        # bounce from the walls<!-- [et_pb_line_break_holder] -->        if self.tennis_ball.y <= 40:<!-- [et_pb_line_break_holder] -->            self.tennis_ball.dy = -self.tennis_ball.dy<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        if self.tennis_ball.y >= HEIGHT - 40:<!-- [et_pb_line_break_holder] -->            self.tennis_ball.dy = -self.tennis_ball.dy<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        # bounce from the paddles<!-- [et_pb_line_break_holder] -->        if self.left_paddle.collidepoint(self.tennis_ball.pos):<!-- [et_pb_line_break_holder] -->            self.tennis_ball.dx = -self.tennis_ball.dx<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        if self.right_paddle.collidepoint(self.tennis_ball.pos):<!-- [et_pb_line_break_holder] -->            self.tennis_ball.dx = -self.tennis_ball.dx<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        # if we didn't bounce, then that is a score<!-- [et_pb_line_break_holder] -->        if self.tennis_ball.x <= 0:<!-- [et_pb_line_break_holder] -->            self.score_for_right()<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        if self.tennis_ball.x >= WIDTH:<!-- [et_pb_line_break_holder] -->            self.score_for_left()<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        if self.score_left == 11 or self.score_right == 11:<!-- [et_pb_line_break_holder] -->            self.in_progress = False<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    # computer movement<!-- [et_pb_line_break_holder] -->    def computer_launch(self):<!-- [et_pb_line_break_holder] -->        self.in_progress = True<!-- [et_pb_line_break_holder] -->        self.computer_acting = False<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def computer_stop_acting(self):<!-- [et_pb_line_break_holder] -->        self.computer_acting = False<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def computer_move(self):<!-- [et_pb_line_break_holder] -->        # move towards the center of the screen when the ball is<!-- [et_pb_line_break_holder] -->        # travelling toward the enemy<!-- [et_pb_line_break_holder] -->        if self.tennis_ball.dx > 0:<!-- [et_pb_line_break_holder] -->            target_y = HEIGHT \/ 2<!-- [et_pb_line_break_holder] -->        else:<!-- [et_pb_line_break_holder] -->            # when the ball is on other side of screen, just move<!-- [et_pb_line_break_holder] -->            # in general direction<!-- [et_pb_line_break_holder] -->            if self.tennis_ball.x > WIDTH \/ 2:<!-- [et_pb_line_break_holder] -->                delta = int(WIDTH * 0.25)<!-- [et_pb_line_break_holder] -->                if self.tennis_ball.dy < 0:<!-- [et_pb_line_break_holder] -->                    target_y = self.tennis_ball.y - delta<!-- [et_pb_line_break_holder] -->                else:<!-- [et_pb_line_break_holder] -->                    target_y = self.tennis_ball.y + delta<!-- [et_pb_line_break_holder] -->            else:<!-- [et_pb_line_break_holder] -->                # the ball is on our side, move with it<!-- [et_pb_line_break_holder] -->                rnd = random.randint(40, 200)<!-- [et_pb_line_break_holder] -->                if self.tennis_ball.dy < 0:<!-- [et_pb_line_break_holder] -->                    target_y = self.tennis_ball.y - rnd<!-- [et_pb_line_break_holder] -->                else:<!-- [et_pb_line_break_holder] -->                    target_y = self.tennis_ball.y + rnd<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        target_y = max(40, min(target_y, HEIGHT - 80))<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        distance = abs(self.left_paddle.y - target_y)<!-- [et_pb_line_break_holder] -->        duration = min(1.0, distance \/ 600.0)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        animate(self.left_paddle, y=target_y, duration=.50,<!-- [et_pb_line_break_holder] -->            on_finished=self.computer_stop_acting)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def computer_move_randomly(self):<!-- [et_pb_line_break_holder] -->        # move the paddle randomly during one second before launching the ball<!-- [et_pb_line_break_holder] -->        target_y = random.randint(40, HEIGHT - PADDLE_HEIGHT - 80)<!-- [et_pb_line_break_holder] -->        distance = abs(self.left_paddle.y - target_y)<!-- [et_pb_line_break_holder] -->        duration = max(0.1, distance \/ 200.0)<!-- [et_pb_line_break_holder] -->        self.computer_total_duration += duration<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        if self.computer_total_duration + duration < 1.0:<!-- [et_pb_line_break_holder] -->            on_finished = self.computer_move_randomly<!-- [et_pb_line_break_holder] -->        else:<!-- [et_pb_line_break_holder] -->            on_finished = self.computer_launch<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        animate(self.left_paddle, y=target_y, duration=duration,<!-- [et_pb_line_break_holder] -->            on_finished=on_finished)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def computer_act(self):<!-- [et_pb_line_break_holder] -->        if self.in_progress:<!-- [et_pb_line_break_holder] -->            # predict where the ball will move and move towards it<!-- [et_pb_line_break_holder] -->            self.computer_move()<!-- [et_pb_line_break_holder] -->        elif self.active_player == LEFT_PLAYER:<!-- [et_pb_line_break_holder] -->            # move randomly for a bit, then shoot the ball out<!-- [et_pb_line_break_holder] -->            if not self.computer_acting:<!-- [et_pb_line_break_holder] -->                self.computer_acting = True<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->                self.computer_total_duration = 0.0<!-- [et_pb_line_break_holder] -->                self.computer_move_randomly()<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    def draw(self):<!-- [et_pb_line_break_holder] -->        # slightly gray background<!-- [et_pb_line_break_holder] -->        screen.fill((64, 64, 64))<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        # show the score for the left player<!-- [et_pb_line_break_holder] -->        screen.draw.text(<!-- [et_pb_line_break_holder] -->            'Computer: {}'.format(self.score_left),<!-- [et_pb_line_break_holder] -->            color=MAIN_COLOR,<!-- [et_pb_line_break_holder] -->            center=(WIDTH\/4 - 20, 20),<!-- [et_pb_line_break_holder] -->            fontsize=48<!-- [et_pb_line_break_holder] -->        )<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        # show the score for the right player<!-- [et_pb_line_break_holder] -->        screen.draw.text(<!-- [et_pb_line_break_holder] -->            'Player: {}'.format(self.score_right),<!-- [et_pb_line_break_holder] -->            color=MAIN_COLOR,<!-- [et_pb_line_break_holder] -->            center=(WIDTH\/2 + WIDTH\/4 - 20, 20),<!-- [et_pb_line_break_holder] -->            fontsize=48<!-- [et_pb_line_break_holder] -->        )<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        # a dividing line<!-- [et_pb_line_break_holder] -->        screen.draw.line(<!-- [et_pb_line_break_holder] -->            (WIDTH\/2, 40),<!-- [et_pb_line_break_holder] -->            (WIDTH\/2, HEIGHT-40),<!-- [et_pb_line_break_holder] -->            color=MAIN_COLOR)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        if self.score_left == 11:<!-- [et_pb_line_break_holder] -->            screen.draw.text(<!-- [et_pb_line_break_holder] -->                'COMPUTER WINS!!!',<!-- [et_pb_line_break_holder] -->                color=MAIN_COLOR,<!-- [et_pb_line_break_holder] -->                center=(WIDTH\/2, HEIGHT\/2),<!-- [et_pb_line_break_holder] -->                fontsize=96<!-- [et_pb_line_break_holder] -->            )<!-- [et_pb_line_break_holder] -->        elif self.score_right == 11:<!-- [et_pb_line_break_holder] -->            screen.draw.text(<!-- [et_pb_line_break_holder] -->                'PLAYER WINS!!!',<!-- [et_pb_line_break_holder] -->                color=MAIN_COLOR,<!-- [et_pb_line_break_holder] -->                center=(WIDTH\/2, HEIGHT\/2),<!-- [et_pb_line_break_holder] -->                fontsize=96<!-- [et_pb_line_break_holder] -->            )<!-- [et_pb_line_break_holder] -->        else:<!-- [et_pb_line_break_holder] -->            self.left_paddle.draw()<!-- [et_pb_line_break_holder] -->            self.right_paddle.draw()<!-- [et_pb_line_break_holder] -->            self.tennis_ball.draw()<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --># first player is chosen randomly<!-- [et_pb_line_break_holder] --># player = LEFT_PLAYER if random.randint(0, 1000) % 2 == 0 else RIGHT_PLAYER<!-- [et_pb_line_break_holder] -->player = LEFT_PLAYER<!-- [et_pb_line_break_holder] -->game = Game(player)<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->def draw():<!-- [et_pb_line_break_holder] -->    game.draw()<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->def update():<!-- [et_pb_line_break_holder] -->    #Phidgets Code Start<!-- [et_pb_line_break_holder] -->    game.right_paddle.phidget_move(slider.getVoltageRatio())<!-- [et_pb_line_break_holder] -->    #Phidgets Code End<!-- [et_pb_line_break_holder] -->    <!-- [et_pb_line_break_holder] -->    if keyboard.up:<!-- [et_pb_line_break_holder] -->        game.right_paddle.up()<!-- [et_pb_line_break_holder] -->    elif keyboard.down:<!-- [et_pb_line_break_holder] -->        game.right_paddle.down()<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    # move the computer controlled paddle<!-- [et_pb_line_break_holder] -->    game.computer_act()<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    # set the position of the ball to be in the middle of the paddle<!-- [et_pb_line_break_holder] -->    if not game.in_progress:<!-- [et_pb_line_break_holder] -->        game.position_ball()<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    if game.in_progress:<!-- [et_pb_line_break_holder] -->        game.proceed()<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->def on_key_down(key):<!-- [et_pb_line_break_holder] -->    # pressing SPACE launches the ball<!-- [et_pb_line_break_holder] -->    if key == keys.SPACE:<!-- [et_pb_line_break_holder] -->        if game.score_left == 11 or game.score_right == 11:<!-- [et_pb_line_break_holder] -->            game.score_left = game.score_right = 0<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        if not game.in_progress and game.active_player == RIGHT_PLAYER:<!-- [et_pb_line_break_holder] -->            game.in_progress = True<!-- [et_pb_line_break_holder] -->            <!-- [et_pb_line_break_holder] -->#Phidgets Code Start<!-- [et_pb_line_break_holder] -->#Create<!-- [et_pb_line_break_holder] -->slider = VoltageRatioInput()<!-- [et_pb_line_break_holder] -->#Address<!-- [et_pb_line_break_holder] -->slider.setIsHubPortDevice(True)<!-- [et_pb_line_break_holder] -->slider.setHubPort(0)<!-- [et_pb_line_break_holder] -->#Open<!-- [et_pb_line_break_holder] -->slider.openWaitForAttachment(5000)<!-- [et_pb_line_break_holder] -->#Set data interval to minimum | This will increase data rate and allow for smoother movement<!-- [et_pb_line_break_holder] -->slider.setDataInterval(slider.getMinDataInterval())<!-- [et_pb_line_break_holder] -->#Phidgets Code End            <!-- [et_pb_line_break_holder] -->            <!-- [et_pb_line_break_holder] -->pgzrun.go()<!-- [et_pb_line_break_holder] -->  <\/code><!-- [et_pb_line_break_holder] --><\/pre>\n<p>[\/et_pb_code][\/et_pb_column_inner][\/et_pb_row_inner][et_pb_row_inner _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;][et_pb_column_inner type=&#8221;4_4&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;Run your code&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;]<\/p>\n<h3>Run Your Program<\/h3>\n<p><!-- [et_pb_line_break_holder] --><pee>You will see the right paddle move when you move your slider.<\/pee>[\/et_pb_code][\/et_pb_column_inner][\/et_pb_row_inner][et_pb_row_inner _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; module_id=&#8221;review&#8221;][et_pb_column_inner type=&#8221;4_4&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;Code Review&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;]<\/p>\n<h2>Code Review<\/h2>\n<p><!-- [et_pb_line_break_holder] --><pee>In this example, we are simply mapping the paddle to the slider instead of using the up and down keys.<\/pee>[\/et_pb_code][\/et_pb_column_inner][\/et_pb_row_inner][et_pb_row_inner _builder_version=&#8221;4.4.1&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243; module_id=&#8221;practice&#8221;][et_pb_column_inner type=&#8221;4_4&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;Practice&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;]<\/p>\n<h2>Practice<\/h2>\n<p><!-- [et_pb_line_break_holder] --><\/p>\n<ol><!-- [et_pb_line_break_holder] --><\/p>\n<li>Currently, you must use the spacebar to launch the ball. Try modifying the game so a button from your Getting Started Kit is used instead.<\/li>\n<p><!-- [et_pb_line_break_holder] --><\/p>\n<li>Try modifying the game so it is a two-player experience. Both players should use a Slider Phidget to control their paddle.<\/li>\n<p><!-- [et_pb_line_break_holder] --><\/ol>\n<p>[\/et_pb_code][\/et_pb_column_inner][\/et_pb_row_inner][et_pb_row_inner admin_label=&#8221;Row&#8221;][et_pb_column_inner type=&#8221;4_4&#8243; saved_specialty_column_type=&#8221;3_4&#8243; custom_padding__hover=&#8221;|||&#8221; custom_padding=&#8221;|||&#8221; saved_specialty_column_type=&#8221;3_4&#8243;][et_pb_code admin_label=&#8221;ph-button-cta: Back to Projects&#8221; _builder_version=&#8221;4.6.6&#8243; box_shadow_horizontal_tablet=&#8221;0px&#8221; box_shadow_vertical_tablet=&#8221;0px&#8221; box_shadow_blur_tablet=&#8221;40px&#8221; box_shadow_spread_tablet=&#8221;0px&#8221; vertical_offset_tablet=&#8221;0&#8243; horizontal_offset_tablet=&#8221;0&#8243; z_index_tablet=&#8221;0&#8243;]<a class=\"ph-button-cta\" href=\"\/education\/learn\/projects\/pygame-zero-projects\"><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"ph-button-cta__icon\"><\/div>\n<p><!-- [et_pb_line_break_holder] -->  Back to Pygame Zero Projects<!-- [et_pb_line_break_holder] --><\/a>[\/et_pb_code][\/et_pb_column_inner][\/et_pb_row_inner][\/et_pb_column][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":3,"featured_media":0,"parent":5547,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"<!-- wp:paragraph -->\r\n<p>This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:<\/p>\r\n<!-- \/wp:paragraph --><!-- wp:quote -->\r\n<blockquote class=\"wp-block-quote\">\r\n<p>Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like pi\u00f1a coladas. (And gettin' caught in the rain.)<\/p>\r\n<\/blockquote>\r\n<!-- \/wp:quote --><!-- wp:paragraph -->\r\n<p>...or something like this:<\/p>\r\n<!-- \/wp:paragraph --><!-- wp:quote -->\r\n<blockquote class=\"wp-block-quote\">\r\n<p>The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.<\/p>\r\n<\/blockquote>\r\n<!-- \/wp:quote --><!-- wp:paragraph -->\r\n<p>As a new WordPress user, you should go to <a href=\"https:\/\/www.phidgets.com\/education\/wp-admin\/\">your dashboard<\/a> to delete this page and create new pages for your content. Have fun!<\/p>\r\n<!-- \/wp:paragraph -->","_et_gb_content_width":"","footnotes":""},"class_list":["post-6242","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.phidgets.com\/education\/wp-json\/wp\/v2\/pages\/6242","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.phidgets.com\/education\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.phidgets.com\/education\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.phidgets.com\/education\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.phidgets.com\/education\/wp-json\/wp\/v2\/comments?post=6242"}],"version-history":[{"count":9,"href":"https:\/\/www.phidgets.com\/education\/wp-json\/wp\/v2\/pages\/6242\/revisions"}],"predecessor-version":[{"id":8900,"href":"https:\/\/www.phidgets.com\/education\/wp-json\/wp\/v2\/pages\/6242\/revisions\/8900"}],"up":[{"embeddable":true,"href":"https:\/\/www.phidgets.com\/education\/wp-json\/wp\/v2\/pages\/5547"}],"wp:attachment":[{"href":"https:\/\/www.phidgets.com\/education\/wp-json\/wp\/v2\/media?parent=6242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}