ROB Bowden: Hi. Tôi Rob, và tôi hy vọng của bạn trò chơi cho trò chơi của 15. Bây giờ, có bốn chức năng bạn cần để thực hiện trong chương trình này - init, vẽ, di chuyển, và chiến thắng. Vì vậy, chúng ta hãy nhìn vào init. Ở đây, chúng ta thấy điều đầu tiên chúng tôi sẽ làm là khai báo một biến được gọi là truy cập. Nó sẽ được khởi tạo d lần d trừ đi 1. Hãy nhớ rằng d là kích thước hội đồng quản trị của chúng tôi. Làm thế nào init là sẽ làm việc là nó sẽ để lặp lại trên toàn bộ hội đồng quản trị và chúng ta sẽ bắt đầu ở phía trên bên trái. Và chúng ta hãy chỉ nói rằng chúng ta có 4 4 hội đồng quản trị. Vì vậy, phía trên bên trái chúng tôi sẽ nói là 15. Và sau đó chúng tôi chỉ sẽ đếm thông qua các hội đồng, nói rằng 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, và như vậy. Vì vậy, phía trên bên trái, chúng tôi hy vọng sẽ được d lần d trừ đi 1, mà trong 4 của 4 trường hợp là có được 16 trừ đi 1, đó là chính xác 15. Và bây giờ đây là nơi mà chúng ta sẽ duyệt qua toàn bộ hội đồng quản trị. Và chúng ta sẽ thiết lập mỗi vị trí trong hội đồng quản trị với giá trị hiện tại của truy cập của chúng tôi, và sau đó truy cập sẽ để làm giảm giá trị, do đó tiếp theo vị trí chúng ta đạt được là sẽ có truy cập là một trong ít hơn vị trí trước đó. Vì vậy, chúng tôi bước đầu đã có 15 giảm giá trị truy cập. Vì vậy, sau đó chúng ta sẽ chỉ định 14 cho vị trí tiếp theo, lượng giảm truy cập, và chúng ta sẽ được giao 13, và như vậy. Cuối cùng, chúng ta cần phải xử lý góc Trường hợp, nếu hội đồng quản trị có một thậm chí kích thước, sau đó chỉ cần làm 15, 14, 13, 12, tất cả các con đường xuống 3, 2, 1, là sẽ để lại cho chúng tôi một hội đồng quản trị giải quyết được. Và chúng ta phải trao đổi 1 và 2. Vì vậy, nếu d mod 2 bằng 0, đó là làm thế nào chúng ta sẽ kiểm tra để xem nếu nó thậm chí còn. Nếu d mod 2 bằng 0, sau đó trong hàng d trừ 1, đó là hàng dưới cùng, và vị trí d trừ 2, hoặc cột d trừ 2, chúng ta sẽ thiết lập đó để 2, và cột d trừ 3 chúng tôi sẽ thiết lập để 1. Vì vậy, đó chỉ là đảo ngược nơi 1 và 2 hiện đang có. Cuối cùng, chúng ta sẽ thiết lập rất dưới cùng bên phải bằng trống, nơi trống đã được định nghĩa băm ở đầu là 0. Vì vậy, đó không phải là thực sự cần thiết, vì điều này cho vòng lặp là sẽ có thiết lập các góc dưới bên phải để 0, vì truy cập sẽ tự nhiên đạt 0. Nhưng điều đó phụ thuộc vào chúng tôi biết rằng trống được băm để tìm một 0. Nếu tôi đi vào chương trình này và sau đó thay đổi trống ở đầu trang 100, nó vẫn phải làm việc. Vì vậy, đây chỉ là đảm bảo rằng các phía dưới bên phải là thực sự bằng của chúng tôi giá trị trống. Cuối cùng, chúng tôi có hai biến toàn cầu, để trống tôi và trống j, và chúng ta thấy những tuyên bố ở đầu trang. Và chúng ta sẽ sử dụng hai toàn cầu biến để theo dõi các vị trí của trống, vì vậy mà chúng ta không cần phải xem xét thông qua toàn bộ hội đồng quản trị để tìm chỗ trống mỗi đơn Hiện chúng tôi cố gắng để thực hiện một di chuyển. Vì vậy, vị trí của trống luôn luôn là sẽ bắt đầu ở góc dưới bên phải. Vì vậy, phía dưới bên phải được cho bởi chỉ số d trừ đi 1, d trừ đi 1. Vì vậy, đó là init. Bây giờ chúng ta chuyển sang vẽ. Vì vậy, hòa là có được tương tự nơi chúng ta sẽ lặp trên toàn bộ hội đồng quản trị. Và chúng tôi chỉ muốn in giá trị đó là trong mỗi vị trí của hội đồng quản trị. Vì vậy, ở đây, chúng tôi đang in giá trị đó là ở mỗi vị trí của hội đồng quản trị. Và nhận thấy rằng chúng tôi đang làm -. Và đó chỉ là nói printf mà không phân biệt nếu đó là một chữ số hoặc hai chữ số, chúng tôi vẫn muốn nó mất hai cột trong in ra, do đó nếu chúng ta có hai chữ số và một số chữ số trong cùng một bảng, chúng tôi hội đồng quản trị sẽ vẫn nhìn đẹp và vuông. Vì vậy, chúng tôi muốn làm điều đó cho tất cả các giá trị trong hội đồng quản trị, ngoại trừ trống. Vì vậy, nếu các vị trí trong hội đồng quản trị bằng trống, sau đó chúng tôi đặc biệt muốn in ra chỉ là một gạch dưới để đại diện cho trống, thay vì bất cứ điều gì giá trị của trống thực sự. Cuối cùng, chúng tôi muốn in ra một dòng mới. Chú ý rằng điều này vẫn còn bên trong bên ngoài vòng lặp, nhưng bên ngoài bên trong vòng lặp. Từ bên ngoài này cho vòng lặp được lặp lại trên tất cả các hàng, và do đó đây là printf sẽ chỉ in một dòng mới, vì vậy chúng tôi di chuyển trên để in ra các hàng tiếp theo. Và đó là nó cho hòa. Vì vậy, bây giờ chúng ta hãy chuyển để di chuyển. Bây giờ, chúng tôi vượt qua di chuyển, ngói rằng người sử dụng được nhập vào trò chơi - họ nhập ngói họ muốn di chuyển - và bạn đang nghĩ để trả về một bool, vì vậy đúng hoặc sai, tùy thuộc vào cho dù di chuyển đã được thực sự hợp lệ - cho dù ngói có thể được di chuyển vào không gian trống. Vì vậy, ở đây, chúng ta khai báo một biến địa phương, tile_1 và tile_j, mà sẽ tương tự như blank_i và blank_j, ngoại trừ nó sẽ theo dõi các vị trí của ngói. Bây giờ đây, chúng ta sẽ sử dụng blank_i và blank_j và nói tất cả rồi, vậy đây là trống trên bảng. Bây giờ, là ngói trên trống? Là ngói bên trái của trống? Là gạch để ở bên phải của trống? Là gạch dưới trống? Vì vậy, nếu gạch là trong bất kỳ của những vị trí, sau đó chúng tôi biết rằng ngói có thể được di chuyển vào vị trí trống và trống có thể được di chuyển đến nơi ngói hiện nay. Vì vậy, ở đây, chúng ta nói nếu hội đồng quản trị ở vị trí blank_i trừ 1 blank_j. Vì vậy, đây được nói là ngói trên các trống hiện tại? Và nếu như vậy, chúng ta sẽ nhớ đó là vị trí của ngói. Gạch ở vị trí blank_i trừ đi 1 và blank_j. bây giờ đầu tiên, chúng tôi cũng có kiểm tra này ngay tại đây, vì vậy blank_i là lớn hơn 0. Tại sao chúng ta muốn làm điều đó? Vâng, nếu trống là ở hàng đầu Hội đồng quản trị, sau đó chúng tôi không muốn tìm trên trống cho ngói từ không có gì ở trên đầu là hàng của bảng. Đây là cách bạn có thể kết thúc nhận một cái gì đó giống như một lỗi phân khúc hay chương trình của bạn chỉ có thể làm việc theo những cách bất ngờ. Vì vậy, đây là đảm bảo rằng chúng tôi không tìm ở những nơi mà không phải là hợp lệ. Bây giờ chúng ta sẽ làm điều tương tự cho tất cả các kết hợp có thể khác. Vì vậy, ở đây, chúng tôi đang tìm kiếm dưới trống để xem nếu đó là ngói. Và chúng tôi cũng phải chắc chắn chúng tôi không trên hàng dưới cùng, nếu không chúng ta không nên tìm kiếm ngói. Ở đây, chúng ta sẽ xem xét bên trái của trống để xem nếu nó là ngói. Và chúng ta không nên nhìn sang bên trái nếu chúng ta đang ở trong cột ngoài cùng bên trái. Và ở đây chúng ta sẽ nhìn vào bên phải của trống, và chúng ta không nên nhìn bên phải nếu chúng ta trong cột bên phải. Vì vậy, nếu không có những điều đó là đúng, điều đó có nghĩa ngói không liền kề để trống và chúng tôi có thể trả về false. Động thái này là không hợp lệ. Nhưng, nếu một trong những người là đúng, sau đó tại thời điểm này, chúng ta biết rằng tile_i và tile_j bằng với vị trí của ngói. Và như vậy, chúng ta có thể cập nhật các bảng tại vị trí tile_i và tile_j. Chúng ta biết được giá trị mới sẽ là trống và rằng blank_i vị trí blank_j, đó là bản gốc trống - chúng ta biết ngói sẽ di chuyển ở đó. Chú ý chúng ta không thực sự phải làm một trao đổi thực sự ở đây, kể từ khi chúng ta biết được giá trị mà cần phải được chèn vào những vị trí. Chúng ta không cần một tạm thời biến xung quanh. Cuối cùng, chúng ta cần nhớ rằng chúng tôi có biến toàn cầu của chúng tôi là theo dõi các vị trí của trống. Vì vậy, chúng tôi muốn để cập nhật vị trí của trống là nơi ngói ban đầu là. Cuối cùng, chúng tôi trở lại đúng từ di chuyển đã thành công. Chúng tôi trao đổi thành công trống với ngói. Được rồi, chúng ta nên cuối cùng cần phải kiểm tra won. Vì vậy, chiến thắng tương tự trả về một bool nơi đúng là sẽ chỉ ra rằng người sử dụng đã thắng. Và sai được chỉ ra rằng các trò chơi vẫn còn đang. Người sử dụng đã không giành chiến thắng. Vì vậy, điều này là có được khá nhiều đối diện của init, init nơi, nhớ, chúng ta khởi tạo hội đồng quản trị 15, 14, 13, 12, vv. Trong khi đó, chiến thắng, chúng tôi muốn kiểm tra xem hội đồng quản trị là 1, 2, 3, 4, 5, và như vậy. Vì vậy, chúng ta sẽ khởi tạo của chúng tôi chống tới 1 vì đó là những gì hàng đầu bên trái của hội đồng quản trị nên được. Và sau đó chúng ta sẽ lặp trên toàn bộ hội đồng quản trị. Hãy bỏ qua tình trạng này trong một giây. Và tình trạng này là chỉ cần đi đến kiểm tra là hội đồng quản trị tại vị trí này bằng với số lượng hiện tại? Nếu như vậy, tăng số lượng để các vị trí tiếp theo chúng ta nhìn vào là một trong những cao hơn so với vị trí chúng tôi đang ở ngay bây giờ. Vì vậy, đó là cách chúng tôi nhận được trên bên trái nên được 1. Tăng số lượng 2. Nhìn vào vị trí tiếp theo. Đây là 2? Nếu như vậy, thặng dư đếm đến 3. Vị trí tiếp theo là 3 này? Nếu như vậy, tăng số lượng đến 4, và như vậy. Vì vậy, nếu có bất kỳ vị trí trên hội đồng quản trị không bằng số của chúng tôi, sau đó chúng tôi muốn trở lại sai vì đó có nghĩa là có một số gạch đó là không ở đúng vị trí. Vì vậy, ở đây, những gì là tình trạng này đang làm gì? Vâng, hãy nhớ rằng trống là nghĩa vụ phải đi vào góc dưới bên phải. Và giá trị của trống có thể không nhất thiết phải tương đương với giá trị của phản có nghĩa là sẽ đạt được ở góc dưới bên phải. Vì vậy, chúng tôi đặc biệt muốn kiểm tra xem tôi bằng bằng d trừ đi 1 và j bình đẳng d bằng trừ 1 - được nói rằng nếu chúng tôi đang tìm kiếm ở góc dưới bên phải hội đồng quản trị - sau đó chúng tôi chỉ muốn tiếp tục. Chúng tôi muốn bỏ qua đặc biệt này lặp đi lặp lại của vòng lặp cho. Và như vậy, nếu chúng ta quản lý để có được thông qua này lồng nhau cho vòng lặp, có nghĩa là không có gạch đó là trong vị trí không chính xác. Và chúng tôi thoát ra khỏi vòng lặp và đến ở đây, nơi chúng tôi có thể trở lại đúng sự thật. Tất cả các gạch là ở các vị trí chính xác và điều đó có nghĩa người dùng có thắng. Và đó là nó. Tên tôi là Rob Bowden, và điều này là 15.