1v1hangman / app.py
Sergidev's picture
Update app.py
9d9cc63 verified
from flask import Flask, request, jsonify, render_template
import random
import string
import time
from threading import Timer
app = Flask(__name__)
# In-memory storage for game sessions and player data
sessions = {}
waiting_session = None
def generate_session_id():
return ''.join(random.choices(string.digits, k=4))
def generate_player_id():
return ''.join(random.choices(string.ascii_uppercase + string.digits, k=6))
def create_game_session():
global waiting_session
if waiting_session:
session_id = waiting_session
waiting_session = None
else:
session_id = generate_session_id()
while session_id in sessions:
session_id = generate_session_id()
waiting_session = session_id
if session_id not in sessions:
sessions[session_id] = {
'players': [],
'words': {},
'current_player': None,
'guesses': set(),
'incorrect_guesses': 0,
'last_activity': time.time()
}
return session_id
def join_game_session(session_id):
if session_id not in sessions:
return None
player_id = generate_player_id()
sessions[session_id]['players'].append(player_id)
sessions[session_id]['last_activity'] = time.time()
return player_id
@app.route('/')
def index():
return render_template('index.html')
@app.route('/play', methods=['POST'])
def play():
session_id = create_game_session()
player_id = join_game_session(session_id)
return jsonify({
'session_id': session_id,
'player_id': player_id,
'waiting': len(sessions[session_id]['players']) == 1
})
@app.route('/check_status/<session_id>', methods=['GET'])
def check_status(session_id):
if session_id in sessions:
return jsonify({
'players': len(sessions[session_id]['players']),
'waiting': len(sessions[session_id]['players']) == 1
})
return jsonify({'error': 'Session not found'}), 404
@app.route('/submit_word', methods=['POST'])
def submit_word():
data = request.json
session_id = data['session_id']
player_id = data['player_id']
word = data['word'].lower()
if len(word) != 7:
return jsonify({'error': 'Word must be 7 letters long'}), 400
sessions[session_id]['words'][player_id] = word
sessions[session_id]['last_activity'] = time.time()
if len(sessions[session_id]['words']) == 2:
sessions[session_id]['current_player'] = sessions[session_id]['players'][0]
return jsonify({'status': 'game_started'})
return jsonify({'status': 'waiting_for_opponent'})
@app.route('/guess', methods=['POST'])
def guess():
data = request.json
session_id = data['session_id']
player_id = data['player_id']
guess = data['guess'].lower()
if player_id != sessions[session_id]['current_player']:
return jsonify({'error': 'Not your turn'}), 400
session = sessions[session_id]
session['guesses'].add(guess)
opponent = [p for p in session['players'] if p != player_id][0]
if guess not in session['words'][opponent]:
session['incorrect_guesses'] += 1
if session['incorrect_guesses'] >= 6:
return jsonify({'status': 'game_over', 'winner': opponent})
if all(letter in session['guesses'] for letter in session['words'][opponent]):
return jsonify({'status': 'game_over', 'winner': player_id})
session['current_player'] = opponent
session['last_activity'] = time.time()
return jsonify({'status': 'continue'})
@app.route('/game_state/<session_id>')
def game_state(session_id):
if session_id not in sessions:
return jsonify({'error': 'Session not found'}), 404
session = sessions[session_id]
return jsonify({
'players': session['players'],
'current_player': session['current_player'],
'guesses': list(session['guesses']),
'incorrect_guesses': session['incorrect_guesses'],
'words': {player: ''.join(['_' if letter not in session['guesses'] else letter for letter in word])
for player, word in session['words'].items()}
})
def cleanup_inactive_sessions():
current_time = time.time()
global waiting_session
for session_id in list(sessions.keys()):
if current_time - sessions[session_id]['last_activity'] > 60:
if session_id == waiting_session:
waiting_session = None
del sessions[session_id]
Timer(60, cleanup_inactive_sessions).start()
if __name__ == '__main__':
cleanup_inactive_sessions()
app.run(host='0.0.0.0', port=7860)