JavaRush /Blog Java /Random-VI /Harvard CS50: Bài tập tuần 3 (Bài 7 và 8), Phần 2
Masha
Mức độ

Harvard CS50: Bài tập tuần 3 (Bài 7 và 8), Phần 2

Xuất bản trong nhóm
Bài giảng Cơ bản về lập trình Harvard CS50 Tài liệu bổ sung: ký hiệu tiệm cận, thuật toán sắp xếp và tìm kiếm Bài tập tuần 3, phần 1. Sắp xếp và tìm kiếm.

Trò chơi bắt đầu!

Harvard CS50: Bài tập tuần 3 (Bài 7 và 8), Phần 2 - 1 Đã đến giờ chơi! Hầu hết mọi người đều quen thuộc với trò chơi giải đố "Tag". Để chính thức hóa nó, “Thẻ” là một trường 4x4 hai chiều, trong trường này không có 16 mà có 15 ô vuông, tức là còn một ô trống. Mỗi ô vuông đều được đánh số và có thể di chuyển theo chiều ngang hoặc chiều dọc trong ô (tất nhiên nếu có chỗ để di chuyển). Mục tiêu là đặt các số theo thứ tự từ 1 đến 15 từ trái qua phải từ trên xuống dưới. Khi đó khoảng trống sẽ ở góc dưới bên phải. Chuyển động của bất kỳ (hoặc một số) ô nào cũng là một “bước” trong không gian trò chơi này. Sự kết hợp hiển thị trong hình trên đã được xếp chồng lên nhau, nhưng lưu ý rằng 12 hoặc 15 ô có thể được đẩy vào chỗ trống. Các quy tắc nêu rõ rằng một ô không được di chuyển theo đường chéo hoặc bị loại bỏ khỏi bàn chơi. Thực tế có rất nhiều cấu hình để bắt đầu trò chơi (bạn có thể đếm chính xác là bao nhiêu), nhưng để đơn giản, hãy sắp xếp các ô theo thứ tự từ lớn nhất đến nhỏ nhất và chừa một khoảng trống ở góc dưới bên phải của bảng. . Điều duy nhất là hãy đổi chỗ 1 và 2 để câu đố có thể giải được. Harvard CS50: Bài tập tuần 3 (Bài 7 và 8), Phần 2 - 2 Bây giờ hãy chuyển đến thư mục ~/ trên bàn làm việc của bạn , sau đó /pset3/fifteen và mở 15.c . Nó chứa mã cho công cụ trò chơi. Nhiệm vụ là thêm mã vào trò chơi. Nhưng trước tiên, hãy biên dịch “động cơ” của chúng tôi (có thể bạn đã biết cách thực hiện việc này). Mặc dù trò chơi chưa kết thúc nhưng bạn có thể khởi chạy ứng dụng. Sẽ thuận tiện hơn khi chạy nó trong cửa sổ terminal lớn hơn thông thường, có thể mở cửa sổ này bằng cách nhấp vào dấu cộng (+) màu xanh lục bên cạnh một trong các tab mã và chọn New Terminal . Hoặc bạn có thể mở cửa sổ terminal ở chế độ toàn màn hình bằng cách nhấp vào biểu tượng Phóng to ở góc trên bên phải của bảng điều khiển. Bạn thấy rằng một số thứ hoạt động bằng cách nào đó. Nhưng trên thực tế, phần lớn trò chơi vẫn chưa được viết ra. Và đây - hãy sẵn sàng - là lối thoát của bạn!
Học
Nghiên cứu mã và nhận xét của 15.c rồi trả lời các câu hỏi bên dưới:
  1. Ngoài bảng 4x4, động cơ của chúng tôi cho phép kích thước trường nào?
  2. Cấu trúc dữ liệu nào là trường trò chơi?
  3. Chức năng nào được gọi để chào người chơi khi bắt đầu trò chơi?
  4. Bạn cần triển khai những tính năng nào?
  5. Lưu ý: Nếu bạn muốn tính năng tự động kiểm tra cho bạn biết liệu bạn đã trả lời đúng các câu hỏi hay chưa, bên cạnh tệp 15.c, hãy tìm tệp 15.txt và viết ra câu trả lời cho những câu hỏi này trong đó.
Thực hiện
Nào, hãy bắt đầu thực hiện trò chơi. Hãy nhớ rằng chúng ta đang đi từng bước nhỏ, đừng cố gắng làm mọi thứ cùng một lúc. Thay vào đó, hãy triển khai từng tính năng một và đảm bảo chúng hoạt động trước khi tiếp tục. Đặc biệt, chúng tôi khuyên bạn nên triển khai các chức năng của trò chơi theo thứ tự sau: init (khởi tạo), draw (vẽ), di chuyển (bước một bước), thắng (thắng). Các quyết định về thiết kế (chẳng hạn như khoảng cách chèn vào giữa các ô số của chúng tôi) là của bạn. Sân chơi sẽ trông giống như thế này: 15 14 13 12 11 10 9 8 7 6 5 4 3 1 2 _ Một lần nữa, xin lưu ý rằng ở vị trí bắt đầu, 1 và 2 nằm theo thứ tự ngược lại (điều này áp dụng cho trường 4x4 cổ điển nếu số ô là số lẻ). Nếu số lượng ô là chẵn và trường là 3x3 thì không cần phải hoán đổi hai ô “thấp nhất”. 8 7 6 5 4 3 2 1 _ Để kiểm tra việc triển khai “Thẻ” của bạn, bạn cần thử phát chúng (đừng quên, bạn có thể thoát khỏi chương trình trước khi chương trình hoàn thành tự nhiên bằng cách nhấn tổ hợp phím crtl+c). Đảm bảo chương trình sẽ hoạt động nếu nhập sai số. Và hãy nhớ rằng giống như bạn tự động hóa dữ liệu đầu vào để tìm kiếm, bạn có thể tự động hóa “hướng dẫn” của trò chơi. Trên thực tế, trong thư mục ~cs50/pset3 có các tệp 3x3.txt4x4.txt , chứa tất cả các chuỗi các bước để giành chiến thắng trên các trường 3x3 và 4x4. Ví dụ: để kiểm tra chương trình bằng cách sử dụng tệp đầu tiên, hãy chạy lệnh sau: ./fifteen 3 < ~cs50/pset3/3x3.txt Thiết lập đối số bạn cần để tăng tốc độ hoạt ảnh. Và nói chung, nếu muốn, bạn luôn có thể thay đổi trò chơi. Để giải trí với "Chuỗi thoát ANSI" bao gồm cả màu sắc. Hãy xem cách triển khai rõ ràng của chúng tôi và xem http://isthe.com/chongo/tech/comp/ansi_escapes.html để tìm hiểu các thủ thuật mới. Nếu bạn muốn, hãy viết các hàm của riêng bạn hoặc thay đổi nguyên mẫu của các hàm mà chúng tôi đã viết. Hạn chế duy nhất là bạn không thay đổi logic của hàm chính, nếu không chúng tôi sẽ không thể áp dụng một số kiểm tra tự động cho nó để xác nhận rằng chương trình của bạn đang hoạt động chính xác. Cụ thể, main phải trả về 0 khi và chỉ khi người dùng giải được câu đố. Các giá trị khác 0 phải được trả về cho tất cả các tùy chọn lỗi. Nếu có lỗi xảy ra, hãy viết thư cho chúng tôi. Chà, nếu bạn muốn thử nghiệm cách triển khai ứng dụng do trợ lý CS50 chuẩn bị, hãy chạy lệnh sau: ~cs50/pset3/fifteen Nếu bạn muốn xem cách triển khai thú vị hơn, với tính năng giải câu đố tự động, hãy xem phiên bản “Hacker” của chương trình: ~cs50/hacker3/fifteen Thay vì nhập số vào cửa sổ trò chơi, hãy gõ chữ GOD. Tuyệt vời phải không? Nếu bạn muốn kiểm tra tính chính xác của chương trình của mình một cách chính thức bằng check50, hãy lưu ý rằng check50 giả định rằng khoảng trống của sân chơi được lấp đầy bằng 0; nếu bạn chọn một giá trị khác, hãy thay thế nó bằng 0 để xác minh chính xác. Ngoài ra, kiểm tra50 giả định rằng bạn đang lập chỉ mục các trường bảng theo thứ tự [hàng] [cột], không phải bảng [cột] [hàng]. check50 2015.fall.pset3.fifteen fifteen.c
Tìm hiểu thêm về cách triển khai Mười lăm chức năng trò chơi
  • init (khởi tạo)
  • vẽ tranh
  • di chuyển (bước một bước)
  • đã thắng (thắng)
trong đó
Trong chức năng này, chúng tôi giới thiệu sân chơi. Để làm điều này, chúng tôi sử dụng một mảng số nguyên hai chiều. Kích thước mảng là MAX x MAX, trong đó MAX là hằng số biểu thị số lượng ô tối đa có thể vừa với một hàng hoặc cột của một trường. Vì vậy, chúng ta cần xác định biến int board[MAX][MAX] Tuy nhiên, hãy nhớ rằng kích thước của sân chơi được xác định bởi người dùng. Do đó, chúng ta cần xác định một biến cho biết kích thước bảng mà người dùng phải nhập. Đây là int d . trong đó d là kích thước bảng, d <= MAX. Tuy nhiên, trong C bạn không thể thay đổi kích thước của mảng, do đó bạn phải chọn kích thước tối đa. Trong init bạn cần đưa các giá trị lên bảng. Harvard CS50: Bài tập tuần 3 (Bài 7 và 8), Phần 2 - 3 Đọc thêm về mảng hai chiều nếu bạn chưa làm việc với chúng. Tóm lại, chúng có hai chỉ số, chỉ số thứ nhất biểu thị số hàng, chỉ số thứ hai biểu thị số cột. Đối với bài toán của chúng ta, chúng ta bắt đầu với số lượng tối đa và kết thúc trong trường hợp d = 3 (“Tám”) với một và một góc trống. Nếu vẫn còn “Tag” thì chúng ta hoán đổi 1 và 2. Làm gì với khoảng trống? Mảng của chúng ta bao gồm các số nguyên, do đó khoảng trống phải được lấp đầy bằng một số nguyên nào đó. Do đó, bạn phải chọn một số số nguyên để khởi tạo ô trống (hoặc, trong trường hợp trò chơi vật lý, không có ô nào). Các vòng lặp có thể được sử dụng để khởi tạo bảng trò chơi và lấp đầy nó bằng một bộ ô bắt đầu. Chúng ta lặp qua các chỉ số i và j, trong đó board[i][j] là một ô nằm ở số hàng i và số cột j. Chúng tôi điền vào bảng theo thứ tự giảm dần. Nếu số ô (không có ô trống) là số lẻ, đổi chỗ 1 và 2.
vẽ tranh
Hàm này sẽ in trạng thái hiện tại của sân chơi. Hãy nhớ rằng chúng ta có thể có các giá trị có một hoặc hai chữ số, vì vậy để định dạng đẹp sau các số 1-9, hàm nên in một khoảng trắng ( #s ). Điều này có thể được thực hiện bằng cách sử dụng trình giữ chỗ %2d . printf (“%2d”, board[i][j]); Cũng đừng quên ô trống. Chọn ký tự đại diện cho nó (trong ví dụ của chúng tôi, đây là dấu gạch dưới). Hàm vẽ sẽ vẽ ký tự này ngay khi bạn nhấn vào một ô trống. Vì vậy, vòng lặp của chúng ta sẽ giống như thế này: for каждой строки for каждого element строки print meaning и пробел print новую строку Hãy nhớ rằng thứ tự mà hàm vẽ vẽ các ô lên màn hình sẽ phản ánh thứ tự của chúng trong mảng được xác định trong hàm init .
di chuyển
Khi bạn đã khởi tạo sân chơi và vẽ các vị trí ô ban đầu, bạn cần cho phép người dùng chỉnh sửa vị trí của các ô, tức là thực hiện các chuyển động. Vì vậy, trong Fifteen.c , chương trình lấy đầu ra từ người dùng, xây dựng bảng trò chơi, sau đó gọi hàm di chuyển và cho nó biết anh ta muốn di chuyển ô nào. Hãy cẩn thận: bạn đang áp dụng hàm cụ thể cho số trên ô chứ không phải cho vị trí của nó trên bảng (trong mảng). Vì vậy, bạn cần tìm vị trí thực tế của ô. Ngoài ra, bạn chỉ nên cho phép người dùng di chuyển ô khi có thể. Harvard CS50: Bài tập tuần 3 (Bài 7 và 8), Phần 2 - 4 Trong hình trên, chúng ta chỉ có thể di chuyển các ô số 2, 5 và 8. Làm thế nào để xác định điều này? Bằng giá trị của một ô trống. Vì vậy, chức năng di chuyển hoạt động như thế này:
  • Chấp nhận số ô mà người dùng muốn di chuyển
  • Tìm vị trí trong mảng (trên sân chơi) của ô này
  • Ghi nhớ vị trí của ô trống
  • Nếu một ô trống liền kề với ô mà người dùng muốn di chuyển, chúng sẽ được hoán đổi trong mảng.
thắng
Chức năng này kiểm tra xem trò chơi đã kết thúc sau mỗi bước của người dùng hay chưa. Nó trả về true nếu các ô xếp theo đúng thứ tự (bao gồm cả vị trí của ô trống ở góc dưới bên phải). Trong trường hợp này, chương trình có thể bị chấm dứt. Nếu các ô vẫn nằm rải rác, hàm trả về sai và chuyển dây cương cho hàm di chuyển . Tổ chức thanh tra như thế nào? Như trong trường hợp khởi tạo và vẽ bảng - sử dụng hai vòng lặp for lồng nhau. Ví dụ: bạn có thể đặt điều kiện là mỗi số tiếp theo trong mảng phải lớn hơn số trước đó. Chú ý giá trị nào được ghi trong ô trống. Hoặc một cách khác - sử dụng bộ đếm để đảm bảo rằng tất cả các ô đều ở đúng vị trí, nếu bạn có thể xử lý nó và viết công thức để lấy nó. Chúng tôi chúc bạn may mắn trong các thí nghiệm của bạn!

Cách xác thực mã của bạn và nhận điểm

Chú ý! Nếu điều quan trọng là bạn chỉ kiểm tra tính chính xác của các tác vụ thì hãy sử dụng cs50check. Nếu bạn muốn đạt điểm trên nền tảng edx, hãy làm theo quy trình được mô tả bên dưới. Hãy nhớ rằng quy trình này sử dụng cùng một cs50check để kiểm tra các tác vụ. Điểm khác biệt duy nhất là nó ghi nhớ kết quả và tính tổng điểm.
  1. Đăng nhập vào CS50 IDE
  2. Gần góc trên cùng bên trái của CS50 IDE , nơi đặt trình duyệt tệp của nó (không phải trong cửa sổ terminal), nhấp chuột phải vào thư mục pset3 của bạn và nhấp vào Tải xuống . Bạn sẽ thấy trình duyệt đã tải xuống kho lưu trữ pset3.tar.gz .
  3. Trong một cửa sổ hoặc tab riêng, đăng nhập vào CS50 Gửi
  4. Bấm vào biểu tượng Gửi ở góc trên bên trái màn hình
  5. Trong danh sách thư mục bên trái, click vào thư mục Issue Set 3 , sau đó click vào nút Upload New Submission. Nó ở bên phải.
  6. Trên màn hình xuất hiện, nhấp vào nút Thêm tệp .... Một cửa sổ để chọn tập tin từ máy tính của bạn sẽ mở ra.
  7. Điều hướng đến thư mục mà bạn đã lưu pset3.tar.gz. Rất có thể nó nằm trong thư mục Tải xuống của bạn hoặc bất cứ nơi nào trình duyệt của bạn đặt tệp theo mặc định. Khi bạn tìm thấy pset3.tar.gz , hãy nhấp vào nó một lần để chọn, sau đó nhấp vào Open .
  8. Nhấp vào Bắt đầu tải lên . Các tập tin của bạn sẽ được tải lên máy chủ CS50 .
  9. Trên màn hình xuất hiện, bạn sẽ thấy cửa sổ No File Selected . Nếu bạn di chuyển con trỏ chuột sang trái, bạn sẽ thấy danh sách các tệp đã tải xuống. Để xác nhận, hãy nhấp vào từng cái. Nếu bạn không chắc chắn về điều gì đó, bạn có thể tải lại tệp lên bằng cách lặp lại các bước tương tự. Bạn có thể làm điều này bao nhiêu lần tùy thích cho đến hết năm 2016.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION