regenerates mines and snacks

may still try to add more difficulty and update any docstrings and old commented code
This commit is contained in:
Chris Mekelburg 2024-12-08 21:31:20 -05:00
parent 729e1085ee
commit 947f9647ba
16 changed files with 208 additions and 27 deletions

Binary file not shown.

View File

@ -2,16 +2,19 @@ from man import Man
from snack import Snack from snack import Snack
from mine import Mine from mine import Mine
from random import shuffle from random import shuffle
from retro import game
class Board: class Board:
display = False
snack=False
mine=False
def __init__(self,width, height,num_snacks,num_mines): def __init__(self,width, height,num_snacks,num_mines):
self.width = width self.width = width
self.height = height self.height = height
self.num_snacks = num_snacks self.num_snacks = num_snacks
self.num_mines = num_mines self.num_mines = num_mines
def get_agents(self,num_snacks,num_mines): def get_agents(self,num_snacks,num_mines):
all_positions = self.get_all_positions() all_positions = self.get_all_positions()
@ -19,8 +22,51 @@ class Board:
man= [Man(all_positions[0])] man= [Man(all_positions[0])]
snacks = [Snack(p) for p in all_positions[1:(num_snacks+1)]] snacks = [Snack(p) for p in all_positions[1:(num_snacks+1)]]
mines = [Mine(p) for p in all_positions[(num_snacks + 2):(num_snacks + num_mines +2)]] mines = [Mine(p) for p in all_positions[(num_snacks + 2):(num_snacks + num_mines +2)]]
agents = man + snacks + mines agents = man + snacks + mines + [self]
return agents return agents
def play_turn(self,game):
game.log(game.turn_number)
while self.game_needs_snacks(game):
self.add_snack(game)
while self.game_needs_mines(game):
self.add_mine(game)
def add_mine(self,game):
all_positions=self.get_all_positions()
shuffle(all_positions)
index =0
while not game.is_empty(all_positions[index]):
index = index + 1
mine = Mine(all_positions[index])
game.add_agent(mine)
def count_mines(self,game):
mines= [a for a in game.agents if a.mine]
return len(mines)
def game_needs_mines(self,game):
return self.count_mines(game) < self.num_mines
def add_snack(self,game):
all_positions=self.get_all_positions()
shuffle(all_positions)
index =0
while not game.is_empty(all_positions[index]):
index = index + 1
snack = Snack(all_positions[index])
game.add_agent(snack)
def count_snacks(self,game):
snacks= [a for a in game.agents if a.snack]
return len(snacks)
def game_needs_snacks(self,game):
return self.count_snacks(game) < self.num_snacks
''' '''
def get_agents(self,num_snacks,num_mines): def get_agents(self,num_snacks,num_mines):
man = self.get_man(num_snacks,num_mines) man = self.get_man(num_snacks,num_mines)

View File

@ -17,7 +17,8 @@ direction_vectors = {
class Man: class Man:
character = "&" #try google asci full table?, character = "&" #try google asci full table?,
color = "blue" color = "blue"
#name = "man" snack=False
mine=False
def __init__(self,position): def __init__(self,position):
self.position = position self.position = position
@ -50,7 +51,6 @@ class Man:
if obstacle.snack: if obstacle.snack:
game.state['Score'] += 1 game.state['Score'] += 1
game.remove_agent(agents[0]) game.remove_agent(agents[0])
self.generate_new_snack()
else: else:
game.state['Score'] -= 10 game.state['Score'] -= 10
game.remove_agent(agents[0]) game.remove_agent(agents[0])
@ -61,28 +61,16 @@ class Man:
else: else:
self.position = future_position self.position = future_position
'''Indicates what happens when the game is over.'''
def die(self,game): def die(self,game):
'''Indicates what happens when the game is over.'''
game.state["message"] = "Game Over" game.state["message"] = "Game Over"
self.color = "black" self.color = "black"
game.end() game.end()
def get_all_positions(self):
positions=[]
for i in range(width):
for j in range(height):
positions.append((i,j))
return positions
'''issue here, is_empty is not generating a coordinate positon,
but I am not sure why it is not'''
def generate_new_snack(self):
all_positions=self.get_all_positions()
shuffle(all_positions)
index =0
while Game.is_empty(all_positions[index]) == False:
index = index + 1
Snack(all_positions[index])
''' '''
def __init__(self, position): def __init__(self, position):
self.position = position self.position = position

28
gamefiles/mine counter.py Normal file
View File

@ -0,0 +1,28 @@
MAX_MINES = 50
LEVELS = [
[5, 10],
[50, 20],
[75, 30],
[100, 40]
]
def num_mines(score):
for limit, n in LEVELS:
if score < limit:
return n
return MAX_MINES
'''
if score < 5:
num_mines = 10
if 10 <= score <50:
num_mines = 20
if 50 <= score <75:
num_mines = 30
if 75 <= score <100:
num_mines = 40
#else:
#num_mines = 50
return num_mines
'''

View File

@ -2,6 +2,7 @@ class Mine:
character = "*" character = "*"
color = "green" color = "green"
snack=False snack=False
mine=True
def __init__(self,position): def __init__(self,position):

28
gamefiles/minecounter.py Normal file
View File

@ -0,0 +1,28 @@
MAX_MINES = 50
LEVELS = [
[5, 10],
[50, 20],
[75, 30],
[100, 40]
]
def num_mines(score):
for limit, n in LEVELS:
if score < limit:
return n
return MAX_MINES
'''
if score < 5:
num_mines = 10
if 10 <= score <50:
num_mines = 20
if 50 <= score <75:
num_mines = 30
if 75 <= score <100:
num_mines = 40
#else:
#num_mines = 50
return num_mines
'''

View File

@ -1,7 +1,6 @@
from retro.game import Game from retro.game import Game
from board import Board from board import Board
from minecounter import num_mines
from score import num_mines
width = 25 width = 25
height = 25 height = 25
@ -14,6 +13,6 @@ board = Board(width,height,num_snacks,num_mines)
game = Game( game = Game(
board.get_agents(num_snacks, num_mines), board.get_agents(num_snacks, num_mines),
state, state,
board_size = (width, height) board_size = (width, height),debug=True
) )
game.play() game.play()

View File

@ -1,6 +1,19 @@
MAX_MINES = 50
LEVELS = [
[5, 10],
[50, 20],
[75, 30],
[100, 40]
]
def num_mines(score): def num_mines(score):
for limit, n in LEVELS:
if score < limit:
return n
return MAX_MINES
'''
if score < 5: if score < 5:
num_mines = 10 num_mines = 10
if 10 <= score <50: if 10 <= score <50:
@ -12,4 +25,4 @@ def num_mines(score):
#else: #else:
#num_mines = 50 #num_mines = 50
return num_mines return num_mines
'''

View File

@ -2,6 +2,7 @@ class Snack:
character = "o" character = "o"
color = "red" color = "red"
snack=True snack=True
mine=False
def __init__(self,position): def __init__(self,position):

80
poetry.lock generated
View File

@ -1,7 +1,83 @@
# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
package = []
[[package]]
name = "ansicon"
version = "1.89.0"
description = "Python wrapper for loading Jason Hood's ANSICON"
optional = false
python-versions = "*"
files = [
{file = "ansicon-1.89.0-py2.py3-none-any.whl", hash = "sha256:f1def52d17f65c2c9682cf8370c03f541f410c1752d6a14029f97318e4b9dfec"},
{file = "ansicon-1.89.0.tar.gz", hash = "sha256:e4d039def5768a47e4afec8e89e83ec3ae5a26bf00ad851f914d1240b444d2b1"},
]
[[package]]
name = "blessed"
version = "1.20.0"
description = "Easy, practical library for making terminal apps, by providing an elegant, well-documented interface to Colors, Keyboard input, and screen Positioning capabilities."
optional = false
python-versions = ">=2.7"
files = [
{file = "blessed-1.20.0-py2.py3-none-any.whl", hash = "sha256:0c542922586a265e699188e52d5f5ac5ec0dd517e5a1041d90d2bbf23f906058"},
{file = "blessed-1.20.0.tar.gz", hash = "sha256:2cdd67f8746e048f00df47a2880f4d6acbcdb399031b604e34ba8f71d5787680"},
]
[package.dependencies]
jinxed = {version = ">=1.1.0", markers = "platform_system == \"Windows\""}
six = ">=1.9.0"
wcwidth = ">=0.1.4"
[[package]]
name = "jinxed"
version = "1.3.0"
description = "Jinxed Terminal Library"
optional = false
python-versions = "*"
files = [
{file = "jinxed-1.3.0-py2.py3-none-any.whl", hash = "sha256:b993189f39dc2d7504d802152671535b06d380b26d78070559551cbf92df4fc5"},
{file = "jinxed-1.3.0.tar.gz", hash = "sha256:1593124b18a41b7a3da3b078471442e51dbad3d77b4d4f2b0c26ab6f7d660dbf"},
]
[package.dependencies]
ansicon = {version = "*", markers = "platform_system == \"Windows\""}
[[package]]
name = "retro-games"
version = "1.1.0"
description = "A simple framework for Terminal-based games"
optional = false
python-versions = "<4.0,>=3.10"
files = [
{file = "retro_games-1.1.0-py3-none-any.whl", hash = "sha256:c621117e4dd528b1e4870d897d00c4365566ab3ba965177e3996ed3c889dd9f8"},
{file = "retro_games-1.1.0.tar.gz", hash = "sha256:2167b574f42fe1e739b7c9ec75e98a9b76df42e2166376b85559291b3dc58f82"},
]
[package.dependencies]
blessed = ">=1.20.0,<2.0.0"
[[package]]
name = "six"
version = "1.17.0"
description = "Python 2 and 3 compatibility utilities"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
files = [
{file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
{file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
]
[[package]]
name = "wcwidth"
version = "0.2.13"
description = "Measures the displayed width of unicode strings in a terminal"
optional = false
python-versions = "*"
files = [
{file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"},
{file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"},
]
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.10" python-versions = "^3.10"
content-hash = "53f2eabc9c26446fbcc00d348c47878e118afc2054778c3c803a0a8028af27d9" content-hash = "2bcb10c06051310c2d2ce4f7b65ed30705765ffe70121fe098b07e32ef9307bc"

View File

@ -7,6 +7,7 @@ readme = "README.md"
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.10" python = "^3.10"
retro-games = "^1.1.0"
[build-system] [build-system]