Spaces:
Sleeping
Sleeping
| from flask import Flask, render_template, jsonify, request | |
| import json | |
| import random | |
| from transformers import AutoTokenizer, AutoModelForCausalLM | |
| import torch | |
| import os | |
| # Set the TRANSFORMERS_CACHE environment variable | |
| os.environ['TRANSFORMERS_CACHE'] = '/app/cache' | |
| app = Flask(__name__) | |
| # Load initial coins | |
| with open('coins.json', 'r') as f: | |
| coins = json.load(f) | |
| # Initialize game state | |
| game_state = { | |
| 'balance': 0, | |
| 'flips_left': 1000, | |
| 'current_coin': 0 | |
| } | |
| # Load leaderboard | |
| try: | |
| with open('leaderboard.json', 'r') as f: | |
| leaderboard = json.load(f) | |
| except FileNotFoundError: | |
| leaderboard = [] | |
| # Load AI model | |
| tokenizer = AutoTokenizer.from_pretrained("TinyLlama/TinyLlama-1.1B-Chat-v1.0") | |
| model = AutoModelForCausalLM.from_pretrained("TinyLlama/TinyLlama-1.1B-Chat-v1.0") | |
| def index(): | |
| return render_template('index.html', coins=coins, game_state=game_state, leaderboard=leaderboard) | |
| def flip_coin(): | |
| if game_state['flips_left'] > 0: | |
| coin = coins[game_state['current_coin']] | |
| is_heads = random.random() < coin['winrate'] | |
| if is_heads: | |
| game_state['balance'] += coin['value'] | |
| # Apply coin bonus | |
| game_state['balance'] += coin['bonus'] | |
| game_state['flips_left'] -= 1 | |
| return jsonify({ | |
| 'result': 'H' if is_heads else 'T', | |
| 'balance': game_state['balance'], | |
| 'flips_left': game_state['flips_left'] | |
| }) | |
| return jsonify({'error': 'No flips left'}) | |
| def buy_coin(): | |
| index = int(request.json['index']) | |
| if index < len(coins) and game_state['balance'] >= coins[index]['price'] and index != game_state['current_coin']: | |
| game_state['balance'] -= coins[index]['price'] | |
| game_state['current_coin'] = index | |
| return jsonify({'success': True, 'balance': game_state['balance'], 'current_coin': index}) | |
| return jsonify({'success': False}) | |
| def generate_coin(): | |
| if game_state['balance'] < 4: | |
| return jsonify({'success': False, 'error': 'Not enough balance to generate a coin'}) | |
| prompt = """Generate a new coin for a game in JSON format with the following properties: | |
| name (a creative name for the coin), | |
| color (as a hex code), | |
| price (between 10 and 100), | |
| value (between 0.1 and 1.0), | |
| winrate (between 0.5 and 0.8), | |
| bonus (a flat $ value between 0.01 and 0.1) | |
| Example: | |
| { | |
| "name": "Lucky Clover", | |
| "color": "#2ecc71", | |
| "price": 15, | |
| "value": 0.2, | |
| "winrate": 0.65, | |
| "bonus": 0.05 | |
| } | |
| """ | |
| try: | |
| inputs = tokenizer(prompt, return_tensors="pt") | |
| with torch.no_grad(): | |
| outputs = model.generate(**inputs, max_length=300) | |
| response = tokenizer.decode(outputs[0], skip_special_tokens=True) | |
| new_coin = json.loads(response) | |
| if validate_coin(new_coin): | |
| coins.append(new_coin) | |
| with open('coins.json', 'w') as f: | |
| json.dump(coins, f) | |
| game_state['balance'] -= 4 | |
| return jsonify({'success': True, 'coin': new_coin, 'balance': game_state['balance']}) | |
| else: | |
| return jsonify({'success': False, 'error': 'Invalid coin format'}) | |
| except Exception as e: | |
| # Refund the player if coin generation fails | |
| return jsonify({'success': False, 'error': str(e), 'balance': game_state['balance']}) | |
| def game_over(): | |
| initials = request.json['initials'] | |
| score = game_state['balance'] | |
| leaderboard.append({'initials': initials, 'score': score}) | |
| leaderboard.sort(key=lambda x: x['score'], reverse=True) | |
| leaderboard = leaderboard[:10] # Keep only top 10 | |
| with open('leaderboard.json', 'w') as f: | |
| json.dump(leaderboard, f) | |
| return jsonify({'success': True}) | |
| def reset_game(): | |
| game_state['balance'] = 0 | |
| game_state['flips_left'] = 1000 | |
| game_state['current_coin'] = 0 | |
| return jsonify({'success': True}) | |
| def validate_coin(coin): | |
| required_keys = ['name', 'color', 'price', 'value', 'winrate', 'bonus'] | |
| return all(key in coin for key in required_keys) and \ | |
| isinstance(coin['name'], str) and \ | |
| isinstance(coin['color'], str) and coin['color'].startswith('#') and \ | |
| isinstance(coin['price'], (int, float)) and 10 <= coin['price'] <= 100 and \ | |
| isinstance(coin['value'], (int, float)) and 0.1 <= coin['value'] <= 1.0 and \ | |
| isinstance(coin['winrate'], (int, float)) and 0.5 <= coin['winrate'] <= 0.8 and \ | |
| isinstance(coin['bonus'], (int, float)) and 0.01 <= coin['bonus'] <= 0.1 | |
| if __name__ == '__main__': | |
| app.run(host='0.0.0.0', port=7860) |