{"id":6317,"date":"2020-07-04T09:52:08","date_gmt":"2020-07-04T07:52:08","guid":{"rendered":"https:\/\/pythonprogramming.altervista.org\/?p=6317"},"modified":"2020-07-04T09:52:08","modified_gmt":"2020-07-04T07:52:08","slug":"arkagame-2-6-adding-keyboard-commands","status":"publish","type":"post","link":"https:\/\/pythonprogramming.altervista.org\/arkagame-2-6-adding-keyboard-commands\/","title":{"rendered":"ArkaGame 2.6 &#8211; Adding keyboard commands"},"content":{"rendered":"<p>I think the mouse is better to control this game, but in case you want to use the keyboard, here is the code:<\/p>\n<pre class=\"lang:default decode:true \">        for event in pygame.event.get():\r\n            if event.type == pygame.QUIT:\r\n                loop = 0\r\n            if event.type == pygame.KEYDOWN:\r\n                if event.key == pygame.K_RIGHT:\r\n                    movebar = \"right\"\r\n                if event.key == pygame.K_LEFT:\r\n                    movebar = \"left\"\r\n                if event.key == pygame.K_UP:\r\n                    movebar = \"up\"\r\n                if event.key == pygame.K_DOWN:\r\n                    movebar = \"down\"<\/pre>\n<p>and&#8230;<\/p>\n<pre class=\"lang:default decode:true \">        # Keyboard commands\r\n        if bar.x &lt; 430:\r\n            if movebar == \"right\":\r\n                bar.x += 2\r\n        if bar.x &gt; 10:\r\n            if movebar == \"left\":\r\n                bar.x -= 2\r\n        if bar.y &gt; 400:\r\n            if movebar == \"up\":\r\n                bar.y -= 2\r\n        if bar.y &lt; 480:\r\n            if movebar == \"down\":\r\n                bar.y += 2<\/pre>\n<h2>The whole code<\/h2>\n<pre class=\"lang:default decode:true  \"># arkanoid\r\nimport pygame\r\nfrom pygame import gfxdraw\r\nimport os\r\nimport sys\r\nfrom random import choice, randrange\r\n'''\r\narkapygame 2.6\r\n================\r\n4.7.2020\r\n- fix the lives problem\r\n- put a menu at the start\r\n'''\r\n\r\n\r\nclass Brick:\r\n    \"One brick class\"\r\n\r\n    def __init__(self, x, y, randomcolor):\r\n        self.x = x\r\n        self.y = y\r\n        self.color = randomcolor\r\n        # This is for collisions\r\n        self.rect = pygame.Rect(self.x, self.y, 50, 20)\r\n\r\n    def update(self):\r\n        # when you update it will go to self.x and self.y\r\n        # bar.x is constantly equal to the mouse position in the while loop\r\n        pygame.draw.rect(screen, self.color, (self.x, self.y, 50, 20))\r\n        # pygame.draw.rect(screen, GREEN, (self.x, self.y, 50, 20))\r\n\r\n\r\nclass Bar:\r\n    \"This is the bar class\"\r\n\r\n    def __init__(self, x, y):\r\n        self.x = x\r\n        self.y = y\r\n\r\n    def update(self):\r\n        \r\n        pygame.draw.rect(screen, RED, (self.x, self.y, 60, 10))\r\n        self.rect = pygame.Rect(self.x, self.y, 60, 10)\r\n\r\n\r\nclass Ball:\r\n    \"Draw Player 2\"\r\n\r\n    def __init__(self, x, y):\r\n        self.x = x\r\n        self.y = y\r\n        self.color = RED\r\n\r\n    def update(self):\r\n        \"The ball moves\"\r\n        global ball\r\n        global ball_x, ball_y\r\n\r\n        # sull'asse x Va verso sinistra\r\n        if ball_x == \"left\":\r\n            # sottraggo perch\u00e8 vado a sinistra\r\n            ball.x -= velx\r\n            # se arriva a 10 rimbalza\r\n            if ball.x &lt; 10:\r\n                pygame.mixer.Sound.play(s_wall)\r\n                ball_x = \"right\"\r\n        # va in basso\r\n        if ball_y == 'down':\r\n            # allora aumenta y quando va in basso (parte da 0 in alto)\r\n            ball.y += vel_y\r\n        if ball_y == 'up':\r\n            # quando va in alto tolgo\r\n            ball.y -= vel_y\r\n            # se arriva in cima rimbalza in basso\r\n            if ball.y &lt; 30:\r\n                pygame.mixer.Sound.play(s_wall)\r\n                ball_y = 'down'\r\n        # se va a destra aumenta x\r\n        if ball_x == \"right\":\r\n            ball.x += velx\r\n            # a 480 rimbalza verso sinistra\r\n            if ball.x &gt; 490:\r\n                pygame.mixer.Sound.play(s_wall)\r\n                ball_x = \"left\"\r\n        \r\n        gfxdraw.filled_circle(screen, ball.x, ball.y, 6, self.color)\r\n        # gfxdraw.filled_circle(screen, ball.x, ball.y, 5, YELLOW)\r\n        self.rect = pygame.Rect(self.x, self.y, 6, 6)\r\n\r\n\r\ndef reverse():\r\n    global ball_x, velx, vel_y\r\n    ball_x = \"right\" if ball_x == \"left\" else \"right\"\r\n\r\n\r\n\r\ndef collision():\r\n    global ball, bar, ball_y, ball_x, vely, velx, mousedir, bricks\r\n    global diff, lives, stage, score, loop\r\n    if ball.rect.colliderect(bar):\r\n        pygame.mixer.Sound.play(hitbar)\r\n        ball_y = \"up\"\r\n        velx = 2 if diff &gt; 0 else 1\r\n        # print(f\"you hit with diff: {diff} vel_x = {velx}\")\r\n\r\n    for n, brick in enumerate(bricks):\r\n        if ball.rect.colliderect(brick):\r\n            # screen.fill((0, 0, 0))\r\n            pygame.draw.rect(screen, (0, 0, 0), (brick.x, brick.y, 50, 20))\r\n            screen.blit(update_fps(color=\"Black\"), (12, 10))\r\n            score += 20\r\n            screen.blit(update_fps(), (12, 10))\r\n            pygame.mixer.Sound.play(hitbrick)\r\n            # print(\"You hit a brick\")\r\n            if ball_y == \"up\":\r\n                # the ball is lower than the brick of 20\r\n                if ball.y == (brick.y + 20 - vel_y) :\r\n                    ball_y = \"down\"\r\n                # if the balls hit the brick on a side\r\n                else:\r\n                    if ball_x == \"left\":\r\n                        ball_x = \"right\"\r\n                    else:\r\n                        ball_x = \"left\"\r\n            elif ball_y == \"down\":\r\n                if ball.y &lt;= brick.y - 1:\r\n                    ball_y = \"up\"\r\n                else:\r\n                    if ball_x == \"left\":\r\n                        ball_x = \"right\"\r\n                    else:\r\n                        ball_x = \"left\"\r\n            bricks.pop(n)\r\n            if bricks == []:\r\n                write_highest_score()\r\n                screen.fill((0, 0, 0))\r\n                ball.y = 300\r\n                ball.x = 100\r\n                if stage &lt; len(blist):\r\n                    stage += 1\r\n                    pygame.mixer.Sound.play(s_ready)\r\n                else:\r\n                    stage = 0\r\n                bricks = create_bricks(make_stages())\r\n                show_bricks()\r\n\r\n    # When the ball goes out of the screen in the bottom\r\n    if ball.y &gt; 510:\r\n        ball.x, ball.y = 500, 300\r\n        lives -= 1\r\n        pygame.mixer.Sound.play(s_out)\r\n        if lives &lt; 0:\r\n            pygame.mixer.Sound.play(s_over)\r\n            score = 0\r\n            stage = 0           \r\n            ball_y = 'down'\r\n            ball_x = 'left'\r\n            # loop = 0\r\n            velx = 1\r\n            vely = 1\r\n\r\n\r\ndef pause():\r\n    global stage\r\n\r\n    pause = 1\r\n    write(\"Arkanoid - Stage \" + str(stage + 1), 200, 320)\r\n    ball.update()\r\n    bar.update()\r\n    while pause:\r\n        \r\n        for event in pygame.event.get():\r\n            if event.type == pygame.QUIT:\r\n                pause = 0\r\n            if event.type == pygame.KEYUP:\r\n                if event.key == pygame.K_ESCAPE:\r\n                    pause = 0\r\n            if event.type == pygame.KEYDOWN:\r\n                if event.key == pygame.K_q:\r\n                    pause = 0\r\n                if event.key == pygame.K_n:\r\n                    generate_level()\r\n        pygame.display.update()\r\n        clock.tick(300)\r\n    screen.fill((0, 0, 0))\r\n    show_bricks()   \r\n\r\ndef generate_level():\r\n    global bricks\r\n    screen.fill((0, 0, 0))\r\n    write(\"Arkanoid - Stage \" + str(stage + 1), 200, 320)\r\n    ball.update()\r\n    bar.update()\r\n    bricks = create_bricks(make_stages())\r\n    show_bricks()\r\n\r\n\r\ndef restart():\r\n    global score, lives, stage\r\n    stage = 0 \r\n    score = 0\r\n    lives = 3\r\n    generate_level()\r\n\r\n\r\n\r\n\r\ndef exit(event, loop):\r\n\r\n    if event.type == pygame.QUIT:\r\n        loop = 0\r\n    if event.type == pygame.KEYUP:\r\n        if event.key == pygame.K_ESCAPE:\r\n            loop = 0\r\n        if event.key == pygame.K_SPACE:\r\n            pause()\r\n    return loop\r\n\r\n\r\ndef create_bricks(blist):\r\n    \"The bricks scheme\"\r\n    bricks = []\r\n    h = 30\r\n    w = 0\r\n    for line in blist:\r\n        randomcolor = randrange(0,255), randrange(0,255), randrange(0,255),\r\n        for brick in line:\r\n            if brick == \"1\":\r\n                bricks.append(Brick(50 + w * 51, h, randomcolor))\r\n            w += 1\r\n            if w == 8:\r\n                w = 0\r\n                h += 21\r\n    return bricks\r\n\r\n\r\ndef show_bricks():\r\n    for brick in bricks:\r\n        brick.update()\r\n\r\nstage = 0\r\nlives = 3\r\n\r\n\r\ndef make_stages():\r\n    blist = []\r\n    for n in range(randrange(5,16)):\r\n        riga = [str(choice([0, 1])) for x in range(4)]\r\n        riga2 = riga[::-1]\r\n        riga = riga + riga2\r\n        # print(riga)\r\n        blist.append(\"\".join(riga))\r\n    return blist\r\n\r\n\r\ndef write_highest_score():\r\n    \"Checks highest score when game's over\"\r\n    global score, scoremax\r\n\r\n    with open(\"score.txt\", \"w\") as file:\r\n        if scoremax &lt; score:\r\n            file.write(str(score))\r\n\r\n\r\nblist = make_stages()\r\nBLACK = (0, 0, 0)\r\nRED = (255, 0, 0)\r\nGREEN = (0, 255, 0)\r\nYELLOW = (255, 255, 0)\r\nball_x = 'left'\r\nball_y = 'down'\r\n# speed horizzontal\r\nvelx = 1\r\n# speed vertical\r\nvel_y = 1\r\n\r\n\r\n######################\r\n#     sound\r\n#####################\r\npygame.mixer.pre_init(44100, -16, 1, 512)\r\npygame.init()\r\npygame.mixer.quit()\r\npygame.mixer.init(22050, -16, 2, 512)\r\npygame.mixer.set_num_channels(32)\r\n# ===================================\r\nhitbar = pygame.mixer.Sound('sound\\\\hitbar2.wav')\r\ns_out = pygame.mixer.Sound('sound\\\\outspeech.wav')\r\nhitbrick = pygame.mixer.Sound('sound\\\\hitbrick.wav')\r\ns_ready = pygame.mixer.Sound('sound\\\\ready.wav')\r\ns_over = pygame.mixer.Sound('sound\\\\over.wav')\r\ns_wall = pygame.mixer.Sound('sound\\\\wall.wav')\r\n# Soundtrack\r\n# track1 = pygame.mixer.Sound('sound\\\\spectral_sound.wav')\r\n \r\nclock = pygame.time.Clock()\r\nscreen = pygame.display.set_mode((500, 500))\r\npygame.display.set_caption(\"Game\")\r\nstartx = 0\r\nbar = Bar(10, 480)\r\nball = Ball(100, 300)\r\nbricks = create_bricks(blist)\r\nbackground = pygame.image.load(\"img\\\\background.png\").convert()\r\npygame.mouse.set_visible(False)\r\nmousedir = \"stop\"\r\ndiff = 0\r\nscore = 0\r\nfont = pygame.font.SysFont(\"Arial\", 14)\r\nscoremax = 0\r\n\r\ndef update_fps(color=\"Coral\"):\r\n    global score, scoremax\r\n\r\n    fps = f\"Max: {scoremax} Lives: {lives} Stage: {stage} Score: {score} \"\r\n    fps_text = font.render(fps, 1, pygame.Color(color))\r\n    return fps_text\r\n\r\n\r\ndef write(text, x, y, color=\"Coral\",):\r\n    text = font.render(text, 1, pygame.Color(color))\r\n    text_rect = text.get_rect(center=(500\/\/2, y))\r\n    screen.blit(text, text_rect)\r\n    return text\r\n\r\n\r\n# pause()\r\nshow_bricks()\r\ncounter = 0\r\nmovebar = \"\"\r\ndef mainloop():\r\n    # screen.blit(write(\"Pause\"), (250, 250))\r\n    global startx, mousedir, diff, counter, movebar\r\n    pygame.mixer.Sound.play(s_ready)\r\n    # pygame.mixer.Sound.play(track1)\r\n    screen.fill((0, 0, 0))\r\n    show_bricks()\r\n    loop = 1\r\n    while loop:\r\n        # screen.blit(background, (0, 0))\r\n        \r\n        #screen.fill((0, 0, 0))\r\n        pygame.draw.rect(screen, (0, 0, 0), (bar.x, bar.y, 60, 10))\r\n        gfxdraw.filled_circle(screen, ball.x, ball.y, 6, (0, 0, 0))\r\n        keys = pygame.key.get_pressed()\r\n        for event in pygame.event.get():\r\n            if event.type == pygame.QUIT:\r\n                loop = 0\r\n            if event.type == pygame.KEYDOWN:\r\n                if event.key == pygame.K_RIGHT:\r\n                    movebar = \"right\"\r\n                if event.key == pygame.K_LEFT:\r\n                    movebar = \"left\"\r\n                if event.key == pygame.K_UP:\r\n                    movebar = \"up\"\r\n                if event.key == pygame.K_DOWN:\r\n                    movebar = \"down\"\r\n                if event.key == pygame.K_ESCAPE:\r\n                    loop = 0\r\n                if event.key == pygame.K_SPACE:\r\n                    pause()                \r\n                if event.key == pygame.K_s:\r\n                    pygame.image.save(screen, f\"image{counter}.png\")\r\n                    counter += 1\r\n                if event.key == pygame.K_r:\r\n                    restart()\r\n                if event.key == pygame.K_n:\r\n                    generate_level()\r\n            if event.type == pygame.KEYUP:\r\n                movebar = \"\"\r\n        \r\n        # Keyboard commands\r\n        if bar.x &lt; 430:\r\n            if movebar == \"right\":\r\n                bar.x += 2\r\n        if bar.x &gt; 10:\r\n            if movebar == \"left\":\r\n                bar.x -= 2\r\n        if bar.y &gt; 400:\r\n            if movebar == \"up\":\r\n                bar.y -= 2\r\n        if bar.y &lt; 480:\r\n            if movebar == \"down\":\r\n                bar.y += 2\r\n        #          Move with the mouse\r\n        posx= pygame.mouse.get_pos()[0]\r\n        \r\n        if pygame.mouse.get_pos()[1] &gt; 400:\r\n            bar.y = pygame.mouse.get_pos()[1]\r\n            pygame.mouse.set_pos(bar.x, bar.y)\r\n        if posx &gt; 10 and posx &lt; 430:\r\n            bar.x = posx\r\n\r\n\r\n        \r\n        # =======================================\r\n        ball.update()\r\n        bar.update()\r\n        collision()\r\n        if startx &gt; posx:\r\n            mousedir = \"left\"\r\n        elif startx &lt; posx:\r\n            mousedir = \"right\"\r\n        else:\r\n            mousedir = \"stop\"\r\n        diff = abs(startx - posx)\r\n        startx = posx\r\n        \r\n\r\n        pygame.display.update()\r\n        clock.tick(300)\r\n\r\n\r\n# This should read the file with the highest score\r\ntry:\r\n    if \"score.txt\" in os.listdir():\r\n        with open(\"score.txt\", \"r\") as file:\r\n            # print(\"Scoremax = \" + file.readlines()[0])\r\n            scoremax = int(file.readlines()[0])\r\n    else:\r\n        with open(\"score.txt\", \"w\") as file:\r\n            file.write(\"100\")\r\nexcept:\r\n    with open(\"score.txt\", \"w\") as file:\r\n        file.write(\"100\")\r\n\r\ndef menu():\r\n    loop = 1\r\n    while loop:\r\n        # screen.blit(background, (0, 0))\r\n        write(\"Press space to start\", 200, 320)\r\n        write(\"Press r to restart during the game\", 150, 340)\r\n        #screen.fill((0, 0, 0))\r\n        pygame.draw.rect(screen, (0, 0, 0), (bar.x, bar.y, 60, 10))\r\n        gfxdraw.filled_circle(screen, ball.x, ball.y, 6, (0, 0, 0))\r\n        keys = pygame.key.get_pressed()\r\n        for event in pygame.event.get():\r\n            if event.type == pygame.QUIT:\r\n                loop = 0\r\n            if event.type == pygame.KEYUP:\r\n                if event.key == pygame.K_ESCAPE:\r\n                    loop = 0\r\n\r\n                if event.key == pygame.K_SPACE:\r\n                    mainloop()\r\n        pygame.display.update()\r\n        clock.tick(300)\r\n\r\nmenu()\r\n\r\npygame.quit()\r\n\r\nwrite_highest_score()\r\n\r\nsys.exit()\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"Arkagame 2.6\n<a class=\"moretag\" href=\"https:\/\/pythonprogramming.altervista.org\/arkagame-2-6-adding-keyboard-commands\/\"> [...]<\/a>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","footnotes":""},"categories":[1],"tags":[194],"class_list":["post-6317","post","type-post","status-publish","format-standard","hentry","category-examples","tag-pygame"],"avopt_banners_inside_post":true,"avopt_banners_on_page":true,"av_copy_from":"","av_sharing_message":"","av_sharing_allowed":true,"av_sharing_on":{"fb":[],"tw":[]},"av_allow_affiliate_banner":false,"av_allow_affiliate_multi_banner":false,"av_show_affiliation_buy_button":false,"av_post_rating":true,"av_have_post_rating_value":false,"av_is_artificial_intelligence_content":false,"_links":{"self":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/6317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/comments?post=6317"}],"version-history":[{"count":1,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/6317\/revisions"}],"predecessor-version":[{"id":6318,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/6317\/revisions\/6318"}],"wp:attachment":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/media?parent=6317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/categories?post=6317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/tags?post=6317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}