Tic tac toe kiểm tra người chiến thắng C++
Gần đây tôi đã được hỏi một câu hỏi để kiểm tra xem người chơi X có thắng trò chơi Tic Tac Toe không. Đây là cách triển khai mà tôi đã cung cấp, một cách tiếp cận vũ phu Show
// Giả sử Trình xây dựng của lớp khởi tạo mọi thứ đúng cách. Tất cả các giá trị được đặt thành // null bool?[][] board; // X = true, O = false, empty space = null Vì vậy, đoạn mã trên có thể sạch hơn một chút, nhưng điểm mà mọi người nên thấy ở đây là giải pháp này là giải pháp O(n²). Nó không hoạt động tốt cho các bảng Tic Tac Toe có kích thước lớn Sự đồng thuận chung để giảm độ phức tạp thời gian của vấn đề là đưa ra một số độ phức tạp không gian. Hãy nhớ rằng, nó luôn luôn là một sự đánh đổi
bool?[][] board; // X = true, O = false, empty space = null Ở đây chúng tôi có nó, một giải pháp O(1) yêu cầu độ phức tạp không gian O(n). Mặc dù giải pháp này phải theo dõi nhiều thứ hơn, nhưng nó đơn giản hơn để viết và gỡ lỗi và quan trọng hơn là không có vòng lặp Đây là một câu hỏi đã được hỏi trên StackOverflow ( https. // stackoverflow. com/câu hỏi/1056316/algorithm-for-dinating-tic-tac-toe-game-over) trong đó câu trả lời được đánh dấu là được chấp nhận/chính xác đã sử dụng các vòng lặp để kiểm tra từng cột/hàng/đường chéo Giải pháp được cung cấp là thời gian O(n) với một vài mảng bổ sung. Tôi sẽ lập luận rằng vì bộ nhớ không phải lúc nào cũng là yếu tố giới hạn và thời gian có thể là như vậy, nên tốt hơn hết là sử dụng thêm bộ nhớ (nếu có) và chạy trong thời gian O(1). Tôi không sử dụng điều này như một quy tắc phổ quát, mà giống như cách tiếp cận 'mèo vừa thì mèo ngồi' để giải quyết vấn đề. Tôi đã học được động thời gian/không gian từ việc giải bài toán này, và tôi hy vọng bạn cũng vậy Ồ, vâng, có thể có lỗi trong đoạn mã trên, nhưng tôi không lo lắng, ý tưởng chính xác mới là vấn đề Điều đó sẽ kiểm tra xem có ai đã giành chiến thắng trên tất cả các hàng hay không, nhưng có vẻ như chức năng này không hoạt động. Điều gì có thể là vấn đề? Tôi không thể đăng nhập vào trang web này mà không thấy 2 hoặc 3 câu hỏi tic-tac-toe trong tuần này. Phải có một bài tập đến hạn hoặc một cái gì đó cho một khóa học tham khảo trang web này rất nhiều http. //cplusplus. com/forum/người mới bắt đầu/58046/ Tôi nghĩ chỉ vì nó là một trò chơi đơn giản và những người mới bắt đầu như tôi muốn luyện tập. Vì vậy, bạn có thấy những gì có thể sai với chức năng của tôi?
không hoạt động trong C++
là những gì bạn cần Phiên bản đầu tiên được đánh giá từ trái sang phải, vì vậy -- giả sử tất cả đều là 'X' (ascii 88) -- nó kết thúc bằng (mỗi lần đánh giá hai thuật ngữ ngoài cùng bên trái) Đưa ra một mảng di chuyển trong đó mỗi phần tử là một mảng khác có kích thước 2 tương ứng với hàng và cột của lưới nơi chúng đánh dấu ký tự tương ứng theo thứ tự mà A và B chơi. Trả lại người chiến thắng của trò chơi nếu nó tồn tại (A hoặc B), trong trường hợp trò chơi kết thúc với tỷ số hòa, hãy trả lại “Hòa”, nếu vẫn còn các chuyển động để chơi, hãy trả về “Đang chờ xử lý” Bạn có thể cho rằng các nước đi là hợp lệ (Nó tuân theo các quy tắc của Tic-Tac-Toe), lưới ban đầu trống và A sẽ chơi trước ví dụ 1 Giải trình. “A” thắng, anh ấy luôn chơi trước "X " "X " "X " "X " "X " " " -> " " -> " X " -> " X " -> " X " " " "O " "O " "OO " "OOX" ví dụ 2 "X " "X " "XX " "XXO" "XXO" "XXO" " " -> " O " -> " O " -> " O " -> "XO " -> "XO " " " " " " " " " " " "O " ví dụ 3 Đầu vào. di chuyển = [[0,0],[1,1],[2,0],[1,0],[1,2],[2,1],[0,1],[0,2] 1 2 3 "XXO" "OOX" "XOX" "XXO" "OOX" "XOX" Ví dụ 4 Đầu vào. di chuyển = [[0,0],[1,1]] 1 2 3 "X " " O " " " "X " " O " " " Hạn chế gợi ý Hàm C++ để xác định người chiến thắng trong Trò chơi Tic-Tac-ToeChỉ cần kiểm tra (bruteforce) nếu có 3 phần được kết nối. 3 hàng, 3 cột và 2 đường chéo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 bool win(char board[3][3], string &result) { for (int i = 0; i < 3; ++ i) { if ((board[i][0] != 0) && (board[i][0] == board[i][1]) && (board[i][1] == board[i][2])) { result = board[i][0]; return true; } if ((board[0][i] != 0) && (board[0][i] == board[1][i]) && (board[1][i] == board[2][i])) { result = board[0][i]; return true; } } if ((board[1][1] != 0) && (board[0][0] == board[1][1]) && (board[1][1] == board[2][2])) { result = board[1][1]; return true; } if ((board[1][1] != 0) && (board[0][2] == board[1][1]) && (board[1][1] == board[2][0])) { result = board[1][1]; return true; } return false; } "X " "X " "XX " "XXO" "XXO" "XXO" " " -> " O " -> " O " -> " O " -> "XO " -> "XO " " " " " " " " " " " "O "0 Bảng đã được khởi tạo thành ma trận 3×3 với các giá trị bằng không "X " "X " "XX " "XXO" "XXO" "XXO" " " -> " O " -> " O " -> " O " -> "XO " -> "XO " " " " " " " " " " " "O "1____3_______2 "X " "X " "XX " "XXO" "XXO" "XXO" " " -> " O " -> " O " -> " O " -> "XO " -> "XO " " " " " " " " " " " "O "3 Ngoài ra, chúng ta có thể sử dụng std. lấp đầy() "X " "X " "XX " "XXO" "XXO" "XXO" " " -> " O " -> " O " -> " O " -> "XO " -> "XO " " " " " " " " " " " "O "1____3_______5 "X " "X " "XX " "XXO" "XXO" "XXO" " " -> " O " -> " O " -> " O " -> "XO " -> "XO " " " " " " " " " " " "O "6 Tìm người chiến thắng trong trò chơi Tic Tac ToeMột trường hợp đặc biệt là kiểm tra xem còn chỗ cho lần chơi tiếp theo hay không – có thể là Hòa hoặc Đang chờ xử lý nếu không có người chiến thắng "X " "X " "XX " "XXO" "XXO" "XXO" " " -> " O " -> " O " -> " O " -> "XO " -> "XO " " " " " " " " " " " "O "7 "X " "X " "XX " "XXO" "XXO" "XXO" " " -> " O " -> " O " -> " O " -> "XO " -> "XO " " " " " " " " " " " "O "8 "X " "X " "XX " "XXO" "XXO" "XXO" " " -> " O " -> " O " -> " O " -> "XO " -> "XO " " " " " " " " " " " "O "9 –EOF (Blog máy tính & công nghệ cơ bản) — Xếp hạng sao GD Bài cuối. Triển khai PUSHD/POPD trong Pure Windows Batch Bài tiếp theo. Thuật toán để xóa khoảng thời gian khỏi phân đoạn URL Vĩnh viễn là. Thuật toán để tìm người chiến thắng trong trò chơi Tic Tac Toe (Phiên bản AMP) bài viết liên quan
|