Compare commits
24 Commits
418420063a
...
main
Author | SHA1 | Date | |
---|---|---|---|
71e0247304 | |||
93403cdf83 | |||
a2e0504aa8 | |||
69ce05886d | |||
e53fd7236c | |||
cb8036bc6d | |||
00da6deb24 | |||
00daf53fae | |||
446ffba554 | |||
9c9db7aba9 | |||
7b486881d9 | |||
b11f77f7ef | |||
54a0f42137 | |||
d329c0f7ab | |||
8bc369c31c | |||
e8236a7e4a | |||
468237429e | |||
ab37e797de | |||
344f2e2909 | |||
bc3d3b59c9 | |||
855e53befe | |||
8dd2035167 | |||
a9b8409928 | |||
5b74ecef52 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +0,0 @@
|
|||||||
|
|
||||||
tester.py
|
|
||||||
|
1
Constants.py
Normal file
1
Constants.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
VERSION_NUMBER = "0.1"
|
51
GameLogic.py
51
GameLogic.py
@ -1,36 +1,39 @@
|
|||||||
from datetime import datetime, time
|
|
||||||
|
|
||||||
from GameMap import *
|
from GameMap import *
|
||||||
from Player import *
|
from Player import *
|
||||||
|
from Timer import *
|
||||||
|
|
||||||
class GameLogic():
|
class GameLogic():
|
||||||
|
|
||||||
def __init__(self, gameMap, playerList, winRowLength, individualMoves):
|
def __init__(self, gameMap, playerList, winRowLength=3, individualMoves=1):
|
||||||
|
|
||||||
self.gameMap = gameMap
|
self.gameMap = gameMap
|
||||||
self.playerList = playerList
|
self.playerList = playerList
|
||||||
self.winRowLength = winRowLength
|
self.winRowLength = winRowLength
|
||||||
self.individualMoves = individualMoves
|
self.individualMoves = individualMoves
|
||||||
self.score = 0
|
self.timer = Timer()
|
||||||
|
|
||||||
self.wait_for_input()
|
def check_who_win(self):
|
||||||
|
# Should have used vectors instead of committing tuples mithosis,
|
||||||
|
# but whatever, it works anyway, and if it works, why code more
|
||||||
|
# for nothing?
|
||||||
|
for player in self.playerList:
|
||||||
|
markList = player.get_markList()
|
||||||
|
# since every mark is checked, there's no need to go into
|
||||||
|
# opposite directions, so, there is (0,1) but no (0, -1).
|
||||||
|
# This twice decreases the amount of computation needed.
|
||||||
|
# maybe TODO - Optimize even more by preventing repeated calculations.
|
||||||
|
directions = ((0, 1), (1, 0), (1,1), (-1, 1))
|
||||||
|
for mark in markList:
|
||||||
|
for direction in directions:
|
||||||
|
if self._is_line(markList, mark, direction):
|
||||||
|
return player
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _is_line(self, markList, mark, direction):
|
||||||
def wait_for_input(self):
|
for i in range(1, self.winRowLength):
|
||||||
pass
|
seeked = (mark[0] + direction[0] * i, mark[1] + direction[1] * i)
|
||||||
|
if seeked in markList:
|
||||||
|
continue
|
||||||
def check_for_win(self, playerList):
|
else:
|
||||||
for player in playerList:
|
return False
|
||||||
pass
|
return True
|
||||||
|
|
||||||
def get_time(self):
|
|
||||||
return str(datetime.now() - self.startTime)
|
|
||||||
|
|
||||||
|
|
||||||
def reset_time(self):
|
|
||||||
self.startTime = datetime.now()
|
|
||||||
|
|
||||||
|
|
||||||
def get_score(self):
|
|
||||||
return self.score
|
|
||||||
|
@ -18,15 +18,17 @@ class GameMap:
|
|||||||
|
|
||||||
|
|
||||||
def add_mark(self, x, y, player):
|
def add_mark(self, x, y, player):
|
||||||
|
# Can be 0 or can be a max value, so,
|
||||||
|
# this is border-inclusive.
|
||||||
if (x <= self.max_size_x and y <= self.max_size_y) and (x >= 0 and y >= 0):
|
if (x <= self.max_size_x and y <= self.max_size_y) and (x >= 0 and y >= 0):
|
||||||
if (x, y) not in self.data:
|
if (x, y) not in self.data:
|
||||||
self.data[(x,y)] = player
|
self.data[(x,y)] = player
|
||||||
player.add_mark((x,y))
|
player.add_mark(x,y)
|
||||||
else:
|
else:
|
||||||
errorMessage = "The mark is already busy by the Player " + str(self.data[(x, y)].get_name())
|
errorMessage = "The mark is already busy by the player '" + str(self.data[(x, y)].get_name()) + "'"
|
||||||
raise KeyError(errorMessage)
|
raise KeyError(errorMessage)
|
||||||
else:
|
else:
|
||||||
errorMessage = "The mark" + str((x,y)) + " is beyond preset max values, max_x - " + str(self.max_size_x) + ", max_y - " + str(self.max_size_y)
|
errorMessage = "The mark" + str((x,y)) + " is beyond preset max values or 0, max_x - " + str(self.max_size_x) + ", max_y - " + str(self.max_size_y)
|
||||||
raise IndexError(errorMessage)
|
raise IndexError(errorMessage)
|
||||||
|
|
||||||
|
|
||||||
|
36
Interface.py
Normal file
36
Interface.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
from tkinter import *
|
||||||
|
import Constants
|
||||||
|
|
||||||
|
def generate_new_settings_window():
|
||||||
|
window = Tk()
|
||||||
|
window.geometry("400x300+300+250")
|
||||||
|
window.title("Tic-Far-Toe v{}".format(Constants.VERSION_NUMBER))
|
||||||
|
main_menu = Menu(tearoff=0)
|
||||||
|
|
||||||
|
file_menu = Menu(tearoff=0)
|
||||||
|
main_menu.add_cascade(label="File", menu=file_menu)
|
||||||
|
|
||||||
|
# TODO - Fix this button that somehow spawns a broken window with no menus
|
||||||
|
file_menu.add_command(label="New", command=generate_new_settings_window)
|
||||||
|
file_menu.add_command(label="Save")
|
||||||
|
file_menu.add_command(label="Save As...")
|
||||||
|
file_menu.add_command(label="Load", command=generate_file_select_window)
|
||||||
|
file_menu.add_separator()
|
||||||
|
file_menu.add_command(label="Exit")
|
||||||
|
|
||||||
|
|
||||||
|
edit_menu = Menu(tearoff=0)
|
||||||
|
main_menu.add_cascade(label="Edit", menu=edit_menu)
|
||||||
|
|
||||||
|
|
||||||
|
view_menu = Menu(tearoff=0)
|
||||||
|
main_menu.add_cascade(label="View", menu=view_menu)
|
||||||
|
|
||||||
|
window.config(menu=main_menu)
|
||||||
|
window.mainloop()
|
||||||
|
|
||||||
|
def generate_new_game_window():
|
||||||
|
pass
|
||||||
|
|
||||||
|
def generate_file_select_window():
|
||||||
|
pass
|
5
Main.py
5
Main.py
@ -1,2 +1,5 @@
|
|||||||
import pygame
|
from Interface import *
|
||||||
from GameLogic import *
|
from GameLogic import *
|
||||||
|
|
||||||
|
VERSION_NUMBER = "0.1"
|
||||||
|
generate_new_settings_window()
|
||||||
|
11
Player.py
11
Player.py
@ -1,16 +1,25 @@
|
|||||||
class Player():
|
class Player():
|
||||||
|
|
||||||
def __init__(self, name):
|
def __init__(self, name, personalScore=0):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.markList = []
|
self.markList = []
|
||||||
|
self.personalScore = personalScore
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "Player " + self.name + ': ' + "\n " + str(self.markList)
|
return "Player " + self.name + ': ' + "\n " + str(self.markList)
|
||||||
|
|
||||||
|
|
||||||
|
def get_markList(self):
|
||||||
|
return self.markList
|
||||||
|
|
||||||
|
|
||||||
def get_name(self):
|
def get_name(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
def add_mark(self, x, y):
|
def add_mark(self, x, y):
|
||||||
self.markList.append((x, y))
|
self.markList.append((x, y))
|
||||||
|
self.personalScore += 10
|
||||||
|
|
||||||
|
def clear_mark_list():
|
||||||
|
self.markList = []
|
18
Timer.py
Normal file
18
Timer.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
from datetime import datetime, time
|
||||||
|
|
||||||
|
class Timer():
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.startTime = 0
|
||||||
|
|
||||||
|
|
||||||
|
def has_second_passed(self):
|
||||||
|
return self.get_time() > 1
|
||||||
|
|
||||||
|
|
||||||
|
def get_time(self):
|
||||||
|
return str(datetime.now() - self.startTime)
|
||||||
|
|
||||||
|
|
||||||
|
def reset_time(self):
|
||||||
|
self.startTime = datetime.now()
|
27
tester.py
Normal file
27
tester.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
from GameLogic import *
|
||||||
|
from unittest import *
|
||||||
|
|
||||||
|
gmap = GameMap(10, 10)
|
||||||
|
player1 = Player("first")
|
||||||
|
player2 = Player("second")
|
||||||
|
playerList = [player1, player2]
|
||||||
|
|
||||||
|
gmap.add_mark(4, 4, player1)
|
||||||
|
gmap.add_mark(4, 5, player1)
|
||||||
|
gmap.add_mark(4, 6, player1)
|
||||||
|
gmap.add_mark(10, 10, player2)
|
||||||
|
|
||||||
|
gmap = gameMap(5, 5)
|
||||||
|
print(gmap)
|
||||||
|
print(player1)
|
||||||
|
print(player2)
|
||||||
|
|
||||||
|
glogic = GameLogic(GameMap, playerList)
|
||||||
|
print(glogic.check_who_win())
|
||||||
|
# AAAAAAAAAAAA I AM GOING INSANE OVER THIS BULLSHIELD
|
||||||
|
|
||||||
|
# Outdated this message is, I will just work with tuple[0] and tuple[1].
|
||||||
|
# ----
|
||||||
|
# Anyway, a reminder when you'll get to the web - figure out how to manipulate
|
||||||
|
# tuples (or replace them altogether) so they'll behave like math matrices -
|
||||||
|
# as in, (4, 4) * 2 -> (8, 8), and as in, (4, 4) + (-2, 3) -> (2, 7)
|
Reference in New Issue
Block a user