2010-05-08 25 views
23

Vì vậy, tôi đang viết một trò chơi Rock, Paper, Scissors đơn giản trong C (nó là một nhiệm vụ bằng cách này, mặc dù điều chính là tìm hiểu ổ cắm. Tôi nghi ngờ nó sẽ là do trước khi tôi nhận được một câu trả lời tốt). Tôi có nó thiết lập như Rock = 0, Paper = 1, và kéo = 2. Có một lớp lót dễ dàng để xác định ai thắng? Tôi đã cố gắng chơi với nó trên giấy, nhưng tôi không thể tìm ra bất kỳ mẫu nào.Một lớp lót để xác định ai thắng trong Rock, Paper, Scissors

+1

Nếu câu hỏi này không liên quan đến phần ổ cắm của nhiệm vụ, nó có thể dễ dàng được chuyển đổi thành một '[code-golf]'. – Pops

+5

6 phút để có câu trả lời hay, khi nào nhiệm vụ của bạn đến hạn? –

+0

Cũng giống như một lưu ý, tôi thường sẽ gán các giá trị đó (đá, giấy, kéo, chất nổ) cho các chuỗi hoặc ký tự. Nói chung, thực hành không tốt là làm cho chúng trở thành một con số bởi vì một cách hợp lý bạn sẽ không bao giờ muốn thêm chúng. Điều này không quan trọng đối với vấn đề chuyển nhượng nhưng tốt để có được trong thói quen vì vậy khi bạn có vấn đề lớn hơn họ không đá ass của bạn. – sixtyfootersdude

Trả lời

77
winner = (3 + player1 - player2) % 3; 

Điều này sẽ cho 1 nếu người chơi 1 thắng, 2 nếu người chơi 2 thắng, 0 để hòa.

Giải thích: Theo trình tự Rock=0, Paper=1, Scissors=2, mỗi mục sẽ đánh bại mục trước đó. Điều này đúng ngay cả khi chúng ta xử lý chuỗi như gói (tức là, mục cuối cùng trước tiên).

Để đặt này trong thuật ngữ toán học hơn, cho bất kỳ mục X:

  • X bị đánh bại bởi (X+1) % 3.
  • X đánh bại (X+2) % 3.

Từ đó, nó có thể được hiển thị mà (3+X-Y) % 3 là 1 nếu X đánh bại Y, hoặc 2 nếu Y đánh bại X.

Thêm 3 là cần thiết để buộc kết quả là không âm: Các mô đun của một số âm sẽ là số âm hoặc bằng không trong C99 và phụ thuộc vào thực hiện trong C89.

+12

Điều này thật tuyệt vời, nhưng một lớp lót như vậy cần ít nhất 3 dòng tài liệu. –

+2

+1 Đặt tôi vào một căn phòng với hai con khỉ và ba nhà văn loại cho tất cả cõi đời đời và chúng tôi sẽ không bao giờ nghĩ ra điều đó !!! –

+0

Tôi nghĩ rằng c có kiểu cấu trúc này: '(3 + player1 - player2)% 3 == 1? winner = "player1": (3 + player1 - player2)% 3 == 2? winner = "player2": winner = "mọi người"; ' – sixtyfootersdude

Các vấn đề liên quan