<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dmitriy</title>
    <description>The latest articles on DEV Community by Dmitriy (@what1is1it).</description>
    <link>https://dev.to/what1is1it</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F413069%2Ff29955db-2220-48f4-af13-768406a11e3d.jpeg</url>
      <title>DEV Community: Dmitriy</title>
      <link>https://dev.to/what1is1it</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/what1is1it"/>
    <language>en</language>
    <item>
      <title>Ping pong(python) </title>
      <dc:creator>Dmitriy</dc:creator>
      <pubDate>Sat, 20 Jun 2020 13:22:44 +0000</pubDate>
      <link>https://dev.to/what1is1it/ping-pong-python-366</link>
      <guid>https://dev.to/what1is1it/ping-pong-python-366</guid>
      <description>&lt;p&gt;from tkinter import *&lt;br&gt;
import random&lt;/p&gt;

&lt;p&gt;WIDTH = 900&lt;br&gt;
HEIGHT = 300&lt;/p&gt;

&lt;p&gt;PAD_W = 10&lt;/p&gt;

&lt;p&gt;PAD_H = 100&lt;/p&gt;

&lt;p&gt;BALL_SPEED_UP = 1.05&lt;br&gt;
BALL_MAX_SPEED = 40&lt;br&gt;
BALL_RADIUS = 30&lt;/p&gt;

&lt;p&gt;INITIAL_SPEED = 20&lt;br&gt;
BALL_X_SPEED = INITIAL_SPEED&lt;br&gt;
BALL_Y_SPEED = INITIAL_SPEED&lt;/p&gt;

&lt;p&gt;PLAYER_1_SCORE = 0&lt;br&gt;
PLAYER_2_SCORE = 0&lt;/p&gt;

&lt;p&gt;right_line_distance = WIDTH - PAD_W&lt;/p&gt;

&lt;p&gt;def update_score(player):&lt;br&gt;
    global PLAYER_1_SCORE, PLAYER_2_SCORE&lt;br&gt;
    if player == "right":&lt;br&gt;
        PLAYER_1_SCORE += 1&lt;br&gt;
        c.itemconfig(p_1_text, text=PLAYER_1_SCORE)&lt;br&gt;
    else:&lt;br&gt;
        PLAYER_2_SCORE += 1&lt;br&gt;
        c.itemconfig(p_2_text, text=PLAYER_2_SCORE)&lt;/p&gt;

&lt;p&gt;def spawn_ball():&lt;br&gt;
    global BALL_X_SPEED&lt;br&gt;
    c.coords(BALL, WIDTH/2-BALL_RADIUS/2,&lt;br&gt;
             HEIGHT/2-BALL_RADIUS/2,&lt;br&gt;
             WIDTH/2+BALL_RADIUS/2,&lt;br&gt;
             HEIGHT/2+BALL_RADIUS/2)&lt;br&gt;
    BALL_X_SPEED = -(BALL_X_SPEED * -INITIAL_SPEED) / abs(BALL_X_SPEED)&lt;/p&gt;

&lt;p&gt;def bounce(action):&lt;br&gt;
    global BALL_X_SPEED, BALL_Y_SPEED&lt;br&gt;
    if action == "strike":&lt;br&gt;
        BALL_Y_SPEED = random.randrange(-10, 10)&lt;br&gt;
        if abs(BALL_X_SPEED) &amp;lt; BALL_MAX_SPEED:&lt;br&gt;
            BALL_X_SPEED *= -BALL_SPEED_UP&lt;br&gt;
        else:&lt;br&gt;
            BALL_X_SPEED = -BALL_X_SPEED&lt;br&gt;
    else:&lt;br&gt;
        BALL_Y_SPEED = -BALL_Y_SPEED&lt;/p&gt;

&lt;p&gt;root = Tk()&lt;br&gt;
root.title("PythonicWay Pong")&lt;/p&gt;

&lt;p&gt;c = Canvas(root, width=WIDTH, height=HEIGHT, background="#003300")&lt;br&gt;
c.pack()&lt;/p&gt;

&lt;p&gt;c.create_line(PAD_W, 0, PAD_W, HEIGHT, fill="white")&lt;br&gt;
c.create_line(WIDTH-PAD_W, 0, WIDTH-PAD_W, HEIGHT, fill="white")&lt;br&gt;
c.create_line(WIDTH/2, 0, WIDTH/2, HEIGHT, fill="white")&lt;/p&gt;

&lt;p&gt;BALL = c.create_oval(WIDTH/2-BALL_RADIUS/2,&lt;br&gt;
                     HEIGHT/2-BALL_RADIUS/2,&lt;br&gt;
                     WIDTH/2+BALL_RADIUS/2,&lt;br&gt;
                     HEIGHT/2+BALL_RADIUS/2, fill="white")&lt;/p&gt;

&lt;p&gt;LEFT_PAD = c.create_line(PAD_W/2, 0, PAD_W/2, PAD_H, width=PAD_W, fill="yellow")&lt;/p&gt;

&lt;p&gt;RIGHT_PAD = c.create_line(WIDTH-PAD_W/2, 0, WIDTH-PAD_W/2, &lt;br&gt;
                          PAD_H, width=PAD_W, fill="yellow")&lt;/p&gt;

&lt;p&gt;p_1_text = c.create_text(WIDTH-WIDTH/6, PAD_H/4,&lt;br&gt;
                         text=PLAYER_1_SCORE,&lt;br&gt;
                         font="Arial 20",&lt;br&gt;
                         fill="white")&lt;/p&gt;

&lt;p&gt;p_2_text = c.create_text(WIDTH/6, PAD_H/4,&lt;br&gt;
                          text=PLAYER_2_SCORE,&lt;br&gt;
                          font="Arial 20",&lt;br&gt;
                          fill="white")&lt;/p&gt;

&lt;p&gt;BALL_X_CHANGE = 20&lt;br&gt;
BALL_Y_CHANGE = 0&lt;/p&gt;

&lt;p&gt;def move_ball():&lt;br&gt;
    ball_left, ball_top, ball_right, ball_bot = c.coords(BALL)&lt;br&gt;
    ball_center = (ball_top + ball_bot) / 2&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if ball_right + BALL_X_SPEED &amp;lt; right_line_distance and \
        ball_left + BALL_X_SPEED &amp;gt; PAD_W:
    c.move(BALL, BALL_X_SPEED, BALL_Y_SPEED)
elif ball_right == right_line_distance or ball_left == PAD_W:
    if ball_right &amp;gt; WIDTH / 2:
        if c.coords(RIGHT_PAD)[1] &amp;lt; ball_center &amp;lt; c.coords(RIGHT_PAD)[3]:
            bounce("strike")
        else:
            update_score("left")
            spawn_ball()
    else:
        if c.coords(LEFT_PAD)[1] &amp;lt; ball_center &amp;lt; c.coords(LEFT_PAD)[3]:
            bounce("strike")
        else:
            update_score("right")
            spawn_ball()
else:
    if ball_right &amp;gt; WIDTH / 2:
        c.move(BALL, right_line_distance-ball_right, BALL_Y_SPEED)
    else:
        c.move(BALL, -ball_left+PAD_W, BALL_Y_SPEED)
if ball_top + BALL_Y_SPEED &amp;lt; 0 or ball_bot + BALL_Y_SPEED &amp;gt; HEIGHT:
    bounce("ricochet")
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;PAD_SPEED = 20&lt;br&gt;
LEFT_PAD_SPEED = 0&lt;br&gt;
RIGHT_PAD_SPEED = 0&lt;/p&gt;

&lt;p&gt;def move_pads():&lt;br&gt;
    PADS = {LEFT_PAD: LEFT_PAD_SPEED, &lt;br&gt;
            RIGHT_PAD: RIGHT_PAD_SPEED}&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for pad in PADS:
    c.move(pad, 0, PADS[pad])
    if c.coords(pad)[1] &amp;lt; 0:
        c.move(pad, 0, -c.coords(pad)[1])
    elif c.coords(pad)[3] &amp;gt; HEIGHT:
        c.move(pad, 0, HEIGHT - c.coords(pad)[3])
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;def main():&lt;br&gt;
    move_ball()&lt;br&gt;
    move_pads()&lt;br&gt;
    root.after(30, main)&lt;/p&gt;

&lt;p&gt;c.focus_set()&lt;/p&gt;

&lt;p&gt;def movement_handler(event):&lt;br&gt;
    global LEFT_PAD_SPEED, RIGHT_PAD_SPEED&lt;br&gt;
    if event.keysym == "w":&lt;br&gt;
        LEFT_PAD_SPEED = -PAD_SPEED&lt;br&gt;
    elif event.keysym == "s":&lt;br&gt;
        LEFT_PAD_SPEED = PAD_SPEED&lt;br&gt;
    elif event.keysym == "Up":&lt;br&gt;
        RIGHT_PAD_SPEED = -PAD_SPEED&lt;br&gt;
    elif event.keysym == "Down":&lt;br&gt;
        RIGHT_PAD_SPEED = PAD_SPEED&lt;/p&gt;

&lt;p&gt;c.bind("", movement_handler)&lt;/p&gt;

&lt;p&gt;def stop_pad(event):&lt;br&gt;
    global LEFT_PAD_SPEED, RIGHT_PAD_SPEED&lt;br&gt;
    if event.keysym in "ws":&lt;br&gt;
        LEFT_PAD_SPEED = 0&lt;br&gt;
    elif event.keysym in ("Up", "Down"):&lt;br&gt;
        RIGHT_PAD_SPEED = 0&lt;/p&gt;

&lt;p&gt;c.bind("", stop_pad)&lt;/p&gt;

&lt;p&gt;main()&lt;/p&gt;

&lt;p&gt;root.mainloop()&lt;/p&gt;

</description>
      <category>python</category>
      <category>pythongame</category>
      <category>minipythongame</category>
    </item>
  </channel>
</rss>
