Câu trả lời com Python for Kids

Giải pháp cho các câu đố lập trình Dưới đây là các giải pháp cho các câu đố lập trình ở cuối các chương. có

Lượt xem 539 Lượt tải xuống 104 Kích thước tệp 1MB

Báo cáo DMCA / Bản quyền

TẢI TẬP TIN

Đề xuất câu chuyện

Xem trước trích dẫn

Giải pháp cho câu đố lập trình

Dưới đây là lời giải cho các câu đố lập trình ở cuối các chương. Không phải lúc nào cũng có một giải pháp duy nhất cho một câu đố, vì vậy giải pháp bạn nghĩ ra có thể không khớp với những gì bạn sẽ tìm thấy ở đây, nhưng các ví dụ sẽ cho bạn ý tưởng về các cách tiếp cận khả thi

Chương 3 #1. Yêu thích Đây là một giải pháp với ba sở thích yêu thích và ba món ăn yêu thích. >>> sở thích = ['Pokemon', 'LEGO Mindstorms', 'Đạp xe leo núi'] >>> thức ăn = ['Bánh kếp', 'Sô cô la', 'Táo'] >>> sở thích = sở thích + thức ăn >>> in

#2. Đếm Chiến binh Chúng ta có thể thực hiện phép tính theo một số cách khác nhau. Chúng tôi có ba tòa nhà với 25 ninja ẩn náu trên mỗi mái nhà và hai đường hầm với 40 samurai ẩn náu trong mỗi đường hầm. Chúng ta có thể tính ra tổng số ninja và sau đó là tổng số samurai, và chỉ cần cộng hai số đó lại với nhau. >>> 3*25 75 >>> 2*40 80 >>> 75+80 155

Ngắn hơn nhiều [và tốt hơn] là kết hợp ba phương trình đó, sử dụng dấu ngoặc đơn [dấu ngoặc đơn không cần thiết, do thứ tự của các phép toán, nhưng chúng làm cho phương trình dễ đọc hơn]. >>> [3*25]+[2*40]

Nhưng có lẽ một chương trình Python đẹp hơn sẽ giống như sau, chương trình này cho chúng ta biết những gì chúng ta đang tính toán. >>> >>> >>> >>> >>> >>> 155

mái nhà = 3 ninjas_per_roof = 25 đường hầm = 2 samurai_per_tunnel = 40 bản in[[mái nhà * ninjas_per_roof] + [đường hầm * samurai_per_tunnel]]

2  Giải pháp cho chương 3

#3. Lời chào hỏi. Trong giải pháp này, chúng tôi đặt tên có ý nghĩa cho các biến, sau đó sử dụng trình giữ chỗ định dạng [%s %s] trong chuỗi của chúng tôi để nhúng giá trị của các biến đó. >>> first_name = 'Brando' >>> last_name = 'Ickett' >>> print['Xin chào, %s %s. ' % [first_name, last_name]] Xin chào, Brando Ickett

Chương 4 #1. Hình chữ nhật Vẽ hình chữ nhật gần giống như vẽ hình vuông, ngoại trừ việc con rùa cần vẽ hai cạnh dài hơn hai cạnh còn lại. >>> >>> >>> >>> >>> >>> >>> >>> >>> >>>

rùa nhập khẩu t = rùa. bút[] t. về phía trước[100] t. trái[90] t. về phía trước[50] t. trái[90] t. về phía trước[100] t. trái[90] t. chuyển tiếp[50]

#2. Một hình tam giác Câu đố không chỉ định loại hình tam giác để vẽ. Có ba loại hình tam giác. đều, cân và scalene. Tùy thuộc vào mức độ hiểu biết của bạn về hình học, bạn có thể đã vẽ bất kỳ loại hình tam giác nào, có lẽ bằng cách loay hoay với các góc cho đến khi bạn kết thúc với một thứ trông giống như vậy. Đối với ví dụ này, hãy tập trung vào hai loại đầu tiên, vì chúng dễ vẽ nhất. Tam giác đều có ba cạnh bằng nhau và ba góc bằng nhau. >>> nhập rùa >>> t = rùa. Bút[] u >>> t. chuyển tiếp[100] Giải pháp cho Chương 4  3

v w x y

>>> >>> >>> >>> >>> >>>

t. trái[120] t. về phía trước[100] t. trái[120] t. chuyển tiếp[100]

Chúng tôi vẽ đáy của hình tam giác bằng cách di chuyển về phía trước 100 pixel tại u. Chúng ta rẽ trái 120 độ [điều này tạo ra góc bên trong 60 độ] tại v và lại di chuyển về phía trước 100 pixel tại w. Lượt tiếp theo cũng là 120 độ tại x và con rùa di chuyển trở lại vị trí bắt đầu bằng cách di chuyển về phía trước thêm 100 pixel tại y. Đây là kết quả của việc chạy mã

Tam giác cân có hai cạnh bằng nhau và hai góc bằng nhau. >>> >>> >>> >>> >>> >>> >>> >>>

rùa nhập khẩu t = rùa. bút[] t. về phía trước[50] t. trái[104. 47751218592992]. về phía trước[100] t. trái[151. 04497562814015]t. chuyển tiếp[100]

Trong giải pháp này, con rùa di chuyển về phía trước 50 pixel, sau đó quay 104. 47751218592992 độ. Nó di chuyển về phía trước 100 pixel, tiếp theo là một lượt 151. 04497562714015 độ, sau đó chuyển tiếp 100 pixel lần nữa. Để biến rùa quay mặt về vị trí ban đầu, chúng ta có thể gọi lại dòng sau. >>> t. trái[104. 47751218592992]

4  Giải pháp cho chương 4

Đây là kết quả của việc chạy mã này

Làm thế nào để chúng tôi đưa ra các góc như 104. 47751218592992 độ và 151. 04497562814015 độ? . Khi chúng tôi đã quyết định về độ dài của mỗi cạnh của tam giác, chúng tôi có thể tính các góc bên trong bằng Python và một chút lượng giác. Trong sơ đồ sau, bạn có thể thấy rằng nếu chúng ta biết độ của góc a, chúng ta có thể tìm ra độ của góc [bên ngoài] b mà con rùa cần quay. Hai góc a và b bằng 180 độ

180° một

con rùa

Tính góc trong không khó nếu biết phương trình đúng. Ví dụ: giả sử chúng tôi muốn tạo một hình tam giác có chiều dài đáy là 50 pixel [hãy gọi cạnh đó là C] và hai cạnh A và B, cả hai đều dài 100 pixel

Giải pháp cho Chương 4  5

B

một một C

rùa

Phương trình tính góc trong a sử dụng các cạnh A, B và C sẽ là.  A2 + C2−B2  a = arccos   2 AC  

Chúng ta có thể tạo một chương trình Python nhỏ để tính giá trị bằng mô-đun toán học của Python. >>> >>> >>> >>> u >>>

nhập toán A = 100 B = 100 C = 50 a = toán. acos[[toán. pow[A,2] + toán học. pow[C,2] - \ toán học. pow[B,2]] / [2*A*C]] >>> print[a] 1. 31811607165

Trước tiên, chúng tôi nhập mô-đun toán học, sau đó tạo các biến cho mỗi bên [A, B và C]. Tại u, ta sử dụng hàm acos[arc cosin] để tính góc. Phép tính này trả về giá trị radian 1. 31811607165. Radian là một đơn vị khác được sử dụng để đo góc, như độ. Ghi chú

Dấu gạch chéo ngược [\] trong dòng tại u không phải là một phần của phương trình— dấu gạch chéo ngược, như đã giải thích trong Chương 16, được sử dụng để phân tách các dòng mã dài. Chúng không cần thiết, nhưng trong trường hợp này, chúng tôi đang chia một dòng dài vì nếu không thì nó sẽ không vừa với trang. Giá trị radian có thể được chuyển đổi thành độ bằng cách sử dụng hàm toán học degree và chúng ta có thể tính góc bên ngoài [góc

6  Giải pháp cho Chương 4

lượng chúng ta cần bảo con rùa quay], bằng cách trừ đi giá trị này từ 180 độ. >>> print[180 - toán. độ[a]] 104. 477512186

Phương trình cho lượt tiếp theo của rùa cũng tương tự

 A2 + B2 − C2  b = arccos   2 AB   Mã của phương trình này cũng tương tự. >>> b = toán. acos[[toán. pow[A,2] + toán học. pow[B,2] - \ toán học. pow[C,2]] / [2*A*B]] >>> print[180 - toán học. độ[b]] 151. 04497562814015

Tất nhiên, bạn không cần sử dụng các phương trình để tính các góc. Bạn cũng có thể thử chơi với các mức độ mà con rùa quay cho đến khi bạn nhận được thứ gì đó có vẻ phù hợp.

#3. Một cái hộp không có góc Lời giải cho câu đố này [một hình bát giác bị thiếu bốn cạnh] là làm điều tương tự bốn lần liên tiếp. Di chuyển về phía trước, rẽ trái 45 độ, nhấc bút lên, di chuyển về phía trước, đặt bút xuống và quay lại 45 độ. t. về phía trước[50] t. trái[45] t. lên[] t. về phía trước[50] t. xuống[] t. trái[45]

Vì vậy, tập lệnh cuối cùng sẽ giống như đoạn mã sau [cách tốt nhất để chạy lệnh này là tạo một cửa sổ mới trong trình bao, sau đó lưu tệp dưới dạng nocorners. py]. rùa nhập khẩu t = rùa. bút[] t. chuyển tiếp[50]

Giải pháp cho Chương 4  7

t. trái[45] t. lên[] t. về phía trước[50] t. xuống[] t. trái[45] t. về phía trước[50] t. trái[45] t. lên[] t. về phía trước[50] t. xuống[] t. trái[45] t. về phía trước[50] t. trái[45] t. lên[] t. về phía trước[50] t. xuống[] t. trái[45] t. về phía trước[50] t. trái[45] t. lên[] t. về phía trước[50] t. xuống[] t. trái[45]

Chương 5 #1. Bạn có giàu không? . >>> tiền = 2000 >>> nếu tiền > 1000. u print["Tôi giàu. "] khác. print["Tôi không giàu. "] v print["Nhưng có thể sau này tôi. "] Lỗi cú pháp. thụt lề bất ngờ

Bạn gặp lỗi này vì khối đầu tiên tại u bắt đầu bằng bốn khoảng trắng, vì vậy Python không mong muốn thấy hai khoảng trắng thừa trên dòng cuối cùng tại v. Nó đánh dấu chỗ nó thấy có vấn đề bằng một khối hình chữ nhật thẳng đứng, để bạn có thể biết mình đã sai ở đâu

8  Giải pháp cho Chương 5

#2. bánh ngọt. Mã để kiểm tra số lượng Twinkies nhỏ hơn 100 hoặc nhiều hơn 500 sẽ như thế này. >>> Twinkies = 600 >>> nếu Twinkies < 100 hoặc Twinkies > 500. >>> print['Quá ít hoặc quá nhiều'] Quá ít hoặc quá nhiều

#3. Đúng số Bạn có thể viết nhiều câu lệnh if để kiểm tra xem một số tiền có nằm trong khoảng từ 100 đến 500 hay 1000 đến 5000 hay không, nhưng bằng cách sử dụng từ khóa và và hoặc, chúng ta có thể làm điều đó chỉ với một câu lệnh. if [số tiền >= 100 và số tiền = 1000 \ và số tiền >> số tiền = 800 >>> if [số tiền >= 100 và số tiền = 1000 \ và số tiền >> số tiền = 400 >>> if [số tiền >= 100 và số tiền . print["Quá nhiều"] elif ninja < 30. print["Sẽ là một cuộc đấu tranh, nhưng tôi có thể hạ gục chúng"] elif ninja < 10. print["Tôi có thể chiến đấu với những ninja đó. "] Nhiều quá

Mặc dù số lượng ninja ít hơn 10 nhưng bạn nhận được thông báo “Đó là quá nhiều. ” Điều này là do điều kiện đầu tiên [< 50] được đánh giá trước [nói cách khác, Python kiểm tra nó trước] và vì biến thực sự nhỏ hơn 50, chương trình sẽ in thông báo mà bạn không muốn thấy. Để làm cho nó hoạt động bình thường, hãy đảo ngược thứ tự mà bạn kiểm tra số để bạn xem liệu số đó có nhỏ hơn 10 trước không. >>> ninja = 5 >>> nếu ninja < 10. print["Tôi có thể chiến đấu với những ninja đó. "] ninja yêu tinh < 30. print["Sẽ là một cuộc đấu tranh, nhưng tôi có thể hạ gục chúng"] elif ninjas < 50. print["Quá nhiều"] Tôi có thể chiến đấu với lũ ninja đó

Chương 6 #1. Vòng lặp Hello Câu lệnh in trong vòng lặp for này chỉ được chạy một lần. Điều này là do khi Python thực hiện câu lệnh if, x nhỏ hơn 9 nên nó ngay lập tức thoát ra khỏi vòng lặp. >>> cho x trong phạm vi [0, 20]. in['xin chào %s' %x]

10  Giải pháp cho Chương 6

nếu x < 9. tạm biệt 0

#2. Số chẵn Chúng ta có thể sử dụng tham số bước với hàm phạm vi để tạo danh sách các số chẵn. Nếu bạn 14 tuổi, tham số bắt đầu sẽ là 2 và tham số kết thúc sẽ là 16 [vì vòng lặp for sẽ chạy cho đến khi giá trị ngay trước tham số kết thúc]. >>> cho x trong phạm vi [2, 16, 2]. in[x] 2 4 6 8 10 12 14

#3. Năm thành phần yêu thích của tôi Có một số cách khác nhau để in số với các mục trong danh sách. Đây là một cách

u v w x

>>> thành phần = ['ốc sên', 'đỉa', 'dây rốn khỉ đột', 'lông mày sâu róm', 'ngón chân rết'] >>> x = 1 >>> cho tôi trong thành phần. in['%s %s' % [x, i]] x = x + 1 1 2 3 4 5

ốc sên đỉa khỉ đột rốn xơ vải sâu bướm lông mày rết ngón chân

Ta tạo biến x để lưu số muốn in tại u. Tiếp theo, chúng tôi tạo một vòng lặp for để lặp qua các mục trong danh sách tại v, gán từng mục cho biến i và chúng tôi in giá trị của các biến x và i tại w, sử dụng trình giữ chỗ %s. Chúng ta thêm 1 vào biến x tại x, để mỗi lần chúng ta lặp, số chúng ta in ra tăng lên. Giải pháp cho Chương 6  11

#4. Cân nặng của bạn trên mặt trăng Để tính cân nặng của bạn theo đơn vị kilôgam trên mặt trăng trong 15 năm, trước tiên hãy tạo một biến để lưu trữ cân nặng ban đầu của bạn. >>> trọng lượng = 30

Đối với mỗi năm, bạn có thể tính trọng lượng mới bằng cách thêm một kilôgam, sau đó nhân với 16. 5 phần trăm [0. 165] để có được trọng lượng trên mặt trăng. >>> trọng lượng = 30 >>> cho năm trong phạm vi [1, 16]. cân nặng = cân nặng + 1 moon_weight = cân nặng * 0. 165 print['Năm %s là %s' % [năm, moon_weight]] Năm Năm Năm Năm Năm Năm Năm Năm Năm Năm Năm Năm Năm

1 là 5. 115 2 là 5. 28 3 là 5. 445 4 là 5. 61 5 là 5. 775 6 là 5. 94 7 là 6. 105 8 là 6. 2700000000000005 9 là 6. 4350000000000005 10 là 6. 6000000000000005 11 là 6. 765000000000001 12 là 6. 930000000000001 13 là 7. 095000000000001 14 là 7. 260000000000001 15 là 7. 425000000000001

Chương 7 #1. Hàm trọng lượng mặt trăng cơ bản Hàm này sẽ nhận hai tham số. cân nặng và tăng lên [số lượng cân nặng sẽ tăng lên mỗi năm]. Phần còn lại của đoạn mã rất giống với lời giải cho Câu đố số 4 trong Chương 6. >>> def moon_weight[trọng lượng, tăng]. cho năm trong phạm vi [1, 16]. cân nặng = cân nặng + tăng moon_weight = cân nặng * 0. 165 print['Năm %s là %s' % [năm, moon_weight]] 12  Giải pháp cho Chương 7

>>> moon_weight[40, 0. 5] Năm 1 là 6. 6825 Năm 2 là 6. 765 Năm 3 là 6. 8475 Năm 4 là 6. 93 Năm 5 là 7. 0125 Năm 6 là 7. 095 Năm 7 là 7. 1775 Năm 8 là 7. 26 Năm 9 là 7. 3425 Năm 10 là 7. 425 Năm 11 là 7. 5075 Năm 12 là 7. 59 Năm 13 là 7. 6725 Năm 14 là 7. 755 Năm 15 là 7. 8375

#2. Hàm Trọng lượng Mặt trăng và Năm Chúng ta chỉ cần một thay đổi nhỏ đối với hàm để số năm có thể được chuyển vào dưới dạng tham số. >>> def moon_weight[cân nặng, tăng, năm]. năm = năm + 1 cho năm trong phạm vi [1, năm]. cân nặng = cân nặng + tăng moon_weight = cân nặng * 0. 165 print['Năm %s là %s' % [năm, moon_weight]] >>> moon_weight[35, 0. 3, 5] Năm 1 là 5. 8245 Năm 2 là 5. 874 Năm 3 là 5. 9235 Năm 4 là 5. 973 Năm 5 là 6. 0225

Lưu ý trên dòng thứ hai của hàm chúng ta thêm 1 vào tham số năm để vòng lặp for kết thúc vào đúng năm

[thay vì năm trước]

#3. Chương trình trọng lượng mặt trăng Chúng ta có thể sử dụng đối tượng stdin của mô-đun sys để cho phép ai đó nhập giá trị [sử dụng hàm readline]. Bởi vì hệ thống. tiêu chuẩn. readline trả về một chuỗi, chúng ta cần chuyển đổi các chuỗi này thành số để có thể thực hiện các phép tính. Giải pháp cho Chương 7  13

nhập sys def moon_weight[]. print['Vui lòng nhập trọng lượng Trái đất hiện tại của bạn'] u weight = float[sys. tiêu chuẩn. readline[]] print['Vui lòng nhập số cân nặng của bạn có thể tăng lên mỗi năm'] v tăng = float[sys. tiêu chuẩn. readline[]] print['Vui lòng nhập số năm'] w years = int[sys. tiêu chuẩn. readline[]] năm = năm + 1 cho năm trong phạm vi [1, năm]. cân nặng = cân nặng + tăng moon_weight = cân nặng * 0. 165 print['Năm %s là %s' % [năm, moon_weight]]

Tại u, chúng tôi đọc đầu vào bằng sys. tiêu chuẩn. readline, sau đó chuyển đổi chuỗi thành float, sử dụng hàm float. Giá trị này được lưu dưới dạng biến trọng số. Chúng tôi thực hiện quy trình tương tự tại v đối với biến tăng, nhưng sử dụng hàm int tại w, vì chúng tôi chỉ nhập số nguyên cho một số năm [không phải số phân số]. Phần còn lại của mã sau dòng đó hoàn toàn giống như trong giải pháp trước đó. Nếu chúng ta gọi hàm bây giờ, chúng ta sẽ thấy một cái gì đó như sau. >>> moon_weight[] Vui lòng nhập trọng lượng Trái đất hiện tại của bạn 45 Vui lòng nhập số lượng cân nặng của bạn có thể tăng lên mỗi năm 0. 4 Vui lòng nhập số năm 12 Năm 1 là 7. 491 Năm 2 là 7. 557 Năm 3 là 7. 623 Năm 4 là 7. 689 Năm 5 là 7. 755 Năm 6 là 7. 821 Năm 7 là 7. 887 Năm 8 là 7. 953 Năm 9 là 8. 019 Năm 10 là 8. 085 Năm 11 là 8. 151 Năm 12 là 8. 217

14  Giải pháp cho Chương 7

Chương 8 #1. Hươu cao cổ xáo trộn Trước khi thêm các chức năng để làm cho Reginald nhảy điệu nhảy, chúng ta hãy xem xét lại các lớp Động vật, Động vật có vú và Hươu cao cổ. Đây là lớp Động vật [lớp này từng là lớp con của lớp Animate, lớp này đã bị xóa để làm cho ví dụ này đơn giản hơn một chút]. lớp Động vật. chắc chắn thở [tự]. print['thở'] def move[self]. print['di chuyển'] def eat_food[self]. in ['ăn thức ăn']

Lớp Động vật có vú là lớp con của lớp Động vật. lớp Động vật có vú [Động vật]. def feed_young_with_milk[tự]. print['cho trẻ ăn']

Và lớp Hươu cao cổ là một lớp con của Động vật có vú. lớp Hươu cao cổ [Động vật có vú]. chắc chắn eat_leaves_from_trees[self]. print['ăn lá']

Các chức năng để di chuyển từng chân khá dễ dàng để thêm vào. lớp Hươu cao cổ [Động vật có vú]. chắc chắn eat_leaves_from_trees[self]. print['ăn lá'] def left_foot_forward[self]. print['chân trái tiến tới'] def right_foot_forward[self]. print['chân phải về phía trước'] def left_foot_backward[self]. print['chân trái lùi'] def right_foot_backward[self]. print['chân phải lùi lại']

Giải pháp cho Chương 8  15

Hàm nhảy chỉ cần gọi từng hàm chân theo đúng thứ tự. nhảy chắc chắn [tự]. bản thân. left_foot_forward[] tự. left_foot_backward[] tự. right_foot_forward[] tự. right_foot_backward[] tự. left_foot_backward[] tự. right_foot_backward[] tự. right_foot_forward[] tự. left_foot_forward[]

Để Reginald nhảy, chúng ta tạo một đối tượng và gọi hàm. >>> reginald = Hươu cao cổ[] >>> reginald. dance[] chân trái tiến chân trái lùi chân phải tiến chân phải lùi chân trái lùi chân phải lùi chân phải tiến chân trái tiến

#2. Turtle Pitchfork Pen là một lớp được định nghĩa trong mô-đun rùa, vì vậy chúng ta có thể tạo nhiều hơn một đối tượng của lớp Pen cho mỗi trong số bốn con rùa. Nếu chúng ta

gán mỗi đối tượng cho một biến khác nhau, chúng ta có thể điều khiển chúng một cách riêng biệt, điều này giúp việc tái tạo các đường mũi tên trong câu đố này trở nên đơn giản. Khái niệm rằng mỗi đối tượng là một thứ độc lập là một khái niệm quan trọng trong lập trình, đặc biệt khi chúng ta đang nói về các lớp và đối tượng. rùa nhập khẩu t1 = rùa. Bút [] t2 = rùa. Bút [] t3 = rùa. Bút [] t4 = rùa. Cái bút[]

16  Giải pháp cho Chương 8

t1. chuyển tiếp[100] t1. trái[90] t1. chuyển tiếp[50] t1. đúng[90] t1. chuyển tiếp[50] t2. chuyển tiếp[110] t2. trái[90] t2. chuyển tiếp[25] t2. đúng[90] t2. chuyển tiếp[25] t3. chuyển tiếp[110] t3. đúng[90] t3. chuyển tiếp[25] t3. trái[90] t3. chuyển tiếp[25] t4. chuyển tiếp[100] t4. đúng[90] t4. chuyển tiếp[50] t4. trái[90] t4. chuyển tiếp[50]

Có một số cách để vẽ cùng một thứ, vì vậy mã của bạn có thể trông không chính xác như thế này

Chương 9 #1. Mã bí ẩn Hàm abs trả về giá trị tuyệt đối của một số, về cơ bản có nghĩa là số âm trở thành số dương. Vì vậy, trong đoạn mã bí ẩn này, câu lệnh in đầu tiên hiển thị 20 và câu lệnh in thứ hai hiển thị 0. u >>> a = abs[10] + abs[-10] >>> print[a] 20 v >>> b = abs[-10] + -10 >>> print[b] 0

Phép tính tại u kết thúc bằng 10 + 10. Phép tính tại v biến thành 10 + –10

Giải pháp cho Chương 9  17

#2. Một thông báo ẩn Thủ thuật ở đây là trước tiên hãy tạo một chuỗi chứa thông báo, sau đó sử dụng hàm dir để tìm xem các hàm nào có sẵn trên chuỗi. >>> s = 'điều này nếu bạn không phải là một người đọc tốt như vậy thì bạn đã giấu một thông báo sai' >>> print[dir[s]] ['__add__', '__class__', '__contains__

Nhìn vào danh sách, một chức năng gọi là split có vẻ hữu ích. Chúng ta có thể sử dụng chức năng trợ giúp để tìm hiểu những gì nó làm. >>> trợ giúp. split] Trợ giúp về chức năng split tích hợp. tách ra[. ] S. split[[sep[, maxsplit]]] -> danh sách các chuỗi Trả về danh sách các từ trong S, sử dụng sep làm chuỗi phân cách. Nếu maxsplit được đưa ra, thì tối đa việc chia tách maxsplit được thực hiện. Nếu sep không được chỉ định hoặc là Không có, bất kỳ chuỗi khoảng trắng nào là dấu phân cách và các chuỗi trống sẽ bị xóa khỏi kết quả

Theo mô tả này, split trả về chuỗi được phân tách thành các từ, theo bất kỳ ký tự nào được cung cấp trong tham số sep. Nếu không có tham số sep, hàm sử dụng khoảng trắng. Vì vậy, chức năng này sẽ phá vỡ chuỗi của chúng tôi. Bây giờ, chúng ta đã biết nên sử dụng hàm nào, chúng ta có thể lặp qua các từ trong chuỗi. Có một số cách khác nhau để 18  Giải pháp cho Chương 9

in ra mọi từ khác [bắt đầu với từ đầu tiên]. Đây là một khả năng. u >>> cách v >>> w >>> x

message = 'điều này nếu bạn không phải là một người đọc rất tốt thế này thì bạn đã ẩn làm sai một tin nhắn' words = message. split[] cho x trong phạm vi [0, len[words], 2]. in[từ[x]]

Chúng tôi tạo chuỗi tại u và tại v, chúng tôi sử dụng hàm tách để tách chuỗi thành danh sách các từ riêng lẻ. Sau đó, chúng tôi tạo một vòng lặp for bằng cách sử dụng hàm phạm vi tại w. Tham số đầu tiên của hàm này là 0 [phần đầu của danh sách]; . Chúng tôi sử dụng biến x từ vòng lặp for để in ra các giá trị từ danh sách tại x

#3. Sao chép tệp Để sao chép tệp, chúng tôi mở tệp đó và sau đó đọc nội dung vào một biến. Chúng tôi mở tệp đích để ghi [sử dụng tham số 'w' để ghi], sau đó viết ra nội dung của biến. Mã cuối cùng như sau. f = mở ['kiểm tra. txt'] s = f. đọc[] f. close[] f = open['đầu ra. txt', 'w'] f. viết [s] f. gần[]

Ví dụ đó hoạt động, nhưng thực ra cách tốt hơn để sao chép tệp là sử dụng mô-đun Python có tên là Shutil. nhập khẩu. sao chép ['kiểm tra. txt', 'đầu ra. txt']

Chương 10 #1. Ô tô đã sao chép Có hai câu lệnh in trong mã này và chúng ta cần tìm ra những gì được in cho mỗi câu lệnh. Giải pháp cho Chương 10  19

Đây là lần đầu tiên. >>> car1 = Car[] u >>> car1. bánh xe = 4 v >>> xe2 = xe1 >>> xe2. bánh xe = 3 >>> print[car1. bánh xe] 3

Tại sao kết quả của câu lệnh in là 3, khi chúng ta đặt rõ ràng 4 bánh xe cho xe1 tại u? . Bây giờ, câu lệnh in thứ hai thì sao? . bản sao [xe1] >>> xe3. bánh xe = 6 >>> print[car1. bánh xe] 3

Trong trường hợp này, car3 là một bản sao của đối tượng; . Vì vậy, khi chúng tôi đặt số bánh xe thành 6, nó không ảnh hưởng đến bánh xe của xe1

#2. Pickled Favorites Chúng tôi sử dụng mô-đun pickle để lưu nội dung của một biến [hoặc các biến] vào một tệp. u v w x

>>> >>> >>> >>> >>> >>>

nhập dưa chua yêu thích = ['PlayStation', 'Fudge', 'Movies', 'Python for Kids'] f = open['favorites. dat', 'wb'] dưa chua. kết xuất [yêu thích, f] f. gần[]

Chúng tôi nhập mô-đun dưa chua tại u và tạo danh sách những thứ yêu thích của chúng tôi tại v. Sau đó, chúng tôi mở một tệp có tên yêu thích. dat bằng cách chuyển chuỗi 'wb' làm tham số thứ hai tại w [điều này có nghĩa là writebinary]. Sau đó, chúng tôi sử dụng chức năng kết xuất của mô-đun dưa chua để lưu nội dung của biến yêu thích vào tệp tại x. Phần thứ hai của giải pháp này là đọc lại tệp trong. Giả sử bạn đã đóng và mở lại trình bao, chúng tôi sẽ cần nhập lại mô-đun dưa chua

20  Giải pháp cho Chương 10

>>> >>> >>> >>> >>> >>>

nhập dưa chua f = open['favorites. dat', 'rb'] yêu thích = dưa chua. tải [f] in [yêu thích]

['PlayStation', 'Fudge', 'Phim', 'Python for Kids']

Điều này tương tự với mã khác, ngoại trừ việc chúng tôi mở tệp bằng tham số 'rb' [có nghĩa là nhị phân đọc] và sử dụng chức năng tải của mô-đun pickle

Chương 11 #1. Vẽ một hình bát giác Một hình bát giác có tám cạnh, vì vậy chúng ta sẽ cần ít nhất một vòng lặp for cho bản vẽ này. Nếu bạn nghĩ một lúc về hướng của con rùa và những gì nó cần làm khi vẽ hình bát giác, bạn có thể nhận ra rằng mũi tên cho con rùa sẽ quay hoàn toàn, giống như kim đồng hồ, khi nó kết thúc . Điều này có nghĩa là nó đã xoay đủ 360 độ. Nếu chúng ta chia 360 cho số cạnh của hình bát giác, chúng ta sẽ nhận được số độ cho góc mà con rùa cần quay sau mỗi bước của vòng lặp [45 độ, như đã đề cập trong phần gợi ý]. >>> nhập rùa >>> t = rùa. Pen[] >>> def bát giác [kích thước]. cho x trong phạm vi [1,9]. t. về phía trước [kích thước] t. phải[45]

Chúng ta có thể gọi hàm để kiểm tra nó bằng cách sử dụng 100 làm kích thước của một trong các cạnh. >>> bát giác [100]

#2. Vẽ một hình bát giác đầy Nếu chúng ta thay đổi chức năng để nó vẽ một hình bát giác đầy, chúng ta sẽ khó vẽ đường viền hơn. Một cách tiếp cận tốt hơn là chuyển vào một tham số để kiểm soát xem hình bát giác có nên được lấp đầy hay không. Giải pháp cho Chương 11  21

bạn v

w x

>>> nhập rùa >>> t = rùa. Pen[] >>> def bát giác [kích thước, đầy]. nếu điền == True. t. begin_fill[] cho x trong phạm vi [1,9]. t. về phía trước [kích thước] t. đúng [45] nếu được điền == True. t. end_fill[]

Đầu tiên, chúng tôi kiểm tra xem tham số đã điền có được đặt thành True tại u không. Nếu đúng như vậy, chúng ta bảo rùa bắt đầu lấp đầy bằng cách sử dụng hàm begin_fill tại v. Sau đó, chúng ta vẽ hình bát giác trên hai dòng tiếp theo, theo cách tương tự như Câu đố số 1, rồi kiểm tra xem tham số đã điền có đúng tại w không. Nếu đúng như vậy, chúng tôi gọi hàm end_fill tại x, hàm này thực sự lấp đầy hình dạng của chúng tôi. Ta có thể test hàm này bằng cách set màu vàng và gọi hàm với tham số set là True [như vậy nó sẽ đầy]. Sau đó, chúng tôi có thể đặt lại màu thành màu đen và gọi lại hàm với tham số được đặt thành Sai cho đường viền của chúng tôi. >>> >>> >>> >>> >>>

t. màu[1, 0. 85, 0] hình bát giác[40, Đúng] t. màu [0, 0, 0] hình bát giác [40, Sai]

#3. Chức năng sao Thủ thuật cho chức năng sao này là chia 360 độ thành số điểm, cung cấp góc bên trong cho mỗi điểm của ngôi sao [xem dòng u trong đoạn mã sau]. Để xác định góc bên ngoài, chúng ta trừ số đó từ 180 để có được số độ mà con rùa phải quay tại x

u v w x y z

rùa nhập khẩu t = rùa. Pen[] def draw_star[kích thước, điểm]. góc = 360 / điểm cho x trong phạm vi [0, điểm]. t. về phía trước [kích thước] t. trái[180 - góc] t. về phía trước [kích thước] t. phải[180-[góc * 2]]

22  Giải pháp cho Chương 11

Chúng tôi lặp từ 0 đến số điểm tại v, sau đó di chuyển con rùa về phía trước số lượng pixel được chỉ định trong tham số kích thước tại w. Chúng tôi xoay con rùa theo số độ mà chúng tôi đã tính toán trước đó tại x, sau đó di chuyển về phía trước một lần nữa tại y, thao tác này sẽ vẽ "xương sống" đầu tiên của ngôi sao. Để di chuyển theo hình tròn, vẽ các gai, chúng ta cần tăng góc, vì vậy chúng ta nhân góc tính được với hai và quay rùa ngay tại z. Ví dụ: bạn có thể gọi chức năng này với 80 pixel và 70 điểm. >>> draw_star[80, 70]

Điều này mang lại kết quả sau

Chương 12 #1. Lấp đầy màn hình bằng các hình tam giác Để lấp đầy màn hình bằng các hình tam giác, bước đầu tiên là thiết lập canvas. Hãy cung cấp cho nó chiều rộng và chiều cao là 400 pixel. >>> >>> >>> >>> >>> >>> >>> >>>

từ tkinter nhập * nhập ngẫu nhiên w = 400 h = 400 tk = Tk[] canvas = Canvas[tk, width=w, height=h] canvas. đóng gói[]

Giải pháp cho Chương 12  23

Một tam giác có ba điểm, có nghĩa là ba bộ tọa độ x và y. Chúng ta có thể sử dụng hàm randrange trong mô-đun ngẫu nhiên [như trong ví dụ về hình chữ nhật ngẫu nhiên ở Chương 12], để tạo ngẫu nhiên tọa độ cho ba điểm [tổng cộng là sáu số]. Sau đó, chúng ta có thể sử dụng hàm Random_triangle để vẽ hình tam giác. >>> def Random_triangle[]. p1 = ngẫu nhiên. randrange[w] p2 = ngẫu nhiên. randrange[h] p3 = ngẫu nhiên. randrange[w] p4 = ngẫu nhiên. randrange[h] p5 = ngẫu nhiên. randrange[w] p6 = ngẫu nhiên. randrange[h] canvas. create_polygon[p1, p2, p3, p4, p5, p6, \ fill="", outline="black"]

Cuối cùng, chúng tôi tạo một vòng lặp để vẽ một loạt các hình tam giác ngẫu nhiên. >>> cho x trong phạm vi [0, 100]. Random_triangle[]

Điều này dẫn đến một cái gì đó như sau

Để lấp đầy cửa sổ bằng các hình tam giác có màu ngẫu nhiên, trước tiên hãy tạo một danh sách các màu. Chúng ta có thể thêm phần này vào mã thiết lập khi bắt đầu chương trình

24  Giải pháp cho Chương 12

>>> >>> >>> >>> >>> >>> >>> >>> >>>

từ tkinter nhập * nhập ngẫu nhiên w = 400 h = 400 tk = Tk[] canvas = Canvas[tk, width=w, height=h] canvas. pack[] colors = ['đỏ','xanh lá cây','xanh dương','vàng','cam','trắng','tím']

Sau đó, chúng ta có thể sử dụng chức năng lựa chọn của mô-đun ngẫu nhiên để chọn ngẫu nhiên một mục từ danh sách màu này và sử dụng nó trong lệnh gọi create_polygon. chắc chắn Random_triangle[]. p1 = ngẫu nhiên. randrange[w] p2 = ngẫu nhiên. randrange[h] p3 = ngẫu nhiên. randrange[w] p4 = ngẫu nhiên. randrange[h] p5 = ngẫu nhiên. randrange[w] p6 = ngẫu nhiên. randrange[h] màu = ngẫu nhiên. sự lựa chọn [màu sắc] canvas. create_polygon[p1, p2, p3, p4, p5, p6, \ fill=color, outline=""]

Giả sử chúng ta lặp lại 100 lần. >>> cho x trong phạm vi [0, 100]. Random_triangle[]

Kết quả sẽ giống như những hình tam giác này

Giải pháp cho Chương 12  25

#2. Tam giác di chuyển Đối với tam giác di chuyển, trước tiên chúng ta thiết lập lại canvas, sau đó vẽ tam giác bằng hàm create_polygon. thời gian nhập từ tkinter import * tk = Tk[] canvas = Canvas[tk, width=200, height=400] canvas. gói [] vải. tạo_đa giác[10, 10, 10, 60, 50, 35]

Để di chuyển hình tam giác theo chiều ngang trên màn hình, giá trị x phải là số dương và giá trị y phải là 0. Chúng ta có thể tạo vòng lặp for cho việc này, sử dụng 1 làm ID của tam giác, 10 làm tham số x và 0 làm tham số y. cho x trong phạm vi [0, 35]. Tranh sơn dầu. di chuyển [1, 10, 0] tk. cập nhật thời gian. ngủ [0. 05]

Di chuyển xuống màn hình rất giống nhau, với giá trị 0 cho tham số x và giá trị dương cho tham số y. cho x trong phạm vi [0, 14]. Tranh sơn dầu. di chuyển [1, 0, 10] tk. cập nhật thời gian. ngủ [0. 05]

Để quay lại màn hình, chúng ta cần một giá trị âm cho tham số x [và, một lần nữa, 0 cho tham số y]. Để di chuyển lên, chúng ta cần một giá trị âm cho tham số y. cho x trong phạm vi [0, 35]. Tranh sơn dầu. di chuyển [1, -10, 0] tk. cập nhật thời gian. ngủ [0. 05] cho x trong phạm vi [0, 14]. Tranh sơn dầu. di chuyển [1, 0, -10] tk. cập nhật thời gian. ngủ [0. 05]

26  Giải pháp cho Chương 12

#3. Ảnh động Mã cho giải pháp ảnh động phụ thuộc vào kích thước ảnh của bạn, nhưng giả sử ảnh của bạn được gọi là khuôn mặt. gif và bạn đã lưu nó vào C của mình. drive, bạn có thể hiển thị nó và sau đó di chuyển nó giống như bất kỳ hình vẽ nào khác. thời gian nhập từ tkinter import * tk = Tk[] canvas = Canvas[tk, width=400, height=400] canvas. pack[] myimage = PhotoImage[file='c. \\đối mặt. gif'] canvas. create_image[0, 0, anchor=NW, image=myimage] cho x trong khoảng [0, 35]. Tranh sơn dầu. di chuyển [1, 10, 10] tk. cập nhật thời gian. ngủ [0. 05]

Mã này sẽ di chuyển hình ảnh theo đường chéo xuống dưới màn hình. Nếu bạn đang sử dụng Ubuntu hoặc Mac OS X, tên tệp của hình ảnh sẽ khác. Nếu tệp nằm trong thư mục chính của bạn, trên Ubuntu, việc tải hình ảnh có thể giống như thế này. myimage = PhotoImage[file='/home/malcolm/face. gif']

Trên máy Mac, tải hình ảnh có thể trông như thế này. myimage = PhotoImage[file='/Users/samantha/face. gif']

Chương 14 #1. Trì hoãn trò chơi bắt đầu Để trò chơi bắt đầu khi người chơi nhấp vào canvas, chúng ta cần thực hiện một số thay đổi nhỏ đối với chương trình. Đầu tiên là thêm chức năng mới vào lớp Paddle. def turn_left[self, evt]. bản thân. x = -2 def turn_right[self, evt]. bản thân. x = 2

Giải pháp cho Chương 14  27

def start_game[self, evt]. bản thân. bắt đầu = Đúng

Hàm này sẽ đặt biến đối tượng đã bắt đầu thành True khi nó được gọi. Chúng ta cũng cần đưa biến đối tượng này vào hàm __init__ của Paddle [và đặt thành Sai], sau đó thêm một liên kết sự kiện cho hàm start_game [liên kết nó với nút chuột]

u

v

def __init__[bản thân, canvas, màu sắc]. bản thân. canvas = canvas tự vẽ. id = vải. tự tạo_hình chữ nhật[0, 0, 100, 10, tô màu=màu]. Tranh sơn dầu. di chuyển [tự. id, 200, 300] bản thân. x = 0 tự. canvas_width = bản thân. Tranh sơn dầu. winfo_width[] tự. bắt đầu = Tự sai. Tranh sơn dầu. bind_all['', tự. rẽ_trái] chính mình. Tranh sơn dầu. bind_all['', tự. rẽ_phải] chính mình. Tranh sơn dầu. bind_all['', tự. bắt đầu trò chơi]

Bạn có thể thấy việc bổ sung biến đối tượng mới bắt đầu tại u và liên kết cho nút chuột tại v. Thay đổi cuối cùng là vòng lặp cuối cùng trong mã. Chúng ta cần kiểm tra xem biến đối tượng đã bắt đầu có đúng không trước khi vẽ quả bóng và mái chèo, bạn có thể thấy điều này trong câu lệnh if này. trong khi 1. nếu bóng. hit_bottom == Sai và mái chèo. bắt đầu == Đúng. trái bóng. vẽ[] mái chèo. vẽ [] tk. update_idletasks[] tk. cập nhật thời gian. ngủ [0. 01]

#2. A “Game Over” đúng cách Chúng ta có thể sử dụng hàm create_text để tạo dòng chữ “Game Over”. Chúng tôi sẽ thêm mã này ngay sau mã để tạo bóng và mái chèo. mái chèo = Paddle[canvas, 'blue'] ball = Ball[canvas, paddle, 'red'] game_over_text = canvas. create_text[250, 200, text='GAME OVER', \ state='hidden']

28  Giải pháp cho Chương 14

Hàm create_text có một tham số được đặt tên là trạng thái, mà chúng ta đặt thành chuỗi 'hidden'. Điều này có nghĩa là Python vẽ văn bản, nhưng ẩn nó đi. Để hiển thị văn bản sau khi trò chơi kết thúc, chúng tôi thêm một câu lệnh if mới vào vòng lặp ở cuối mã. trong khi 1. nếu bóng. hit_bottom == Sai và mái chèo. bắt đầu == Đúng. trái bóng. vẽ[] mái chèo. draw[] u nếu bóng. hit_bottom == Đúng. v thời gian. ngủ[1] với canvas. itemconfig[game_over_text, state='normal'] tk. update_idletasks[] tk. cập nhật thời gian. ngủ [0. 01]

Chúng tôi xem nếu biến đối tượng hit_bottom được đặt thành True tại u. Nếu đúng như vậy, chúng tôi sẽ ngủ trong 1 giây ở v [để tạo độ trễ ngắn trước khi hiển thị văn bản], sau đó thay đổi tham số trạng thái của văn bản thành 'bình thường' thay vì 'ẩn' ở w, sử dụng chức năng itemconfig của . Chúng tôi truyền hai tham số cho chức năng này. mã định danh của văn bản được vẽ trên canvas [được lưu trữ trong biến game_over_text] và trạng thái tham số được đặt tên

#3. Tăng tốc quả bóng Thay đổi này rất đơn giản, nhưng bạn có thể thấy khó tìm ra vị trí trong mã để thực hiện thay đổi. Chúng tôi muốn quả bóng tăng tốc nếu nó di chuyển theo cùng một hướng nằm ngang khi chạm vào mái chèo và chậm lại nếu nó đi theo hướng ngang ngược lại. Để làm điều này, tốc độ trái-phải [ngang] của mái chèo phải được thêm vào tốc độ ngang của quả bóng. Nơi đơn giản nhất để thực hiện thay đổi này là trong hàm hit_paddle của lớp Ball

bạn v

def hit_paddle[self, pos]. mái chèo_pos = tự. Tranh sơn dầu. hợp âm [tự. mái chèo. id] if pos[2] >= paddle_pos[0] and pos[0] = paddle_pos[1] and pos[3] = paddle_pos[0] and pos[0] = paddle_pos[1] and pos[3] = paddle_pos . bản thân. x = 0 đúng = Sai nếu sprite. tàn cuộc. bản thân. kết thúc [sprite]

Trong phần mã nơi chúng tôi kiểm tra xem hình que có di chuyển sang trái hay không và liệu anh ta có va chạm với một nhân vật ở bên trái hay không, chúng tôi kiểm tra xem biến kết thúc trò chơi có đúng tại u không. Nếu đúng như vậy, chúng ta biết rằng đây là một đối tượng DoorSprite và tại v, chúng ta gọi hàm kết thúc bằng cách sử dụng biến sprite làm tham số. Chúng tôi thực hiện thay đổi tương tự trong phần mã nơi chúng tôi xem liệu hình que có di chuyển sang phải và va chạm với một nhân vật ở bên phải không [tại w và x]

#3. Nền tảng di chuyển Một lớp nền tảng di chuyển sẽ tương tự như lớp dành cho hình que. Chúng tôi sẽ cần tính toán lại vị trí của nền tảng, thay vì có một bộ tọa độ cố định. Chúng ta có thể tạo một lớp con của lớp PlatformSprite, do đó hàm __init__ sẽ như sau. u v w x y z {

lớp Di chuyểnPlatformSprite[PlatformSprite]. def __init__[bản thân, trò chơi, ảnh_ảnh, x, y, chiều rộng, chiều cao]. Nền tảngSprite. __init__[self, game, photo_image, x, y, \ width, height] self. x = 2 tự. truy cập = 0 tự. last_time = thời gian. thời gian [] tự. chiều rộng = chiều rộng bản thân. chiều cao = chiều cao

Chúng tôi chuyển các tham số giống như lớp PlatformSprite tại u, sau đó gọi hàm __init__ của lớp cha có cùng các tham số đó tại v. Điều này có nghĩa là bất kỳ đối tượng nào của

Giải pháp cho Chương 18  39

Lớp MovingPlatformSprite sẽ được thiết lập hoàn toàn giống như một đối tượng của lớp PlatformSprite. Sau đó, chúng tôi tạo một biến x có giá trị là 2 [nền tảng sẽ bắt đầu di chuyển sang phải] tại w, theo sau là một biến đếm tại x. Chúng tôi sẽ sử dụng bộ đếm này để báo hiệu khi nền tảng thay đổi hướng. Bởi vì chúng tôi không muốn nền tảng di chuyển qua lại nhanh nhất có thể, giống như cách mà StickFigureSprite của chúng tôi không nên di chuyển qua lại nhanh nhất có thể, chúng tôi sẽ ghi lại thời gian trong biến last_time tại y [ . Các bổ sung cuối cùng cho chức năng này là lưu chiều rộng và chiều cao tại z và {. Phần bổ sung tiếp theo cho lớp mới của chúng ta là hàm coords. bản thân. last_time = thời gian. thời gian [] tự. chiều rộng = chiều rộng bản thân. chiều cao = chiều cao

bạn v

def coords [bản thân]. xy = tự. trò chơi. Tranh sơn dầu. hợp âm [tự. hình ảnh] tự. tọa độ. x1 = xy[0] tự. tọa độ. y1 = xy[1] tự. tọa độ. x2 = xy[0] + bản thân. chiều rộng tự. tọa độ. y2 = xy[1] + bản thân. chiều cao tự trả lại. tọa độ

Hàm coords gần giống hệt như hàm mà chúng ta đã sử dụng cho hình que, ngoại trừ việc thay vì sử dụng chiều rộng và chiều cao cố định, chúng ta sử dụng các giá trị mà chúng ta đã lưu trữ trong hàm __init__. [Bạn có thể thấy sự khác biệt ở dòng u và v. ] Vì đây là nhân vật di chuyển nên chúng ta cũng cần thêm chức năng di chuyển. bản thân. tọa độ. x2 = xy[0] + bản thân. chiều rộng tự. tọa độ. y2 = xy[1] + bản thân. chiều cao tự trả lại. tọa độ

u v w x y z {

di chuyển chắc chắn [bản thân]. nếu thời gian. thời gian[] - bản thân. lần trước > 0. 03. bản thân. last_time = thời gian. thời gian [] tự. trò chơi. Tranh sơn dầu. di chuyển [tự. hình ảnh, bản thân. x, 0] tự. phản = tự. truy cập + 1 nếu tự. bộ đếm > 20. bản thân. x = tự. x * -1 tự. bộ đếm = 0

40  Giải pháp cho Chương 18

Chức năng di chuyển kiểm tra xem thời gian có lớn hơn ba phần mười giây tại u không. Nếu đúng như vậy, chúng tôi đặt biến last_time thành thời điểm hiện tại tại v. Tại w, chúng tôi di chuyển hình ảnh nền tảng, sau đó tăng biến đếm tại x. Nếu bộ đếm lớn hơn 20 [câu lệnh if tại y], chúng ta đảo ngược hướng chuyển động bằng cách nhân biến x với –1 [vì vậy nếu nó dương thì nó trở thành âm và nếu nó âm thì nó trở thành dương] tại z, và . Giờ đây, bệ sẽ di chuyển theo một hướng khi đếm đến 20, sau đó quay ngược lại theo hướng khác khi đếm đến 20. Để kiểm tra các nền tảng di chuyển, chúng ta có thể thay đổi một vài đối tượng nền tảng hiện có từ PlatformSprite thành MovingPlatformSprite. platform5 = MovingPlatformSprite[g, PhotoImage[file="platform2. gif"], \ 175, 350, 66, 10] platform6 = PlatformSprite[g, PhotoImage[file="platform2. gif"], \ 50, 300, 66, 10] platform7 = PlatformSprite[g, PhotoImage[file="platform2. gif"], \ 170, 120, 66, 10] platform8 = PlatformSprite[g, PhotoImage[file="platform2. gif"], \ 45, 60, 66, 10] platform9 = MovingPlatformSprite[g, PhotoImage[file="platform3. gif"], \ 170, 250, 32, 10] platform10 = PlatformSprite[g, PhotoImage[file="platform3. gif"], \ 230, 200, 32, 10]

Sau đây hiển thị mã đầy đủ với tất cả các thay đổi. từ tkinter nhập * nhập lớp thời gian nhập ngẫu nhiên Trò chơi. def __init__[bản thân]. bản thân. tk = Tk[] tự. tk. title["Mr Stick Man Races for the Exit"] tự. tk. tự thay đổi kích thước [0, 0]. tk. wm_attributes["-topmost", 1] self. canvas = Canvas[tự. tk, width=500, height=500, \ highlightthickness=0]. Tranh sơn dầu. pack[] tự. tk. tự cập nhật []. canvas_height = 500 bản thân. canvas_width = 500 bản thân. bg = PhotoImage[file="nền. gif"]

Giải pháp cho Chương 18  41

w = bản thân. bg. chiều rộng [] h = tự. bg. height[] cho x trong phạm vi [0, 5]. cho y trong phạm vi [0, 5]. bản thân. Tranh sơn dầu. create_image[x * w, y * h, \ image=self. bg, anchor='nw'] tự. sprites = [] tự. chạy = Chân chính. game_over_text = bản thân. Tranh sơn dầu. create_text[250, 250, \ text='BẠN THẮNG. ', state='hidden'] def mainloop[self]. trong khi 1. nếu tự. đang chạy. cho ma trong tự. yêu tinh. ma. di chuyển [] khác. thời gian. ngủ [1] tự. Tranh sơn dầu. itemconfig[tự. game_over_text, \ state='normal'] tự. tk. update_idletasks[] tự. tk. cập nhật thời gian. ngủ [0. 01] tọa độ lớp. def __init__[bản thân, x1=0, y1=0, x2=0, y2=0]. bản thân. x1 = x1 bản thân. y1 = y1 bản thân. x2 = x2 tự. y2 = y2 def trong_x[co1, co2]. nếu [co1. x1 > co2. x1 và co1. x1 < co2. x2] hoặc [co1. x2 > co2. x1 và co1. x2 < hoặc [co2. x1 > co1. x1 và co2. x1 < hoặc [co2. x2 > co1. x1 và co2. x2 < return Đúng khác. trả về Sai def trong_y[co1, co2]. nếu [co1. y1 > co2. y1 và co1. y1 < co2. y2] hoặc [co1. y2 > co2. y1 và co1. y2 < hoặc [co2. y1 > co1. y1 và co2. y1 < hoặc [co2. y2 > co1. y1 và co2. y2 < trả về Đúng

42  Giải pháp cho Chương 18

\ co2. x2] \ co1. x2] \ co1. x1]

\ co2. y2] \ co1. y2] \ co1. y1]

khác. trả về Sai def va chạm_left[co1, co2]. nếu trong_y[co1, co2]. nếu co1. x1 = co2. x1. return Đúng return Sai def va chạm_right[co1, co2]. nếu trong_y[co1, co2]. nếu co1. x2 >= co2. x1 và co1. x2 = co2. y1 và y_calc 0. 03. bản thân. last_time = thời gian. thời gian [] tự. trò chơi. Tranh sơn dầu. di chuyển [tự. hình ảnh, bản thân. x, 0] tự. bộ đếm += 1 nếu tự. bộ đếm > 20. bản thân. x *= -1 bản thân. bộ đếm = 0 lớp DoorSprite[Sprite]. def __init__[bản thân, trò chơi, x, y, chiều rộng, chiều cao]. Ma. __init__[bản thân, trò chơi] bản thân. closed_door = PhotoImage[file="door1. gif"] tự. open_door = PhotoImage[file="door2. gif"] tự. hình ảnh = trò chơi. Tranh sơn dầu. create_image[x, y, \ image=self. closed_door, anchor='nw'] tự. tọa độ = Tọa độ[x, y, x + [chiều rộng / 2], y + chiều cao] tự. endgame = True def opendoor[self]. bản thân. trò chơi. Tranh sơn dầu. itemconfig[tự. hình ảnh, hình ảnh = chính mình. open_door] tự. trò chơi. tk. update_idletasks[] def closedoor[self]. bản thân. trò chơi. Tranh sơn dầu. itemconfig[tự. hình ảnh, \ image=self. đóng_cửa] tự. trò chơi. tk. update_idlet task[]

44  Giải pháp cho Chương 18

lớp StickfigureSprite[Sprite]. def __init__[bản thân, trò chơi]. Ma. __init__[bản thân, trò chơi] bản thân. images_left = [ PhotoImage[file="figure-L1. gif"], PhotoImage[file="figure-L2. gif"], PhotoImage[file="figure-L3. gif"] ] tự. images_right = [ PhotoImage[file="figure-R1. gif"], PhotoImage[file="figure-R2. gif"], PhotoImage[file="figure-R3. gif"] ] tự. hình ảnh = trò chơi. Tranh sơn dầu. create_image[200, 470, \ image=self. images_left[0], anchor='nw'] self. x = -2 tự. y = 0 tự. current_image = 0 tự. current_image_add = 1 bản thân. jump_count = 0 tự. last_time = thời gian. thời gian [] tự. tọa độ = tọa độ[] trò chơi. Tranh sơn dầu. bind_all['', tự. trò chơi quay_trái]. Tranh sơn dầu. bind_all['', tự. trò chơi rẽ_phải]. Tranh sơn dầu. bind_all['', tự. jump] def turn_left[self, evt]. nếu tự. y == 0. bản thân. x = -2 def turn_right[self, evt]. nếu tự. y == 0. bản thân. x = 2 bước nhảy def [bản thân, evt]. nếu tự. y == 0. bản thân. y = -4 tự. jump_count = 0 def animate[self]. nếu tự. x. = 0 và tự. y == 0. nếu thời gian. thời gian[] - bản thân. lần trước > 0. 1. bản thân. last_time = thời gian. thời gian [] tự. current_image += bản thân. current_image_add nếu bản thân. current_image >= 2. bản thân. current_image_add = -1 nếu bản thân. hiện tại_hình ảnh 0. nếu tự. y. = 0. bản thân. trò chơi. Tranh sơn dầu. itemconfig[tự. hình ảnh, \ image=self. images_right[2]] khác. bản thân. trò chơi. Tranh sơn dầu. itemconfig[tự. hình ảnh, \ image=self. hình ảnh_phải[bản thân. current_image]] def coords[self]. xy = tự. trò chơi. Tranh sơn dầu. hợp âm [tự. hình ảnh] tự. tọa độ. x1 = xy[0] tự. tọa độ. y1 = xy[1] tự. tọa độ. x2 = xy[0] + 27 tự. tọa độ. y2 = xy[1] + 30 tự quay lại. tọa độ def di chuyển [bản thân]. bản thân. animate[] nếu tự. y < 0. bản thân. jump_count += 1 nếu tự. jump_count > 20. bản thân. y = 4 nếu tự. y > 0. bản thân. jump_count -= 1 đồng = tự. coords[] left = True right = True top = True bottom = True tụt xuống = True if self. y > 0 và đồng. y2 >= bản thân. trò chơi. canvas_height. bản thân. y = 0 bottom = Sai elif self. y < 0 và đồng. y1 0 và đồng. x2 >= tự. trò chơi. canvas_width. bản thân. x = 0 đúng = Sai

46  Giải pháp cho Chương 18

bản thân yêu tinh. x < 0 và đồng. x1 0 và va chạm_bottom[tự. y, \ co, sprite_co]. bản thân. y = sprite_co. y1 - co. y2 nếu tự. y < 0. bản thân. y = 0 đáy = Sai đỉnh = Sai nếu đáy và giảm và tự. y == 0 \ và co. y2 < bản thân. trò chơi. canvas_height \ và va chạm_bottom[1, co, sprite_co]. ngã = Sai nếu trái và tự. x < 0 và va chạm_left[co, sprite_co]. bản thân. x = 0 còn lại = Sai nếu sprite. tàn cuộc. bản thân. kết thúc [sprite] nếu đúng và tự. x > 0 \ và va chạm_right[co, sprite_co]. bản thân. x = 0 đúng = Sai nếu sprite. tàn cuộc. bản thân. kết thúc [sprite] nếu rơi và đáy và tự. y == 0 \ và co. y2 < bản thân. trò chơi. canvas_height. bản thân. y = 4 tự. trò chơi. Tranh sơn dầu. di chuyển [tự. hình ảnh, bản thân. x, bản thân. y] def end[bản thân, sprite]. bản thân. trò chơi. đang chạy = Sprite sai. opendoor[] thời gian. ngủ [1] tự. trò chơi. Tranh sơn dầu. itemconfig[tự. image, state='hidden'] sprite. đóng cửa[]

Giải pháp cho Chương 18  47

g = Game[] platform1 = PlatformSprite[g, PhotoImage[file="platform1. gif"], \ 0, 480, 100, 10] platform2 = PlatformSprite[g, PhotoImage[file="platform1. gif"], \ 150, 440, 100, 10] platform3 = PlatformSprite[g, PhotoImage[file="platform1. gif"], \ 300, 400, 100, 10] platform4 = PlatformSprite[g, PhotoImage[file="platform1. gif"], \ 300, 160, 100, 10] platform5 = MovingPlatformSprite[g, PhotoImage[file="platform2. gif"],\ 175, 350, 66, 10] platform6 = PlatformSprite[g, PhotoImage[file="platform2. gif"], \ 50, 300, 66, 10] platform7 = PlatformSprite[g, PhotoImage[file="platform2. gif"], \ 170, 120, 66, 10] platform8 = PlatformSprite[g, PhotoImage[file="platform2. gif"], \ 45, 60, 66, 10] platform9 = MovingPlatformSprite[g, PhotoImage[file="platform3. gif"],\ 170, 250, 32, 10] platform10 = PlatformSprite[g, PhotoImage[file="platform3. gif"], \ 230, 200, 32, 10] g. yêu tinh. nối thêm [nền tảng1] g. yêu tinh. nối thêm [nền tảng2] g. yêu tinh. nối thêm [nền tảng3] g. yêu tinh. nối thêm [nền tảng4] g. yêu tinh. nối thêm [nền tảng5] g. yêu tinh. nối thêm [nền tảng6] g. yêu tinh. nối thêm [nền tảng7] g. yêu tinh. nối thêm [nền tảng8] g. yêu tinh. nối thêm [nền tảng9] g. yêu tinh. append[platform10] door = DoorSprite[g, 45, 30, 40, 35] g. yêu tinh. append[cửa] sf = StickFigureSprite[g] g. yêu tinh. nối thêm [sf] g. vòng lặp chính[]

Học Python có dễ không?

Python được coi là một trong những ngôn ngữ lập trình dễ học nhất dành cho người mới bắt đầu . Nếu bạn quan tâm đến việc học một ngôn ngữ lập trình, Python là một nơi tốt để bắt đầu. Nó cũng là một trong những cách được sử dụng rộng rãi nhất.

Python có phải là ngôn ngữ lập trình không?

Python là ngôn ngữ lập trình hướng đối tượng, tương tác, thông dịch . Nó kết hợp các mô-đun, ngoại lệ, gõ động, kiểu dữ liệu động mức rất cao và các lớp. Nó hỗ trợ nhiều mô hình lập trình ngoài lập trình hướng đối tượng, chẳng hạn như lập trình thủ tục và chức năng.

Chủ Đề