File size: 4,883 Bytes
933256c
 
 
 
 
33bff5d
 
 
 
933256c
 
 
 
 
 
 
 
 
 
 
 
 
 
72c9352
 
 
 
 
 
 
933256c
 
 
 
 
 
72c9352
933256c
 
 
 
 
 
 
 
137918c
 
933256c
72c9352
933256c
 
 
 
 
 
 
 
 
 
72c9352
933256c
 
137918c
933256c
 
 
 
72c9352
 
 
 
 
 
137918c
 
72c9352
137918c
72c9352
 
 
 
 
 
 
 
137918c
72c9352
 
933256c
 
137918c
 
 
 
 
933256c
72c9352
933256c
72c9352
 
 
 
933256c
 
137918c
 
 
933256c
72c9352
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20fcd1d
72c9352
 
 
137918c
 
72c9352
137918c
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
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']
            # 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'})

@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'], 'current_coin': index})
    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 (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']})

@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', '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)