Cách tiếp cận tốt nhất để viết một động cơ cờ vua? [đóng cửa]


15

Tôi là một người đam mê cờ vua và là một lập trình viên. Gần đây tôi đã quyết định bắt đầu chế tạo một cỗ máy cờ vua bằng kiến ​​thức lập trình và cờ vua của mình. Vì vậy, đây là câu hỏi của tôi:

Ngôn ngữ nào (tôi quen thuộc với Java, C ++ và Python) và phương pháp luận tôi nên thích nghi trong khi viết một công cụ cờ vua?

Một chút hướng dẫn sẽ được nhiều đánh giá cao.

Biên tập:

Vì vậy, tôi quyết định làm cho nó trong JavaScript. Tôi tải về này Cờ UI từ github và bây giờ tôi đã sẵn sàng! Bước đầu tiên của tôi sẽ là viết các động thái pháp lý cho nó. Vì vậy, bất cứ ai có thể chỉ cho tôi đi đúng hướng? (Tôi mới sử dụng jQuery nhưng có nhiều kinh nghiệm lập trình).

Tái bút: Tôi không cố gắng tạo ra một công cụ rất hiệu quả (tôi biết cách của nó quá khó), tôi chỉ muốn làm quen với quy trình và tìm hiểu một số kỹ thuật mới trên đường đi.


5
Bất kỳ ngôn ngữ và phương pháp chính thống sẽ làm, không có gì đặc biệt về một động cơ cờ vua (về vấn đề đó).
yannis

3
Tôi sẽ cụ thể hơn về các mục tiêu. Nếu bạn chỉ muốn đưa nó vào một loạt các quy tắc vẹt, thì đó là một nhiệm vụ lớn nhưng bất kỳ lập trình viên nào cũng có thể sắp xếp theo cách thức vũ phu đó. Nếu bạn muốn tham gia vào những việc như nhận dạng mẫu hoặc cân nhắc rủi ro so với phần thưởng, đó là nơi câu trả lời có thể trở nên hấp dẫn.
Erik Reppen

Bạn đã kiểm tra phần Sư phạm dưới wiki wiki Engine. Những thứ này dường như được dùng để dạy Lập trình Cờ vua và tất cả đều là Nguồn mở. Ngay cả khi bạn không sử dụng mã nguồn thực tế, tài liệu thường sẽ giải thích những gì đằng sau sự phát triển: en.wikipedia.org/wiki/Chess_engine#C
sortifying

1
Phần thực sự khó là làm thế nào để đánh giá một vị trí nhất định bởi vì bạn cần phải xem liệu vị trí A có tốt hơn vị trí B để lựa chọn hay không.

1
Nó không rõ ràng những gì bạn muốn biết. Bạn đã quyết định đại diện cho một vị trí? Nếu vậy, bước tiếp theo là viết và kiểm tra một trình tạo di chuyển. Không chắc chắn những gì bạn nghĩ jQuery phải làm với điều đó.
kevin cline

Câu trả lời:


19

Người chơi cờ 2072 đánh giá ở đây. Tôi đã tạo trang web này bằng JavaScript thuần vào cuối tuần. Nó không phải là một công cụ cờ vua (tôi đã thiết kế nó để tạo ra các vị trí mở thú vị như một loại động cơ Chess960 đồi trụy), nhưng đó là điểm khởi đầu. Mã nguồn ở đây .

Có rất nhiều biến chứng liên quan đến việc làm một bảng chức năng. Bao gồm các:

  • Đầu tiên, tìm ra cách thể hiện các động thái pháp lý cơ bản. Bạn phải làm toán với tọa độ đầu và cuối. Chẳng hạn, với các bước di chuyển, một trong các tọa độ phải giống nhau trước và sau. Với các bước di chuyển hiệp sĩ, tổng giá trị tuyệt đối của các thay đổi tọa độ phải là 3 và cả hai tọa độ phải thay đổi. Với các di chuyển của giám mục, tổng số tọa độ vẫn giữ nguyên hoặc cả hai đều tăng cùng một lượng. Chân là khó nhất vì bạn không chỉ phải tìm hiểu xem chúng có thể di chuyển hai hình vuông hay một (kiểm tra hàng và màu thay vì lưu trữ bao nhiêu di chuyển chúng đã thực hiện) mà còn phải xử lý toàn bộ việc bắt chéo - di chuyển theo đường chéo điều tiếp theo
  • Chụp là một thách thức vì cầm đồ và kiểm tra. Bạn không thể nói rằng nếu một mảnh di chuyển đến một hình vuông của mảnh khác, thì đó là một hình chụp. Rốt cuộc, những con tốt không thể di chuyển đến một hình vuông khác để chụp - chúng có cách bắt đặc biệt của riêng chúng.
  • Bạn phải tìm ra một cách hiệu quả để xem liệu quân địch có theo cách di chuyển của quân cờ để quyết định xem nó có hợp pháp hay không.
  • Kiểm tra là thách thức để đối phó với. Sau mỗi lần di chuyển, bạn phải kiểm tra tất cả các ô vuông mà quân địch có thể đi đến và xem liệu một trong số chúng có liên quan đến vua của bạn hay không, và nếu vậy, đó là một động thái bất hợp pháp.
  • Castling, en passant, thăng hạng, bế tắc, bị ép buộc, lặp đi lặp lại - không ai trong số này là tầm thường để xử lý theo quy mô của vấn đề.

Tất cả các công cụ cờ vua hoạt động bằng cách xem xét tất cả (có thể là một tập hợp con được xác định theo phương pháp heuristic) của các bước di chuyển hợp pháp ở một vị trí và đánh giá các số để biểu thị các giá trị tương đối của chúng bằng cách thực hiện các bước di chuyển đó và thực hiện tương tự cho các vị trí kết quả. Vấn đề sinh đôi của bạn ở đây là

  • Cách lưu trữ dữ liệu này hiệu quả
  • Cách tiến hành tìm kiếm đệ quy này - sau tất cả, bạn không thể để nó diễn ra mãi mãi, vì vậy bạn phải đặt giới hạn và sau đó tìm ra cách thiết kế thuật toán của mình để thực hiện tìm kiếm tối ưu và kỹ lưỡng nhất trong giới hạn đó. Ví dụ, bạn muốn đảm bảo rằng ít nhất nó đưa ra một số đánh giá cho mỗi lần bắt đầu có thể, nhưng bạn cũng có thể muốn nó dành nhiều thời gian hơn để đánh giá các bước đi hứa hẹn hơn thay vì đưa ra một lượng thời gian bằng nhau cho mỗi lần di chuyển.

Đây là tất cả trên đầu thiết kế thuật toán ở nơi đầu tiên, có rất nhiều thông tin có sẵn trên.

Về ngôn ngữ đi cùng (mặc dù tôi đoán bạn đã quyết định sử dụng JavaScript), tôi nghĩ nó phụ thuộc nhiều vào mục tiêu của bạn hơn bất kỳ thứ gì khác. Tôi muốn làm cho tôi trực tuyến (và trở nên tốt hơn về JavaScript), vì vậy JavaScript là lựa chọn của tôi. Bất kỳ ngôn ngữ lập trình hướng đối tượng sẽ làm mặc dù.

Khi bạn cảm thấy thoải mái với những gì bạn đang làm, các tài nguyên sau có thể sẽ chứng minh thực sự hữu ích:

Chúc may mắn!


Cảm ơn rất nhiều, nó chắc chắn đã giúp tôi rất nhiều để bắt đầu. Mặc dù vẫn còn rất nhiều điều để tìm hiểu và thực hiện, động cơ cờ vua không bao giờ dễ viết. Nhưng tôi nghĩ thật tốt khi làm việc với thứ bạn yêu thích!
Adnan Zahid

Tôi đồng ý. Tôi muốn có một bản lý lịch thực sự đa dạng về các dự án, nhưng thật lòng tôi chỉ thích phát triển những thứ cờ vua hơn.
Andrew Latham

Tên miền lathamcity.com hiện đang được bán. Mã hiện có sẵn trên một trang web khác không?
IkWeetHetOokNiet

14

Vấn đề với "chương trình cờ vua" là một khái niệm là có nhiều quân cờ có thể hấp thụ rất nhiều thời gian và không nhất thiết phải khiến bạn quan tâm vào lúc này. Bạn có thể dành nhiều năm chỉ để làm việc trên đồ họa, hoặc tìm kiếm alpha-beta hoặc trực quan hóa để giúp phát triển cho công cụ tìm kiếm, hoặc ... tốt, có rất nhiều phần.

Tôi khuyên bạn nên tìm một chương trình cờ vua nguồn mở (phải có nhiều) và tập trung vào việc cải thiện các phần của nó mà bạn quan tâm nhất. Cuối cùng, bạn có thể thay thế toàn bộ chương trình, một chức năng tại một thời điểm hoặc bạn có thể học đủ và có động lực để vứt bỏ nó và thiết kế chương trình của riêng bạn từ đầu. Trong mọi trường hợp, chìa khóa là bắt đầu "ánh sáng" và tìm hiểu các sợi dây trước khi cố gắng kiến ​​trúc sư toàn bộ chương trình.


Bằng cách tuân thủ một trong các giao thức giao diện đã thiết lập, bạn có thể sử dụng bất kỳ giao diện hiện có nào với công cụ của mình.

Tôi hy vọng alpha beta không mất nhiều năm để viết
Kevin

1
Không phải năm để viết, mà là năm để
mò mẫm

9

Nếu bạn đã quen thuộc với các quy tắc của cờ vua, một điểm khởi đầu tốt về các kỹ thuật cơ bản là http://www.frayn.net/beowulf/theory.html Một bộ sưu tập lớn các Tài liệu và liên kết bạn có thể tìm thấy ở đây: http: // Chessprogramming .wikispaces.com / Và thứ ba: Học từ mã người khác. Hãy xem các nguồn của Crafty . Đây là công cụ nguồn mở hàng đầu. Rất quan trọng để suy nghĩ về các trường hợp Thử nghiệm, để xem liệu bạn có cải thiện hay không: Bắt đầu với một số vị trí cuối trò chơi đơn giản dễ dàng với 3 hoặc 4 hình.


3

Như đã đề cập, không có gì khó khăn khủng khiếp khi xây dựng một động cơ cờ vua. Có lẽ, bạn nên tập trung vào cách sử dụng và (có khả năng) triển khai ứng dụng này vì điều này có thể sẽ quyết định lựa chọn ngôn ngữ của bạn.

Nếu đây chỉ là một bài tập thú vị, bạn có thể muốn viết mã bằng Javascript và triển khai nó dưới dạng trang web. Nếu bạn không bao giờ muốn biến nó thành một trò chơi cờ vua chuyên nghiệp, ít nhất những người khác sẽ có thể chơi với nó và mã nguồn của nó.

Nếu bạn muốn học một công nghệ cụ thể cùng một lúc, hãy nói WPF, thì đây có thể là một cách tốt để giết hai con chim bằng một viên đá. MVVM có thể là quá mức cần thiết cho ứng dụng này, nhưng ít nhất bạn sẽ học nó.

Nếu bạn muốn nhắm mục tiêu các thiết bị Android, thì Java sẽ là một lựa chọn tốt. Tương tự, Objective-C cho các thiết bị iOS.

Dài và ngắn, sự lựa chọn ngôn ngữ không tồn tại trong chân không.


3

Tôi giả sử bạn đã biết về khái niệm Min-Max, cây và cắt tỉa, heuristic và những điều cơ bản khác và những gì tôi viết ở đây chỉ là một số chi tiết có thể bị đánh giá thấp.

Tôi với công ty một người bạn đã viết động cơ cờ vua của chúng ta đôi khi trước đây. Tôi chia sẻ một số vấn đề và ý tưởng chúng tôi đã có và tôi hy vọng bạn thấy chúng hữu ích.

Vì cả hai chúng tôi đều là lập trình viên java, ngôn ngữ của chúng tôi đã biến chúng tôi thành java và chúng tôi bắt đầu với cách tiếp cận hướng đối tượng. Các mảnh là các đối tượng, bảng là đối tượng, các tập tin và cấp bậc (hàng và cột trong tài liệu cờ vua) là các đối tượng. Và điều này đã sai. Chi phí rất lớn và chương trình đang vật lộn để đi xa hơn 2 lần di chuyển (4 ply) trong cây tìm kiếm.

Vì vậy, với một số tìm kiếm, chúng tôi đã kết thúc với một ý tưởng tuyệt vời (không phải của chúng tôi!): Đại diện cho các mảnh và bảng dưới dạng số nguyên dài (64 bit). Điều này có ý nghĩa bởi vì một bàn cờ có 64 ô vuông. Phần còn lại là các thao tác bit khôn ngoan (chạy rất gần với cpu = cực kỳ nhanh). Ví dụ, hãy xem xét một số nguyên 64 bit nhị phân trong đó các số nguyên đang trình bày các ô vuông trên bảng mà mảnh của bạn có thể tấn công. Bây giờ nếu bạn thực hiện một "VÀ" logic giữa hai số như thế này, kết quả khác không nói rằng bạn có một hình vuông với những kẻ tấn công. Có một số cách để trình bày bàn cờ và quân cờ, Vì vậy:

1 - Quyết định về bài thuyết trình của bạn

Sau đó, bạn cần và mở cơ sở dữ liệu. Cờ mở bằng cách nào đó đã được giải quyết, kiến ​​rất nên có và mở sách. Trong trường hợp này, bạn có nhiều thời gian thêm trong các trò chơi blitz.

2 - Tìm cho mình một cuốn sách mở đầu.

Chúng tôi đã làm những điều này, nhưng chúng tôi vẫn còn lâu mới tốt:

3 - Một động cơ cờ tốt sẽ có thể nhìn thấy 6 nước (12 ply) phía trước.

Vì vậy, những gì chúng tôi đã làm sau đó, là sử dụng thời gian chết (nếu đó là một con người so với động cơ máy tính).

4 - Sử dụng thời gian khi đối thủ đang suy nghĩ để tạo ra một số cấp độ của cây của bạn.

Và chúng tôi vẫn còn cách xa 12 đồng đội. Bằng cách nghiên cứu nhiều hơn, chúng tôi khám phá một số thủ thuật! Ví dụ, nó được đề xuất bỏ qua một lớp cây và bắt đầu từ lớp tiếp theo (như không có đối thủ). Ý tưởng là nếu một động thái cực kỳ ngu ngốc, vậy thì tại sao phải lãng phí thời gian và xem đối thủ phản ứng với động thái đó là gì. Tuy nhiên, một động cơ tốt sẽ có thể phân biệt giữa di chuyển ngu ngốc và hy sinh nữ hoàng thiên tài.

5 - Tìm hiểu các thủ thuật lập trình cho vấn đề cụ thể này (cờ vua).

Tôi và bạn tôi, trong tình trạng này, vẫn còn tệ: / Những gì chúng tôi có thể làm - và chúng tôi đã làm một phần - là để lưu các vị trí được tính toán. Nếu bạn tính toán một vị trí, sau đó lưu nó cho tương lai! Điều tương tự cũng xảy ra với các vòng lặp trong cây tìm kiếm. Vấn đề là lưu / truy xuất hiệu quả:

6 - Lưu dữ liệu bạn tạo ... Hiệu quả!

và cuối cùng:

7 - Mã với tối ưu hóa tối đa.

Vấn đề này cực kỳ tốn kém cả về thời gian và bộ nhớ CPU. Điều rất quan trọng để viết mã của bạn rất hiệu quả. Hãy nhớ rằng chúng ta đang nói về yếu tố nhánh 35. Điều này có nghĩa là "nếu" ở đâu đó trong heuristic của bạn, có thể biến thành 3.3792205e+18"nếu" ở đâu đó sâu trong cây tìm kiếm của bạn.

Lập trình cờ vua là một thử thách rất thú vị và đó là lúc bạn có thể đưa khả năng lập trình của mình vào một bài kiểm tra nghiêm túc. Có một vài điểm nữa mà tôi có thể đề xuất nhưng tôi chắc chắn bạn sẽ tự mình khám phá chúng. Còn nhiều điểm nữa mà tôi không biết nhưng bạn có thể tìm thấy chúng trên internet!

Chúc may mắn và vui vẻ!

ps Tôi không biết rõ về javascript nhưng có điều gì đó cho tôi biết dựa trên độ khó của vấn đề, có thể, xem xét tất cả những gì C ++ có thể cung cấp, sẽ tốt hơn nếu bỏ javascript và làm điều đó trong C ++.


2

Theo chỉnh sửa của bạn, bạn đang ở giai đoạn xác định các động thái 'hợp pháp'.

Có hai cách mô tả di chuyển trong cờ vua. Ký hiệu mô tả và ký hiệu đại số . Những gì bạn có thể muốn là một chức năng lấy mảnh, vị trí bắt đầu và vị trí kết thúc làm tham số. ví dụ. Hiệp sĩ từ QN1 đến QB2 không hợp lệ, nhưng Hiệp sĩ từ QN1 đến Q2 là hợp lệ. Suy nghĩ về nó, ký hiệu đại số có thể đơn giản hơn do khả năng dễ dàng tính toán định vị 'tương đối'.

Để đảm bảo bạn đang viết số tiền tối thiểu của mã yêu cầu, tôi muốn bắt đầu với cách viết tests cho hàm đầu tiên . Nếu bạn đang sử dụng ký hiệu Đại số, có lẽ bạn không cần kiểm tra cho mỗi phần / bắt đầu / kết thúc. Để mỗi bài kiểm tra hoạt động và tái cấu trúc lại bản sao trước khi chuyển sang 'di chuyển' tiếp theo. Mã của bạn sẽ kết thúc sạch hơn.

Khi bạn đã bao gồm đầy đủ các động thái hợp pháp và bất hợp pháp cho từng mảnh, tôi sẽ bắt đầu thêm kiểm tra cho các biến khác (chẳng hạn như di chuyển một vị vua vào điều kiện 'kiểm tra' và 'giao phối').

Tôi khuyên bạn nên dùng qunit cho các bài kiểm tra đơn vị và hoa nhài cho các bài kiểm tra hành vi trong JavaScript.


1

Tôi thực sự đã viết một động cơ cờ vua. Chuẩn bị cho mình một điều trị và một cơn ác mộng. Khi bạn bè của tôi và tôi làm điều đó, đó là trong một cuộc thi lập trình đúng thời gian và ngôn ngữ mà chúng tôi quyết định sử dụng là Java. Tôi cảm thấy Java hoặc C là lựa chọn tốt nhất của bạn, nhưng tôi thấy rằng bạn đã quyết định sử dụng Javascript. Tôi thực sự không thể gõ nó vì tôi không quen với nó.

Vấn đề chính ở đây sẽ là có rất nhiều kịch bản di chuyển / giành chiến thắng với mỗi phần bạn cần tính đến, vì vậy tôi khuyên bạn nên viết ra tất cả các tình huống có thể xảy ra cho mỗi phần trước khi bạn thực sự bắt đầu viết mã. Chỉ cần nhảy vào mà không có kế hoạch sẽ biến dự án thú vị này thành một việc vặt lặp đi lặp lại. Nhưng đó thực sự là điều chính. Trước tiên, chỉ cần lập kế hoạch bên ngoài mã và đảm bảo bạn nhận được mọi kịch bản cho một phần tại một thời điểm.

Chúc may mắn


1

Đối với phần quyết định của người chơi máy tính trong trò chơi, tôi không thể giới thiệu đủ cuốn sách "Trí tuệ nhân tạo: Cách tiếp cận hiện đại" (trang web sách http: //aima.cs.ber siêu.edu / ). Tùy thuộc vào nền tảng của bạn về toán học (lý thuyết biểu đồ giúp) nó có thể hơi cao, nhưng nó được viết đơn giản như những thứ học thuật này có thể và nó chứa một tổng quan rất cập nhật (và một số chiều sâu) của các kỹ thuật để làm cho các chương trình quyết định mọi thứ.

Nó sẽ chỉ ra những điều cho bạn như nêu rõ mục tiêu (ví dụ: checkmate hoặc null), đánh giá mức độ gần gũi của một trạng thái cụ thể (bố cục bảng) với mục tiêu đó, cách tạo các trạng thái sau có thể khác nhau bắt đầu từ trạng thái hiện tại và làm thế nào để vượt qua một không gian vấn đề rộng lớn.

Một điều có thể giúp thiết kế thuật toán AI là tìm ra cách quyết định nên chơi trò tiếp theo nào như thể bạn có toàn bộ thời gian trên thế giới, bắt đầu từ một tình huống rất gần với một trò chơi chiến thắng. Bạn tối ưu hóa nó để nó tìm ra giải pháp trong một khoảng thời gian (giờ) hợp lý, sau đó tìm cách chọn con đường chiến thắng mặc dù bạn chưa khám phá tất cả các kết quả, để bạn thực sự có thể làm gián đoạn "suy nghĩ" một lượt đáng giá của thời gian.

Chỉ sau đó tôi mới xem xét tối ưu hóa biểu diễn để làm cho các phép tính riêng lẻ nhanh hơn, chẳng hạn như sử dụng các số nguyên dài như được đề xuất. Cho dù bạn có thể so sánh nhanh đến mức nào, nếu cách bạn vượt qua không gian vấn đề không có khả năng phỏng đoán tốt, sẽ mất nhiều thời gian để làm điều đó.


0

Bạn có thể đi bất kỳ cách nào bạn muốn, nhưng đây là những suy nghĩ của tôi về chủ đề này:

Tôi sẽ sử dụng Java vì điều đó cho phép bạn ở cấp độ rất cao và có các thư viện giao diện người dùng (AWT, Swing) theo ý của bạn. Bạn có thể sử dụng một cách tiếp cận hướng đối tượng để mô hình hóa bàn cờ và quân cờ. Các đối tượng khác có thể đứng trong lịch sử di chuyển và ghi bàn. Ngay cả những người chơi cũng có thể là đối tượng, và trong tương lai bạn có thể mở rộng Playerlớp của mình để cung cấp một trình phát máy tính thông minh nhân tạo.

Bạn có thể muốn xem bộ điều khiển mô hình-khung nhìn (MVC) vì đây là một cách tiếp cận rất hay trong trường hợp này để buộc các đối tượng mô hình (mô hình miền) của bạn vào giao diện người dùng (chế độ xem) và cho phép người dùng thao tác mô hình (thông qua bộ điều khiển).

Bạn cũng có thể muốn áp dụng phát triển dựa trên thử nghiệm , điều này không chỉ đảm bảo rằng tất cả các phương thức hoạt động theo cách bạn mong đợi, mà còn buộc bạn phải viết mã mô-đun có thể kiểm tra được.


4
Một cỗ máy cờ vua không liên quan gì đến UI, chỉ có "tâm trí", tính toán nước đi tốt nhất.
CSE

@CSE - Nó phụ thuộc vào định nghĩa của bạn về động cơ .
Daniel AA Pelsmaeker

@CSE - Như Adnan của biên tập chương trình, ông đã thực sự cũng đang tìm kiếm một giao diện người dùng. Vì vậy, câu trả lời của tôi là có liên quan.
Daniel AA Pelsmaeker

-8

Các quy tắc của cờ vua khá đơn giản. Bạn chỉ cần có thể tạo ma trận (mảng 2 chiều) cho bảng và tìm cách mã hóa các khái niệm của các mảnh, quy tắc di chuyển cho từng mảnh, xác thực rằng di chuyển là hợp pháp và điều kiện báo hiệu kết thúc trò chơi Không có gì đặc biệt khó khăn về bất kỳ điều đó. Bạn nên sử dụng bất kỳ ngôn ngữ nào bạn quen thuộc nhất.

Bây giờ nếu bạn muốn tạo ra một AI chơi cờ sẽ đóng vai trò là một trong những người chơi, đó là nơi mọi thứ trở nên khó khăn. Nhưng một lần nữa, lựa chọn ngôn ngữ không phải là vấn đề lớn nhất ở đây; hiểu các nguyên tắc AI liên quan là. Đó sẽ là một yếu tố quan trọng hơn nhiều.

(Đã nói rằng, kiểu ra quyết định này có thể cực kỳ tính toán và có lẽ bạn sẽ muốn sử dụng thứ gì đó biên dịch thành mã gốc thay vì ngôn ngữ kịch bản. Và C ++ là một lựa chọn rất tệ, không phải vì nó không tốt - được sử dụng cho vấn đề này nhưng đơn giản vì nói chung đó là một ngôn ngữ rất tệ và cố gắng thực hiện những thứ phức tạp trong đó là một cách tốt để mã hóa tất cả các loại đau đầu cho chính bạn.)


15
Tôi nghĩ rằng bạn phải cụ thể hơn một chút về lý do tại sao C ++ không phù hợp với nhiệm vụ đặc biệt này để tránh thánh chiến.
Erik Reppen

9
-1 cho nỗ lực bắt đầu một cuộc chiến thần thánh.
Doc Brown

1
Tại sao bạn nghĩ rằng C ++ là một ngôn ngữ rất xấu nói chung?
Anthony

Tôi nghĩ rằng bạn chắc chắn đã nhận sai anh ta. Tôi cho một người chia sẻ ý kiến ​​của mình, C ++ là một ngôn ngữ tốt để bắt đầu nhưng nó trở thành một nỗi đau khi bạn đối phó với những thứ phức tạp!
Adnan Zahid
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.