Spaces:
Sleeping
Sleeping
File size: 5,226 Bytes
933256c 33bff5d 933256c 72c9352 933256c 72c9352 933256c 72c9352 933256c 72c9352 933256c 72c9352 933256c 72c9352 933256c 72c9352 933256c 72c9352 933256c 72c9352 933256c 72c9352 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
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")
@app.route('/')
def index():
return render_template('index.html', coins=coins, game_state=game_state, leaderboard=leaderboard)
@app.route('/flip', methods=['POST'])
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']
game_state['flips_left'] -= 1
# Apply coin ability if it exists
if 'ability' in coin:
ability_effect(coin['ability'])
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'})
@app.route('/buy', methods=['POST'])
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']})
return jsonify({'success': False})
@app.route('/generate_coin', methods=['POST'])
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 (higher than 10),
value (higher than 0.1),
winrate (between 0.5 and 0.8),
ability (a unique effect that modifies game state, e.g., 'add 5 flips', 'double next flip value', etc.)
Example:
{
"name": "Lucky Clover",
"color": "#2ecc71",
"price": 15,
"value": 0.2,
"winrate": 0.65,
"ability": "add 3 flips on every 10th flip"
}
"""
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)
try:
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 json.JSONDecodeError:
return jsonify({'success': False, 'error': 'Invalid JSON format'})
@app.route('/game_over', methods=['POST'])
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})
@app.route('/reset_game', methods=['POST'])
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', 'ability']
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 coin['price'] > 10 and \
isinstance(coin['value'], (int, float)) and coin['value'] > 0.1 and \
isinstance(coin['winrate'], (int, float)) and 0.5 <= coin['winrate'] <= 0.8 and \
isinstance(coin['ability'], str)
def ability_effect(ability):
# Implement ability effects here
if "add" in ability and "flips" in ability:
flips_to_add = int(ability.split()[1])
game_state['flips_left'] += flips_to_add
elif "double next flip value" in ability:
# This would need to be handled in the flip_coin function
pass
# Add more ability effects as needed
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860) |