pybog
Differences
This shows you the differences between two versions of the page.
| pybog [2023/11/10 04:16] – created appledog | pybog [2023/11/10 04:28] (current) – appledog | ||
|---|---|---|---|
| Line 71: | Line 71: | ||
| == bog.py | == bog.py | ||
| This is where all the real magic happens. This could have been a class, but, since it's just a small, specialized project, I decided to write it using functions for kicks. Instead of self, I just use a bog variable. It's basically the same as if I wrote it like a class. | This is where all the real magic happens. This could have been a class, but, since it's just a small, specialized project, I decided to write it using functions for kicks. Instead of self, I just use a bog variable. It's basically the same as if I wrote it like a class. | ||
| + | |||
| + | If this seems a bit hard to follow, please keep in mind it is only about 50 lines of code, if you don't count function definitions! | ||
| < | < | ||
| + | import random | ||
| + | |||
| + | # Define bog size (5x5). | ||
| + | bog_x = 5 | ||
| + | bog_y = 5 | ||
| + | |||
| + | # Make a new bog game board. It's a 2-d array (list) of characters. | ||
| + | def make_bog(): | ||
| + | bog = [[" " for x in range(bog_x)] for y in range(bog_y)] | ||
| + | return bog | ||
| + | |||
| + | # display the bog. Some may say this doesn' | ||
| + | def print_bog(bog): | ||
| + | for row in bog: | ||
| + | print(" | ||
| + | |||
| + | # fill the remaining empty spaces with letters. | ||
| + | def fill_bog(bog): | ||
| + | letters = ' | ||
| + | for y in range(bog_y): | ||
| + | for x in range(bog_x): | ||
| + | # If it's an empty space replace it with a random letter. | ||
| + | if bog[y][x] == ' ': | ||
| + | bog[y][x] = random.choice(letters) | ||
| + | |||
| + | # Try to put a word on the board a certain number of times. | ||
| + | def try_put_bog(bog, | ||
| + | while n > 0: | ||
| + | if put_bog(bog, | ||
| + | return True | ||
| + | else: | ||
| + | n = n - 1 | ||
| + | |||
| + | return False | ||
| + | |||
| + | # Try to put a word on the board in a random position. | ||
| + | # This will take two passes. One to test and one to put. | ||
| + | def put_bog(bog, | ||
| + | # Choose a random spot and a random direction for the word. | ||
| + | x = random.randint(0, | ||
| + | y = random.randint(0, | ||
| + | d = random.randint(1, | ||
| + | |||
| + | # Set dx and dy for ' | ||
| + | if d == 1: | ||
| + | # go up | ||
| + | dx = 0 | ||
| + | dy = -1 | ||
| + | elif d == 2: | ||
| + | # go to the right | ||
| + | dx = 1 | ||
| + | dy = 0 | ||
| + | else: | ||
| + | # go down | ||
| + | dx = 0 | ||
| + | dy = 1 | ||
| + | |||
| + | # PASS 1: Test if we can add the word | ||
| + | tx = x # test-x | ||
| + | ty = y # test-y | ||
| + | |||
| + | for i in range(len(word)): | ||
| + | # Fail because outside | ||
| + | if tx < 0 or ty < 0 or tx >= bog_x or ty >= bog_y: | ||
| + | return False | ||
| + | |||
| + | # Fail because there is already a letter. | ||
| + | if bog[ty][tx] != ' ': | ||
| + | return False | ||
| + | |||
| + | tx = tx + dx #step to next letter position | ||
| + | ty = ty + dy #step to next letter position | ||
| + | |||
| + | # Fall-through pass 2: add the word. | ||
| + | # For every letter, step through and add it. | ||
| + | for c in word: | ||
| + | bog[y][x] = c | ||
| + | x = x + dx | ||
| + | y = y + dy | ||
| + | |||
| + | # Since we added the word, return true. | ||
| + | return True | ||
| </ | </ | ||
| + | |||
| + | With this, the game is finished. It's a very simple concept. | ||
| + | |||
| + | == Commentary | ||
| + | The big logic here is how the words are put on the board. Using dx and dy to walk accross a 2d landscape is a common theme. fill_bog() is the other interesting function (to a point), with the rest of the code being rather ordinary. | ||
| + | |||
| + | What most people are intened to remember from this example is how the list was filtered, "list = [x for x in list if try_put_bog(bog, | ||
| + | |||
| + | If your program plans to instantiate a class and then call it, and the class is only ever intended to be instantiated or created once, it is highly likely it does not need to be a class. If there is no overhead, then the use of a class is fine. But plesae do not use this archetype to promote callback-based programming. That just sucks, | ||
pybog.1699589812.txt.gz · Last modified: 2023/11/10 04:16 by appledog
