ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Nhập môn lập trình CO1003 Bài tập lớn CỜ CARO TP HỒ CHÍ MINH, THÁNG 10/2022 TRƯỜNG ĐẠI HỌC BÁCH KHOA[.]
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Nhập mơn lập trình - CO1003 Bài tập lớn CỜ CARO TP HỒ CHÍ MINH, THÁNG 10/2022 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH ĐẶC TẢ BÀI TẬP LỚN Phiên 1.0 Chuẩn đầu Sau hoàn thành tập lớn này, sinh viên ôn lại sử dụng thành thục: • Các cấu trúc rẽ nhánh • Các cấu trúc lặp • Mảng chiều mảng chiều • Xử lý chuỗi ký tự • Hàm lời gọi hàm • Cấu trúc người dùng tự định nghĩa (struct) Dẫn nhập Cờ Caro (hay gọi cờ chéo, Gomoku, Five in a Row, v.v ) trò chơi chiến lược bàn cờ Theo truyền thống, cờ Caro chơi quân cờ vây (đá đen trắng) bàn cờ vây với kích thước bàn cờ 15 x 15 (Hình 1) Vì qn cờ thường khơng có nhu cầu bị di chuyển hay loại khỏi bàn cờ, nên cờ Caro chơi giấy bút chì Trong tập lớn này, bạn thực lại trò chơi cờ Caro với số luật chơi cung cấp bên (a) Cờ Caro bàn cờ vây (b) Cờ Caro chơi giấy Hình 1: Hình minh họa cho trị chơi cờ Caro Bài tập lớn mơn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 1/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Luật chơi Để đơn giản, luật chơi nêu BTL áp dụng cho phiên chơi giấy (nước cờ kí hiệu X O) Trong cờ Caro thơng thường, hai người chơi luân phiên đặt nước cờ lên ô trống Người chơi bắt đầu nước cờ X, người chơi sử dụng nước cờ O luân phiên đặt xuống bàn cờ Người chiến thắng người chơi tạo thành chuỗi năm (5) nước cờ liên tiếp, không bị đứt đoạn theo chiều ngang, chiều dọc đường chéo Hình mơ tả số trạng thái chiến thắng trị chơi Hình 2: Một số trạng thái thắng cờ Caro Ngoài ra, BTL này, bổ sung thêm luật cho trị chơi: • Luật bổ sung (6 nước trở lên): Một chuỗi nước cờ liên tiếp có nhiều năm (5) nước cờ khơng tính chiến thắng • Luật bổ sung (Chặn đầu): Một chuỗi năm (5) nước cờ liên tiếp bị chặn đầu nước cờ đối thủ không tính chiến thắng Bài tập lớn mơn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 2/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH (a) Hình minh họa cho luật nước trở lên (b) Hình minh họa cho luật chặn đầu Hình 3: Luật bổ sung Ở hình 3(a), đường kẻ màu đỏ người chơi Đen dù có nước cờ khơng tính chiến thắng Ở hình 3(b), người chơi O khơng tính thắng dù có nước cờ O liên tiếp bị người chơi X chặn nước cờ X hai đầu Mô tả chương trình Phần trình bày thơng tin mà sinh viên cần phải nắm chương trình trước bắt đầu thực yêu cầu Bài tập lớn Trong BTL này, sinh viên cung cấp trước đoạn mã nguồn thực sẵn bao gồm: hàm main(), hàm startGame(), hàm displayBoard() (cùng với hàm lineString() bổ trợ cho displayBoard) hàm displayBoardSimple(), kiểu enum Stone số biến toàn cục khác phục vụ cho mã nguồn cho trước Khi chương trình bắt đầu chạy, hình hiển thị sau: Welcome to Gomoku! Play game History Exit Please select mode [1/2/3]: Chương trình đợi input người dùng số nguyên với input tương ứng: • Nếu input 1: Chương trình gọi hàm startGame() bắt đầu chế độ chơi theo lượt Bài tập lớn mơn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 3/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH trị chơi cờ Caro • Nếu input 2: Chương trình gọi hàm displayHistory() bắt đầu chế độ xem lại ván đấu cờ Caro • Nếu input 3: Chương trình kết thúc • Nếu input khơng hợp lệ: Chương trình in Illegal input, please try again: yêu cầu người dùng nhập lại Nhiệm vụ Trong BTL này, sinh viên cần thực chương trình giả tưởng ngôn ngữ C để mô lại trình chơi trị chơi cờ Caro hình console thông qua luật chơi mô tả nhiệm vụ mô tả bên Mỗi nhiệm vụ yêu cầu viết hàm tương ứng, tham số cho hàm cho mô tả yêu cầu nhiệm vụ Trước đọc tiếp phần dưới, sinh viên yêu cầu phải đọc hiểu rõ cách hàm main() startGame() hoạt động Việc hiểu rõ nội dung hàm displayBoard() lineString() không khuyến khích 5.1 Đi nước cờ (3 điểm) Khi người dùng chọn chế độ chơi theo lượt, chương trình gọi hàm startGame() Chương trình đợi người dùng nhập nước vị trí bàn cờ Cờ caro chơi bảng vuông gồm 15 hàng đánh số từ 15 đến (từ xuống dưới) 15 cột đánh thứ tự từ a đến o (từ trái sang phải) Một nước người chơi bàn cờ ký hiệu tổ hợp hàngcột với giá trị hàng cột nằm khoảng hợp lệ bàn cờ Một số ví dụ nước hợp lệ: 1a, 3d, 5o, v.v Sinh viên yêu cầu viết hàm để xác định nước nhập vào người chơi hợp lệ hay không ghi nhận nước vào bàn cờ hợp lệ Cụ thể, mơ tả hàm sau: • Tên hàm: makeMove • Tham số đầu vào: – board[][MAX_SIZE] (kiểu enum Stone): Mảng chiều kiểu enum Stone, lưu trữ thông tin trạng thái bàn cờ – size (kiểu int): Kích thước bàn cờ – playerMove (kiểu char*): Chuỗi chứa nước người chơi Bài tập lớn mơn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 4/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH – isFirstPlayerTurn (kiểu bool): Biến logic dùng để xác định lượt lượt người nước cờ hay khơng • u cầu hàm: Hàm kiểm tra nước người có phải nước hợp lệ hay không Nước hợp lệ nước đi: tuân theo ký hiệu nước cờ, giá trị hàng cột nằm khoảng hợp lệ, ô cờ trống Nếu nước hợp lệ, hàm cập nhật quân cờ vào bàn cờ board thành quân cờ người chơi dựa vào biến isFirstPlayerTurn Ngược lại, hàm khơng làm Hàm trả true bàn cờ cập nhật thêm nước cờ mới, ngược lại trả false Ví dụ 1: Các ví dụ playerMove nước cờ khơng hợp lệ: • 32x: khơng hợp lệ có giá trị hàng 32 giá trị cột ’x’ nằm ngồi khoảng hợp lệ bàn cờ • t3: khơng hợp lệ không tuân theo cách ký hiệu nước cờ Hàm trả giá trị false trường hợp Ví dụ 2: Cho trạng thái bàn cờ sau: Bài tập lớn mơn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 5/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH a b c d e f g h i j k l m n o 15 14 13 12 11 O 10 X X O X O Với playerMove = "12i" isFirstPlayerTurn = false, hàm cập nhật board thành: a b c d e f g h i j k l m n o 15 14 13 12 11 X O 10 X X O X O Hàm trả giá trị true Bài tập lớn môn Nhập môn lập trình - HK năm học 2022 - 2023 Trang 6/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH 5.2 Kiểm tra chiến thắng (4 điểm) Ta tiếp tục quan sát hàm startGame() Sau nước hợp lệ quân cờ lên bàn cờ, chương trình tiếp tục kiểm tra người chơi vừa nước cờ thắng hay chưa Điều kiện thắng trò chơi mô tả rõ mục Luật chơi Sinh viên yêu cầu viết hàm sau để mô tả lại q trình kiểm tra chiến thắng Thơng tin hàm sau: • Tên hàm: hasWon • Tham số đầu vào: – board[][MAX_SIZE] (kiểu enum Stone): Mảng chiều kiểu enum Stone, lưu trữ thông tin trạng thái bàn cờ – size (kiểu int): Kích thước bàn cờ – isFirstPlayerTurn (kiểu bool): Biến logic dùng để xác định lượt lượt người nước cờ hay khơng • u cầu hàm: Hàm kiểm tra trạng thái bàn cờ board có phải trạng thái chiến thắng người chơi 1/người chơi (dựa vào biến isFirstPlayerTurn) hay khơng • Kết trả về: Hàm trả giá trị true bàn cờ board trạng thái chiến thắng Ngược lại, trả false Ví dụ 3: Cho trạng thái bàn cờ sau: Bài tập lớn mơn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 7/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH a b c d e f g h i j 13 O O 12 X k l m X O n o 15 14 11 O 10 X O X X O X X X X O O X O X O Nhận thấy, người chơi X có nước cờ liên tiếp từ 9h đến 9l Vì nên, người chơi X chiến thắng Hàm trả kết true Ví dụ 4: Cho trạng thái bàn cờ sau: Bài tập lớn mơn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 8/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH a b c d e f g h i j k l m n o 15 14 X 13 12 11 O X O X X O O X O X O O X X O 10 O X O Mặc dù người chơi O có nước cờ liên tiếp (từ 9j đến 13j) theo luật Chặn đầu, người chơi O chưa chiến thắng bị người chơi X chặn nước 14j 8j Vì vậy, hàm trả false chưa có chiến thắng Ví dụ 5: Cho trạng thái bàn cờ sau: Bài tập lớn môn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 9/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH a b c d e f g h i j k l O O O O O O m n o 15 14 13 12 11 X O 10 X O X X X X O O X X X X O X X O Người chơi O khơng tính chiến thắng có nước cờ liên tiếp (13g đến 13k, 13h đến 13l) nước cờ rơi vào luật nước trở lên Trong đó, người chơi X có nước cờ liên tiếp từ 10i đến 10m nên X người chiến thắng Hàm trả kết true 5.3 Xem lịch sử trận đấu (3 điểm) Mục yêu cầu sinh viên thực chức xem lại ván đấu cờ Caro thông qua việc thực hàm displayHistory() Biết sau trận đấu kết thúc, lịch sử trận đấu lưu lại format sau: a0a1a2 an Trong đó: • : Ký hiệu nước cờ • n: Số lượng nước cờ trận đấu Sau chế độ xem lại lịch sử chọn, người dùng nhập vào lịch sử trận đấu để Bài tập lớn môn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 10/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH theo dõi lại trận đấu Chương trình tiếp tục cung cấp cho người dùng cách thức để điều khiển trình xem lại bao gồm: Xem nước cờ tiếp theo, Xem nước cờ trước Thốt SV yêu cầu viết hàm sau phép người dùng điều khiển trình xem lại trận đấu dựa vào lịch sử người dùng nhập vào Thông tin cụ thể hàm sau: • Tên hàm: displayHistory • Tham số đầu vào: – history (kiểu char*): chuỗi chứa lịch sử trận đấu – numOfMoves (kiểu int): số lượng nước cờ trận đấu • Yêu cầu hàm: Khai báo mảng chiều kiểu enum Stone (gọi game) với kích thước 15x15 để lưu trữ trạng thái trận đấu Khởi tạo phần tử mảng giá trị NA Hiển thị sàn đấu thông qua gọi hàm displayBoard với đối số (argument) cần thiết để hiển thị bàn đấu trống In hình chuỗi inputCommand Đọc vào input người dùng kí tự kiểu char – Nếu người dùng nhập vào kí tự ’n’: Hiển thị bàn cờ sau đánh nước cờ (tiếp tục sử dụng hàm displayBoard) Tuy nhiên, nước cờ nước cờ cuối cùng, in hình chuỗi endOfHistory Sau đó, quay lại bước – Nếu người dùng nhập vào kí tự ’p’: Hiển thị bàn cờ trước đánh nước cờ (sử dụng hàm displayBoard) Tuy nhiên, bàn cờ trống, in hình startOfGame Sau đó, quay lại bước – Nếu người dùng nhập vào kí tự ’s’: Kết thúc hàm – Nếu người dùng nhập vào kí tự khác với kí tự trên, in hình chuỗi invalidInput Sau đó, quay lại bước • Kết trả về: Khơng • Lưu ý: Trong BTL này, lịch sử trận đấu người dùng nhập vào đảm bảo hợp lệ n < 225 Ví dụ 6: Đây số ví dụ chuỗi lịch sử trận đấu: 7i7h8f8h9g10h9h9i8j6h6f9f4h6g5f7f10g11f5h5g4g10j11k6i8g11g3h2i4f4e2h1h3f2f3g5e3e3d3i (n = 34) 13n10n12n8e7k9e12m7e6e8n12l12o10k14o12j12k11l9j10l9l9k8k11m13o8j (n = 25) Bài tập lớn mơn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 11/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH 13n10n12n8e7k9f9h7f9d8f6f7d6c7e7g8c8d6e5e5f4g9b (n = 22) Ví dụ 7: Ví dụ sau luồng hoạt động người dùng tương tác với chương trình sau người dùng chọn chế độ xem lịch sử trận đấu: • Màn hình hiển thị: Please enter number of moves: • Người dùng nhập vào: 22 • Màn hình hiển thị: Please enter history: • Người dùng nhập vào: 13n10n12n8e7k9f9h7f9d8f6f7d6c7e7g8c8d6e5e5f4g9b • Màn hình hiển thị: a b c d e f g h i j k l m n o 15 14 13 12 11 10 Previous move/Next move/Stop [p/n/s]: • Người dùng nhập vào: n • Màn hình hiển thị: Bài tập lớn mơn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 12/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH a b c d e f g h i j k l m n o 15 14 13 X 12 11 10 Previous move/Next move/Stop [p/n/s]: • Người dùng nhập vào: n • Màn hình hiển thị: a b c d e f g h i j k l m n o 15 14 13 X 12 11 10 O Bài tập lớn mơn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 13/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Previous move/Next move/Stop [p/n/s]: • Người dùng nhập vào: s • Chương trình kết thúc Ví dụ 8: Xét lịch sử trận đấu 13n10n12n8e7k9e12m7e6e8n12l12o10k14o12j12k11l9j10l9l9k8k11m13o8j với n = 25 Sau trạng thái bàn cờ trình xem lại: a b c d e f g h i j k l m n o 15 14 O 13 X 12 X O 11 X X X O X 10 X O O O X O O O X Sau người dùng nhập vào p, chương trình in ra: Bài tập lớn mơn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 14/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH a b c d e f g h i j k l m n o 15 14 O 13 X 12 X O 11 X X X O X 10 X O O O X O O X Nếu người dùng nhập vào a, chương trình in ra: Illegal input, please try again: Người dùng tiếp tục nhập vào s, chương trình kết thúc 5.4 Cập nhật hàm displayBoard (bắt buộc) Bởi kích thước hiển thị hàm displayBoard lớn hệ thống chấm sinh viên cách so trùng testcase, sinh viên bắt buộc phải thay tất lời gọi hàm displayBoard sang lời gọi hàm displayBoardSimple trước nộp lên hệ thống Thay in tồn bàn cờ hàm displayBoard, hàm displayBoardSimple mã hóa bàn cờ chuỗi số để tăng tốc độ so trùng giảm kích thước testcase Hàm displayBoardSimple thực sẵn Nộp Sinh viên download file file sau từ trang Web môn học: gomoku.c Mã nguồn khởi tạo [NMLT]Gomoku - Assignment.pdf File mô tả nội dung tập lớn Bài tập lớn môn Nhập môn lập trình - HK năm học 2022 - 2023 Trang 15/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH File gomoku.c mã nguồn khởi tạo Sinh viên phải sử dụng mã nguồn để viết tiếp Khi nộp bài, sinh viên nộp site e-Learning môn học Sinh viên điền code tập lớn giống thực hành khác Nội dung điền vào toàn file gomoku.c sau thực sinh viên Sinh viên cung cấp nơi nộp bài: • Nơi nộp thử: Sinh viên nộp làm chấm testcases để kiểm tra lỗi cú pháp, lỗi logic có làm sinh viên Sinh viên phép nộp vơ số lần • Bài tập lớn - Đi nước cờ: Sinh viên nộp làm chấm 30 testcases để kiểm tra trường hợp liên quan đến Nhiệm vụ Đi nước cờ • Bài tập lớn - Kiểm tra chiến thắng: Sinh viên nộp làm chấm 40 testcases để kiểm tra trường hợp liên quan đến Nhiệm vụ Kiểm tra chiến thắng • Bài tập lớn - Xem lịch sử trận đấu: Sinh viên nộp làm chấm 30 testcases để kiểm tra trường hợp liên quan đến Nhiệm vụ Xem lịch sử trận đấu Trong phần trên, ngoại trừ Nơi nộp thử, sinh viên có tối đa 10 lần làm Đối với lần nộp bài, sinh viên có 10 phút để nộp code kiểm tra Chỉ có lần nhấn "Kiểm tra" tính điểm, lần sau không lấy điểm Kết làm hiển thị sau bạn nhấn nút "Hoàn thành làm" Điểm cao lần làm lấy làm điểm cho phần Điểm tập lớn sinh viên tính theo công thức sau: Điểm BTL = (30 %) Nhiệm vụ Đi nước cờ + (40 %) Nhiệm vụ Kiểm tra chiến thắng + (30 %) Nhiệm vụ Xem lịch sử trận đấu Ví dụ, sinh viên A đạt 10 điểm Nhiệm vụ Đi nước cờ, điểm Nhiệm vụ Kiểm tra chiến thắng, điểm Nhiệm vụ Xem lịch sử trận đấu Vậy: Điểm BTL A = 10 * 0.3 + * 0.4 + * 0.3 = 8.2 Thời hạn nộp công bố nơi nộp site nêu Đến thời hạn nộp bài, đường liên kết tự động khố nên sinh viên khơng thể nộp chậm Để tránh rủi ro xảy vào thời điểm nộp bài, sinh viên PHẢI nộp trước thời hạn quy định Sinh viên phải kiểm tra chương trình MinGW nơi nộp thử trước nộp Bài tập lớn mơn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 16/17 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Xử lý gian lận Bài tập lớn phải sinh viên TỰ LÀM Sinh viên bị coi gian lận nếu: • Có giống bất thường mã nguồn nộp Trong trường hợp này, TẤT CẢ nộp bị coi gian lận Do sinh viên phải bảo vệ mã nguồn tập lớn • Sinh viên khơng hiểu mã nguồn viết, trừ phần mã cung cấp sẵn chương trình khởi tạo Sinh viên tham khảo từ nguồn tài liệu nào, nhiên phải đảm bảo hiểu rõ ý nghĩa tất dịng lệnh mà viết Trong trường hợp khơng hiểu rõ mã nguồn nơi tham khảo, sinh viên đặc biệt cảnh báo KHÔNG ĐƯỢC sử dụng mã nguồn này; thay vào nên sử dụng học để viết chương trình • Nộp nhầm sinh viên khác tài khoản cá nhân Trong trường hợp bị kết luận gian lận, sinh viên bị điểm cho toàn mơn học (khơng tập lớn) KHƠNG CHẤP NHẬN BẤT KỲ GIẢI THÍCH NÀO VÀ KHƠNG CĨ BẤT KỲ NGOẠI LỆ NÀO! Sau tập lớn nộp, có số sinh viên gọi vấn ngẫu nhiên để chứng minh tập lớn vừa nộp làm Thay đổi so với phiên trước ———————HẾT——————— Bài tập lớn môn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 17/17 ... qn cờ thường khơng có nhu cầu bị di chuyển hay loại khỏi bàn cờ, nên cờ Caro chơi giấy bút chì Trong tập lớn này, bạn thực lại trò chơi cờ Caro với số luật chơi cung cấp bên (a) Cờ Caro bàn cờ. .. (struct) Dẫn nhập Cờ Caro (hay gọi cờ chéo, Gomoku, Five in a Row, v.v ) trò chơi chiến lược bàn cờ Theo truyền thống, cờ Caro chơi quân cờ vây (đá đen trắng) bàn cờ vây với kích thước bàn cờ 15 x... luật chơi cung cấp bên (a) Cờ Caro bàn cờ vây (b) Cờ Caro chơi giấy Hình 1: Hình minh họa cho trị chơi cờ Caro Bài tập lớn mơn Nhập mơn lập trình - HK năm học 2022 - 2023 Trang 1/17 TRƯỜNG ĐẠI