STEAM Bus 2022 – 5 thành phố, 10 lớp học, và vô vàn trải nghiệm STEAM thú vị
Tham gia hành trình này, phụ huynh sẽ được cùng con trải nghiệm các workshop miễn phí về tư duy và lập trình trên toàn quốc, cũng như giao lưu với đội ngũ tài năng trên toàn cầu của STEAM for Vietnam. Hãy cùng STEAM for Vietnam tìm hiểu về chuyến Bus tour xuyên Việt đầy hào hứng này nhé!
Xuất phát từ Hà Nội, hành trình STEAM Bus 2022 sẽ bắt đầu tại American Center, Hà Nội – nơi khai trương STEAM Hub đầu tiên ở Việt Nam. Từ đó, chuyến xe sẽ lăn bánh qua 5 thành phố, tổ chức dự kiến 10 workshop, đem đến vô vàn trải nghiệm học STEAM thú vị cho hơn 600 học sinh.
Đến với STEAM Bus, học sinh và phụ huynh có cơ hội giao lưu trực tiếp với các thầy cô là những chuyên gia hàng đầu đang làm việc tại các tập đoàn lớn trên thế giới.
Đây cũng sẽ đánh dấu lần đầu tiên các em được trực tiếp tham gia vào các workshop do STEAM for Vietnam tổ chức tại địa phương sau 2 năm thành lập.
Tuyến Xe Trải Nghiệm – Rèn luyện Tư duy Máy tính và lập trình
STEAM Bus 2022 sẽ đem lại một mùa hè độc nhất với vô vàn trải nghiệm học tập STEAM thú vị cho phụ huynh và các bé, trong đó là các workshop về “Tư duy Máy tính và Lập trình Scratch” của khoá học CS 001 và “Lập trình Robotics cùng VEX IQ” của khóa học CS 201.
Workshop “Tư duy Máy tính và Lập trình Scratch”
Workshop có gì thú vị?
Vận dụng bí kíp Giải quyết vấn đề vạn năng “TTNV” – “Tách; Tìm; Nhìn; Viết”, các bạn học sinh tham gia workshop sẽ đồng hành nhân vật Miu trong hành trình đi tìm cá nướng. Học sinh sẽ sử dụng ngôn ngữ lập trình Scratch và óc sáng tạo để giúp Miu vượt qua mê cung tìm đường đến đích.
Lợi ích khi tham gia workshop:
“Học mà chơi, chơi mà học”: Trong 1 tiếng workshop, các bạn học sinh có thể vận dụng Tư duy Máy tính và nắm được kĩ năng lập trình cơ bản để xây dựng trò chơi của riêng mình.
Các em có thể mang về sản phẩm hoàn chỉnh do chính bản thân tạo ra để “khoe” với bạn bè và gia đình.
Các bạn tham gia còn được nhận những món quà “có 1-0-2” từ STEAM for Vietnam.
Những thành phẩm demo của workshop:
Phụ huynh và học sinh có thể tham khảo sản phẩm được làm từ Scratch của các STEAMese lớp CS 001 ở những link sau:
Đến với workshop, học sinh sẽ được chia vào đội nhóm và hướng dẫn lắp ráp robot Slick. Các em học sinh có thể thoả sức sáng tạo trang trí robot theo hướng mình thích. Các đội nhóm sau đó sẽ so tài phân định thắng thua qua cuộc thi đẩy gỗ cùng với robot của mình.
Lợi ích khi tham gia workshop:
Học sinh được trải nghiệm lắp đặt linh kiện và tạo ra các vận động cơ bản của robot VEX IQ
Các em được thử thách khả năng làm việc đội nhóm và kết bạn cùng trang lứa thông qua cuộc thi.
Do chương trình giới hạn số lượng người tham gia, phụ huynh và học sinh hãy đăng ký ngay để có cơ hội tham gia các workshop đặc biệt này!
Lần đầu tiên các em học sinh sẽ được gặp gỡ trực tiếp đội ngũ hùng hậu của STEAM for Vietnam trên toàn cầu. Hàng chục thành viên bao gồm các giảng viên và hơn 200 tình nguyện viên từ nhiều đất nước như Hoa Kỳ, Canada, Singapore đã sẵn sàng cho một mùa hè thật nhiều trải nghiệm và đáng nhớ cùng các phụ huynh và học sinh.
Các giảng viên đồng hành STEAM for Vietnam trong chuyến đi dọc Việt Nam là những kỹ sư công nghệ, chuyên gia đến từ thung lũng Silicon của Hoa Kỳ cùng các tập đoàn đa quốc gia tại châu Á và châu Âu. Họ sẽ hỗ trợ các thầy cô tại các trường học đối tác thiết kế và triển khai các hoạt động hoạt tập tại STEAM Hub.
Ngoài ra, STEAM for Vietnam sẽ tổ chức 2 buổi workshop về “Phát triển sự nghiệp trong lĩnh vực Khoa học Máy tính” với mong muốn truyền cảm hứng cho các bạn học sinh có dự định theo đuổi STEAM trong tương lai và phát triển tư duy khoa học để ứng dụng trong đời sống.
Đến với workshop, các bạn sẽ được tìm hiểu về 1 ngày trọn vẹn của các kỹ sư tại STEAM for Vietnam. Ban ngày họ là những người trẻ đa tài phù sóng 12 múi giờ tại các công ty danh tiếng như Google, Microsoft, Amazon, v.v. Sau giờ hành chính, họ là những tình nguyện viên nhiệt huyết của STEAM for Vietnam.
Làm thế nào họ giữ được “lửa” với nghề và cân bằng giữa hai công việc? Các bạn học sinh hãy nhanh tay đăng ký tham gia workshop để có cơ hội gặp gỡ các kỹ sư tài năng và nhiệt huyết từ STEAM for Vietnam nhé!
Hành trình STEAM Bus – Cùng STEAM mang tới cơ hội học tập STEAM cho hàng ngàn trẻ em Việt Nam
STEAM Bus là dự án khởi động sáng kiến xây dựng các trung tâm STEAM Hub trên toàn Việt Nam. STEAM Hub là sáng kiến của STEAM for Vietnam nhằm xây dựng các thư viện công nghệ và trung tâm học tập STEAM, mang lại cơ hội và môi trường học tập STEAM và lập trình hoàn toàn miễn phí và bình đẳng.
STEAM Hub sẽ được trang bị các thiết bị và tài liệu học tập đa dạng, chương trình học đẳng cấp quốc tế và sự hỗ trợ tại chỗ của đội ngũ trợ giảng địa phương. Thông qua sáng kiến STEAM Hub, STEAM for Vietnam hy vọng việc thiếu thiết bị học tập không còn là rào cản với học sinh, từ đó giúp học sinh Việt Nam nâng cao tính cạnh tranh trên thị trường toàn cầu.
Thời gian đăng ký tham gia STEAM Bus có hạn. Nếu phụ huynh và các con đã sẵn sàng cho một mùa hè sôi động cùng STEAM, hãy nhanh tay đăng ký tham gia ngay hôm nay!
————————
STEAM Bus là dự án mở màn sáng kiến xây dựng các trung tâm STEAM Hub trên toàn Việt Nam, nơi trang bị các thiết bị và tài liệu về kiến thức STEAM. Nhằm giúp các học sinh có cơ hội tiếp cận và học tập công nghệ một cách bình đẳng, STEAM Bus hứa hẹn mang tới một mùa hè tràn đầy trải nghiệm cho các học sinh và phụ huynh. Hãy đăng ký tham gia để cùng STEAM for Vietnam trải nghiệm một mùa hè đầy sôi động và bổ ích.
Có không ít phụ huynh nghĩ rằng, nghệ thuật chỉ xuất hiện ở các lĩnh vực như văn chương, điện ảnh, âm nhạc, kiến trúc… Nhưng thực tế, bất cứ ngành nào cũng sẽ gắn liền với nghệ thuật. Đối với ngành IT, các bạn lập trình viên cũng cần có tư duy nghệ thuật để phát triển đồ họa đẹp cho app và website để thu hút khách hàng truy cập nhiều hơn. Bên cạnh đó, Erica – phát minh trí tuệ nhân tạo đầu tiên gây bất ngờ cho toàn thế giới với vẻ ngoài y hệt con người cũng là một sản phẩm của nghệ thuật. Nếu các nhà khoa học không có tư duy sáng tạo và quan sát tỉ mỉ thì đã không tạo ra được một sản phẩm trí tuệ nhân tạo thực tế đến như vậy.
“Khi học về nghệ thuật, các em có thể ứng dụng nó trong học tập và phát huy những năng lực tiềm tàng của bản thân.” – Thầy Nguyễn Văn Mạnh – Giáo viên trung tâm mỹ thuật Đàn Cá Nhỏ và Giảng viên khoá học ART 001.
Hiểu được tầm quan trọng của việc tiếp xúc nghệ thuật từ sớm, STEAM for Vietnam đã hợp tác với VCVAA – Học viện Nghệ thuật Thị giác Đương đại Việt Nam để cho ra đời khóa học Nghệ thuật Thị giác ART 001 – “EM!” – Hành trình Khám phá Bản thân qua Nghệ thuật. Thông qua khóa học, các em sẽ phát triển thêm nhận thức về bản thân và tự tin với chính mình hơn – vì STEAM for Vietnam và VCVAA tin rằng mỗi con người chúng ta sinh ra đã là một cá nhân vô cùng đặc biệt, mỗi chúng ta đều là một nhà sáng tạo, một người nghệ sĩ tài ba.
Đây là khóa học có “1-0-2” với sự kết hợp hoàn hảo giữa nghệ thuật và ứng dụng công nghệ thông tin vào trong giảng dạy. Các bài giảng được triển khai với mô hình lớp học OMO Supermodel Class và hình thức học trực tuyến Live MOOC, vì vậy học sinh ở bất kỳ đâu cũng có cơ hội được tiếp cận với chương trình học chuẩn quốc tế và các thầy cô giàu kinh nghiệm. Chương trình giảng dạy khóa học ART 001: “EM!” – Hành trình Khám phá Bản thân qua Nghệ thuật được chia làm 3 phần lớn: “Em là ai”, “Nơi em sống”, “Cảm xúc và em”. Qua hành trình thú vị này, các em học sinh sẽ có những trải nghiệm quý giá và được tiếp cận với nghệ thuật một cách gần gũi nhất.
Phần 1: Em là ai?
Ở trạm 1, học viên chơi các trò chơi, trả lời các câu hỏi để khám phá những khía cạnh sâu sắc về tính cách, sở thích của bản thân. Từ đó học sinh có thể trình bày tác phẩm tự họa bằng các chất liệu và học về sự cân bằng, tính đối xứng qua việc quan sát các tác phẩm tự hoạ của các danh hoạ và của cá nhân.
Bài 1: Em là ai?
Học sinh sẽ làm quen với thầy cô, hiểu rõ nội dung khóa học và học cách sử dụng thiết bị cũng như trang LMS. Đồng thời, học sinh sẽ được hướng dẫn phương pháp ghi chép bằng sketchnote để trình bày về bản thân.
Bài 2: Em và danh họa
Thông qua tìm hiểu tranh chân dung Danh họa – Arcymboldo và chân dung của các họa sĩ, học sinh sẽ học được nhiều kiến thức hữu ích như: tính đối xứng và điểm nhấn trong nghệ thuật, kĩ thuật sử dụng màu sáp dầu. Bên cạnh đó, học sinh sẽ có cơ hội sử dụng từ vựng về màu sắc, đối xứng, điểm nhấn để mô tả tác phẩm.
Bài 3: Chân dung em
Học sinh sẽ sáng tạo tác phẩm chân dung của chính bản thân mình trên giấy A4 bằng các nguyên vật liệu giấy, lá, hoa, cành cây, sỏi và các kĩ thuật thao tác, sử dụng, kết nối. Qua đó, học sinh sẽ hiểu được làm thế nào để có điểm nhấn và sắp xếp bố cục tranh chân dung.
Phần 2: Nơi em sống
Học viên được cung cấp các biểu mẫu để thực hành ghi chép bằng sketchnote quan sát nhà, phòng, khung cảnh và mọi người xung quanh mình. Qua việc học hỏi các tác phẩm 3D của các học sinh khác và các nghệ sĩ, học viên sẽ tạo 1 tác phẩm 3D môi trường sống của mình (nhà cửa, phong cảnh, thành phố, con người).
Bài 4: Làm quen với họa sĩ
Học sinh hiểu được cảm xúc của mỗi nghệ sĩ sẽ biểu hiện khác nhau trên các tác phẩm của họ thông qua tác phẩm ấn tượng, trừu tượng như họa sĩ Xèo Chu. Đồng thời, học sinh sẽ được học về hình thái của đường nét, dùng các từ ngữ chuyên ngành để mô tả về đường nét, màu sắc, hình dạng và điểm nhấn trong tác phẩm. Thông qua bài 4 này, học sinh sẽ thành thạo kĩ thuật sử dụng màu nước kết hợp màu sáp dầu.
Bài 5: Cảm xúc của em
Học sinh mạnh dạn sử dụng các màu sắc, đường nét để tạo điểm nhấn trong tác phẩm và vẽ những tác phẩm trừu tượng miêu tả cảm xúc của mình trên giấy A3.
Phần 3: Cảm xúc và Em
Chặng cuối của chuyến tàu khám phá bản thân, học sinh sẽ khám phá những cảm xúc đa dạng của con người. Đồng thời các em học cách dễ dàng vận dụng các kĩ năng về đường nét, màu sắc để sáng tạo tác phẩm thể hiện cảm xúc cá nhân của mình.
Bài 6: Nơi em sống
Đây là một trong những bài học thú vị nhất của trạm 3, học sinh sẽ sử dụng sketchnote để các từ ngữ về màu sắc, đường nét, hình dạng, hình khối để mô tả môi trường xung quanh và phác họa khung cảnh nơi mình sống. Hơn thế nữa, học sinh sẽ lựa chọn 1 đối tượng (nhà, con người, đồ vật) và ghi chép kỹ: màu, hình, chi tiết nhỏ.
Bài 7: Ngôi nhà trong mơ
Học sinh sử dụng kỹ thuật pop-up để thực hiện tác phẩm mô tả về khung cảnh, môi trường sống, bao gồm: một số kĩ thuật dựng nổi (pop-up) cơ bản. và một số kĩ thuật dựng khối từ các đồ vật tái chế.
Bài 8: Là Em!
Học sinh sẽ quay video giới thiệu về bản thân mình qua các sản phẩm nghệ thuật đã sáng tạo trong quá trình học. Đồng thời chia sẻ cảm xúc và trải nghiệm với thầy cô và các bạn.
Các thầy cô giàu kinh nghiệm của STEAM for Vietnam và VCVAA luôn mong muốn giúp cho các bạn học sinh ở khắp mọi nơi có thể học nghệ thuật để phát triển toàn diện hơn về trí tuệ tư duy cũng như cảm xúc. Nhờ đó, học sinh biết cách biểu lộ cảm xúc, thể hiện mong muốn bản thân, được là chính mình. Hãy cùng STEAM for Vietnam tìm hiểu về những thầy cô sẽ dẫn dắt các bạn học sinh trên chuyến tàu ART 001 – “EM!” – Hành trình khám phá bản thân qua Nghệ thuật này nhé!
“Nghệ thuật có vai trò trong việc giáo dục giúp trẻ em được là chính mình, thay vì là bản sao của người khác”– Sydney Gurewitz Clemens.
Đây cũng là mong muốn của STEAM for Vietnam và VCVAA khi phát triển khoá học ART 001, giúp các em nhỏ được phát triển bản thân thông qua khám phá và cảm nhận thế giới Nghệ thuật Thị giác đầy phong phú từ cuộc sống xung quanh.
Chúng tôi hy vọng thông qua khóa học, trẻ em Việt Nam sẽ được tiếp cận với các phương pháp học và thực hành nghệ thuật để phát triển cảm xúc, kĩ năng giải quyết vấn đề trong học tập và cuộc sống sau này. Phụ huynh có thể đăng ký ngay lớp ART 001: “EM!” – Hành trình khám phá bản thân qua Nghệ thuật tại đây.
— — —
STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.
ART 001: “EM!” – Hành trình Khám phá Bản thân qua Nghệ thuật là khóa học nghệ thuật ứng dụng các công nghệ hiện đại, với mong muốn giúp hàng nghìn trẻ em Việt Nam tiếp cận nghệ thuật một cách tự nhiên và dễ dàng nhất. Sử dụng các hoạt động học tập sáng tạo, chất liệu nghệ thuật gần gũi và chương trình đề cao việc tự học, ART 001 phù hợp với mọi độ tuổi và đối tượng. Khóa học sẽ giúp các bạn học sinh tìm hiểu về chính mình, cũng như học cách thể hiện cảm xúc của bản thân qua nghệ thuật.
2. Tại sao chọn Nghệ thuật Thị giác để mang tới cho trẻ em Việt Nam?
Hội hoạ không chỉ là một hoạt động giải trí hay sở thích, nó còn có thể mang lại lợi ích cho trẻ theo nhiều cách hơn chúng ta nghĩ, bởi “Nghệ thuật có vai trò trong việc giáo dục giúp trẻ em được là chính mình, thay vì là bản sao của người khác” – Sydney Gurewitz Clemens. STEAM for Vietnam muốn truyền tải thông điệp này đến với các trẻ em Việt Nam qua Nghệ thuật thị giác (Visual Arts) và đã cùng Học viện Nghệ thuật Thị giác Đương đại Việt Nam (VCVAA) phát triển nên khoá học ART 001, lấy chủ đề xoay quanh hành trình khám phá bản thân của “EM” – tên gọi trìu mến mà chúng ta dành cho trẻ em Việt Nam.
Nghệ thuật Thị giác là một hình thức nghệ thuật tạo ra các sản phẩm bắt nguồn từ tự nhiên và chủ yếu tác động vào thị giác như hội họa, điêu khắc, kiến trúc, đồ họa hay nhiếp ảnh, làm phim. Nó thực ra hiện hữu ở khắp mọi nơi xung quanh chúng ta, trong những thứ giản đơn như ngôi nhà ta ở, con đường ta đi, hay cuốn sách ta đọc. Với môn nghệ thuật này, trẻ sẽ được tiếp xúc với nhiều thể loại và yếu tố nghệ thuật, “chơi đùa” nhiều hơn với màu sắc và các chất liệu tự nhiên. Vì vậy, các em sẽ được rèn luyện cả về tư duy trí tuệ (IQ) và tư duy cảm xúc (EQ) để có thể hiểu thêm về bản thân mình.
3. Phương pháp tiếp cận nghệ thuật TTNV
Để đạt được hai mục tiêu chính đó, ART 001 mang đến 4 phương pháp tiếp cận nghệ thuật chính được viết tắt bằng cụm “Tớ Thích Như Vậy – TTNV”. Hãy cùng tìm hiểu cụm từ này đóng vai trò quan trọng ra sao với các bạn học sinh của khóa học nhé!!
T – Tập trung vào quá trình (Process Focus)
Mục tiêu chính của khóa học là giúp trẻ bồi dưỡng kỹ năng và kiến thức để có thể tạo ra những tác phẩm của riêng mình. Đây là một quá trình dài với nhiều hoạt động mỹ thuật, luyện tập và thực hành, nhưng khi đã biết cách thuyết minh về quá trình tạo tác phẩm; học viên sẽ có thể thiết kế portfolio nghệ thuật (artfolio) của riêng mình, biết quan tâm hơn đến bản thân và môi trường xung quanh.
T – Tư duy Thiết kế (Design Thinking)
Tư duy Thiết kế là một cách tư duy khuyến khích sự đổi mới và tiếp cận vấn đề một cách sáng tạo. Trong khi đó, nghệ thuật đề cao sự sáng tạo và suy nghĩ logic.Vì vậy, Tư duy Thiết kế là một phương tiện giúp trẻ có thể tiếp cận nghệ thuật một cách tự nhiên nhất. Kết hợp cả hai sẽ tạo ra một môi trường sáng tạo, năng động và rộng mở học sinh có thể phát triển cảm xúc, kỹ năng giải quyết vấn đề trong học tập và trong cuộc sống sau này. Chính vì vậy, STEAM for Vietnam đã đưa “Tư duy Thiết kế” vào một trong bốn hướng tiếp cận cốt lõi để trẻ có thể phát huy tối đa tiềm năng nghệ thuật.
N – Năm giác quan (Cảm thụ và thưởng ngoạn nghệ thuật trọn vẹn thông qua 5 giác quan) và V – Vui học “vẽ” thông qua thực hành (Learning by doing)
Vẽ là một môn nghệ thuật cần sử dụng nhiều giác quan để tạo ra tác phẩm, vì vậy khóa học ART 001 mang đến một hành trình khám phá nghệ thuật với nhiều chất liệu: màu sáp, màu nước, bút mực, giấy và các nguyên vật liệu đa dạng như sách báo, giấy màu, lá cây, sỏi, v.v. “EM! – Hành trình Khám phá Bản thân qua Nghệ thuật thiết kế nhiều bài tập thực hành khác nhau: cắt dán, tạo hình, vẽ tranh, v.v. để giúp học sinh có thêm các trải nghiệm đa dạng. Khi được trải nghiệm nhiều hơn, các em hiểu thêm về cách tạo điểm nhấn trong tác phẩm, kết nối nhiều yếu tố cá nhân để tạo ra những bức tranh sống động.
Cùng một cảm xúc nhưng trong mỗi bức tranh, người nghệ sĩ sẽ có cách thể hiện khác nhau: vui, buồn, mệt mỏi, thích thú, v.v. qua những đường nét, hình dáng, màu sắc của tác phẩm. Với “TTNV”, STEAM for Vietnam mong rằng có thể phần nào giúp các học viên thể hiện cảm xúc cá nhân của mình qua những bức tranh sinh động.
4. Tam giác năng lực ASK
Ngoài việc ứng dụng Nghệ thuật Thị giác để mang Tư duy Thiết kế đến với trẻ em Việt Nam, “EM! – Hành trình Khám phá Bản thân qua Nghệ thuật còn xây dựng cho học sinh nền tảng tam giác năng lực ASK với 3 yếu tố chính: Attitude (thái độ), Skills (kỹ năng), và Knowledge (kiến thức) để trẻ có thể sớm hình thành và xây dựng năng lực thẩm mỹ.
STEAM for Vietnam muốn mang tới một không khí học tập thoải mái, năng động để giúp trẻ phát huy tối đa niềm yêu thích với nghệ thuật. Bên cạnh đó, những buổi học của ART 001 sẽ bồi dưỡng cho trẻ nhiều kỹ năng mềm như kỹ năng ghi chép, trình bày bằng sketchnote để từ đó tạo cơ hội cho các em phát triển cảm xúc cá nhân. Và cuối cùng, những “họa sĩ nhí” có thể thỏa sức phát triển bản thân với nhiều kiến thức và chất liệu nghệ thuật đa dạng như kỹ thuật sử dụng màu sáp dầu, kỹ thuật popup, sáng tạo chân dung, tranh phong cảnh, v.v. Trong khoá học ART 001, các em sẽ được cung cấp một môi trường cởi mở để bồi dưỡng mô hình năng lực ASK nói trên.
STEAM for Vietnam và Học viện Nghệ thuật Thị giác Đương đại Việt Nam (VCVAA) tin rằng, mỗi chúng ta sinh ra đã là một cá thể vô cùng đặc biệt và đều là nhà sáng tạo tài ba. Với các chủ đề gần gũi trong cuộc sống, chúng tôi mong muốn các em đều có thể khám phá được thêm về bản thân mình và trở nên tự tin hơn – bởi Nghệ thuật là một nơi kì diệu để biến mọi ý tưởng trở thành hiện thực, mọi chất liệu đời thường của cuộc sống trở thành công cụ sáng tạo.
Phụ huynh có thể đăng kí lớp ART 001 cho học sinh tại link này: https://steamforvietnam.org/courses (Thời gian mở đơn: 01/06/2022 – 18/06/2022 VNT)
————————
STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.
Đây là một trong những điều đầu tiên bạn cần chuẩn bị sau khi được mời tham gia vòng phỏng vấn. Biết về tầm nhìn, sứ mệnh, các hoạt động và sản phẩm của chúng tôi chắc chắn sẽ cung cấp cho bạn cái nhìn rộng hơn về tổ chức. Ngoài việc thể hiện mức độ quan tâm của bạn đến tổ chức mà bạn đang ứng tuyển, điều cần thiết là bạn phải làm rõ TẠI SAO bạn chọn chúng mình thay vì các tổ chức phi chính phủ/công ty khác.
Ngoài ra, bạn nên cập nhật cho mình về quy trình tuyển dụng cũng như các tiêu chí đánh giá ứng viên mà chúng mình sắp tiết lộ ngay dưới đây.
1.1 Quy trình tuyển dụng:
Quá trình tuyển dụng của STEAM for Vietnam bao gồm 5 vòng:
Sàng lọc CV (Resume screening)
Bài đánh giá (Assignment/Online assessment)
Phỏng vấn ban đầu (Phone screening)
Phỏng vấn chuyên môn (Technical interview)
Phỏng vấn cấp cao (nếu có) (Management interview)
Các vòng này giúp chúng mình đánh giá một cách hiệu quả xem ứng viên có đủ các yếu tố để trở thành một trong những mảnh ghép tiếp theo của STEAM for Vietnam hay không.
1.2 Tiêu chuẩn đánh giá:
Trong số nhiều tiêu chí của quy trình lựa chọn ứng viên, tiêu chí nào được chúng mình sử dụng tại STEAM cho Việt Nam? Hãy để chúng mình chia sẻ với bạn về IASK!
IASK là viết tắt của: Intelligence, Attitude, Skills & Knowledge.
Chúng mình tin rằng một ứng viên tiềm năng sẽ là một người nhanh nhẹn và có tinh thần học hỏi cao. Bên cạnh đó, bạn cần có khả năng phân tích và có thể sử dụng dữ liệu một cách hiệu quả.
Là một tổ chức trẻ và có tốc độ phát triển nhanh, chúng mình nhận ra rằng những thái độ trên là chìa khóa đưa đến thành công hôm nay của STEAM for Vietnam. Nếu bạn sẵn sàng đón nhận những thử thách mới, nhiệt huyết và đam mê, cam kết với tầm nhìn chung của tổ chức, thì STEAM for Vietnam chắc chắn là một nơi dừng chân phù hợp cho bạn.
Bên cạnh đó, chúng mình mong muốn các thành viên có những kỹ năng nhất định để thực hiện tốt nhất nhiệm vụ của mình. Các yêu cầu về kỹ năng sẽ khác nhau tùy theo vị trí ứng tuyển của bạn, nhưng điều bắt buộc phải có bao gồm kỹ năng chuyên môn và khả năng giao tiếp.
Knowledge — (About) Platform, Audience, Education
Để trở thành một thành viên cốt yếu tại STEAM for Vietnam, bạn cần phải có kiến thức nền tảng về STEAM nói chung cũng như kiến thức chuyên môn cho vị trí mà bạn ứng tuyển.
2. Tìm hiểu về bản thân:
Vì toàn bộ quá trình tuyển dụng nhằm mục đích cho phép chúng ta hiểu thêm về nhau, bạn nên nên hình dung được mình là ai, sẽ đóng vai trò như thế nào và điều gì sẽ giúp bạn tỏa sáng tại STEAM for Vietnam. Dưới đây là gợi ý về những thứ bạn nên chuẩn bị.
2.1 Thực hành và chuẩn bị:
Trước khi phỏng vấn, đừng quên xem lại CV của bạn một lần nữa và luyện tập trả lời các câu hỏi thường gặp khi phỏng vấn để làm quen với quy trình phỏng vấn. Ngoài ra, hãy chuẩn bị sẵn danh sách các câu hỏi dành cho người phỏng vấn. Điều này sẽ giúp bạn hiểu rõ hơn về tổ chức cũng như thể hiện sự mong muốn tìm hiểu thêm về chúng mình.
2.2 Trung thực:
Bạn hãy thành thật về các kỹ năng, điểm mạnh và điểm yếu của bản thân, do người phỏng vấn có thể khai thác các câu hỏi sâu hơn về những câu trả lời bạn đưa ra trong cuộc phỏng vấn. Không thành thật hoặc phóng đại khả năng của bản thân thường không giúp bạn thành công trong buổi phỏng vấn, mà ngược lại có thể gây ấn tượng xấu cho hình ảnh của bạn.
2.3 Tập trung:
Hãy chắc chắn rằng bạn dành sự chú ý trong quá trình phỏng vấn để hiểu đầy đủ các câu hỏi, nếu không, đừng ngại hỏi lại người phỏng vấn. Ngoài ra, bạn có thể chuẩn bị giấy bút hoặc thiết bị ghi chú để nắm bắt các thông tin quan trọng trong quá trình phỏng vấn.
2.4 Đúng giờ:
Mặc dù cuộc phỏng vấn được thực hiện trực tuyến, bạn nên xuất hiện ít nhất 10 phút trước giờ hẹn. Điều này giúp bạn có thời gian để chuẩn bị tốt hơn. Ngoài ra, nếu có bất kỳ vấn đề kỹ thuật nào, bạn vẫn có thời gian để giải quyết chúng và có mặt đúng giờ cho buổi phỏng vấn.
Chúng mình hy vọng rằng với những lời khuyên trên, bạn sẽ trang bị cho mình các “bí kíp” để có thể dễ dàng vượt qua buổi phỏng vấn và trở thành những đồng đội tuyệt vời của chúng mình trong tương lai!
Tìm hiểu về các vị trí đang tuyển dụng và ứng tuyển:
STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.
Không khó để chúng ta nhận thấy nhiều trẻ em đã bộc lộ tài năng và sự sáng tạo ngay từ khi còn nhỏ. Với việc được tiếp xúc với kiến thức về Robotics từ sớm, Anna Du, sống ở Mỹ, chỉ mới 12 tuổi nhưng đã chế tạo robot thu gom rác thải nhựa trên biển. Từ việc yêu môi trường và khát khao làm sạch bờ biển khu vực mình sống, Anna đã sáng tạo một chiếc xe robot có khả năng điều hướng trên mặt nước, tìm kiếm rác dưới đáy đại dương.
Ngay tại Việt Nam, cũng có không ít bạn nhỏ tài giỏi đã có những sáng kiến đóng góp lớn cho xã hội. Nguyễn Đức Nghĩa (9 tuổi, Trường Tiểu học Trần Khánh Dư, Q.1, TP.HCM) cùng với bạn học Dương Huy Giáp (9 tuổi) và Vương Đoàn Khuê (6 tuổi) đã chế tạo nên bộ thiết bị giúp hỗ trợ người già mang tên “Hạnh phúc và sức khỏe”. Thông qua sản phẩm này, các bạn mong muốn robot có thể giúp những ông bà đã tuổi cao sức yếu có thể giảm triệu chứng đau lưng và di chuyển dễ dàng hơn.
Nguồn: Ấn tượng những sản phẩm robot vì cộng đồng – thanhgiong.vn
Chính vì vậy, STEAM for Vietnam đã hợp tác với VinUni – Đại học tư thục hoạt động không vì lợi nhuận đầu tiên tại Việt Nam để giảng dạy và đem những kiến thức mới mẻ về Robotics cho các em học sinh tại các trường Trung học trên toàn quốc, đến cả những tỉnh thành xa xôi như Lạng Sơn, Hà Giang, Cà Mau, v.v. Ở STEAM for Vietnam, các em hoàn toàn có thể biến ý tưởng của mình thành những sản phẩm thực tế để phục vụ cho xã hội. Đến nay, các khóa học lập trình của STEAM for Vietnam đã có hơn 35,000 lượt đăng ký và 34,900 dự án lập trình Scratch được hoàn thành.
Nhằm lan tỏa sứ mệnh giáo dục lập trình từ sớm cho trẻ em Việt Nam, STEAM for Vietnam đã được thành lập và thành công với các khóa học miễn phí. Hơn thế nữa, STEAM for Vietnam đã hợp tác với Quỹ Nhi đồng Liên Hiệp Quốc (UNICEF) và nhiều đối tác lớn để xây dựng các giải pháp học tập trực tuyến được công nhận trên toàn quốc và nền tảng chuyển đổi số cho hệ thống giáo dục Việt Nam. Đội ngũ nhân tài đến từ các “ông lớn công nghệ” trên thế giới như Google, Facebook, Microsoft… sẽ trực tiếp giảng dạy và biến ý tưởng sáng tạo của thế hệ lập trình viên nhí thành hiện thực.
STEAM for Vietnam đã tổ chức các lớp học miễn phí theo mô hình “học mà chơi, chơi mà học” giúp trẻ em dễ dàng tiếp cận các kiến thức lắp ráp và lập trình Robotics dưới nhiều hình thức phong phú, hấp dẫn. Đối với lớp CS 201: Nhập môn Thiết kế và Lập trình Robotics với VEX IQ, các giảng viên là những kỹ sư dày dặn kinh nghiệm về lập trình và robotics của STEAM for Vietnam đã nghiên cứu và đưa ra công thức tối ưu giúp học sinh có thể tiếp cận kiến thức dễ hiểu nhất. Bên cạnh đó, việc xây dựng và tổ chức khoá học còn có sự tham gia tích cực của các giảng viên đến từ trường Đại học VinUni, góp phần đưa những bộ robot VEX IQ tiên tiến phân bố đến các trường trung học trên toàn quốc. hương pháp được xây dựng có tên là “TTVN” gồm 4 bước Thiết kế – Thử nghiệm – Nâng cấp hành vi – Vận dụng, giúp học sinh chuẩn hóa quy trình làm ra một sản phẩm Robotics hoàn thiện.
Cụ thể, học sinh sẽ được học Thiết kế robot (5 bài học cơ bản) để được làm quen với bộ kit lắp ráp, đồng thời học cách sử dụng và lập trình. Các bài tiếp theo sẽ là một phiên bản nâng cấp hơn bài trước để đảm bảo các bạn luôn ghi nhớ kiến thức và vận dụng hiệu quả.
Sau những lớp CS201 Nhập môn Thiết kế và Lập trình Robotics với VEX IQ được khai giảng, STEAM for Vietnam đã hỗ trợ thành công hàng trăm các trường cấp 3 tạo môi trường giáo dục Roboctics tốt hơn cho các em học sinh, góp phần thúc đẩy tiềm năng của những nhân tài công nghệ nhí trên khắp các tỉnh thành Việt Nam.
Cô Nguyễn Thị Thanh Hà – Giáo viên tại TH-THCS-THPT Chu Văn An (Sơn La) đã gửi những lời cảm ơn đến STEAM for Vietnam: “Sau bao ngày chờ đợi, cô trò mình đã được đồng hành cùng STEAM for Vietnam và Đại học VinUni trên hành trình phát triển giáo dục STEAM. Mình thấy rằng mô hình giáo dục của STEAM for Vietnam hiện đại, hiệu quả và phát triển được năng lực của người học. Cảm ơn ban tổ chức đã tạo ra một sân chơi thú vị và bổ ích cho học sinh trên toàn quốc”.
Hơn thế nữa, các em học sinh Trung học độ tuổi 12 – 17 ở Việt Nam lần đầu tiên được tiếp xúc với bộ VEX IQ tiên tiến được chuyển thẳng từ Mỹ về đã vô cùng hứng khởi. Các em và thầy cô đã cùng nhau lắp ráp tạo ra một sản phẩm hoàn thiện và khoe ngay với STEAM for Vietnam. Các em học sinh trường THPT Tháp Chàm (Ninh Thuận) đã lắp ráp và thử nghiệm IQ Clawbot. Link video
“Công nghệ là thứ gần gũi nhất với ma thuật còn tồn tại trên thế giới này” (Elon Musk). Chính vì vậy, STEAM for Vietnam mong muốn tạo cơ hội để thế hệ trẻ em Việt Nam có thể tiếp xúc với robot nhiều hơn, phát triển kỹ năng kỹ thuật và sự sáng tạo để trở thành những kỹ sư công nghệ tài năng trong tương lai. Để góp sức vào sứ mệnh ý nghĩa của STEAM for Vietnam, quý thầy cô và phụ huynh có thể quyên góp theo hình thức ở đây.
— — —
STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.
Kết thúc Học kỳ Mùa thu 2021, Demo Day – Ngày hội lập trình viên nhí – đã bình chọn và trao giải cho những bài thi sáng tạo và nổi bật nhất là hai phiên bản ‘‘Bay cao Việt Nam’ của bạn Trần Quốc Bảo (10 tuổi) và bạn Trần Hoàng Long (10 tuổi).
Giải xuất sắc nhất: Trần Quốc Bảo
Với sức sáng tạo và sự nỗ lực, bạn Trần Quốc Bảo đến từ Đồng Nai đã vượt qua hàng trăm bài thi và giành được Giải Xuất sắc nhất trong Demo Day vừa qua. Dự án cuối khóa ‘Bay cao Việt Nam’ của Quốc Bảo có những biến tấu vô cùng khác biệt và thú vị. Dựa vào ý tưởng gốc là một trò chơi kể về hành trình của bạn Cò bay qua mọi miền đất nước, Quốc Bảo làm trò chơi của mình thêm phần thú vị với ý tưởng lập trình cho bạn Cò sẽ “béo” thêm mỗi khi có đồ ăn cùng với thanh điểm thể hiện độ “béo” của bạn Cò. Cùng khả năng thuyết trình tự tin và sự am hiểu về kiến thức lập trình, Quốc Bảo thật xứng đáng giành giải thưởng cao nhất trong ngày hội Demo Day này!
Giải được Yêu thích nhất: Trần Hoàng Long
Dự án của bạn Trần Hoàng Long đến từ An Giang chinh phục được thầy cô với ý tưởng vô cùng thú vị. Trong dự án ‘Bay cao Việt Nam’ của Hoàng Long, người chơi sẽ được hóa thân thành các nhân vật của STEAM for Vietnam (bạn Cò, bạn Robot và bạn Miu) trở thành các dũng sĩ diệt COVID – đại diện cho đội ngũ chống dịch tuyến đầu – mang vaccine đến cho mọi nhà. Với ý tưởng đột phá này, trong tổng số hơn 300dự án tham gia, bạn Hoàng Long đã tạo dấu ấn với 127 lượt bình chọn từ các bạn học sinh STEAM for Vietnam với nhiều bình luận tích cực.
Học kỳ Mùa Xuân 2022 có gì đáng chú ý?
Trải qua 4 học kỳ lập trình cùng với 3 khóa học CS 001, CS 101 và CS 201, STEAM for Vietnam đã mang lập trình đến với hơn 35,000 học sinh đang sinh sống và học tập tại 34 quốc gia. Bên cạnh đó, đội ngũ hơn 140 giảng viên, trợ giảng, và tình nguyện viên hỗ trợ cũng rất tự hào khi chứng kiến sự phát triển của học sinh qua những chia sẻ của các em trong dự án ‘Nhật ký Lập trình’.
Để tiếp nối thành công của các học kỳ trước và hoàn thành sứ mệnh mang nền giáo dục STEAM đẳng cấp quốc tế đến với trẻ em Việt Nam một cách bình đẳng, đội ngũ STEAM for Vietnam cho ra mắt khóa học chuyên sâu hoàn toàn mới CS 002 – Tư duy Máy tính và Lập trình Scratch Nâng caotrong Học kỳ Mùa xuân 2022 này.
CS 002 – Tư duy Máy tính và Lập trình Scratch Nâng cao là khóa học lập trình hướng đến học sinh từ 8 đến 16 tuổi chưa hoặc ít tiếp xúc với lập trình. Xuyên suốt khóa học, học sinh sẽ được đào tạo và rèn luyện khả năng tư duy máy tính và sử dụng ngôn ngữ lập trình Scratch theo hình thức “học mà chơi, chơi mà học” được giảng dạy bởi đội ngũ giảng viên là các kỹ sư phần mềm thực thụ với kinh nghiệm giảng dạy cho hàng nghìn học sinh Việt Nam.
Khóa học là hành trình thú vị của nhân vật Miu và các bạn khám phá thế giới STEAMderland. Trong mỗi buổi học, bạn sẽ được học về tư duy lập trình và các kiến thức cơ bản của lập trình thông qua việc làm dự án. Tư duy Máy tính sẽ được sử dụng để phân tích và đưa ra giải pháp thực hiện dự án. Sau đó học sinh sẽ thực hành lập trình theo giải pháp đã đề ra để giải quyết vấn đề. Kết thúc buổi học, học sinh sẽ có ngay cho mình một trò chơi hay một đoạn phim hoạt hình để có thể tự hào chia sẻ với bạn bè và người thân.
CS 002 – Tư duy Máy tính và Lập trình Scratch Nâng caolà phiên bản ‘nâng cao’ của khóa học CS 001 – Nhập môn Tư duy Máy tính và Lập trình Scratch. Cùng sử dụng ngôn ngữ lập trình Scratch, một sản phẩm của Viện Công nghệ Massachusetts (MIT), tuy nhiên, các câu hỏi và thử thách đặt ra trong khóa học CS 002 đòi hỏi học sinh cần có vốn kiến thức nhất định về Toán và Vật Lý để hoàn thành dự án và bài tập về nhà. Điều đó cũng có nghĩa là những kiến thức lập trình được giảng dạy trong khóa học CS 002 này sẽ vô cùng mới mẻ và các dự án lập trình cuối khóa của học sinh sẽ rất đáng được mong chờ!
Sau hơn 4 tháng dày công chuẩn bị, đội ngũ STEAM for Vietnam tin chắc rằng khóa học CS 002 – Tư duy Máy tính và Lập trình Scratch Nâng cao sẽ mang đến cho các em học sinh Việt Nam một trải nghiệm học lập trình vô cùng ý nghĩa và bổ ích. Tìm hiểu thêm về khóa học tại đây.
— — —
STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.
Một số yếu tố toán học và hình học để lập trình game
Giới thiệu trò chơi
Bóng bàn là một trong những môn thể thao phổ biến trên toàn thế giới và điều đó cũng biến game ping pong trở thành một trong những game máy tính đầu tiên được ra đời vào năm 1972. Trò chơi có quy tắc chơi rất là đơn giản. Hai bên sẽ đỡ trả những quả bóng cho đến khi một bên không đánh trả được nữa. Ở đây chúng ta sẽ là một người chơi và đánh quả bóng bàn không bị rơi xuống đất. Các bạn học sinh hãy cùng trải nghiệm trò chơi trước khi bắt tay vào lập trình ở link sau: https://replit.com/@STEAM4VNOfficial/Pingpong#main.py
Bắt tay vào lập trình thôi nào
Bước 1: Khai báo thư viện sử dụng để lập trình trò chơi
Giống như các bài blog khác trong Pygame series (Link), chúng ta sẽ cần sử dụng thư viện pygame. Ngoài ra, chúng ta cũng cần có thư viện random để khởi tạo ngẫu nhiên hướng đi của quả bóng bàn khi mới bắt đầu trò chơi.
import pygame
import random
Bước 2: Khởi tạo một vài yếu tố cơ bản của trò chơi:
Hàm pygame.init() giúp chúng ta bắt đầu khởi tạo trò chơi. Thêm vào đó, các bạn hãy sử dụng vòng lặp while với biến start để lặp lại liên tục các hành động của người chơi và quả bóng, cho đến khi quả bóng rơi xuống đất. Biến start sẽ được khởi tạo với giá trị True. Khi bóng rơi xuống đất, biến start sẽ được thay đổi thành False.
Chúng ta cũng cần khởi tạo một số màu cơ bản dùng trong trò chơi, cho quả bóng, vợt bóng bàn, và màn hình. Giống như blog cờ caro (link), chúng ta sẽ sử dụng bảng mã RGB.
Black = (0,0,0)
Green = (0, 250, 0)
Yellow = (250, 250, 0)
Sau đó, các bạn tiếp tục khởi tạo màn hình cửa sổ trò chơi với kích thước 800×500 pixels bằng câu lệnh pygame.display.set_mode. Chúng ta cũng cài đặt màn hình màu đen bằng câu lệnh fill. Ngoài ra, câu lệnh pygame.display.set_caption sẽ giúp hiển thị tên của trò chơi.
Tương tự như game cờ caro, chúng ta sẽ sử dụng font freesansbold với kích thước 20 cho chữ trong game. Đồng thời, ta sử dụng thư viện random để khởi tạo chọn ngẫu nhiên một trong hai số 0 và 1, ứng với hướng di chuyển của quả bóng lúc bắt đầu trò chơi. Để cho game thêm phần thú vị, chúng ta sẽ tính điểm của người chơi và lưu vào biến score. Biến score sẽ được khởi tạo bằng 0:
direct = random.randint(0,1)
font = pygame.font.Font('freesansbold.ttf', 20)
score = 0
Bước 3: Khởi tạo 2 đối tượng chính của người chơi là quả bóng và trò chơi.
Chúng ta sẽ sử dụng khái niệm đối tượng và lớp đã được học ở bài 8 của khoá CS 101 để tạo quả bóng và người chơi. Chúng ta sẽ tạo lớp (class) Player với hai thuộc tính x và y, để lưu toạ độ của người chơi. Sau đó chúng ta sẽ tạo đối tượng (object) player của lớp Player để tạo một người chơi trong trò chơi. Trong trường hợp này người chơi sẽ là cái vợt bóng bàn ở vị trí (400,200) trên màn hình trò chơi khi bắt đầu.
Tương tự như vậy, chúng ta sẽ tạo lớp Ball và đối tượng ball để tạo một quả bóng ở vị trí (350,400) cho trò chơi. Vì chúng ta sử dụng khái niệm lập trình hướng đối tượng nên chúng ta có thể tạo ra rất nhiều người chơi và quả bóng khác nhau. Tất cả người chơi và quả bóng đều có hai thuộc tính là toạ độ x, y.
class Player:
def __init__(self, x, y):
self.x = x
self.y = y
class Ball:
def __init__(self, x, y):
self.x = x
self.y = y
ball = Ball(400, 200)
player = Player(350, 400)
Bước 4: Vẽ các yếu tố đồ hoạ lúc bắt đầu game
Trong trò chơi này, quả bóng sẽ là hình tròn, người chơi và mặt đất sẽ là hình chữ nhật. Chúng ta sẽ bắt đầu với câu lệnh pygame.display.flip(). Để vẽ hình tròn, ta sẽ sử dụng câu lệnh pygame.draw.circle() với 4 inputs: màn hình game (screen), màu sắc, toạ độ của tâm hình tròn, và bán kính của hình tròn. Toạ độ của tâm hình tròn sẽ là 2 thuộc tính x và y của đối tượng ball. Chúng ta sẽ lấy thuộc tính của đối tượng bằng câu lệnh đã học ở bài 8 của khoá CS 101. Bán kính của quả bóng là 20 và quả bóng màu xanh lá cây.
Để vẽ hình chữ nhật, chúng ta sẽ sử dụng câu lệnh pygame.draw.rect() với 3 inputs: màn hình, màu sắc, và đối tượng hình chữ nhật trong pygame. Đối tượng hình chữ nhật được định nghĩa bởi câu lệnh pygame.Rect() với 4 inputs. Hai inputs đầu tiên xác định toạ độ của đỉnh bên trái trên cùng của hình chữ nhật. Input thứ ba là chiều dài của hình chữ nhật. Input thứ tư là chiều rộng của hình chữ nhật. Ví dụ, hình chữ nhật biểu diễn người chơi có chiều dài là 100 và chiều rộng là 20. Ngoài ra, toạ độ của đỉnh trên cùng bên trái được xác định bằng thuộc tính x, y của đối tượng player. Chúng ta sẽ vẽ hình chữ nhật biểu diễn người chơi bằng màu vàng và hình chữ nhật biểu diễn mặt đất bằng màu đỏ.
Ngoài ra, chúng ta sẽ sử dụng vòng lặp for để đi qua tất cả các tương tác của người dùng với trò chơi, và đóng game khi người dùng ấn vào nút đóng. Chúng ta cũng định nghĩa biến move để lấy ra nút người chơi bấm trên bàn phím để di chuyển hình chữ nhật màu vàng.
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
move = pygame.key.get_pressed()
Bước 5: Code phần di chuyển của người chơi
Người chơi sẽ có 2 hướng di chuyển: sang trái hoặc sang phải. Khi người chơi ấn nút sang trái, toạ độ x của người chơi sẽ giảm đi 0.5. Khi người chơi ấn nút sang phải, toạ độ x sẽ tăng thêm 0.5. Toạ độ x sẽ bằng 0 nếu người chơi đi ra khỏi góc trái màn hình (x < 0). Toạ độ x sẽ bằng 700 nếu người chơi đi ra khỏi góc phải màn hình (x > 700).
if move[pygame.K_LEFT]:
player.x -= 0.5
if player.x < 0:
player.x = 0
elif move[pygame.K_RIGHT]:
player.x += 0.5
if player.x > 700:
player.x = 700
Bước 6: Code phần di chuyển quả bóng:
Chúng ta quy định hướng di chuyển của quả bóng bằng các chỉ số như hình vẽ trên. Bây giờ chúng ta sẽ nhận xét và vẽ hình khi mà quả bóng va chạm với các cạnh với các hướng thì nó sẽ thay đổi sao. Khi mà quả bóng va vào người chơi hay va vào bức tường thì quả bóng sẽ bật lại theo hướng ngược với nó va chạm vào.
Hướng 0 là hướng đi lên trên bên trái. Khi đi theo hướng này, toạ độ x và y của quả bóng đều bị giảm đi 0.4. Vì quả bóng có bán kính 20 nên khi toạ độ tâm của quả bóng bé hơn 20 ở x thì quả bóng đã va vào bức tường bên trái và bị bật lại theo hướng 1. Tương tự, khi toạ độ y bé hơn 20, quả bóng va vào bức tường ở trên và bật lại theo hướng 3. Hướng 1 là hướng đi lên bên phải. Hướng 3 là hướng đi xuống bên trái. Khi bóng đi theo hướng 1, toạ độ x được thêm 0.4 và toạ độ y bị trừ đi 0.4. Vì màn hình có kích thước 800 theo chiều x và quả bóng có bán kính 20 nên khi bóng đi theo hướng 1, nếu toạ độ x lớn hơn 780, bóng đã va vào bức tường bên phải. Bóng sẽ bật ra theo hướng 0. Tương tự, nếu toạ độ y của quả bóng bé hơn 20, bóng đã va vào bức tường ở trên và bật ra theo hướng 2. Khi bắt đầu trò chơi, quả bóng sẽ được ngẫu nhiên chọn di chuyển theo hướng 0 hoặc hướng 1.
# BALL
if direct == 0: # LEFT UP
ball.x -= 0.4
ball.y -= 0.4
if ball.x < 20:
direct = 1
if ball.y < 20:
direct = 3
if direct == 1: # RIGHT UP
ball.x += 0.4
ball.y -= 0.4
if ball.x > 780:
direct = 0
if ball.y < 20:
direct = 2
Hướng 2 là hướng đi xuống bên phải. Khi quả bóng đi theo hướng này, toạ độ x và y được cộng thêm 0.4. Nếu quả bóng va vào cạnh dưới và ở vị trí người chơi thì họ sẽ được cộng điểm, còn không họ sẽ thua. Để kiểm tra điều kiện này, chúng ta có thể sử dụng câu lệnh điều kiện if và phép toán and để kết hợp nhiều điều kiện. Chúng ta có thể dễ dàng đặt các điều kiện với lưu ý là quả bóng có bán kính 20 và hình chữ nhật biểu diễn người chơi có chiều dài là 100. Khi quả bóng ở vị trí người chơi, điểm sẽ được cộng 1 và quả bóng bật lại theo hướng 1. Ngoài ra chúng ta phải kiểm tra xem quả bóng có va vào bức tường bên phải chưa. Nếu quả bóng va vào bức tường bên phải, quả bóng sẽ bật lại theo hướng 3 là hướng đi xuống bên trái. Tương tự, chúng ta có trường hợp quả bóng theo hướng 3. Ngoài ra, người chơi sẽ thua khi quả bóng chạm đất. Vì chiều rộng của màn hình trò chơi là 500 nên khi toạ độ y của tâm quả bóng ở 480, biến start sẽ chuyển sang False và người chơi đã thua.
if direct == 2: # RIGHT DOWN
ball.x += 0.4
ball.y += 0.4
if ball.y >= player.y - 20 and ball.y <= player.y + 20 and ball.x >= player.x and ball.x <= player.x + 100:
direct = 1
score += 1
if ball.x > 780:
direct = 3
if direct == 3: # LEFT DOWN
ball.x -= 0.4
ball.y += 0.4
if ball.y >= player.y - 20 and ball.y <= player.y + 20 and ball.x >= player.x and ball.x <= player.x + 100:
direct = 0
score += 1
if ball.x < 20:
direct = 2
if ball.y >= 480:
start = False
Bước 7: Hoàn thiện phần kết thúc trò chơi:
Phần kết thúc trò chơi sẽ có màn hình màu trắng và có chữ You Lose cùng với điểm số. Chúng ta có thể sử dụng các câu lệnh font.render, screen.blit, text.get_rect tương tự game cờ caro (link) để in thông báo ra màn hình. Đồng thời sử dụng câu lệnh pygame.quit() để kết thúc trò chơi.
Trò chơi ping pong này thật thú vị phải không các bạn! Sau khi hoàn thành trò chơi, chúng ta đồng thời đã áp dụng được ngay các kiến thức lập trình với pygame, kiến thức toán và kiến thức vật lý về phản xạ của quả bóng khi đập vào tường. Các bạn học sinh hãy thử sáng tạo và cải tiến code bằng cách áp dụng các định luật vật lý về phản xạ như định luật Snell (học ở chương trình vật lý 7) để có thể tạo được hiệu ứng bật lại của quả bóng đúng hơn. Ngoài ra, các bạn có thể tạo thêm người chơi, thêm quả bóng cho trò chơi nhé.
Sau khi hoàn thành dự án cá nhân, các bạn đừng quên chia sẻ chương trình của mình lên STEAMese Profile để thầy cô và các bạn cùng trải nghiệm và nhận xét.
— — —
STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.
Các bạn học sinh hẳn đã rất quen thuộc với trò chơi caro truyền thống. Cách chơi trò này rất đơn giản, 2 người chơi đại diện cho 2 quân X và O. Mỗi lượt đi, người chơi lần lượt đánh quân của họ lên bàn cờ. Trò chơi chỉ xác định người thắng bại khi mà có 5 quân cờ của họ cùng nằm liên tiếp trên một hàng ngang hoặc một hàng dọc hoặc một đường chéo.
Chúng ta sẽ chọn một bảng kích cỡ khá lớn để bắt đầu. Ở đây các bạn học sinh hãy chọn bảng 33×64 là dễ nhìn và tiện thao tác nhất.
Bảng ở đây sẽ biểu diễn dưới dạng mảng 2 chiều. Mỗi khi chúng ta click chuột vào một ô để đánh dấu thì sẽ xem lại cả bảng để kiểm tra các điều kiện về đường dọc, đường ngang, đường chéo. Khi đó các bạn sẽ biết được mình có chiến thắng không. Không chỉ vậy, các bạn sẽ dùng vòng lặp để đếm các ô trong mảng 2 chiều, chỉ khi nào mà 5 ô cùng màu được tô liên tiếp theo hàng dọc hoặc hàng ngang hoặc hàng chéo chúng ta sẽ in ra kết quả người chơi chiến thắng.
Nếu có người thắng cuối, trò chơi sẽ in ra kết quả người thắng cuộc và kết thúc trò chơi, còn không, trò chơi vẫn tiếp tục. Nếu trong trường hợp 2 người chơi đã tô hết cả bảng mà vẫn không xác định trò chơi, máy sẽ thông báo kết quả hòa và kết thúc trò chơi.
b. Các bước triển khai dự án
Bước 1: Khai báo thư viện sử dụng để code trò chơi.
Ở đây ngoài các hàm tiêu chuẩn có sẵn của ngôn ngữ lập trình python ra, ta sẽ sử dụng thêm 2 thư viện đó là pygame và sys. Thư viện pygame là một thư viện python giúp chúng ta có thể code các trò chơi dễ dàng hơn. Còn thư viện sys liên quan đến điều khiển các chương trình trên máy tính. Để khai báo chương trình, ta dùng 2 câu lệnh sau.
import pygame
import sys
Bước 2: Khai báo một số yếu tố cơ bản trong trò chơi
Đầu tiên, chúng ta sẽ định nghĩa một số màu hiển thị trong trò chơi theo bảng mã RGB.
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0,0,255)
Trong bảng mã RGB, mỗi một màu sẽ được biểu diễn bằng 3 phần tử tương ứng cường độ của 3 màu cơ bản: đỏ (Red), xanh lá (Green), xanh dương (Blue). Hoà trộn 3 màu này lại, chúng ta sẽ được một màu mới.
Ta sẽ giả định con x là con đi trước và khởi tạo FPS – Frames Per Second (độ mượt của game) là 120
XO = 'x'
FPS = 120
Tiếp đó, chúng ta sẽ khởi tạo các kích cỡ bảng và ô caro. Biến WIDTH và HEIGHT chỉ chiều dài và chiều rộng mỗi ô caro là 28×28. Biến MARGIN chỉ độ dày cạnh mỗi ô caro là 2. Biến rownum và colnum lần lượt là số hàng và số cột của bảng caro. Chúng ta có 33 hàng và 64 cột.
# This sets the WIDTH and HEIGHT of each board location
WIDTH = 28
HEIGHT = 28# This sets the distance between each cell
MARGIN = 2
rownum = 33
colnum = 64
Các bạn học sinh hãy biểu bảng caro dưới dạng mảng 2 chiều với rownum hàng và colnum cột. Đầu tiên khởi tạo grid là một mảng đơn. Sau đó, chúng ta dùng vòng lặp với số lần lặp tương ứng với số hàng (rownum) để khởi tạo mỗi phần tử của grid là một mảng, ứng với một hàng trong bảng caro. Chúng ta tiếp tục sử dụng vòng lặp thứ hai với số lần lặp tương ứng với số cột (colnum). Chúng ta sử dụng 2 vòng lặp để tạo một mảng hai chiều, giống như bảng caro hoặc mê cung trong bài 6 của khoá CS 101. Giá trị ở mỗi vị trí trong bảng là 0. Vậy là các bạn học sinh đã khởi tạo được bảng caro với kích cỡ rownum * colnum rồi đấy!
# Create a 2 dimensional array. A two dimensional
# array is simply a list of lists.
grid = []
for row in range(rownum):
# Add an empty array that will hold each cell
# in this row
grid.append([])
for column in range(colnum):
grid[row].append(0) # Append a cell
Giờ thì các bạn phải khởi tạo trò chơi. Muốn chạy một trò chơi thì trước tiên các bạn hãy dùng hàm pygame.init(). Ngoài ra để game hiển thị chúng ta phải khởi tạo về cửa sổ game: Biến WINDOW_SIZE chứa 2 kích cỡ chiều dài và chiều rộng của màn hình game ở đây sẽ để kích cỡ là 1920 * 990. Khi đó, biến screen chính là màn hình game trong python. Chúng ta sẽ khởi tạo nó bằng cách khai báo screen = pygame.display.set_mode(WINDOW_SIZE). Vậy chúng ta đã khởi tạo xong cửa sổ game với kích cỡ chúng ta yêu cầu.
# Set the HEIGHT and WIDTH of the screen
WINDOW_SIZE = [1920,990]
screen = pygame.display.set_mode(WINDOW_SIZE)
Về yếu tố hình ảnh, chúng ta có hình ảnh quân X và quân O trên bàn cờ. Ở đây, chúng ta chuẩn bị hình ảnh quân X là file ảnh X_modified-100×100.png và quân O là o_modified-100×100.png. (Các bạn học sinh có thể lấy hình ở link). Sau đó, ta sẽ đưa hai hình ảnh đó vào trò chơi bằng các câu lệnh sau:
Ở đây, ta có thể thấy hàm pygame.transform.smoothscale chính là hàm giúp chúng ta chuyển đổi các hình ảnh thành các phần tử ta muốn trong game. Còn hàm pygame.image.load() sẽ đưa hình ảnh vào. Hàm convert() sẽ giúp ta chuyển hình ảnh thành các ô pixel. Và cuối cùng (28,28) chính là kích cỡ một ô vuông trong bảng caro ta đã nói ở trên.
Bước 3: Viết hàm kiểm tra điều kiện thắng của trò chơi
Làm thế nào để các bạn học sinh có thể biết trò chơi kết thúc và kết quả người chiến thắng?
Như các bạn đã biết, trò chơi chỉ có người chiến thắng khi tồn tại 5 quân cùng loại cùng nằm trên một hàng ngang hoặc một hàng dọc hoặc một đường chéo. Vậy trên một bảng, điều kiện đó sẽ được biểu diễn như thế nào?
Chúng ta gọi ô (i, j) là ô có địa chỉ tại hàng thứ i và cột thứ j. Khi đó, ta giả sử ô (i, j) là ô bắt đầu hàng ngang thì các ô tiếp theo của hàng ngang đó sẽ là (i, j + 1), (i, j + 2), (i, j + 3), (i, j + 4). Nếu ô đó là ô bắt đầu một hàng dọc thì các ô tiếp theo sẽ là (i + 1,j), (i + 2, j), (i + 3, j), (i + 4, j). Chúng ta có 2 loại đường chéo. Với loại đường chéo thứ nhất thì các ô tiếp theo sẽ là (i + 1, j – 1), (i + 2, j – 2), (i + 3, j – 3), (i + 4, j – 4). Còn lại với loại đường chéo thứ 2 thì là (i + 1, j + 1), (i + 2, j + 2), (i + 3, j + 3), (i + 4, j + 4). Chúng ta đã được học cách để lấy địa chỉ cho một ô trong mảng hai chiều ở bài 6 trong khoá CS 101.
Như vậy để kiểm tra điều kiện thắng thì ta có thể kiểm tra các ô cùng hàng, cùng cột, cùng đường chéo một cách dễ dàng hơn. Ta có hàm kiểm tra như sau:
def checkwin(board):
indices = [i for i,x in enumerate(board) if 'x' in x]
for index in indices:
xrowindices = [i for i, x in enumerate(board[index]) if x == "x"]
for xs in xrowindices:
if xs<=len(board[0])-5:
if board[index][xs] == board[index][xs+1] == board[index][xs+2] == board[index][xs+3] == board[index][xs+4]:
return 1
if index<=len(board)-5:
if board[index][xs] == board[index+1][xs] == board[index+2][xs] == board[index+3][xs] == board[index+4][xs]:
return 1
if xs<=len(board[0])-5:
if board[index][xs] == board[index+1][xs+1] == board[index+2][xs+2] == board[index+3][xs+3] == board[index+4][xs+4]:
return 1
if board[index][xs] == board[index+1][xs-1] == board[index+2][xs-2] == board[index+3][xs-3] == board[index+4][xs-4]:
return 1
indices1 = [i for i,x in enumerate(board) if 'o' in x]
for index1 in indices1:
orowindices = [i for i, x in enumerate(board[index1]) if x == "o"]
for os in orowindices:
if os<=len(board[0])-5:
if board[index1][os] == board[index1][os+1] == board[index1][os+2] == board[index1][os+3] == board[index1][os+4]:
return 2
if index1<=len(board)-5:
if board[index1][os] == board[index1+1][os] == board[index1+2][os] == board[index1+3][os] == board[index1+4][os]:
return 2
if os<=len(board[0])-5:
if board[index1][os] == board[index1+1][os+1] == board[index1+2][os+2] == board[index1+3][os+3] == board[index1+4][os+4]:
return 2
if board[index1][os] == board[index1+1][os-1] == board[index1+2][os-2] == board[index1+3][os-3] == board[index1+4][os-4]:
return 2
count = 0
for rows in board:
for cells in rows:
if cells == 'x' or cells == 'o':
count+=1
if count == rownum*colnum:
return 3
return 0
Về cách đoạn code hoạt động, ta sẽ tách rõ ra làm 3 điều kiện kiểm tra. Phần thứ nhất là kiểm tra điều kiện thắng của con X, phần thứ 2 kiểm tra điều kiện thắng của con O và phần còn lại sẽ giúp chúng ta kiểm tra hai người chơi hòa hay không. Chúng ta sẽ đặt nếu người chơi X thắng thì trả kết quả chương trình về 1. Nếu người chơi O thắng sẽ trả kết quả về 2. Nếu giải đấu caro hòa thì về giá trị 3. Còn nếu trò chơi tiếp tục chúng ta trả về giá trị 0.
Các bạn có thể thấy ở đoạn code trên có một cách tạo mảng theo điểu kiện rất hay như sau:
indices = [i for i,x in enumerate(board) if 'x' in x]
Cách tạo mảng trên được gọi là list comprehension và cấu trúc của nó như sau:
newlist = [expression for value in array if true]
Cách tạo mảng này sẽ giúp chúng ta tạo một mảng mới từ mảng cũ bằng cách dựa vào các giá trị mảng cũ theo điều kiện nào đó. Các bạn có thể để ý hàm enumerate() sẽ giúp chúng ta tạo ra một danh sách gồm các cặp chỉ số – phần tử trong mảng như kiểu 0 – board [0] rất thuận tiện. Trong đoạn code này, ta sẽ thấy mảng indices chứa các chỉ số hàng của mảng board tồn các con X, tương tự với mảng indices1 sẽ chứa các chỉ số hàng của mảng board tồn tại các con O.
Các bạn học sinh hãy để ý hai đoạn code kiểm tra điều kiện thắng của X và O. Ở vòng lặp thứ hai, chúng ta lại bắt gặp cách tạo mảng tương tự như vậy. Mảng thứ hai sẽ giúp chúng ta lấy chỉ số cột của các ô trong hàng index.
Ngoài việc kiểm tra các hàng, các cột, các đường chéo, trước hết chúng ta cần đảm bảo các ô chúng ta kiểm tra không bị vượt ra ngoài mảng 2 chiều. Nếu không, chương trình sẽ bị lỗi. Như khi kiểm tra một hàng, chúng ta phải kiểm tra đúng xs <= len(board[0]) – 5 để xem các ô chúng ta kiểm tra sau đó có bị tràn ra khỏi bảng caro không. Các bạn nhớ chú ý khi kiểm tra một đường chéo thỏa mãn thì phải xem chỉ số hàng, cột và ô bắt đầu để có thể kiểm tra được cả 5 ô.
Về phần kiểm tra người chơi hòa, các bạn hãy xem các ô tô X hoặc O hết chưa. Nếu có thì trò chơi hòa. Còn nếu không trò chơi tiếp tục
Bước 4: hoàn thiện các phần còn lại để trò chơi chạy
Đầu tiên, chúng ta sẽ khởi tạo hai biến là done và status để thể hiện trò chơi “đã kết thúc” và “đã có người chiến thắng”. Ban đầu, chúng ta để hai biến này là False và None tại vì trò chơi chưa kết thúc và chưa xác định kết quả trò chơi.
# Loop until the user clicks the close button.
done = False
status = None
Sau đó, các bạn sẽ dùng một vòng lặp while để chạy trò chơi. Nếu mà biến done chưa đúng thì nghĩa là trò chơi vẫn tiếp tục và vòng lặp vẫn chạy. Trong pygame, các hoạt động của người chơi sẽ là các event. Chúng ta sẽ dùng một vòng lặp để lấy các event mà chúng ta tác động lên trò chơi.
Trong đó, nếu mà chúng ta kết thúc trò chơi tức là loại event chúng ta thực hiện sẽ là pygame. QUIT thì pygame sẽ kết thúc và chúng ta sẽ để biến done là True để kết thúc vòng lặp. Còn nếu chúng ta click chuột vào một ô trên màn hình thì thao tác này là pygame .MOUSEBUTTONDOWN tức là người chơi chọn đánh dấu một quân lên bảng và chúng ta sẽ dùng hàm pygame.mouse.get_pos() để lấy vị trí ô chúng ta click vào. Nếu ô đó đã được đánh dấu là X hoặc O thì chúng ta bỏ qua. Còn không, chúng ta sẽ đánh dấu nó là biến xo và đổi biến xo ngược lại để đến lượt người chơi thứ hai. Sau đó, chúng ta sẽ gắn biến status với giá trị của hàm checkwin(grid).
while not done:
for event in pygame.event.get(): # User did something if event.type == pygame.QUIT: # If user clicked close
done = True # Flag that we are done so we exit this loop # Set the screen backgroundif event.type == pygame.MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
col = pos[0] // (WIDTH + MARGIN)
row= pos[1] // (HEIGHT + MARGIN)
if grid[row][col] == 0:
if XO == 'x':
grid[row][col] = XO
XO = 'o'
else:
grid[row][col] = XO
XO = 'x'
status = checkwin(grid)
Ở đoạn code trên, các bạn có thể thấy chỉ số hàng và cột mà chúng ta lấy đã bị đảo lại. Nguyên nhân là vì hàm python.mouse.get_pos() sẽ trả về cột trước hàng sau..
Trong vòng lặp while trên, sau khi đánh dấu ô và kiểm tra điều kiện chiến thắng, giờ chúng ta sẽ vẽ hình bảng caro. Đầu tiên, chúng ta sẽ để cả cái bảng màu đen. Sau đó, vẽ các ô caro là các hình vuông màu trắng có kích cỡ WIDTH * HEIGHT có khoảng cách là MARGIN. Như vậy, chúng ta đã xong bảng ô vuông caro. Giờ các bạn hãy dùng vòng lặp để xem ô đó có điền X hay O thì chúng ta chèn hình ảnh X hoặc O vào ô nhé! Ta có đoạn code sau:
for row in range(rownum):
for column in range(colnum):
color = WHITE
pygame.draw.rect(screen,
color,
[(MARGIN + WIDTH) * column + MARGIN,
(MARGIN + HEIGHT) * row + MARGIN,
WIDTH,
HEIGHT])
if grid[row][column] == 'x':
screen.blit(x_img,((WIDTH + MARGIN)*column+2,(HEIGHT + MARGIN)*row+2))
if grid[row][column] == 'o':
screen.blit(o_img,((WIDTH + MARGIN)*column+2,(HEIGHT + MARGIN)*row+2))
Ở đây, chúng ta thấy tọa độ một ô vuông màu trắng ứng với ô row, column sẽ là (MARGIN + WIDTH) * column + MARGIN, (MARGIN + HEIGHT) * row. Các bạn hãy vẽ hình vuông kích cỡ WIDTH * HEIGHT. Để ý kỹ, các bạn sẽ thấy chúng ta vẽ theo thứ tự cột trước hàng sau tại vì pygame sẽ vẽ hình chữ nhật theo kích cỡ là chiều ngang trước chiều dọc sau. Hàm screen.blit giúp chúng ta có thể chèn hình ảnh ta muốn vào ô vuông với tọa độ như trên.
Giờ chúng ta đã vẽ xong bảng và nếu có người chơi thắng hoặc hòa, chúng ta phải in kết quả ra và kết thúc trò chơi.
if status == 3:
font = pygame.font.Font('freesansbold.ttf', 100)
text = font.render('Draw', True, GREEN, BLUE)
textRect = text.get_rect()
textRect.center = (WINDOW_SIZE[0]/2,WINDOW_SIZE[1]/2)
screen.blit(text,textRect)
done = True
if status == 1:
font = pygame.font.Font('freesansbold.ttf', 100)
text = font.render('X wins', True, GREEN, BLUE)
textRect = text.get_rect()
textRect.center = (WINDOW_SIZE[0]/2,WINDOW_SIZE[1]/2)
screen.blit(text,textRect)
done = True
if status == 2:
font = pygame.font.Font('freesansbold.ttf', 100)
text = font.render('O wins', True, GREEN, BLUE)
textRect = text.get_rect()
textRect.center = (WINDOW_SIZE[0]/2,WINDOW_SIZE[1]/2)
screen.blit(text,textRect)
done = True
Ở đây, các bạn sẽ thấy hàm pygame.font.Font có thể chọn lần lượt font chữ và kích cỡ chữ hiển thị. Ở đây ta sẽ chọn là font freesansbold và file của font đó là freesansbold.ttf, kích cỡ 100. Nếu status là 3 thì chúng ta có kết quả hòa. Còn nếu status là 2 chúng ta cho người chơi O thắng. Còn là 1 thì người chơi X thắng.
Hàm font.render sẽ giúp chúng ta biểu thị dòng chữ mà mình cần. Còn biến True trong hàm font.render giúp chữ hiển thị nét hơn trên máy tính. GREEN chính là màu của chữ cái ta chọn. BLUE chính là màu phông nền đằng sau. Chúng ta đã tạo các màu này bằng giá trị RGB ở phần đầu chương trình. Hàm get_rect sẽ giúp lấy hình chữ nhật chứa các từ mà các bạn muốn. Sau đó, các bạn hãy nhớ chỉnh tọa độ của hình chữ nhật ở trung tâm là (WINDOW_SIZE[0]/2,WINDOW_SIZE[1]/2).
Ngoài ra, hàm screen.blit sẽ giúp trò chơi hiển thị chữ cái ta cần ở vị trí hình chữ nhật đó. Và nếu trò chơi kết thúc chúng ta phải đặt biến done là True.
Sau đó, các bạn sẽ làm trò chơi cập nhật và hiện lên bằng câu lệnh sau:
clock.tick(FPS)
# Go ahead and update the screen with what we've drawn.
pygame.display.update()
Hàm clock.tick(FPS) sẽ giúp trò chơi chúng ta mượt hơn và hàm python.display.update() sẽ giúp ta hiện những gì vừa thực hiện lên. FPS là số khung hình trong một giây chúng ta đã tạo ở đầu chương trình.
Kết thúc trò chơi, chúng ta sẽ dừng trò chơi trong 10s để nó giữ kết quả người chơi chiến thắng và thoát khỏi trò chơi.
Hàm pygame.time.delay(10000) sẽ giữ trò chơi tầm 10 giây để chúng ta có thể nhìn thấy kết quả trò chơi và sau đó thoát game ra bằng hàm pygame.quit().
4. Tadaa !
Sau trò chơi thú vị này, các bạn học sinh lại được cập nhật thêm những kiến thức thú vị về lập trình python như toán, hàm, câu điều kiện, các vòng lặp…
Đây là một chương trình cần kiến thức khá là khó và dài, nhưng cũng không kém phần thú vị. Các bạn học sinh hãy thử sáng tạo, cải tiến code bằng cách thay hình ảnh của X và O bằng bất cứ hình ảnh nào các bạn thích. Hoặc chúng ta có thể tạo một bảng caro to hơn để chơi đã hơn.
Sau khi hoàn thành dự án cá nhân, các bạn đừng quên chia sẻ chương trình của mình lên STEAMese Profile để thầy cô và các bạn cùng trải nghiệm nhé!
— — —
STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.
Chúng ta sẽ áp dụng kiến thức đã được học ở bài 6 của khoá CS 101 để hoàn thành trò chơi này:
Stack và Queue trong Python.
Câu lệnh điều kiện trong Python.
Vòng lặp while và for trong Python.
Câu lệnh input() để nhập dữ liệu trong Python.
Câu lệnh print() để in thông báo ra màn hình.
Nội dung trò chơi
Một vật dụng không thể thiếu với các bạn học sinh khi học Toán đó là máy tính cầm tay. Máy tính cầm tay giúp chúng ta tính toán những phép toán cộng, trừ, nhân, chia, và kết hợp với dấu ngoặc đơn. Hẳn bạn học sinh nào cũng biết đến ba câu thần chú quen thuộc khi tính một biểu thức nào đó theo thứ tự tính toán: “Nhân chia trước, cộng trừ sau. Trong ngoặc trước, ngoài ngoặc sau. Tính từ trái sang phải”. Chúng ta có thể sử dụng Python để mô phỏng lại máy tính cầm tay và giúp tính toán nhanh hơn các biểu thức đơn giản với số tự nhiên. Chúng ta có thể chơi thử trò chơi ở đây nhé: https://s4v.trinket.io/sites/calculator
Bắt tay vào lập trình thôi nào!!!
a. Thuật toán
Mỗi biểu thức người chơi nhập vào sẽ có dạng chuỗi (string). Chuỗi có thể xem là một mảng. Chúng ta sẽ lấy lần lượt từng phần tử của mảng. Trong trò chơi, chúng ta sẽ có số tự nhiên và phép toán (cộng, trừ, nhân, chia, ngoặc đơn). Chúng ta sẽ tạo hai mảng. Một mảng để lưu các kết quả tính toán và một mảng để lưu các phép toán.
Vì chúng ta chỉ có thể lấy ra được từng chữ số nên cần tạo một biến để lưu kết quả số có nhiều chữ số. Ví dụ số có một chữ số: 5. Chúng ta thấy 5 = 0 * 10 + 5. Với số có hai chữ số: 35 = (0 * 10 + 3) * 10 + 5. Với số có ba chữ số: 475 = ((0 * 10 + 4) * 10 + 7) * 10 + 5. Như vậy với số, chúng ta có thể lấy các chữ số từ trái sang phải và sử dụng quy luật ở trên. Với mỗi số như vậy, chúng ta sẽ thêm vào mảng chứa kết quả.
Chúng ta có 4 phép toán: cộng, trừ, nhân, chia, dấu ngoặc đơn. Chúng ta sẽ chia các phép toán thành 3 nhóm: Nhóm 1: cộng và trừ, Nhóm 2: nhân và chia, Nhóm 3: dấu ngoặc đơn. Mỗi nhóm sẽ có một thứ tự ưu tiên, từ lớn đến bé là: Nhóm 2, Nhóm 1, Nhóm 3.
Khi đi qua các phần tử của chuỗi được nhập vào ban đầu, nếu chúng ta gặp phải phép toán cộng, trừ, nhân, chia, dấu mở ngoặc, chúng ta sẽ kiểm tra thứ tự ưu tiên của nó với phép toán xuất hiện ở trước nó tính từ trái sang phải trong biểu thức. Vì chúng ta phải thực hiện phép toán từ trái sang phải và ưu tiên cho phép toán nhân và chia nên nếu phép toán phía trước có độ ưu tiên lớn hơn hoặc bằng phép toán hiện tại thì chúng ta sẽ thực hiện phép toán phía trước trước. Sau đó, chúng ta sẽ xoá phép toán đó ra khỏi mảng lưu phép toán và thêm vào mảng phép toán hiện tại.
Khi đi qua các phần tử của chuỗi được nhập vào ban đầu, nếu chúng ta gặp phải phép toán mở ngoặc thì chúng ta sẽ thêm nó vào trong mảng phép toán và đợi đến khi gặp phép toán đóng ngoặc. Khi gặp phép toán đóng ngoặc, chúng ta sẽ thực hiện phép toán trong ngoặc và xoá hết các phép toán trong ngoặc và phép toán mở, đóng ngoặc sau khi thực hiện xong.
Chúng ta có thấy mảng lưu kết quả phép tính và mảng lưu phép toán giống những ngăn xếp (stacks) không nào? Chúng ta đã học ở bài 6 hai câu lệnh với ngăn xếp là push và pop, cùng với câu thần chú LIFO (Last In First Out). Vì chúng ta thực hiện phép toán từ trái sang phải và chúng ta cũng lấy các phép toán theo thứ tự từ trái sang phải nên nó sẽ tuân theo LIFO.
b. Code:
Bước 1: Viết chương trình chính của trò chơi
Tương tự với blog “Câu chuyện ngẫu nhiên”, chúng ta sẽ sử dụng biến cont và vòng lặp while để tiếp tục hoặc dừng lại trò chơi theo yêu cầu của người chơi. Ngoài ra, chúng ta sẽ sử dụng câu lệnh input() để hỏi người dùng nhập vào biểu thức cần tính. Câu lệnh input() cùng với câu lệnh điều kiện còn giúp hỏi người chơi có muốn tiếp tục trò chơi không. Câu lệnh print() sẽ in ra màn hình kết quả tính toán của hàm evaluate sẽ được viết ở bước 4.
cont = True
while cont:
formula = input('Nhập biểu thức cần tính với số tự nhiên (gồm các phép tính cộng, trừ, nhân, chia và dấu ngoặc đơn)')
print('Kết quả của biểu thức là: %s' % str(evaluate(formula)))
tiep = input('Bạn có muốn tiếp tục không (Y/N)?')
if tiep.upper() == 'Y':
cont = True
else:
cont = False
Bước 2: Viết hàm kiểm tra phép toán và thứ tự ưu tiên của phép toán:
Chúng ta sẽ viết hàm is_op để kiểm tra xem input có phải là một trong những phép toán cộng, trừ, nhân, chia hay không. Chúng ta sẽ sử dụng câu lệnh in. Câu lệnh trả về True hoặc False.
def is_op(c):
return c in ['+', '-', '*', '/']
Tiếp theo, chúng ta sẽ viết hàm priority để trả về thứ tự ưu tiên của phép toán. Phép toán nhân chia sẽ được thực hiện trước, nên có thứ tự ưu tiên là 2. Phép toán cộng trừ có thứ tự ưu tiên 1. Phép toán mở ngoặc có thứ tự ưu tiên là -1. Những phép toán nào có thứ tự ưu tiên cao hơn sẽ được thực hiện trước.
def priority(op):
if op == '+' or op == '-':
return 1
if op == '*' or op == '/':
return 2
return -1
Bước 3: Viết hàm thực hiện phép toán:
Chúng ta sẽ viết hàm process_op nhận vào ngăn xếp lưu kết quả phép toán và phép toán. Hàm thêm kết quả phép toán mới vào ngăn xếp và trả về ngăn xếp. Với mỗi phép toán mới, chúng ta sẽ lấy ra kết quả trước và sau phép toán đó từ ngăn xếp bằng câu lệnh .pop(). Sau đó hàm sẽ thực hiện phép toán và thêm kết quả vào ngăn xếp.
Trường hợp đặc biệt: Số chia bằng 0 trong phép chia thì chúng ta sẽ thêm vào ngăn xếp kết quả vô cùng (∞). Trong Python sẽ là float(“inf”). Chúng ta sẽ sử dụng ký tự đặc biệt này để dừng vòng lặp ở hàm chính được viết ở bước 4.
def process_op(st, op):
r = st.pop()
l = st.pop()
if op == '+':
st.append(l + r)
elif op == '-':
st.append(l - r)
elif op == '*':
st.append(l * r)
elif op == '/':
if r == 0:
print('Biểu thức có phép chia cho 0: ' + str(l) + '/' + str(r))
st.append(float("inf"))
else:
st.append(l / r)
return st
Bước 4: Viết hàm evaluate:
Hàmevaluatenhận vào chuỗi s và in ra kết quả tính toán cuối cùng. Chúng ta sẽ tạo 2 ngăn xếp bằng mảng. Ngăn xếp st để lưu các kết quả tính toán và ngăn xếp op để lưu các phép toán. Chúng ta sẽ sử dụng vòng lặp for cùng với hàm range và len để đi qua các phần tử của chuỗi. range(len(s)) dùng để tạo một mảng gồm các số tự nhiên bắt đầu từ 0 với các phần tử nhỏ hơn chiều dài của mảng s. Các phần tử này tương ứng với index của các phần tử của chuỗi s.
Trường hợp thứ nhất khi phần tử trong chuỗi là khoảng trắng thì chúng ta sẽ không làm gì, và tiếp tục đi đến phần tử khác của chuỗi bằng câu lệnh continue. Trường hợp thứ hai khi phần tử trong chuỗi là dấu mở ngoặc, chúng ta sẽ thêm phép toán mở ngoặc vào ngăn xếp op. Trường hợp thứ ba khi phần tử trong chuỗi là một chữ số, chúng ta sẽ tìm tiếp từ phần tử đó đến hết chuỗi xem có chữ số nào nối tiếp không để tạo thành một số có nhiều chữ số. Để tìm xem phần tử có phải là số không, chúng ta có thể sử dụng câu lệnh isnumeric(). Để lấy ra các phần tử tiếp theo chúng ta có thể sử dụng vòng lặp for cùng với hàm range. range(i, len(s)) dùng để tạo một mảng gồm các số tự nhiên bắt đầu từ i với các phần tử nhỏ hơn chiều dài của mảng s. Để dừng lại khi không còn gặp các chữ số liên tiếp trong chuỗi, chúng ta dùng câu lệnh break.
Chúng ta sẽ tính ra giá trị của số có nhiều chữ số bằng công thức ở phần Thuật toán. Khi tính ra số, chúng ta sẽ thêm số đó vào ngăn xếp st (push) bằng câu lệnh .append(). Vì vòng lặp khi đi qua từng phần tử của chuỗi sẽ tăng index lên 1 đơn vị, nên để tránh bị lỗi khi có nhiều chữ số liền nhau, tạo thành một số có nhiều chữ số, chúng ta sẽ sử dụng một mảng có kích thước bằng với kích thước của chuỗi. Mảng này sẽ có kiểu dữ liệu boolean và được khởi tạo bằng False với tất cả các phần tử của mảng. Các phần tử của mảng này sẽ được gán là True nếu nó tương ứng với các chữ số đã đi qua trong chuỗi s. Như vậy chúng ta chỉ xét những vị trí có giá trị False.
st = []
op = []
mst = [False] * len(s)
for i in range(len(s)):
if s[i] == ' ':
continue
elif s[i] == '(':
op.append('(')
elif not mst[i]:
num = 0
for j in range(i, len(s)):
if s[j].isnumeric():
num = num * 10 + int(s[j])
mst[j] = True
else:
break
st.append(num)
Trường hợp thứ tư khi phần tử trong chuỗi là một trong các phép toán cộng, trừ, nhân, chia. Chúng ta có thể kiểm tra việc này bằng hàm is_op. Chúng ta sẽ so sánh thứ tự ưu tiên của phép toán đó với thứ tự ưu tiên của phép toán trước đó. Nếu phép toán trước đó có thứ tự ưu tiên lớn hơn hoặc bằng thứ tự ưu tiên của phép toán hiện tại thì chúng ta sẽ thực hiện phép toán trước đó bằng hàm process_op và bỏ phép toán trước đó ra khỏi mảng op bằng câu lệnh .pop() với ngăn xếp cho đến khi ngăn xếp op không còn phần tử nào. Hàm process_op nhận vào 2 inputs là mảng st để lưu kết quả của phép tính và phép toán trước đó. Chúng ta có thể dùng vòng lặp while để làm việc này. Cuối cùng chúng ta sẽ thêm phép toán hiện tại vào mảng op (push) bằng câu lệnh .append().
elif is_op(s[i]):
cur_op = s[i]
while len(op) != 0 and priority(op[-1]) >= priority(cur_op):
st = process_op(st, op[-1])
op.pop()
op.append(cur_op)
Trường hợp thứ năm khi phần tử trong chuỗi là dấu đóng ngoặc thì chúng ta sẽ thực hiện các phép toán trước đó bằng hàm process_op cho đến khi gặp dấu mở ngoặc trong ngăn xếp op. Sau khi thực hiện mỗi phép toán, chúng ta phải bỏ phép toán vừa thực hiện ra khỏi ngăn xếp op bằng câu lệnh .pop(). Và cuối cùng là phải bỏ dấu mở ngoặc tương ứng ra khỏi ngăn xếp op.
elif s[i] == ')':
while op[-1] != '(':
st = process_op(st, op[-1])
op.pop()
op.pop()
Chúng ta sẽ dừng vòng lặp đi qua các phần tử của s nếu trong ngăn xếp st có kết quả vô cùng (khi chia cho 0). Cuối cùng sau khi đi hết các phần tử của chuỗi s, chúng ta sẽ phải thực hiện các phép toán còn lại trong ngăn xếp op và bỏ phép toán vừa thực hiện ra khỏi ngăn xếp cho đến khi hết phần tử trong ngăn xếp.
while op:
st = process_op(st, op[-1])
op.pop()
Code hoàn chỉnh của hàm evaluate là
def evaluate(s):
st = []
op = []
mst = [False] * len(s)
for i in range(len(s)):
if s[i] == ' ':
continue
elif s[i] == '(':
op.append('(')
elif s[i] == ')':
while op[-1] != '(':
st = process_op(st, op[-1])
op.pop()
op.pop()
elif is_op(s[i]):
cur_op = s[i]
while len(op) != 0 and priority(op[-1]) >= priority(cur_op):
st = process_op(st, op[-1])
op.pop()
op.append(cur_op)
elif not mst[i]:
num = 0
for j in range(i, len(s)):
if s[j].isnumeric():
num = num * 10 + int(s[j])
mst[j] = True
else:
break
st.append(num)
if float("inf") in st:
break
while op:
st = process_op(st, op[-1])
if float("inf") in st:
break
op.pop()
return st[0]
4. Tada!!!
Như vậy chúng ta đã hoàn thành trò chơi rồi đấy. Thật đơn giản đúng không nào. Chúng ta cần thêm một điều kiện nếu kết quả từ hàmevaluatekhác vô cùng thì sẽ in kết quả ra màn hình.
Code hoàn chỉnh sẽ là:
# -*- coding: utf-8 -*-
def is_op(c):
return c in ['+', '-', '*', '/']
def priority(op):
if op == '+' or op == '-':
return 1
if op == '*' or op == '/':
return 2
return -1
def process_op(st, op):
r = st.pop()
l = st.pop()
if op == '+':
st.append(l + r)
elif op == '-':
st.append(l - r)
elif op == '*':
st.append(l * r)
elif op == '/':
if r == 0:
print('Biểu thức có phép chia cho 0: ' + str(l) + '/' + str(r))
st.append(float("inf"))
else:
st.append(l / r)
return st
def evaluate(s):
st = []
op = []
mst = [False] * len(s)
for i in range(len(s)):
if s[i] == ' ':
continue
elif s[i] == '(':
op.append('(')
elif s[i] == ')':
while op[-1] != '(':
st = process_op(st, op[-1])
op.pop()
op.pop()
elif is_op(s[i]):
cur_op = s[i]
while len(op) != 0 and priority(op[-1]) >= priority(cur_op):
st = process_op(st, op[-1])
op.pop()
op.append(cur_op)
elif not mst[i]:
num = 0
for j in range(i, len(s)):
if s[j].isnumeric():
num = num * 10 + int(s[j])
mst[j] = True
else:
break
st.append(num)
if float("inf") in st:
break
while op:
st = process_op(st, op[-1])
if float("inf") in st:
break
op.pop()
return st[0]
cont = True
while cont:
formula = input('Nhập biểu thức cần tính với số tự nhiên (gồm các phép tính cộng, trừ, nhân, chia và dấu ngoặc đơn)')
result = evaluate(formula)
if result != float("inf"):
print('Kết quả của biểu thức là: %s' % str(evaluate(formula)))
tiep = input('Bạn có muốn tiếp tục không (Y/N)?')
if tiep.upper() == 'Y':
cont = True
else:
cont = False
Chương trình của chúng ta mới chỉ thực hiện các phép toán đơn giản với số tự nhiên. Các bạn học sinh hãy thử sáng tạo, cải tiến code để có thể thực hiện các phép toán với cả số thập phân và luỹ thừa, căn bậc hai nhé! Sau khi hoàn thành dự án cá nhân, các bạn đừng quên chia sẻ chương trình của mình lên STEAMese Profile để thầy cô và các bạn cùng trải nghiệm.
— — —
STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.
Các bạn học sinh có còn nhớ dự án ““Nhà thám hiểm và cánh cửa bí mật” hay không? Ở dự án đó, nhà thám hiểm đã phải trải qua hành trình thật khó khăn khi phải lựa chọn 4 căn phòng bí ẩn, thế nhưng bạn ấy đã thành công lấy được kho báu và rời khỏi lâu đài. Trở lại với tòa lâu đài cổ kính đầy rẫy nguy hiểm, các con quái vật sau khi để mất kho báu đã họp bàn với nhau để tìm cách bảo vệ tòa lâu đài tốt hơn. Vậy là, nhân sư đã nâng cấp trò chơi của mình, không còn chỉ là game đoán số thông thường, mà là một thử thách sắp xếp đòi hỏi khả năng tính toán chính xác.
Lần này, nhà thám hiểm lại quyết định quay trở lại tòa lâu đài bí ẩn. Làm thế nào để các bạn học sinh có thể giúp cho nhà thám hiểm an toàn rời khỏi nơi nguy hiểm đó? Để vượt qua thử thách của nhân sư, nhiệm vụ của chúng ta là sắp xếp các dãy số lộn xộn theo thứ tự từ lớn đến bé hoặc từ bé đến lớn. Chúng ta sẽ được chọn mình sắp xếp bao nhiêu số. Đặc biệt, các số trong dãy số sẽ ở dưới dạng các biểu thức cộng trừ, đòi hỏi sự tính toán thật nhanh và chính xác. Hãy thử sức chơi game với nhân sư ngay nào:
Một số kiến thức chúng ta đã được học ở khoá CS 101 sẽ được áp dụng để hoàn thành game nhập vai đơn giản này:
Thư viện randomđể tạo số ngẫu nhiên.
Vòng lặp for và while trong Python.
Hàm (function) trong Python
Chuỗi ký tự gồm nhiều dòng (Multi-line String)
Mảng trong Python
Bắt đầu code thôi nào !!!!!
Luật chơi:
Trò chơi bắt đầu khi nhân sư tạo một dãy số ngẫu nhiên dưới dạng các biểu thức cộng, trừ. Nếu sắp xếp theo thứ tự từ bé đến lớn, nhân sư sẽ hỏi người chơi lần lượt từ số bé nhất, số bé thứ hai, số bé thứ ba,… đến số lớn nhất.
Ví dụ: Một dãy số gồm các biểu thức: 3+1, 3-2, 1+1, 2+3. Sau khi tính toán, dãy số đó sẽ là 4, 1, 2, 5. Nhân sư yêu cầu người chơi sắp xếp từ bé đến lớn. Nhân sư sẽ hỏi: Số thứ nhất là số nào? Câu trả lời đúng là số 1. Nếu người chơi trả lời sai, trò chơi sẽ kết thúc. Nếu người chơi trả lời đúng, nhân sư sẽ tiếp tục hỏi: Số thứ hai là số nào? Câu trả lời đúng là 2. Nếu người chơi trả lời sai, trò chơi sẽ kết thúc. Nếu người chơi trả lời đúng, nhân sư sẽ tiếp tục hỏi số thứ ba. Trò chơi tiếp tục như thế đến số cuối cùng. Nếu người chơi trả lời đúng hết thì người chơi sẽ chiến thắng.
Luật chơi tương tự với trường hợp sắp xếp từ lớn đến bé.
Thuật toán:
Chúng ta sẽ tạo một thuật toán đơn giản để có thể mô phỏng trò chơi này. Chúng ta sẽ sử dụng hai mảng. Một mảng lưu các biểu thức dưới dạng chuỗi. Mảng còn lại lưu kết quả các biểu thức đó. Ví dụ: Mảng lưu dãy các biểu thức: [‘3+1’, ‘3-2’, ‘1+1’, ‘2+3’]. Sau khi tính toán, mảng còn lại sẽ lưu kết quả dãy số đó sẽ là [4, 1, 2, 5]. Ở đây, mục đích của mảng gồm các chuỗi là dùng để in ra màn hình cho người chơi. Mảng kết quả gồm các số sẽ dùng để sắp xếp.
Trong luật chơi, nhân sư sẽ hỏi lần lượt các số theo thứ tự từ bé đến lớn (hoặc từ lớn đến bé). Vì vậy, chúng ta có thể tìm số bé nhất (hoặc lớn nhất) trong mảng. Qua mỗi lần nhân sư hỏi, chúng ta sẽ bỏ số bé nhất (hoặc lớn nhất) ra khỏi mảng, và tiếp tục tìm số bé nhất (hoặc lớn nhất) của mảng mới đến khi mảng không còn phần tử nào.
Ví dụ: Dãy gồm các biểu thức: 3+1, 3-2, 1+1, 2+3. Sau khi tính toán, dãy kết quả sẽ là 4, 1, 2, 5. Nhân sư yêu cầu người chơi sắp xếp từ bé đến lớn.
Ở lượt thứ nhất, số bé nhất là 1. Sau lượt thứ nhất, chúng ta sẽ bỏ số 1 ra khỏi mảng. Mảng mới sẽ gồm 3 số là 4, 2, 5.
Ở lượt thứ hai, số bé nhất là 2. Sau lượt thứ hai, chúng ta sẽ bỏ số 2 ra khỏi mảng. Mảng mới sẽ gồm 2 số là 4, 5.
Ở lượt thứ ba, số bé nhất là 4. Sau lượt thứ ba, chúng ta sẽ bỏ số 4 ra khỏi mảng.
Mảng mới sẽ còn lại số 5. Số 5 là số cuối cùng. Như vậy, chúng ta đã gián tiếp sắp xếp dãy số ban đầu từ bé đến lớn.
3. Code:
Bước 1: Viết hàm giới thiệu game
Trước tiên, chúng ta sẽ tạo một hàm sử dụng câu lệnh print() để in ra màn hình luật chơi cũng như giới thiệu về game:
def intro():
print('''
---
NUMBER SORTING ++
---
RULE: Nhiệm vụ của trò chơi là sắp xếp 1 dãy số lộn xộn theo thứ tự từ bé đến lớn hoặc từ lớn đến bé.
Người chơi sẽ được chọn sắp xếp bao nhiêu số trong dãy số
Đặc biệt: Các số trong dãy sẽ được cho dưới dạng các biểu thức cộng trừ, đòi hỏi chúng ta cần kĩ năng tính toán cực cao nữa đó!
''')
Ở bài số 2, chúng ta đã biết về kiểu dữ liệu chuỗi (string). Từ trước đến nay, ta đều nhận thấy dữ liệu string phải ở trong cùng 1 dòng bắt đầu và kết thúc với dấu “”. Tuy nhiên, nếu ta sử dụng ”’ ”’ (3 dấu ‘), dữ liệu chuỗi có thể gồm nhiều dòng khác nhau (multi-line string).
Bước 2: Viết câu lệnh tương tác với người dùng ở đầu game
Tương tự như dự án “Nhà thám hiểm và cánh cửa bí mật”, chúng ta sẽ tạo một vòng lặp while để hỏi người chơi muốn tiếp tục trò chơi hay dừng lại. Đồng thời chúng ta sẽ in ra luật chơi bằng cách gọi hàm intro đã viết ở bước 1. Chúng ta lưu ý để gọi hàm intro, chúng ta chỉ cần dùng intro() vì hàm không return gì cả. Chúng ta cũng sẽ tạo một biến để hỏi người chơi muốn sắp xếp bao nhiêu số bằng câu lệnh input.
condition = Truewhile condition == True:
intro()
number_guest = int(input("Bạn muốn sắp xếp bao nhiêu số nhỉ? >> "))
again = input('Bạn muốn chơi tiếp không? [Y/N]')
if again == 'N':
condition = False
Bước 3: Viết hàm tạo dãy số ngẫu nhiên
Trò chơi sẽ gồm bốn loại biểu thức: a+b, a-b, a+b-c, a-b+c. a, b, c là các số nguyên ngẫu nhiên từ 1 đến 60. Chúng ta sẽ sử dụng câu lệnh random.randint(1,60) tương tự như dự án “Nhà thám hiểm và cánh cửa bí mật”. Mỗi biểu thức trong dãy số sẽ được chọn ngẫu nhiên từ bốn loại biểu thức bằng câu lệnh random.choice tương tự như dự án “Câu chuyện ngẫu nhiên”.
Chúng ta sẽ sử dụng hai mảng raw_list1 và raw_list2. Mảng raw_list1 lưu biểu thức dưới dạng chuỗi và mảng raw_list2 lưu kết quả của biểu thức. Ở bài số 3, chúng ta đã biết câu lệnh append dùng để lưu dữ liệu vào mảng. Ngoài ra để đổi số thành chuỗi chúng ta sẽ sử dụng hàm str. Để kết nối hai chuỗi, chúng ta sẽ sử dụng phép toán +. Ngoài ra chúng ta cũng không muốn các số trong dãy số lặp lại nên sẽ dùng câu lệnh notin để kiểm tra. “Not in” có nghĩa là không ở trong cái gì đó.
Chúng ta sẽ tạo hai mảng trống rawlist1 và rawlist2. Để dãy số có đủ số mà người chơi muốn sắp xếp, chúng ta sẽ sử dụng vòng lặp while và biến đếm i. Chúng ta sẽ đặt tên cho hàm tạo dãy số ngẫu nhiên là prep. Hàm nhận vào số biểu thức người chơi muốn sắp xếp và trả về hai mảng:
def prep(number_sort):
rawlist1 = []
rawlist2 = []
i = 0
while i < number_sort:
a = random.randint(1,60)
b = random.randint(1,60)
c = random.randint(1,60)
options = ["a+b", "a-b", "a+b-c", "a-b+c"]
option = random.choice(options)
if option == 'a+b' and a+b not in rawlist1:
rawlist1.append(str(a)+ ' + '+ str(b))
rawlist2.append(a+b)
elif option == 'a-b' and a-b not in rawlist2:
rawlist1.append(str(a)+ ' - '+ str(b))
rawlist2.append(a-b)
elif option == 'a+b-c' and a+b-c not in rawlist2:
rawlist1.append(str(a) + "+" + str(b) + "-" + str(c))
rawlist2.append(a+b-c)
elif option == 'a-b+c' and a-b+c not in rawlist2:
rawlist1.append(str(a) + "-" + str(b) + "+" + str(c))
rawlist2.append(a-b+c)
i = i + 1
return rawlist1, rawlist2
Bước 4: Viết hàm trả về số bé nhất (hoặc lớn nhất)
Chúng ta sẽ sử dụng hai hàm có sẵn ở trong Python. Hàm min dùng để tìm số bé nhất trong mảng và hàm max để tìm số lớn nhất trong mảng. Chúng ta sẽ đặt tên hàm cần viết là sorting. Hàm nhận vào mảng (dãy số) và kiểu sắp xếp. Kiểu sắp xếp nhận một trong hai giá trị: 0 (sắp xếp từ bé đến lớn) hoặc 1 (sắp xếp từ lớn đến bé). Hàm trả về số bé nhất (hoặc lớn nhất) tương ứng với cách sắp xếp.
Sau khi hỏi người chơi muốn sắp xếp bao nhiêu số, chúng ta sẽ chọn ngẫu nhiên cách sắp xếp bằng sử dụng câu lệnh random.randint(0,1). Nếu kết quả là 0 thì sắp xếp từ bé đến lớn. Nếu kết quả là 1 thì sắp xếp từ lớn đến bé.
Chúng ta sẽ gọi hàm prep để tạo dãy số ngẫu nhiên đã viết ở bước 2. Chúng ta sẽ in ra màn hình mảng gồm các biểu thức cần sắp xếp và cách thức sắp xếp.
import random
condition = Truewhile condition == True:
intro()
number_guest = int(input('Bạn muốn sắp xếp bao nhiêu số ? >>'))
sort_type = random.randint(0,1)
raw_list1, raw_list2 = prep(number_guest)
if sort_type == 0:
print('Sắp xếp dãy số theo thứ tự từ bé đến lớn: ' + str(raw_list1))
else:
print('Sắp xếp dãy số theo thứ tự từ lớn đến bé: ' + str(raw_list1))
again = input('Bạn có muốn chơi tiếp không? [Y/N]')
if again == 'N':
condition = False
Chúng ta sẽ tạo một vòng lặp while với biến đếm counter để đi qua số lượt nhân sư sẽ hỏi người chơi (bằng với số phần tử của mảng). Với mỗi lượt hỏi, chúng ta sẽ thực hiện ba công việc:
Tìm số bé nhất (hoặc lớn nhất) trong mảng.
Hỏi người chơi xem số tiếp theo trong dãy sau khi được sắp xếp là số nào. Kiểm tra đúng hay sai. Nếu đúng thực hiện bước tiếp theo. Nếu sai thoát khỏi vòng lặp.
Bỏ số tìm được ở công việc đầu tiên ra khỏi mảng.
Để tìm số lớn nhất (bé nhất), chúng ta sử dụng hàm đã viết ở bước 3. Chúng ta sử dụng câu lệnh điều kiện giống như thuật toán Cánh cửa bí mật ở bài số 2 để kiểm tra người chơi có nhập đúng số không. Để bỏ một số ra khỏi mảng, chúng ta sẽ sử dụng hàm remove:
turn = len(raw_list2)
counter = 0
while counter < turn:
number = sorting(raw_list2, sort_type)
guess = int(input('Sau khi sắp xếp, số ở vị trí số '+ str(counter + 1) + ' là: >>'))
if guess == int(number):
if counter == turn - 1:
print('Chúc mừng chiến thắng')
else:
print('Đúng rồi! Tiếp tục nào!')
else:
print('Bạn đã thua, câu trả lời là ' + str(number))
break
raw_list2.remove(number)
counter = counter + 1
4. Tada!!!
Như vậy chúng ta đã hoàn thành xong một game rất thú vị đúng không nào. Các bạn học sinh đã thành công áp dụng kiến thức về hàm đã học ở bài số 4 để viết một thuật toán sắp xếp một dãy số. Ngoài ra, chúng ta cũng biết thêm một số hàm mới có sẵn trong Python giúp chúng ta code thuận tiện hơn
Chương trình Python hoàn chỉnh của game sẽ là:
# -*- coding: utf-8 -*-
import random
def intro():
print('''
---
NUMBER SORTING ++
---
RULE: Nhiệm vụ của trò chơi là sắp xếp 1 dãy số lộn xộn theo thứ tự từ bé đến lớn hoặc từ lớn đến bé.
Người chơi sẽ được chọn sắp xếp bao nhiêu số trong dãy số
Đặc biệt: Các số trong dãy sẽ được cho dưới dạng các biểu thức cộng trừ, đòi hỏi chúng ta cần kĩ năng tính toán cực cao nữa đó!
''')
def prep(number_sort):
rawlist1 = []
rawlist2 = []
i = 0
while i < number_sort:
a = random.randint(1,60)
b = random.randint(1,60)
c = random.randint(1,60)
options = ["a+b", "a-b", "a+b-c", "a-b+c"]
option = random.choice(options)
if option == 'a+b' and a+b not in rawlist1:
rawlist1.append(str(a)+ ' + '+ str(b))
rawlist2.append(a+b)
elif option == 'a-b' and a-b not in rawlist2:
rawlist1.append(str(a)+ ' - '+ str(b))
rawlist2.append(a-b)
elif option == 'a+b-c' and a+b-c not in rawlist2:
rawlist1.append(str(a) + "+" + str(b) + "-" + str(c))
rawlist2.append(a+b-c)
elif option == 'a-b+c' and a-b+c not in rawlist2:
rawlist1.append(str(a) + "-" + str(b) + "+" + str(c))
rawlist2.append(a-b+c)
i = i + 1
return rawlist1, rawlist2
def sorting(arr, sort_type):
if sort_type == 0:
return min(arr)
else:
return max(arr)
condition = True
while condition == True:
intro()
number_guest = int(input('Bạn muốn sắp xếp bao nhiêu số ? >>'))
sort_type = random.randint(0,1)
raw_list1, raw_list2 = prep(number_guest)
if sort_type == 0:
print('Sắp xếp dãy số theo thứ tự từ bé đến lớn: ' + str(raw_list1))
else:
print('Sắp xếp dãy số theo thứ tự từ lớn đến bé: ' + str(raw_list1))
turn = len(raw_list2)
counter = 0
while counter < turn:
number = sorting(raw_list2, sort_type)
guess = int(input('Sau khi sắp xếp, số ở vị trí số '+ str(counter + 1) + ' là: >>'))
if guess == int(number):
if counter == turn - 1:
print('Chúc mừng chiến thắng')
else:
print('Đúng rồi! Tiếp tục nào!')
else:
print('Bạn đã thua, câu trả lời là ' + str(number))
break
raw_list2.remove(number)
counter = counter + 1
again = input('Bạn có muốn chơi tiếp không? [Y/N]')
if again == 'N':
condition = False
Các bạn học sinh hãy tự do sáng tạo theo những ý tưởng của riêng mình. Chúng ta có rất nhiều cách để cải tiến game khác lạ hơn. Thầy cô gợi ý các bạn có thể sắp xếp dãy số bằng hàm có sẵn trong Python là sorted. Sắp xếp dãy số trước khi hỏi người chơi sẽ giúp chương trình chúng ta chạy nhanh hơn. Ngoài ra, các bạn có thể thêm vào những loại biểu thức khác nhau, và thêm phép tính nhân, chia. Các bạn học sinh hãy thử tạo nên dự án của riêng mình và chia sẻ game của mình trên STEAMese Profile nhé!
— — —
STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.