@Vadimganin

Почему неправильно страбатывают матемитические действия в SQLite3?

Я сделал казино с базой данных и когда я играю в него, программа считает коины неправильно. Почему?

Код:
import sqlite3
import hashlib
from random import randint

def md5sum(value):
	return hashlib.md5(value.encode()).hexdigest()

with sqlite3.connect('database.db') as db:
	cursor = db.cursor()

	tables = """
	CREATE TABLE IF NOT EXISTS users(
			id INTEGER PRIMARY KEY,
			name VARCHAR(30),
			age INTEGER(3),
			balance INTEGER NOT NULL DEFAULT 2000,
			login VARCHAR(15),
			password VARCHAR(20)
	);
	CREATE TABLE IF NOT EXISTS casino(
			name VARCHAR(50),
			description TEXT(300),
			balance BIGINT NOT NULL DEFAULT 20000
	)
	"""

	cursor.executescript(tables)

def registration():
	print('РЕГИСТРАЦИЯ\n')

	name = input('Имя: ')
	age = input('Возраст: ')
	login = input('Придумайте логин: ')
	password = input('Придумайте пароль: ')

	try:
		db = sqlite3.connect('database.db')
		cursor = db.cursor()
		db.create_function('md5', 1, md5sum)

		cursor.execute("SELECT login FROM users WHERE login = ?", [login])
		if cursor.fetchone() is None:
			values = [name, age, login, password]

			cursor.execute("INSERT INTO users(name, age, login, password) VALUES(?, ?, ?, md5(?))", values)
			db.commit()

			print('Вы успешно зарегистрированы! Теперь войдите в систему.')
			log_in()
		else:
			print('Пользователь с таким логином уже существует!')
			registration()

	except sqlite3.Error as e:
		print('Ошибка!', e)
	finally:
		cursor.close()
		db.close()

def log_in():
	print('ВХОД В СИСТЕМУ\n')

	login = input('Введите логин: ')
	password = input('Введите пароль: ')

	try:
		db = sqlite3.connect('database.db')
		cursor = db.cursor()
		db.create_function('md5', 1, md5sum)

		cursor.execute("SELECT login FROM users WHERE login = ?", [login])
		if cursor.fetchone() is None:
			print('Такого пользователя не существует! Зарегистрируйтесь')
			registration()
		elif cursor.execute("SELECT password FROM users WHERE login = ? AND password = md5(?)", [login, password]).fetchone() is None:
			print('Неверный пароль!')
			log_in()
		else:
			print('Вы успешно вошли в систему!')
			play_casino(login)

	except sqlite3.Error as e:
		print('Ошибка!', e)
	finally:
		cursor.close()
		db.close()

def play_casino(login):
	print('КАЗИНО\n')

	try:
		db = sqlite3.connect("database.db")
		cursor = db.cursor()

		cursor.execute("SELECT age FROM users WHERE login = ? AND age >= ?", [login, 18])
		if cursor.fetchone() is None:
			print("Вам недостаточно лет!")
		else:
			bet = int(input("Ставка: "))
			number = randint(1, 100)

			balance = cursor.execute("SELECT balance FROM users WHERE login = ?", [login]).fetchone()[0]
			if balance < bet:
				print("Недостаточно коинов")
			elif balance <= 0:
				print("Недостаточно коинов")
			else:
				if number < 50:
					cursor.execute("UPDATE users SET balance = balance - ? WHERE login = ?", [bet, login])
					cursor.execute("UPDATE casino SET balance = balance + ?", [bet])

					print("Ты проиграл. Твой баланс - " + str(balance) + " коинов")
				else:
					cursor.execute("UPDATE users SET balance = balance + ? WHERE login = ?", [bet, login])
					cursor.execute("UPDATE casino SET balance = balance - ?", [bet])

					print("Ты выйграл! Твой баланс - " + str(balance) + " коинов")

				db.commit()
				play_casino(login)


	except sqlite3.Error as e:
		print('Ошибка!', e)
	finally:
		cursor.close()
		db.close()
	

def main():
	log_in()

if __name__ == '__main__':
	main()


Вывод:
ВХОД В СИСТЕМУ

Введите логин: g
Введите пароль: ok
Вы успешно вошли в систему!
КАЗИНО

Ставка: 46
Ты проиграл. Твой баланс - 1777 коинов
КАЗИНО

Ставка: 32
Ты проиграл. Твой баланс - 1731 коинов
КАЗИНО

Ставка: 324
Ты проиграл. Твой баланс - 1699 коинов
  • Вопрос задан
  • 63 просмотра
Решения вопроса 1
@twistfire92
Python backend developer
Ваша программа работает ровно так, как вы и написали))
не заметили закономерность?
Ставка 46. 1777-46=1731
Ставка 32. 1731-32=1699.
Вы прежде чем балланс выводить, вычитайте из него ставку. А так вы выводите предыдущий балланс.

И вообще прятать логику и вычисления в SQL запросы такая себе идея. вытащите все вычисления из запросов. Записывайте только результат.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы