From 90c43783bc102b5a99341a6dd6a6ec449afa393a Mon Sep 17 00:00:00 2001 From: gracemontagnino Date: Sat, 3 Mar 2018 16:39:38 -0500 Subject: [PATCH 01/11] Project Proposal --- ProjectProposal.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 ProjectProposal.md diff --git a/ProjectProposal.md b/ProjectProposal.md new file mode 100644 index 00000000..595d5c9f --- /dev/null +++ b/ProjectProposal.md @@ -0,0 +1,7 @@ +Grace and Quinn +Interactive Programming + + + +We want to make a two player game using pygame. Our minimal vibale product is a game of pong, and the stretch goal is airhockey. We will explore two player inputs to generate a simple game output. Quinn's learning goal is to understand the pygame library and how to use github. Grace's goal is to have a deep understanding of our code and project. We are planning on using pygame as our main input library. For our mid prject check in we want to have a clear outline of our code functions and classes as well as how we will distribute the work between us. We would also liked to have started filling in some of this skeleton code. The biggest risk is trying to have two inputs to our game, when we have not yet done anything with a single interactive input. + From 458e6bd002aefa9bef8a877ab3c9ab0ffb540c3a Mon Sep 17 00:00:00 2001 From: gracemontagnino Date: Tue, 6 Mar 2018 15:02:25 -0500 Subject: [PATCH 02/11] Day1 Code, two paddles and window, no motion --- start.py | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 start.py diff --git a/start.py b/start.py new file mode 100644 index 00000000..4942ef74 --- /dev/null +++ b/start.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +""" +This is a worked example of applying the Model-View-Controller (MVC) +design pattern to the creation of a simple arcade game (in this case +Brick Breaker). + +We will create our game in stages so that you can see the process by +which the MVC pattern can be utilized to create clean, extensible, +and modular code. + +@author: SoftDesProfs +""" + +import pygame +from pygame.locals import * +import time + +class PyGameWindowView(object): + """ A view of brick breaker rendered in a Pygame window """ + def __init__(self, model, size): + """ Initialize the view with a reference to the model and the + specified game screen dimensions (represented as a tuple + containing the width and height """ + self.model = model + self.screen = pygame.display.set_mode(size) + + def draw(self): + """ Draw the current game state to the screen """ + self.screen.fill(pygame.Color(0,0,0)) + + pygame.draw.rect(self.screen, + pygame.Color(255, 0, 0), + pygame.Rect(self.model.paddle.x, + self.model.paddle.y, + self.model.paddle.width, + self.model.paddle.height)) + pygame.draw.rect(self.screen, + pygame.Color(255, 255, 255), + pygame.Rect(self.model.paddle2.x, + self.model.paddle2.y, + self.model.paddle2.width, + self.model.paddle2.height)) + pygame.display.update() + +class Model(object): + """ Encodes a model of the game state """ + def __init__(self, size): + self.paddle = Paddle(50,10,0,240) + self.paddle2=Paddle(50,10,630,240) + def update(self): + """ Update the game state (currently only tracking the paddle) """ + self.paddle.update() + self.paddle.update() + def __str__(self): + output_lines = [] + # convert each brick to a string for outputting + output_lines.append(str(self.paddle)) + # print one item per line + return "\n".join(output_lines) +class Paddle(object): + """ Encodes the state of the paddle in the game """ + def __init__(self, height, width, x, y): + """ Initialize a paddle with the specified height, width, + and position (x,y) """ + self.height = height + self.width = width + self.x = x + self.y = y + self.vx = 0.0 + + def update(self): + """ update the state of the paddle """ + self.x += self.vx + + def __str__(self): + return "Paddle height=%f, width=%f, x=%f, y=%f" % (self.height, + self.width, + self.x, + self.y) + + +if __name__ == '__main__': + pygame.init() + + size = (640, 480) + + model = Model(size) + print(model) + view = PyGameWindowView(model, size) + #controller = PyGameKeyboardController(model) + #controller = PyGameMouseController(model) + + running = True + while running: + for event in pygame.event.get(): + if event.type == QUIT: + running = False + #controller.handle_event(event) + model.update() + view.draw() + time.sleep(.001) + + #pygame.quit() From 284e7d9825c66e7b3d18969cfe9bd0864bd93c2f Mon Sep 17 00:00:00 2001 From: gracemontagnino Date: Thu, 8 Mar 2018 20:17:29 -0500 Subject: [PATCH 03/11] Ball object and class added. --- start.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/start.py b/start.py index 4942ef74..d95cc9f1 100644 --- a/start.py +++ b/start.py @@ -12,6 +12,7 @@ """ import pygame + from pygame.locals import * import time @@ -40,6 +41,7 @@ def draw(self): self.model.paddle2.y, self.model.paddle2.width, self.model.paddle2.height)) + pygame.draw.circle(self.screen,pygame.Color(0,0,255),(int(self.model.puck.x),int(self.model.puck.y)),self.model.puck.r) pygame.display.update() class Model(object): @@ -47,10 +49,12 @@ class Model(object): def __init__(self, size): self.paddle = Paddle(50,10,0,240) self.paddle2=Paddle(50,10,630,240) + self.puck=Puck(10,10,320,240) def update(self): """ Update the game state (currently only tracking the paddle) """ self.paddle.update() - self.paddle.update() + self.paddle2.update() + self.puck.update() def __str__(self): output_lines = [] # convert each brick to a string for outputting @@ -77,7 +81,26 @@ def __str__(self): self.width, self.x, self.y) +class Puck(object): + """ Encodes the state of the paddle in the game """ + def __init__(self, r, width, x, y): + """ Initialize a paddle with the specified height, width, + and position (x,y) """ + self.x = x + self.y = y + self.r=r + self.w=width + self.vx = 0.0 + + def update(self): + """ update the state of the paddle """ + self.x += self.vx + def __str__(self): + return "Puck x coordinate=%f, y coordinate=%f, radius=%f, width=%f" % (self.x, + self.y, + self.r, + self.w) if __name__ == '__main__': pygame.init() From fc0b3051ce81d7f0a3ac0cd72427e6d4136076b3 Mon Sep 17 00:00:00 2001 From: Quinn Date: Fri, 9 Mar 2018 13:37:34 -0500 Subject: [PATCH 04/11] This is our basic outline of classes as of 3/9 --- Classes.pdf | Bin 0 -> 23375 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Classes.pdf diff --git a/Classes.pdf b/Classes.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0ff74292cbabbba4f202724aeb6696d8077c3129 GIT binary patch literal 23375 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 Date: Fri, 9 Mar 2018 14:03:02 -0500 Subject: [PATCH 05/11] Swithced ball to square --- start.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/start.py b/start.py index d95cc9f1..7aaff9aa 100644 --- a/start.py +++ b/start.py @@ -41,7 +41,13 @@ def draw(self): self.model.paddle2.y, self.model.paddle2.width, self.model.paddle2.height)) - pygame.draw.circle(self.screen,pygame.Color(0,0,255),(int(self.model.puck.x),int(self.model.puck.y)),self.model.puck.r) + pygame.draw.rect(self.screen, + pygame.Color(255, 255, 255), + pygame.Rect(self.model.puck.height, + self.model.puck.w, + self.model.puck.x, + self.model.puck.y)) + pygame.display.update() class Model(object): @@ -49,7 +55,7 @@ class Model(object): def __init__(self, size): self.paddle = Paddle(50,10,0,240) self.paddle2=Paddle(50,10,630,240) - self.puck=Puck(10,10,320,240) + self.puck=Puck(10,10,10,10) def update(self): """ Update the game state (currently only tracking the paddle) """ self.paddle.update() @@ -83,12 +89,12 @@ def __str__(self): self.y) class Puck(object): """ Encodes the state of the paddle in the game """ - def __init__(self, r, width, x, y): + def __init__(self, height, width, x, y): """ Initialize a paddle with the specified height, width, and position (x,y) """ - self.x = x - self.y = y - self.r=r + self.height=height + self.x=x + self.y=y self.w=width self.vx = 0.0 @@ -99,7 +105,7 @@ def update(self): def __str__(self): return "Puck x coordinate=%f, y coordinate=%f, radius=%f, width=%f" % (self.x, self.y, - self.r, + self.height, self.w) if __name__ == '__main__': From 385efe1f7ab156420094855cbb198d6a86ec6b89 Mon Sep 17 00:00:00 2001 From: Quinn Date: Tue, 13 Mar 2018 18:46:36 -0400 Subject: [PATCH 06/11] fixed paddle controls --- middle.py | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 middle.py diff --git a/middle.py b/middle.py new file mode 100644 index 00000000..ca5a34e0 --- /dev/null +++ b/middle.py @@ -0,0 +1,176 @@ +# -*- coding: utf-8 -*- +""" +@author: Grace Montagnino & Quinn Kelley +""" + +import pygame +import random + +from pygame.locals import * +import time + +FPS = 50 + +class PyGameWindowView(object): + """ A view of brick breaker rendered in a Pygame window """ + def __init__(self, model, size): + """ Initialize the view with a reference to the model and the + specified game screen dimensions (represented as a tuple + containing the width and height """ + self.model = model + self.screen = pygame.display.set_mode(size) + self.screenheight = pygame.display.get_surface().get_height() + # self.screenwidth = pygame.display.get_surface().get_width() + def draw(self): + """ Draw the current game state to the screen """ + self.screen.fill(pygame.Color(0,0,0)) + + pygame.draw.rect(self.screen, + pygame.Color(255, 0, 0), + pygame.Rect(self.model.paddle.x, + self.model.paddle.y, + self.model.paddle.width, + self.model.paddle.height)) + pygame.draw.rect(self.screen, + pygame.Color(255, 255, 255), + pygame.Rect(self.model.paddle2.x, + self.model.paddle2.y, + self.model.paddle2.width, + self.model.paddle2.height)) + pygame.draw.rect(self.screen, + pygame.Color(255, 255, 255), + pygame.Rect(self.model.puck.x, + self.model.puck.y, + self.model.puck.height, + self.model.puck.width, + )) + pygame.display.update() + +class Model(object): + """ Encodes a model of the game state """ + def __init__(self, size): + self.paddle = Paddle(50,10,0,240) + self.paddle2=Paddle(50,10,630,240) + self.puck=Puck(10,10,10,10) + def update(self): + """ Update the game state (currently only tracking the paddle) """ + self.paddle.update() + self.paddle2.update() + if self.puck.x==(self.paddle.x+10) and self.puck.y==(self.paddle.y): + self.puck.vx=-self.puck.vx + self.puckvy=-self.puck.vy + if self.puck.x==(self.paddle2.x+10) and self.puck.y==(self.paddle2.y): + self.puck.vx=-self.puck.vx + self.puck.vy=-self.puck.vy + self.puck.update() + def __str__(self): + output_lines = [] + # convert each brick to a string for outputting + output_lines.append(str(self.paddle)) + # print one item per line + return "\n".join(output_lines) +class Paddle(object): + """ Encodes the state of the paddle in the game """ + def __init__(self, height, width, x, y): + """ Initialize a paddle with the specified height, width, + and position (x,y) """ + self.height = height + self.width = width + self.x = x + self.y = y + self.vx = 0 + self.vy = 0 + + def update(self): + """ update the state of the paddle & stops it from running off the screen""" + self.x += self.vx + self.y += self.vy + if self.y > 480 - self.height: + self.y = 480 - self.height + if 0 > self.y: + self.y = 0 + + + def __str__(self): + return "Paddle height=%f, width=%f, x=%f, y=%f" % (self.height, + self.width, + self.x, + self.y) + +class Puck(object): + """ Encodes the state of the paddle in the game """ + def __init__(self,x,y,height,width): + """ Initialize a paddle with the specified height, width, + and position (x,y) """ + self.height=height + self.x,self.y=320,240 + self.width=width + #to make starting v random do someting about making vx and vy random + self.vx=random.choice([-1,-.8,-.6,-.4,-.2,.2,.4,.6,.8,1]) + self.vy=random.choice([-1,-.8,-.6,-.4,-.2,.2,.4,.6,.8,1]) + self.rect = pygame.Rect(self.x, self.y, self.height, self.width) + def update(self): + """ update the state of the puck """ + if self.y>=480 or self.y<=0: + self.vy=-self.vy + if self.x>640 or self.x<=0: + self.vx= -self.vx + self.x += self.vx + self.y+=self.vy + def draw(self, surface): + self.screen = pygame.display.set_mode(size) + self.screen.fill(pygame.Color(0,0,0)) + pygame.draw.rect(screen, (55,150,55), self.rect) + self.x = self.rect.left + self.y = self.rect.top + def __str__(self): + return "Puck x coordinate=%f, y coordinate=%f, radius=%f, width=%f" % (self.x, + self.y, + self.height, + self.w) + +class PyGameKeyboardController(object): + """ Handles keyboard input for brick breaker """ + def __init__(self,model): + self.model = model + + def handle_event(self,event): + """ arrow keys + WS modify the y position of the paddles""" + pressed = pygame.key.get_pressed() + if pressed[pygame.K_UP]: + self.model.paddle2.vy = -1 + elif pressed[pygame.K_DOWN]: + self.model.paddle2.vy = 1 + else: + self.model.paddle2.vy = 0 + if pressed[pygame.K_w]: + self.model.paddle.vy = -1 + elif pressed[pygame.K_s]: + self.model.paddle.vy = 1 + else: + self.model.paddle.vy = 0 + +if __name__ == '__main__': + pygame.init() + + size = (640, 480) + + model = Model(size) + print(model) + view = PyGameWindowView(model, size) + controller = PyGameKeyboardController(model) + + running = True + while running: + for event in pygame.event.get(): + if event.type == QUIT: + running = False + controller.handle_event(event) + screen = pygame.display.set_mode(size) + screen.fill((0, 0, 0)) + model.update() + view.draw() + time.sleep(.001) +time.sleep(.001) + +pygame.quit() From cb17c3cc5d7a1a51889394ef5ed9c61e6627f3d2 Mon Sep 17 00:00:00 2001 From: gracemontagnino Date: Wed, 14 Mar 2018 19:14:21 -0400 Subject: [PATCH 07/11] Collision code added and a little scoring code, scoring code does not work, collision does. --- collision.py | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 collision.py diff --git a/collision.py b/collision.py new file mode 100644 index 00000000..74baead7 --- /dev/null +++ b/collision.py @@ -0,0 +1,189 @@ +# -*- coding: utf-8 -*- +""" +@author: Grace Montagnino & Quinn Kelley +""" + +import pygame +import random + +from pygame.locals import * +import time + +FPS = 50 + +class PyGameWindowView(object): + """ A view of brick breaker rendered in a Pygame window """ + def __init__(self, model, size): + """ Initialize the view with a reference to the model and the + specified game screen dimensions (represented as a tuple + containing the width and height """ + self.model = model + self.screen = pygame.display.set_mode(size) + self.screenheight = pygame.display.get_surface().get_height() + # self.screenwidth = pygame.display.get_surface().get_width() + def draw(self): + """ Draw the current game state to the screen """ + self.screen.fill(pygame.Color(0,0,0)) + + pygame.draw.rect(self.screen, + pygame.Color(255, 0, 0), + pygame.Rect(self.model.paddle.x, + self.model.paddle.y, + self.model.paddle.width, + self.model.paddle.height)) + pygame.draw.rect(self.screen, + pygame.Color(255, 255, 255), + pygame.Rect(self.model.paddle2.x, + self.model.paddle2.y, + self.model.paddle2.width, + self.model.paddle2.height)) + pygame.draw.rect(self.screen, + pygame.Color(255, 255, 255), + pygame.Rect(self.model.puck.x, + self.model.puck.y, + self.model.puck.height, + self.model.puck.width, + )) + pygame.display.update() + +class Model(object): + """ Encodes a model of the game state """ + def __init__(self, size): + self.paddle = Paddle(50,10,0,240) + self.paddle2=Paddle(50,10,630,240) + self.puck=Puck(10,10,10,10) + def update(self): + """ Update the game state (currently only tracking the paddle) """ + self.paddle.update() + self.paddle2.update() + if int(self.puck.x)==int(self.paddle.x)+10 and (int(self.paddle.y)-50)<=int(self.puck.y)<=(int(self.paddle.y)+50): + self.puck.vx=-self.puck.vx + self.puckvy=-self.puck.vy + if int(self.puck.x)==int(self.paddle2.x)-10 and (int(self.paddle2.y)-50)<=int(self.puck.y)<=(int(self.paddle2.y)+50): + self.puck.vx=-self.puck.vx + self.puck.vy=-self.puck.vy + self.puck.update() + + def __str__(self): + output_lines = [] + # convert each brick to a string for outputting + output_lines.append(str(self.paddle)) + # print one item per line + return "\n".join(output_lines) +class Paddle(object): + """ Encodes the state of the paddle in the game """ + def __init__(self, height, width, x, y): + """ Initialize a paddle with the specified height, width, + and position (x,y) """ + self.height = height + self.width = width + self.x = x + self.y = y + self.vx = 0 + self.vy = 0 + + def update(self): + """ update the state of the paddle & stops it from running off the screen""" + self.x += self.vx + self.y += self.vy + if self.y > 480 - self.height: + self.y = 480 - self.height + if 0 > self.y: + self.y = 0 + def __str__(self): + return "Paddle height=%f, width=%f, x=%f, y=%f" % (self.height, + self.width, + self.x, + self.y) + +class Puck(object): + """ Encodes the state of the paddle in the game """ + def __init__(self,x,y,height,width): + """ Initialize a paddle with the specified height, width, + and position (x,y) """ + self.height=height + self.x,self.y=320,240 + self.width=width + self.vx=1 + self.vy=0 + self.score1=0 + self.score2=0 + #to make starting v random do someting about making vx and vy random + #self.vx=random.choice([-.6,-.4,-.2,.2,.4,.6]) + #self.vy=random.choice([-.6,-.4,-.2,.2,.4,.6]) + self.rect = pygame.Rect(self.x, self.y, self.height, self.width) + def update(self): + """ update the state of the puck """ + if self.y>=480 or self.y<=0: + self.vy=-self.vy + if self.x>640: + self.__init__(self.x,self.y,self.height,self.width) + self.score2=self.score2+1 + font = pygame.font.Font(None, 36) + Score2=int(self.score2) + pygame.display.set_caption("Score:"+str(Score2)) + if self.x<=0: + self.__init__(self.x,self.y,self.height,self.width) + self.score1=self.score1+1 + font = pygame.font.Font(None, 36) + Score1=int(self.score1) + pygame.display.set_caption("Score:"+str(Score1)) + self.x += self.vx + self.y+=self.vy + def draw(self, surface): + self.screen = pygame.display.set_mode(size) + self.screen.fill(pygame.Color(0,0,0)) + pygame.draw.rect(screen, (55,150,55), self.rect) + self.x = self.rect.left + self.y = self.rect.top + def __str__(self): + return "Puck x coordinate=%f, y coordinate=%f, radius=%f, width=%f" % (self.x, + self.y, + self.height, + self.w) + +class PyGameKeyboardController(object): + """ Handles keyboard input for brick breaker """ + def __init__(self,model): + self.model = model + + def handle_event(self,event): + """ arrow keys + WS modify the y position of the paddles""" + pressed = pygame.key.get_pressed() + if pressed[pygame.K_UP]: + self.model.paddle2.vy = -1 + elif pressed[pygame.K_DOWN]: + self.model.paddle2.vy = 1 + else: + self.model.paddle2.vy = 0 + if pressed[pygame.K_w]: + self.model.paddle.vy = -1 + elif pressed[pygame.K_s]: + self.model.paddle.vy = 1 + else: + self.model.paddle.vy = 0 + +if __name__ == '__main__': + pygame.init() + + size = (640, 480) + + model = Model(size) + print(model) + view = PyGameWindowView(model, size) + controller = PyGameKeyboardController(model) + + running = True + while running: + for event in pygame.event.get(): + if event.type == QUIT: + running = False + controller.handle_event(event) + screen = pygame.display.set_mode(size) + screen.fill((0, 0, 0)) + model.update() + view.draw() + time.sleep(.001) +time.sleep(.001) + +pygame.quit() From 98e2a78eae3f1755f8431f5066dbe8e4222b35c6 Mon Sep 17 00:00:00 2001 From: Quinn Date: Thu, 15 Mar 2018 19:48:47 -0400 Subject: [PATCH 08/11] Implemented Scoring --- collision.py | 28 ++++---- scores.py | 193 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 209 insertions(+), 12 deletions(-) create mode 100644 scores.py diff --git a/collision.py b/collision.py index 74baead7..8254c92c 100644 --- a/collision.py +++ b/collision.py @@ -11,6 +11,8 @@ FPS = 50 + + class PyGameWindowView(object): """ A view of brick breaker rendered in a Pygame window """ def __init__(self, model, size): @@ -44,6 +46,11 @@ def draw(self): self.model.puck.height, self.model.puck.width, )) + font = pygame.font.Font(None, 36) + scoretext1=font.render("Score:"+str(self.model.puck.score1), 1,(255,255,255)) + self.screen.blit(scoretext1, (440, 50)) + scoretext2=font.render("Score:"+str(self.model.puck.score2), 1,(255,255,255)) + self.screen.blit(scoretext2, (100, 50)) pygame.display.update() class Model(object): @@ -101,6 +108,7 @@ class Puck(object): def __init__(self,x,y,height,width): """ Initialize a paddle with the specified height, width, and position (x,y) """ + #self.screen = pygame.display.set_mode(size) self.height=height self.x,self.y=320,240 self.width=width @@ -108,34 +116,30 @@ def __init__(self,x,y,height,width): self.vy=0 self.score1=0 self.score2=0 - #to make starting v random do someting about making vx and vy random - #self.vx=random.choice([-.6,-.4,-.2,.2,.4,.6]) - #self.vy=random.choice([-.6,-.4,-.2,.2,.4,.6]) + self.vx=random.choice([-.6,-.4,-.2,.2,.4,.6]) + self.vy=random.choice([-.6,-.4,-.2,.2,.4,.6]) self.rect = pygame.Rect(self.x, self.y, self.height, self.width) def update(self): """ update the state of the puck """ if self.y>=480 or self.y<=0: self.vy=-self.vy if self.x>640: - self.__init__(self.x,self.y,self.height,self.width) + self.x,self.y=320,240 self.score2=self.score2+1 - font = pygame.font.Font(None, 36) - Score2=int(self.score2) - pygame.display.set_caption("Score:"+str(Score2)) + #Score2=int(self.score2) if self.x<=0: - self.__init__(self.x,self.y,self.height,self.width) + self.x,self.y=320,240 self.score1=self.score1+1 - font = pygame.font.Font(None, 36) - Score1=int(self.score1) - pygame.display.set_caption("Score:"+str(Score1)) + #font = pygame.font.Font(None, 36) + #Score1=int(self.score1) self.x += self.vx self.y+=self.vy def draw(self, surface): - self.screen = pygame.display.set_mode(size) self.screen.fill(pygame.Color(0,0,0)) pygame.draw.rect(screen, (55,150,55), self.rect) self.x = self.rect.left self.y = self.rect.top + pygame.display.update() def __str__(self): return "Puck x coordinate=%f, y coordinate=%f, radius=%f, width=%f" % (self.x, self.y, diff --git a/scores.py b/scores.py new file mode 100644 index 00000000..8254c92c --- /dev/null +++ b/scores.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +""" +@author: Grace Montagnino & Quinn Kelley +""" + +import pygame +import random + +from pygame.locals import * +import time + +FPS = 50 + + + +class PyGameWindowView(object): + """ A view of brick breaker rendered in a Pygame window """ + def __init__(self, model, size): + """ Initialize the view with a reference to the model and the + specified game screen dimensions (represented as a tuple + containing the width and height """ + self.model = model + self.screen = pygame.display.set_mode(size) + self.screenheight = pygame.display.get_surface().get_height() + # self.screenwidth = pygame.display.get_surface().get_width() + def draw(self): + """ Draw the current game state to the screen """ + self.screen.fill(pygame.Color(0,0,0)) + + pygame.draw.rect(self.screen, + pygame.Color(255, 0, 0), + pygame.Rect(self.model.paddle.x, + self.model.paddle.y, + self.model.paddle.width, + self.model.paddle.height)) + pygame.draw.rect(self.screen, + pygame.Color(255, 255, 255), + pygame.Rect(self.model.paddle2.x, + self.model.paddle2.y, + self.model.paddle2.width, + self.model.paddle2.height)) + pygame.draw.rect(self.screen, + pygame.Color(255, 255, 255), + pygame.Rect(self.model.puck.x, + self.model.puck.y, + self.model.puck.height, + self.model.puck.width, + )) + font = pygame.font.Font(None, 36) + scoretext1=font.render("Score:"+str(self.model.puck.score1), 1,(255,255,255)) + self.screen.blit(scoretext1, (440, 50)) + scoretext2=font.render("Score:"+str(self.model.puck.score2), 1,(255,255,255)) + self.screen.blit(scoretext2, (100, 50)) + pygame.display.update() + +class Model(object): + """ Encodes a model of the game state """ + def __init__(self, size): + self.paddle = Paddle(50,10,0,240) + self.paddle2=Paddle(50,10,630,240) + self.puck=Puck(10,10,10,10) + def update(self): + """ Update the game state (currently only tracking the paddle) """ + self.paddle.update() + self.paddle2.update() + if int(self.puck.x)==int(self.paddle.x)+10 and (int(self.paddle.y)-50)<=int(self.puck.y)<=(int(self.paddle.y)+50): + self.puck.vx=-self.puck.vx + self.puckvy=-self.puck.vy + if int(self.puck.x)==int(self.paddle2.x)-10 and (int(self.paddle2.y)-50)<=int(self.puck.y)<=(int(self.paddle2.y)+50): + self.puck.vx=-self.puck.vx + self.puck.vy=-self.puck.vy + self.puck.update() + + def __str__(self): + output_lines = [] + # convert each brick to a string for outputting + output_lines.append(str(self.paddle)) + # print one item per line + return "\n".join(output_lines) +class Paddle(object): + """ Encodes the state of the paddle in the game """ + def __init__(self, height, width, x, y): + """ Initialize a paddle with the specified height, width, + and position (x,y) """ + self.height = height + self.width = width + self.x = x + self.y = y + self.vx = 0 + self.vy = 0 + + def update(self): + """ update the state of the paddle & stops it from running off the screen""" + self.x += self.vx + self.y += self.vy + if self.y > 480 - self.height: + self.y = 480 - self.height + if 0 > self.y: + self.y = 0 + def __str__(self): + return "Paddle height=%f, width=%f, x=%f, y=%f" % (self.height, + self.width, + self.x, + self.y) + +class Puck(object): + """ Encodes the state of the paddle in the game """ + def __init__(self,x,y,height,width): + """ Initialize a paddle with the specified height, width, + and position (x,y) """ + #self.screen = pygame.display.set_mode(size) + self.height=height + self.x,self.y=320,240 + self.width=width + self.vx=1 + self.vy=0 + self.score1=0 + self.score2=0 + self.vx=random.choice([-.6,-.4,-.2,.2,.4,.6]) + self.vy=random.choice([-.6,-.4,-.2,.2,.4,.6]) + self.rect = pygame.Rect(self.x, self.y, self.height, self.width) + def update(self): + """ update the state of the puck """ + if self.y>=480 or self.y<=0: + self.vy=-self.vy + if self.x>640: + self.x,self.y=320,240 + self.score2=self.score2+1 + #Score2=int(self.score2) + if self.x<=0: + self.x,self.y=320,240 + self.score1=self.score1+1 + #font = pygame.font.Font(None, 36) + #Score1=int(self.score1) + self.x += self.vx + self.y+=self.vy + def draw(self, surface): + self.screen.fill(pygame.Color(0,0,0)) + pygame.draw.rect(screen, (55,150,55), self.rect) + self.x = self.rect.left + self.y = self.rect.top + pygame.display.update() + def __str__(self): + return "Puck x coordinate=%f, y coordinate=%f, radius=%f, width=%f" % (self.x, + self.y, + self.height, + self.w) + +class PyGameKeyboardController(object): + """ Handles keyboard input for brick breaker """ + def __init__(self,model): + self.model = model + + def handle_event(self,event): + """ arrow keys + WS modify the y position of the paddles""" + pressed = pygame.key.get_pressed() + if pressed[pygame.K_UP]: + self.model.paddle2.vy = -1 + elif pressed[pygame.K_DOWN]: + self.model.paddle2.vy = 1 + else: + self.model.paddle2.vy = 0 + if pressed[pygame.K_w]: + self.model.paddle.vy = -1 + elif pressed[pygame.K_s]: + self.model.paddle.vy = 1 + else: + self.model.paddle.vy = 0 + +if __name__ == '__main__': + pygame.init() + + size = (640, 480) + + model = Model(size) + print(model) + view = PyGameWindowView(model, size) + controller = PyGameKeyboardController(model) + + running = True + while running: + for event in pygame.event.get(): + if event.type == QUIT: + running = False + controller.handle_event(event) + screen = pygame.display.set_mode(size) + screen.fill((0, 0, 0)) + model.update() + view.draw() + time.sleep(.001) +time.sleep(.001) + +pygame.quit() From 1af01f2c453687a8ef2a330c3d8051afee7e7015 Mon Sep 17 00:00:00 2001 From: Quinn Date: Fri, 16 Mar 2018 09:39:51 -0400 Subject: [PATCH 09/11] Updated intitial velocity of ball --- pong.py | 191 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 pong.py diff --git a/pong.py b/pong.py new file mode 100644 index 00000000..a9bd99c8 --- /dev/null +++ b/pong.py @@ -0,0 +1,191 @@ +# -*- coding: utf-8 -*- +""" +@author: Grace Montagnino & Quinn Kelley +""" + +import pygame +import random + +from pygame.locals import * +import time + +FPS = 50 + + + +class PyGameWindowView(object): + """ A view of brick breaker rendered in a Pygame window """ + def __init__(self, model, size): + """ Initialize the view with a reference to the model and the + specified game screen dimensions (represented as a tuple + containing the width and height """ + self.model = model + self.screen = pygame.display.set_mode(size) + self.screenheight = pygame.display.get_surface().get_height() + + def draw(self): + """ Draw the current game state to the screen """ + self.screen.fill(pygame.Color(0,0,0)) + + pygame.draw.rect(self.screen, + pygame.Color(255, 0, 0), + pygame.Rect(self.model.paddle.x, + self.model.paddle.y, + self.model.paddle.width, + self.model.paddle.height)) + pygame.draw.rect(self.screen, + pygame.Color(255, 255, 255), + pygame.Rect(self.model.paddle2.x, + self.model.paddle2.y, + self.model.paddle2.width, + self.model.paddle2.height)) + pygame.draw.rect(self.screen, + pygame.Color(255, 255, 255), + pygame.Rect(self.model.puck.x, + self.model.puck.y, + self.model.puck.height, + self.model.puck.width, + )) + font = pygame.font.Font(None, 36) + scoretext1=font.render("Score:"+str(self.model.puck.score1), 1,(255,255,255)) + self.screen.blit(scoretext1, (440, 50)) + scoretext2=font.render("Score:"+str(self.model.puck.score2), 1,(255,255,255)) + self.screen.blit(scoretext2, (100, 50)) + pygame.display.update() + +class Model(object): + """ Encodes a model of the game state """ + def __init__(self, size): + self.paddle = Paddle(50,10,0,240) + self.paddle2=Paddle(50,10,630,240) + self.puck=Puck(10,10,10,10) + def update(self): + """ Update the game state (currently only tracking the paddle) """ + self.paddle.update() + self.paddle2.update() + if int(self.puck.x)==int(self.paddle.x)+10 and (int(self.paddle.y)-50)<=int(self.puck.y)<=(int(self.paddle.y)+50): + self.puck.vx=-self.puck.vx + self.puckvy=-self.puck.vy + if int(self.puck.x)==int(self.paddle2.x)-10 and (int(self.paddle2.y)-50)<=int(self.puck.y)<=(int(self.paddle2.y)+50): + self.puck.vx=-self.puck.vx + self.puck.vy=-self.puck.vy + self.puck.update() + + def __str__(self): + output_lines = [] + # convert each brick to a string for outputting + output_lines.append(str(self.paddle)) + # print one item per line + return "\n".join(output_lines) +class Paddle(object): + """ Encodes the state of the paddle in the game """ + def __init__(self, height, width, x, y): + """ Initialize a paddle with the specified height, width, + and position (x,y) """ + self.height = height + self.width = width + self.x = x + self.y = y + self.vx = 0 + self.vy = 0 + + def update(self): + """ update the state of the paddle & stops it from running off the screen""" + self.x += self.vx + self.y += self.vy + if self.y > 480 - self.height: + self.y = 480 - self.height + if 0 > self.y: + self.y = 0 + def __str__(self): + return "Paddle height=%f, width=%f, x=%f, y=%f" % (self.height, + self.width, + self.x, + self.y) + +class Puck(object): + """ Encodes the state of the paddle in the game """ + def __init__(self,x,y,height,width): + """ Initialize a paddle with the specified height, width, + and position (x,y) """ + #self.screen = pygame.display.set_mode(size) + self.height=height + self.x,self.y=320,240 + self.width=width + self.vx=1 + self.vy=0 + self.score1=0 + self.score2=0 + self.vx=random.choice([-.8,-.6,.6,.8]) + self.vy=random.choice([-.8,-.6,.6,.8]) + self.rect = pygame.Rect(self.x, self.y, self.height, self.width) + def update(self): + """ update the state of the puck """ + if self.y>=480 or self.y<=0: + self.vy=-self.vy + if self.x>640: + self.x,self.y=320,240 + self.score2=self.score2+1 + if self.x<=0: + self.x,self.y=320,240 + self.score1=self.score1+1 + + self.x += self.vx + self.y+=self.vy + def draw(self, surface): + self.screen.fill(pygame.Color(0,0,0)) + pygame.draw.rect(screen, (55,150,55), self.rect) + self.x = self.rect.left + self.y = self.rect.top + pygame.display.update() + def __str__(self): + return "Puck x coordinate=%f, y coordinate=%f, radius=%f, width=%f" % (self.x, + self.y, + self.height, + self.w) + +class PyGameKeyboardController(object): + """ Handles keyboard input for brick breaker """ + def __init__(self,model): + self.model = model + + def handle_event(self,event): + """ arrow keys + WS modify the y position of the paddles""" + pressed = pygame.key.get_pressed() + if pressed[pygame.K_UP]: + self.model.paddle2.vy = -1 + elif pressed[pygame.K_DOWN]: + self.model.paddle2.vy = 1 + else: + self.model.paddle2.vy = 0 + if pressed[pygame.K_w]: + self.model.paddle.vy = -1 + elif pressed[pygame.K_s]: + self.model.paddle.vy = 1 + else: + self.model.paddle.vy = 0 + +if __name__ == '__main__': + pygame.init() + + size = (640, 480) + + model = Model(size) + print(model) + view = PyGameWindowView(model, size) + controller = PyGameKeyboardController(model) + + running = True + while running: + for event in pygame.event.get(): + if event.type == QUIT: + running = False + controller.handle_event(event) + screen = pygame.display.set_mode(size) + screen.fill((0, 0, 0)) + model.update() + view.draw() + time.sleep(.001) +time.sleep(.001) + +pygame.quit() From b28bfa228dc473f11c386f5e42438317e0f61885 Mon Sep 17 00:00:00 2001 From: gracemontagnino Date: Fri, 16 Mar 2018 09:58:18 -0400 Subject: [PATCH 10/11] Project write up --- Pong Write-Up.pdf | Bin 0 -> 134321 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Pong Write-Up.pdf diff --git a/Pong Write-Up.pdf b/Pong Write-Up.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a047cf5844aad582317bc02c9196c7d119c8f5e7 GIT binary patch literal 134321 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

ZZYW536dL}PJUH;1`yXTD`60=N#$d3 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 BYhVBX literal 0 HcmV?d00001 From a36558778344cbc338e1b9399f2e868914ab60b0 Mon Sep 17 00:00:00 2001 From: gracemontagnino Date: Fri, 16 Mar 2018 10:05:57 -0400 Subject: [PATCH 11/11] Final copies for Project. --- README.md | 3 +++ pong.py | 15 ++++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5f822327..27ac3617 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ # InteractiveProgramming This is the base repo for the interactive programming project for Software Design, Spring 2018 at Olin College. +To run this pong program you will need to install pygame ($pip install pygame) as well as import random into your code. +The write up can be found here: https://github.com/gracemontagnino/InteractiveProgramming/blob/master/Pong%20Write-Up.pdf (Or just by looking at the Pong Write-Up File in the git repository.) +To run this game use $python3 pong.py diff --git a/pong.py b/pong.py index a9bd99c8..57279b8d 100644 --- a/pong.py +++ b/pong.py @@ -14,7 +14,7 @@ class PyGameWindowView(object): - """ A view of brick breaker rendered in a Pygame window """ + """ A view of pong rendered in a Pygame window """ def __init__(self, model, size): """ Initialize the view with a reference to the model and the specified game screen dimensions (represented as a tuple @@ -26,7 +26,7 @@ def __init__(self, model, size): def draw(self): """ Draw the current game state to the screen """ self.screen.fill(pygame.Color(0,0,0)) - + #Draws the paddles and the puck pygame.draw.rect(self.screen, pygame.Color(255, 0, 0), pygame.Rect(self.model.paddle.x, @@ -46,6 +46,7 @@ def draw(self): self.model.puck.height, self.model.puck.width, )) + #Prints the scoring font = pygame.font.Font(None, 36) scoretext1=font.render("Score:"+str(self.model.puck.score1), 1,(255,255,255)) self.screen.blit(scoretext1, (440, 50)) @@ -60,9 +61,10 @@ def __init__(self, size): self.paddle2=Paddle(50,10,630,240) self.puck=Puck(10,10,10,10) def update(self): - """ Update the game state (currently only tracking the paddle) """ + """ Update the game state tracking the paddle and running collision code """ self.paddle.update() self.paddle2.update() + #Controls collisions between puck and paddle if int(self.puck.x)==int(self.paddle.x)+10 and (int(self.paddle.y)-50)<=int(self.puck.y)<=(int(self.paddle.y)+50): self.puck.vx=-self.puck.vx self.puckvy=-self.puck.vy @@ -93,6 +95,7 @@ def update(self): """ update the state of the paddle & stops it from running off the screen""" self.x += self.vx self.y += self.vy + #Keeps paddle on screen if self.y > 480 - self.height: self.y = 480 - self.height if 0 > self.y: @@ -120,10 +123,11 @@ def __init__(self,x,y,height,width): self.vy=random.choice([-.8,-.6,.6,.8]) self.rect = pygame.Rect(self.x, self.y, self.height, self.width) def update(self): - """ update the state of the puck """ + """ update the state of the puck and counts scoring """ if self.y>=480 or self.y<=0: self.vy=-self.vy if self.x>640: + #resets position of puck after it runs off screen self.x,self.y=320,240 self.score2=self.score2+1 if self.x<=0: @@ -133,6 +137,7 @@ def update(self): self.x += self.vx self.y+=self.vy def draw(self, surface): + """Draws the actual paddles""" self.screen.fill(pygame.Color(0,0,0)) pygame.draw.rect(screen, (55,150,55), self.rect) self.x = self.rect.left @@ -145,7 +150,7 @@ def __str__(self): self.w) class PyGameKeyboardController(object): - """ Handles keyboard input for brick breaker """ + """ Handles keyboard input for pong """ def __init__(self,model): self.model = model