You need to sign in or sign up before continuing.
Commit df3aafc2 authored by Anurag Kumar's avatar Anurag Kumar

Upload new file

parent 11756cb5
import numpy as np
import pygame
import sys
from tkinter import *
from tkinter import messagebox
from gui import *
import pygame_menu
#Constants
SQUARESIZE = 70
ROW = 6
COLUMN = 7
WIDTH, HEIGHT = COLUMN*SQUARESIZE, (ROW+2)*SQUARESIZE
WINDOW = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Connect 4")
FPS = 60
#Global variable
player1_score = 0
player2_score = 0
player1_name = 'Player1'
player2_name = ''
difficulty_level = 1
# score location of player-1 and player-2
SCORE_PLAYER1_X = SQUARESIZE/4
SCORE_PLAYER1_Y = SQUARESIZE/3
SCORE_PLAYER2_X = WIDTH - 2*SQUARESIZE
SCORE_PLAYER2_Y = SQUARESIZE/3
# Color used
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
LIGHTWOOD = (249, 248, 246)
WOOD=(202,164,114)
DARKWOOD=(184,134,69)
BLOODRED = (238,75,43)
#flags
player1_winner_flag = False
player2_winner_flag = False
gameExit = False
def playing_board():
'''
:return: 2D matrix of ROW*COLUMN size
'''
return (np.zeros((ROW, COLUMN)))
def is_valid_location(board, column):
'''
:param board: hold playing_board() result
:param column: represent number of column
:return: location is valid or not, It return true if location is valid otherwise return flase
'''
return board[5][column] == 0
# This function will return the row number where Square will fill after clicking
def get_block_filling_location(board, column):
'''
:param board: hold the playing_board() matrix
:param column: represent the number of column
:return: It return the row number of correspoing column where mouse is clicked
'''
for row in range(ROW):
if (board[row][column] == 0):
return row
def winner(board, squareBlock):
'''
:param board: hold the playing_board() matrix
:param squareBlock: squareBlock = 1(Blue) for player-1 , and squareBlock = 2(Yellow) for player-2.
:return: True if 4 same color consecutive block is present in row or column or diagonally
'''
# horizontal checkup
for j in range(COLUMN - 3):
for i in range(ROW):
if (board[i][j] == squareBlock and board[i][j + 1] == squareBlock and board[i][j + 2] == squareBlock and
board[i][j + 3] == squareBlock):
return True
# vertical checkup
for j in range(COLUMN):
for i in range(ROW - 3):
if (board[i][j] == squareBlock and board[i + 1][j] == squareBlock and board[i + 2][j] == squareBlock and
board[i + 3][j] == squareBlock):
return True
# Diagonal checkup
for j in range(COLUMN - 3):
for i in range(ROW - 3):
if (board[i][j] == squareBlock and board[i + 1][j + 1] == squareBlock and board[i + 2][
j + 2] == squareBlock and board[i + 3][j + 3] == squareBlock):
return True
for j in range(COLUMN - 3):
for i in range(3, ROW):
if (board[i][j] == squareBlock and board[i - 1][j + 1] == squareBlock and board[i - 2][
j + 2] == squareBlock and board[i - 3][j + 3] == squareBlock):
return True
def playerOneActionOnMouseClick(board,event):
'''
:param board: hold the playing_board() matrix
:param event: MOUSEBUTTONDOWN event
:Functinality: represent what happen when player one turn and mouse clicked
'''
global player1_score # player 1 score
global player1_winner_flag #player 1 winning flag, represent True if player one won
global gameExit
mouse_pos = event.pos[0]
column = int(mouse_pos / SQUARESIZE)
if is_valid_location(board, column):
row = get_block_filling_location(board, column)
board[row][column] = 1
print(board)
if winner(board, 1):
gameExit = True
print(board)
print("Player 1 wins")
player1_winner_flag = True
player1_score = player1_score + 1
#
def playerTwoActionOnMouseClick(board,event):
'''
:param board: hold the playing_board() matrix
:param event: MOUSEBUTTONDOWN event
This function defined what happen when player Two turn is there and mouse clicked
'''
global player2_score
global player2_winner_flag
global gameExit
mouse_pos = event.pos[0]
column = int(mouse_pos / SQUARESIZE)
if is_valid_location(board, column):
row = get_block_filling_location(board, column)
board[row][column] = 2
print(board)
if winner(board, 2):
gameExit = True
print(board)
print("Player 2 wins")
player2_winner_flag = True
player2_score = player2_score + 1
#This function defined what happen when player one won the match
def playerOneWon():
global gameExit
global player1_winner_flag
global player1_name
global difficulty_level
result = messagebox.askyesno("Restart", "{} Won !!!!\n Do you want to setPlayerMode again?".format(player1_name))
if result:
gameExit = False
player1_winner_flag = False
if difficulty_level==1:
manualPlayer()
else:
pass #Add ComputerPlayer() here for difficulty_level = 2
else:
menu()
#This function defined what happend when player Two won the match
def playerTwoWon():
global gameExit
global player2_winner_flag
global player2_name
global difficulty_level
result = messagebox.askyesno("Restart", "{} Won !!!!\n Do you want to setPlayerMode again?".format(player2_name))
if result:
gameExit = False
player2_winner_flag = False
if difficulty_level==1:
manualPlayer()
else:
pass #Add ComputerPlayer() here
else:
menu()
def manualPlayer():
'''
This function is for manual player
'''
global player1_score #score of 1st Player
global player2_score #score of 2nd Player
global player1_name #Name of 1st player
global player2_name #Name of 2nd player
global player1_winner_flag #Player1 won then this flag set True, Otherwise False
global player2_winner_flag #Player2 won then this flag set True, Otherwise False
global gameExit #This flag set True when we want to exit from game
board = playing_board() #return 2D matrix containing 0's, size is ROW * COLUMN
player2_name = 'Player2' #For manual player Player2 name is 'Player2', for computer set Player2 name is 'computer'
player_turn = 0 #Indicate the turn of player, for player1 player_turn = 0, and for player2 player_turn = 1
clock = pygame.time.Clock()
gui = Gui(WINDOW) # created object of Gui class defined in gui.py file
gui.draw_window(board) # calling draw_window method defined in gui.py file
gui.show_score(SCORE_PLAYER1_X, SCORE_PLAYER1_Y, SCORE_PLAYER2_X, SCORE_PLAYER2_Y,player1_score,player2_score,player1_name,player2_name)
while not gameExit: #Infinite loop, till player want to exit
clock.tick(FPS) #For synchronization purpose, Bcoz different computer have different speed
for event in pygame.event.get():
if event.type == pygame.QUIT: #When player click on 'X' button
Tk().wm_withdraw() #Freez the pygame window, untill user reply for confirmation window
result = messagebox.askyesno("Confirmation Window", "Are you sure want to exit?") #Confirmation window
if result:
sys.exit() #Exit from game
if event.type == pygame.MOUSEMOTION: #This even take care of mousemotion
# print(event.pos)
pygame.draw.rect(WINDOW, BLACK, (0, SQUARESIZE+1, WIDTH, SQUARESIZE)) #moving Square row (i.e Black row)
mouse_pos = event.pos[0] #calculate the X coordinate of mouse motion
if player_turn == 0:
pygame.draw.rect(WINDOW, BLUE, (mouse_pos, SQUARESIZE+1, SQUARESIZE, SQUARESIZE-1)) #If player1 turn then moving square will be BLUE
else:
pygame.draw.rect(WINDOW, YELLOW, (mouse_pos, SQUARESIZE+1, SQUARESIZE, SQUARESIZE-1)) #If player2 turn then moving square will be YELLOW
pygame.display.update() #Update the pygame window
if event.type == pygame.MOUSEBUTTONDOWN: #This even take care of mousemotion
if player_turn == 0:
playerOneActionOnMouseClick(board,event) #This function will take care when player1 click to fill then SQUARE
else:
playerTwoActionOnMouseClick(board,event) #This function will take care when player1 click to fill then SQUARE
gui.draw_window(board) #Drawing the pygame window board again and again
player_turn += 1 #Increase the Player_turn of every turn
player_turn = player_turn % 2
gui.show_score(SCORE_PLAYER1_X, SCORE_PLAYER1_Y, SCORE_PLAYER2_X, SCORE_PLAYER2_Y,player1_score,player2_score,player1_name,player2_name) #Update the score
print("Player 1 score: " + str(player1_score))
print("Player 2 score: " + str(player2_score))
if gameExit:
Tk().wm_withdraw() #Freez the pygame window and popup the tkinter confirmation window
if player1_winner_flag:
playerOneWon() #This function defines what happen when player1 won the match
if player2_winner_flag:
playerTwoWon() #This function defines what happen when player2 won the match
def set_difficulty(value, difficulty):
'''
:param value: It return value of difficult, like easy, hard
:param difficulty: It return difficulty level, for easy difficulty = 1, for hard difficulty=2
This function will be called after difficulty level set by player from menu
This function will set the difficulty level in global variable difficulty_level
'''
global difficulty_level
if difficulty==1:
difficulty_level = 1
if difficulty == 2:
difficulty_level = 2
def setPlayerMode():
'''
Get the difficulty_level then start game according to difficulty level set by player
'''
global difficulty_level #reading difficulty level, byDefault Manual means difficulty_level = 1
if difficulty_level==1:
manualPlayer()
elif difficulty_level == 2:
Tk().wm_withdraw()
result = messagebox.showinfo("showinfo", "Playing with computer not implemented")
def menu():
'''
This function is for menu
'''
global player1_name
global player2_name
menu = pygame_menu.Menu(250, 400, 'Welcome',
theme=pygame_menu.themes.THEME_BLUE)
menu.add_selector('Difficulty :', [('Manual ', 1),('Computer', 2)], onchange=set_difficulty)
menu.add_button('Play',setPlayerMode)
menu.add_button('Quit', pygame_menu.events.EXIT)
menu.mainloop(WINDOW)
if __name__ == '__main__':
pygame.init() #initialize the pygame
menu() #calling menu function
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment