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)