Demoscenes

Pong


    import tkinter as tk

# Constants
WIDTH, HEIGHT = 800, 600
PADDLE_WIDTH, PADDLE_HEIGHT = 15, 100
BALL_SIZE = 10
WIN_SCORE = 7

class Paddle:
    def __init__(self, canvas, x, y, up_key, down_key, color):
        self.canvas = canvas
        self.x = x
        self.y = y
        self.up_key = up_key
        self.down_key = down_key
        self.speed = 7
        self.color = color
        self.id = canvas.create_rectangle(x, y, x + PADDLE_WIDTH, y + PADDLE_HEIGHT, fill=color)
        self.moving_up = False
        self.moving_down = False

    def update(self):
        if self.moving_up:
            self.canvas.move(self.id, 0, -self.speed)
        elif self.moving_down:
            self.canvas.move(self.id, 0, self.speed)

        coords = self.canvas.coords(self.id)
        if coords[1] < 0:
            self.canvas.move(self.id, 0, -coords[1])
        if coords[3] > HEIGHT:
            self.canvas.move(self.id, 0, HEIGHT - coords[3])

    def reset(self):
        self.canvas.coords(self.id, self.x, self.y, self.x + PADDLE_WIDTH, self.y + PADDLE_HEIGHT)

class Ball:
    def __init__(self, canvas):
        self.canvas = canvas
        self.id = canvas.create_oval(0, 0, BALL_SIZE, BALL_SIZE, fill="white")
        self.canvas.move(self.id, WIDTH // 2, HEIGHT // 2)
        self.speed_x = 4
        self.speed_y = 0.1

    def update(self):
        self.canvas.move(self.id, self.speed_x, self.speed_y)
        coords = self.canvas.coords(self.id)
        if coords[1] <= 0 or coords[3] >= HEIGHT:
            self.speed_y *= -1

    def reset(self, direction=1):
        self.canvas.coords(self.id, WIDTH // 2, HEIGHT // 2, WIDTH // 2 + BALL_SIZE, HEIGHT // 2 + BALL_SIZE)
        self.speed_x = 4 * direction
        self.speed_y = 0.1

    def stop(self):
        self.speed_x = 0
        self.speed_y = 0

    def hit_paddle(self, paddle):
        ball_coords = self.canvas.coords(self.id)
        paddle_coords = self.canvas.coords(paddle.id)

        if (ball_coords[2] >= paddle_coords[0] and ball_coords[0] <= paddle_coords[2] and
            ball_coords[3] >= paddle_coords[1] and ball_coords[1] <= paddle_coords[3]):
            self.speed_x *= -1.1
            hit_pos = ((ball_coords[1] + ball_coords[3]) / 2 - (paddle_coords[1] + paddle_coords[3]) / 2) / 50
            self.speed_y = hit_pos * 3
            return True
        return False

# Main Game Class
class PongGame:
    def __init__(self, root):
        self.root = root
        self.root.title("Pong")

        self.canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="black")
        self.canvas.pack()

        self.left_score = 0
        self.right_score = 0

        self.left_paddle = Paddle(self.canvas, 30, 250, "w", "s", "red")
        self.right_paddle = Paddle(self.canvas, WIDTH - 45, 250, "Up", "Down", "blue")
        self.ball = Ball(self.canvas)

        self.score_text = self.canvas.create_text(200, 100, text="0", fill="white", font=("Courier", 36))
        self.score_text2 = self.canvas.create_text(600, 100, text="0", fill="white", font=("Courier", 36))

        self.win_text = None
        self.rematch_button = None

        self.bind_keys()
        self.update()

    def bind_keys(self):
        self.root.bind("", self.key_press)
        self.root.bind("", self.key_release)

    def key_press(self, event):
        if event.keysym == self.left_paddle.up_key:
            self.left_paddle.moving_up = True
        elif event.keysym == self.left_paddle.down_key:
            self.left_paddle.moving_down = True
        elif event.keysym == self.right_paddle.up_key:
            self.right_paddle.moving_up = True
        elif event.keysym == self.right_paddle.down_key:
            self.right_paddle.moving_down = True
        elif event.keysym == "Return":
            if self.left_score == WIN_SCORE or self.right_score == WIN_SCORE:
                self.reset_game()

    def key_release(self, event):
        if event.keysym == self.left_paddle.up_key:
            self.left_paddle.moving_up = False
        elif event.keysym == self.left_paddle.down_key:
            self.left_paddle.moving_down = False
        elif event.keysym == self.right_paddle.up_key:
            self.right_paddle.moving_up = False
        elif event.keysym == self.right_paddle.down_key:
            self.right_paddle.moving_down = False

    def update(self):
        if self.left_score < WIN_SCORE and self.right_score < WIN_SCORE:
            self.left_paddle.update()
            self.right_paddle.update()
            self.ball.update()

            if self.ball.hit_paddle(self.left_paddle) or self.ball.hit_paddle(self.right_paddle):
                pass

            ball_coords = self.canvas.coords(self.ball.id)
            if ball_coords[0] <= 0:
                self.right_score += 1
                self.ball.reset(direction=1)
                self.left_paddle.reset()
                self.right_paddle.reset()
            elif ball_coords[2] >= WIDTH:
                self.left_score += 1
                self.ball.reset(direction=-1)
                self.left_paddle.reset()
                self.right_paddle.reset()

            self.canvas.itemconfig(self.score_text, text=str(self.left_score))
            self.canvas.itemconfig(self.score_text2, text=str(self.right_score))

            if self.left_score == WIN_SCORE:
                self.win_text = self.canvas.create_text(250, 200, text="RED WINS!", fill="red", font=("Courier", 30))
                self.show_rematch()
                self.ball.stop()
            elif self.right_score == WIN_SCORE:
                self.win_text = self.canvas.create_text(550, 200, text="BLUE WINS!", fill="blue", font=("Courier", 30))
                self.show_rematch()
                self.ball.stop()

        self.root.after(16, self.update)  # roughly 60fps

    def show_rematch(self):
        self.rematch_button = self.canvas.create_text(WIDTH//2, 300, text="Rematch? Press ENTER",
                                                      fill="purple", font=("Courier", 20))

    def reset_game(self):
        self.left_score = 0
        self.right_score = 0
        self.ball.reset()
        self.left_paddle.reset()
        self.right_paddle.reset()
        self.canvas.itemconfig(self.score_text, text="0")
        self.canvas.itemconfig(self.score_text2, text="0")
        if self.win_text:
            self.canvas.delete(self.win_text)
        if self.rematch_button:
            self.canvas.delete(self.rematch_button)


# Start the game
root = tk.Tk()
game = PongGame(root)
root.mainloop()
    

Essays

Systems Engineering Essay

Systems Engineering

Computer Architecture Essay

Computer 1 Computer 2

OS Essay

OS

Game of Life

Classic Game of Life



import time
import os
import random
percent = int(input("What percent of cells would you like to start off alive?"))
rows = int(input("How large would you like the grid to be? (10-50)"))
prob = percent/100
grid = []
def makeGrid(grid):
    for i in range(rows):
        row = []
        for j in range(rows):
            if random.random() < prob:
                row.append(1)
            else: 
                row.append(0)
        grid.append(row)
    for row in grid:
        print(''.join('██' if cell == 1 else '  ' for cell in row))

def printGrid(grid):
    for row in grid:
        print(''.join('██' if cell == 1 else '  ' for cell in row))

def count_neighbors(grid, x, y):
    neighbors = 0
    for i in [-1, 0, 1]:
        for j in [-1, 0, 1]:
            if i == 0 and j == 0:
                continue
            neighbor_x, neighbor_y = x + i, y + j
            if 0 <= neighbor_x < rows and 0 <= neighbor_y < rows:
                neighbors += grid[neighbor_x][neighbor_y]
    return neighbors
def next_generation(grid):
    new_grid = []
    for x in range(rows):
        new_row = []
        for y in range(rows):
            neighbors = count_neighbors(grid, x, y)
            if grid[x][y] == 1:  
                if neighbors < 2 or neighbors > 3:
                    new_row.append(0)  
                else:
                    new_row.append(1)  
            else:  
                if neighbors == 3:
                    new_row.append(1)
                else:
                    new_row.append(0)
        new_grid.append(new_row)
    return new_grid
makeGrid(grid)
while True:
    os.system('clear')
    printGrid(grid)
    grid = next_generation(grid)
    time.sleep(0.2)

    

Green Game of Life(+ other minor changes)


    import time
import os
import random

class GameOfLife:
    def __init__(self, rows, percent_alive, delay=1):
        self.rows = rows
        self.percent_alive = percent_alive
        self.prob = percent_alive / 100
        self.delay = delay
        self.grid = self.make_grid()

    def make_grid(self):
        grid = []
        for i in range(self.rows):
            row = []
            for j in range(self.rows):
                if random.random() < self.prob:
                    row.append(1)
                else:
                    row.append(0)
            grid.append(row)
        return grid

    def print_grid(self):
        for row in self.grid:
            print(''.join('\033[42m  \033[0m' if cell == 1 else '  ' for cell in row))

    def count_neighbors(self, x, y):
        neighbors = 0
        for i in [-1, 0, 1]:
            for j in [-1, 0, 1]:
                if i == 0 and j == 0:
                    continue
                nx, ny = x + i, y + j
                if 0 <= nx < self.rows and 0 <= ny < self.rows:
                    neighbors += self.grid[nx][ny]
        return neighbors

    def next_generation(self):
        new_grid = []
        for x in range(self.rows):
            new_row = []
            for y in range(self.rows):
                neighbors = self.count_neighbors(x, y)
                if self.grid[x][y] == 1:
                    if neighbors < 2 or neighbors > 3:
                        new_row.append(0)
                    else:
                        new_row.append(1)
                else:
                    if neighbors == 3:
                        new_row.append(1)
                    else:
                        new_row.append(0)
            new_grid.append(new_row)
        self.grid = new_grid

    def run(self):
        while True:
            os.system('clear')
            self.print_grid()
            self.next_generation()
            time.sleep(self.delay)
if __name__ == "__main__":
    percent = int(input("What percent of cells would you like to start off alive? "))
    rows = int(input("How large would you like the grid to be? (10–50) "))
    delay = float(input("How many seconds between updates? (e.g. 0.5, 1) "))

    game = GameOfLife(rows, percent, delay)
    game.run()
    

Rainbow of Life


import time
import os
import random

class GameOfLife:
    def __init__(self, rows, percent_alive, delay=1):
        self.rows = rows
        self.percent_alive = percent_alive
        self.prob = percent_alive / 100
        self.delay = delay
        self.grid = self.make_grid()

    def random_color(self):
        return random.choice([(255, 0, 0), (0, 255, 0), (0, 0, 255)])

    def make_grid(self):

        grid = []
        for i in range(self.rows):
            row = []
            for j in range(self.rows):
                if random.random() < self.prob:
                    row.append([1, self.random_color()])  # alive with random color
                else:
                    row.append([0, (0, 0, 0)])  # dead, black
            grid.append(row)
        return grid

    def print_grid(self):
        for row in self.grid:
            line = ''
            for cell in row:
                alive, color = cell
                if alive:
                    r, g, b = color
                    line += f'\033[48;2;{r};{g};{b}m  \033[0m
                else:
                    line += '  '
            print(line)

    def count_neighbors(self, x, y):
        neighbors = 0
        color_sum = [0, 0, 0]
        for i in [-1, 0, 1]:
            for j in [-1, 0, 1]:
                if i == 0 and j == 0:
                    continue
                nx, ny = x + i, y + j
                if 0 <= nx < self.rows and 0 <= ny < self.rows:
                    alive, color = self.grid[nx][ny]
                    if alive:
                        neighbors += 1
                        color_sum[0] += color[0]
                        color_sum[1] += color[1]
                        color_sum[2] += color[2]

        if neighbors > 0:
            avg_color = tuple(min(255, max(0, c // neighbors)) for c in color_sum)
        else:
            avg_color = (0, 0, 0)

        return neighbors, avg_color

    def next_generation(self):
        new_grid = []
        for x in range(self.rows):
            new_row = []
            for y in range(self.rows):
                alive, color = self.grid[x][y]
                neighbors, avg_color = self.count_neighbors(x, y)
                if alive:
                    if neighbors < 2 or neighbors > 3:
                        new_row.append([0, (0, 0, 0)])  # dies
                    else:
                        new_row.append([1, color])  # stays alive, keep color
                else:
                    if neighbors == 3:
                        new_row.append([1, avg_color])  # born with mixed color
                    else:
                        new_row.append([0, (0, 0, 0)])  # stays dead
            new_grid.append(new_row)
        self.grid = new_grid

    def run(self):
        while True:
            os.system('clear')
            self.print_grid()
            self.next_generation()
            time.sleep(self.delay)

# ---- Run the Game ----
if __name__ == "__main__":
    percent = int(input("What percent of cells would you like to start off alive? "))
    rows = int(input("How large would you like the grid to be? (10–50) "))
    delay = float(input("How many seconds between updates? (e.g. 0.5, 1) "))

    game = GameOfLife(rows, percent, delay)
    game.run()
        
    

Videos

Industry Matrix