-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoriginal.py
246 lines (221 loc) · 8.48 KB
/
original.py
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
import pygame
import random
import time
import turtle
from turtle import ht, st
from urllib.request import urlopen
# Class thể hiện đối tượng Câu hỏi
# Một đối tượng Question gồm có 2 fields:
# - question: đề bài
# - answer: đáp án
class Question:
def __init__(self, question, answer):
self.question = question
self.answer = answer
# Class thể hiện trạng thái hiện tại của trò chơi
class GameState:
# Điểm số hiện tại
score = 0
# Khởi động lại đồng hồ bấm giờ: cho giá trị bằng thời gian hiện tại
def reset_timer(self):
self.start_time = time.time()
# Trả về thời gian trả lời câu hỏi (tính bằng giây), bằng cách lấy
# thời gian đồng hồ trừ đi thời gian start_time đã lưu.
def get_timer(self):
return time.time() - self.start_time
# Khởi tạo đối tượng cụ thể lưu trạng thái của trò chơi
state = GameState()
# Dùng thư viện pygame để chơi âm thanh.
def play_music(file):
pygame.mixer.init()
pygame.mixer.music.load(file)
pygame.mixer.music.play()
def play_sound(file):
pygame.mixer.init()
sound = pygame.mixer.Sound(file)
sound.play()
# Vẽ hình nhân vật.
avatar = turtle.Turtle()
def draw_avatar(image):
# Phải gọi lệnh turtle.addshape trước khi vẽ ảnh.
turtle.addshape(image)
avatar.clear()
avatar.penup()
avatar.setposition(350, -100)
# Lưu ý: turtle chỉ vẽ được ảnh có định dạng .gif
avatar.shape(image)
# Khởi tạo cây bút chuyên dùng để vẽ thời gian.
pen_timer = turtle.Turtle()
def draw_timer():
# Ẩn con rùa.
pen_timer.hideturtle()
# Nhấc bút lên.
pen_timer.penup()
# Xoá, để khi vẽ điểm không bị đè lên nhau.
pen_timer.clear()
# Đổi màu.
pen_timer.color('green')
# Đặt vị trí.
pen_timer.setposition(-240, 170)
# Viết điểm số ra màn hình.
pen_timer.write(round(state.get_timer()), font=get_font(20))
# Vẽ lại điểm số sau 1000ms (1 giây) nữa
turtle.Screen().ontimer(draw_timer, 1000)
# Khai báo dữ liệu câu hỏi và đáp án
def read_data():
data = []
url = r'https://opentdb.com/api.php?amount=10&encode=url3986'
data1 = """"""
sample = 'bcd'
for i in range (0,9):
page = urlopen(url)
html_bytes = page.read()
html = html_bytes.decode("utf-8")
start_index = html.find("question") + len("question")
end_index = html.find("correct_answer")
title = html[start_index + 3:end_index-3]
data1 += title
#take question
data1 += '\n'
start_index = html.find("correct_answer") + len("correct_answer")
end_index = html.find("incorrect_answer")
title = html[start_index + 3:end_index-3]
data1 += ('a.' + title)
answer = 'a'
start_index = html.find("incorrect_answer") + len("incorrect_answer")
end_index = html.find("]}")
title = html[start_index + 5:end_index-1].split('","')
for o in range (0,3):
data1 += '\n'
data1 += sample[o]+'. '+title[o]
# Tạo đối tượng Question và thêm vào mảng dữ liệu data
data.append(Question(data1, answer))
data1 = ''''''
# Trả về mảng dữ liệu data
return data
# Sinh ra các câu hỏi tính nhẩm ngẫu nhiên Siêu Trí Tuệ
def generate_math_questions():
# Ban đầu, danh sách câu hỏi trống.
data = []
# Số lượng câu hỏi sinh ra.
num_questions = 3
# Hai phép toán: cộng và nhân
operators = ["+", "x"]
# Số lượng chữ số tối đa khi sinh câu hỏi ngẫu nhiên
max_digits = 4
for i in range(num_questions):
# Chọn số ngẫu nhiên từ 0 đến 10^max_digits - 1
a = random.randint(0, 10**max_digits)
b = random.randint(0, 10**max_digits)
# Chọn một phép toán ngẫu nhiên
op = random.choice(operators)
# Sinh ra đề bài
question = str(a) + " " + op + " " + str(b) + " = ?"
# Sinh ra đáp án
if op == "+":
answer = a + b
elif op == "x":
answer = a * b
# Thêm câu hỏi vào danh sách
data.append(Question(question, str(answer)))
# Trả về danh sách câu hỏi tính nhẩm Siêu Trí Tuệ.
return data
# Trả về font chữ với kích thước được cho.
def get_font(font_size):
return ("Arial", font_size, "normal")
# Khởi tạo cây bút chuyên dùng để vẽ Điểm số.
pen_score = turtle.Turtle()
def draw_score():
# Ẩn con rùa.
pen_score.hideturtle()
# Nhấc bút lên.
pen_score.penup()
# Xoá, để khi vẽ điểm không bị đè lên nhau.
pen_score.clear()
# Đổi màu.
pen_score.color('white')
# Đặt vị trí.
pen_score.setposition(340, 110)
# Viết điểm số ra màn hình.
pen_score.write(state.score, font=get_font(40))
# In câu hỏi ra màn hình
def ask_question(question):
# In ra dấu * ngăn cách giữa hai câu hỏi
print("***************************")
print(question.question)
# Xoá màn hình trước khi vẽ để chữ khỏi bị viết đè lên nhau
turtle.clear()
# Ẩn con rùa (hình tam giác)
turtle.hideturtle()
# Nhấc bút lên (để khỏi để lại dấu vết)
turtle.penup()
# Đặt vị trí bút (để viết câu hỏi)
turtle.setposition(-240, 20)
# In câu hỏi ra màn hình Turtle và cho biết cỡ font chữ.
turtle.write(question.question, font=get_font(15))
# Gọi hàm viết điểm số ra màn hình.
draw_score()
# Vẽ hình nhân vật trạng thái bình thường
draw_avatar('KimNguu-normal.gif')
# Trước khi hỏi câu hỏi mới, cần khởi động lại đồng hồ bấm giờ
state.reset_timer()
# Hỏi người dùng nhập câu trả lời qua giao diện Turtle
result = turtle.textinput("Siêu Lập Trình", "Câu trả lời của bạn là gì?\n") # So sánh kết quả của người chơi nhập vào với đáp án
check_result(result, question.answer)
# So sánh câu trả lời với đáp án
def check_result(result, answer):
# Thời gian người chơi trả lời câu hỏi (tính bằng giây).
time_taken = state.get_timer()
# Tính điểm thưởng nếu trả lời nhanh.
if time_taken < 5:
bonus = 5
else:
bonus = 0
if result == answer:
# Cộng điểm nếu người chơi trả lời đúng
# Cộng điểm trả lời đúng và cả điểm thưởng nữa.
state.score += 10 + bonus
# Chơi âm thanh cho biết trả lời đúng.
play_sound("correct_answer.wav")
# Vẽ hình nhân vật khi trả lời đúng.
draw_avatar('KimNguu-correct.gif')
print("Đúng rồi")
else:
# Chơi âm thanh cho biết trả lời sai.
play_sound("wrong_answer.wav")
# Vẽ hình nhân vật khi trả lời sai.
draw_avatar('KimNguu-wrong.gif')
print("Sai rồi")
# Chờ một chút để thấy rõ nhân vật cử động.
time.sleep(0.5)
print("Thời gian trả lời câu hỏi là:", round(time_taken), "giây")
if bonus > 0:
print("Bạn nhận được điểm thưởng là", bonus, "vì trả lời nhanh")
print("Điểm hiện tại của bạn là: ", state.score)
# Thiết lập màn hình giao diện turtle
def setup_turtle():
# Màn hình Turtle
screen = turtle.Screen()
# Thiết lập kích thước màn hình
screen.setup(1200, 600)
# Thiết lập ảnh nền cho màn hình
screen.bgpic(r'background.gif')
# Thiết lập tiêu đề cho cửa sổ chương trình
turtle.title("Siêu lập trình")
def run ():
# Gọi hàm thiết lập màn hình
setup_turtle()
# Chơi nhạc
play_music("music.wav")
# Vẽ thời gian
state.reset_timer()
draw_timer()
# Kết hợp các câu đố vui đọc từ File với các câu tính nhẩm Siêu Trí Tuệ.
data = read_data() + generate_math_questions()
# Xáo trộn các câu hỏi một cách ngẫu nhiên
random.shuffle(data)
for question in data:
ask_question(question)
turtle.clear()
return ''
run()