Trò chơi golf Hangman


14

Lấy cảm hứng từ reddit .

Viết một chương trình chơi Hangman .

  • Chương trình chọn một từ ngẫu nhiên từ danh sách N từ, trong đó N> 2.
  • Danh sách từ có thể được cung cấp cho chương trình theo bất kỳ cách nào bạn chọn.
  • Ở mỗi lần lặp

    • In ra trạng thái của trò chơi bằng cách sử dụng dấu gạch dưới cho các chữ cái chưa được phát hiện:

    H _ N _ _ _ N

    • In số lần thử còn lại

    10

    • Đọc một lá thư từ stdin và cập nhật trạng thái của trò chơi, trừ đi một nỗ lực nếu họ đoán một chữ cái không chính xác.

    A (đầu vào)

    H A N _ _ A N

    10

    • Lặp lại cho đến khi tất cả các chữ cái được đoán hoặc cố gắng đạt 0
  • Sử dụng bất kỳ ngôn ngữ
  • Số lượng nhân vật ít nhất chiến thắng.
  • Vẽ giá treo cổ là không cần thiết, nhưng sẽ giúp bạn kiếm được nhiều tiền và danh tiếng.

Tôi có thể để mỗi từ trong danh sách có cùng số ký tự không?
Peter Olson

Các chữ cái trong đầu ra phải được phân tách bằng khoảng trắng?
Lowjacker

@Peter Of The Corn: bạn nên cho rằng danh sách từ này là tùy ý
drspod

@Lowjacker: không gian cải thiện mức độ dễ đọc của dấu gạch dưới liên tiếp, nếu không, thật khó để đếm được bao nhiêu chữ cái mà chúng đại diện.
drspod

Câu trả lời:


6

Hồng ngọc 1.9, 134 132 120 117 108 107

Danh sách từ được cung cấp trong ARGV. Các từ và các chữ cái đã nhập phải khớp trong trường hợp.

r=w=$*.sample
t=10
loop{puts [*w.tr(r,?_).chars]*' ',t
t>0&&r>''?w[l=STDIN.gets[0]]?r=r.tr(l,''):t-=1:exit}

8

Chết tiệt, tôi nghĩ rằng nó nói "số dòng chiến thắng ít nhất." Tôi sẽ không chiến thắng bất kỳ cuộc thi nhân vật nào ở đây, nhưng chương trình Lisp chung này chỉ có một dòng.

(let ((words (list "that" "help" "rent" "chair" "octopus" "monitor" "manual" "speakers" "onomatopoeia" "regardless" "irresponsible" "cornerstone"))) (let ((word (nth (random (length words)) words))) (format t "~a~%" (funcall (defun play (word current remaining-attempts) (progn (if (not (find #\_ current)) (return-from play "You win!")) (if (equalp remaining-attempts 0) (return-from play "You lose!")) (format t "~a~%~d~%" current remaining-attempts) (let ((guess (char (read-line) 0)) (index 0) (found nil)) (loop for letter across word do (if (equalp guess letter) (progn (setf (char current index) letter) (setf found t))) (setf   index (+ index 1))) (if found (play word current remaining-attempts) (play word current (- remaining-attempts 1)))))) word (map 'string #'(lambda (c) #\_) word) 10))))

1
Tôi ủng hộ bạn vì tôi khá chắc chắn rằng bạn đang cố tình hài hước :-)
Bác sĩ Pain

8

Trăn 3.

from random,sys import *
w=choice(*argv)
L=set(w)
a=10
while L and a:
 print(" ".join("_"if x in L else x for x in w),a)
 try:L-=set(input()[0])
 except:a-=1

Tôi thích cái này hơn: dài hơn nhưng đẹp hơn.

import random
w=random.choice(list(open("/usr/dict/words")))[:-1]
L=set(w)
a=10
while L and a:
 print(" ".join("_"if x in L else x for x in w),a)
 try:L.remove(input()[0])
 except:a-=1
print w

Nếu tôi cũng không phải in a, tôi có thể sử dụng *hai lần:print(*("_"if x in L else x for x in w))
badp

4

c ++ (tiêu đề)

struct h{h(char a):b(a){}char operator()(char c,char d){return d!='_'?d:c==b?c:'_';}char b;};

int main(int a,char**b){
srand(time(0));string c=*(b+rand()%(a-1)+1),d(c.size(),'_'),e;
char f=10,g;
while(f){
cout<<"> ";cin>>g;e=d;
transform(c.begin(),c.end(),d.begin(),d.begin(),h(g));if(e==d)--f;
cout<<d<<endl<<(int)f<<endl;if(d==c)break;
}return 0;}

mèo / usr / dict / words | xargs treo


Lời nhắc ">" cho đầu vào là không cần thiết cho giải pháp, tôi chỉ thêm nó vào câu hỏi để chỉ ra rằng đó là đầu vào, vì nhiều ngôn ngữ cung cấp lời nhắc như thế này.
drspod

@drspod Bạn nên chỉnh sửa câu hỏi để phản ánh điều đó.
Lowjacker

chỉnh sửa để làm rõ
drspod

2

Con trăn

import random

DEFAULT_ATTEMPTS = 10

def print_word(word, uncovered):
    for c in word:
        if c not in uncovered:
            c = '_'
        print c,
    print ''

def get_letter():
    letter = None
    while letter is None:
        letter = raw_input('> ')
        if len(letter) != 1:
            print 'Letters must be 1 character.  Try again.'
            letter = None
    return letter

if __name__ == '__main__':
    import sys

    if len(sys.argv) != 2: sys.exit(1)
    with open(sys.argv[1], 'r') as f:
        words = [word.strip() for word in f.readlines() if word.strip()]

    word = random.choice(words)
    uncovered = set([' '])
    attempts = DEFAULT_ATTEMPTS

    while attempts > 0 and any(letter not in uncovered for letter in word):
        print_word(word, uncovered)
        print attempts

        letter = get_letter()
        if letter in uncovered:
            print 'You have already tried that letter.'
        elif letter in word:
            print 'You got it!'
        else:
            print 'Wrong!'
            attempts -= 1

        uncovered.add(letter)

    if attempts == 0:
        print 'You lose!',
    else:
        print 'You win!'
    print 'The phrase was "%s".' % word

Tôi đã không thực sự cố gắng cho các nhân vật ít nhất, chỉ muốn làm cho nó nhỏ nhất có thể mà không phải hy sinh bất cứ điều gì.


@user: Bạn có thể quan tâm đến tập lệnh người dùng tuyệt vời của George Edison cho trang web này đặt mã của bạn (như được sao chép ở đây bởi badp) ở mức 1225 ký tự.
dmckee --- ex-moderator mèo con

Tôi nghĩ đó là lý do tôi đã sử dụng các tab và chúng đã được chuyển đổi thành không gian ở đây. wc nói đó là 1034 với các tab.
Serge G

@user: Vâng. Một khó khăn nổi tiếng với đệ trình trăn.
dmckee --- ex-moderator mèo con

2

Perl, 112 char. Tôi cảm thấy mình có thể làm tốt hơn - có lẽ tôi sẽ thử lại sau

$_=$ARGV[rand@ARGV];$a=10;while($a&&/[a-z]/){print map/[A-Z]/?$_:'_',split'';$x=<STDIN>;chop$x;s/$x/$x/ig||$a--}

Các từ được đưa ra trên dòng lệnh, các chữ cái gõ chữ hoa


Xuống tới 107 $_=$ARGV[rand@ARGV];$a=10;while($a&&/[a-z]/){$y=$_;$y=~y/a-z/_/;print$y;$x=<STDIN>;chop$x;s/$x/$x/ig||$a--}

3
Bạn chỉ có thể chỉnh sửa câu trả lời ban đầu của bạn.
Lowjacker

1
Điều này không hiển thị số lần thử còn lại.
Lowjacker

2

Clojure

Đây là 400 byte được nén, vẫn còn khá nhiều, có lẽ là do cách Clojure xử lý trạng thái có thể thay đổi.

(def m ["will" "work" "for" "food"])
(def w (nth m (rand-int (count m))))
(def *s* (atom (replicate (count w) "_")))
(def *a* (atom 10))

(defn g [s a]
  (str (apply str (interpose " " s)) "\n" a))

(loop [n (read-line)]
  (if (some (set n) w)
    (swap! *s* (fn [s]
                 (map 
                   (fn [i]
                     (if (= n (str (nth w i)))
                       n
                       (nth s i)))
                   (range 0 (count s)))))
    (swap! *a* dec))

  (println (g (deref *s*) (deref *a*))) 

  (if (and (< 0 (deref *a*)) (some #{"_"} (deref *s*)))
    (recur (read-line))))

2

C # 370

using System;namespace h{class P{static void Main(string[]a){int c=10,d,l;char y=' ';string w=a[new Random().Next(a.Length)];l=w.Length;char[]x=new char[l];for(d=-1;++d<l;x[d]='-');while(c>0){for(d=-1;++d<l;x[d]=(y==w[d]||x[d]!='-')?w[d]:x[d]);Console.WriteLine(new string(x)+" "+c);if(w==new string(x))return;y=Console.ReadKey(true).KeyChar;if(!w.Contains(y+""))c--;}}}

danh sách từ làm đối số


1

VB.NET


Tôi chưa thử thu nhỏ nó, nhưng:
Thu nhỏ thứ nhất:
Thu nhỏ thứ hai (3759 ký tự):

Module Hangman
    Sub Main()
        Dim m As Int32, w = "banana|apple|pear|dog|cat|orange|monkey|programming|hangman".Split("|")(New Random().Next(9)), g = "", e = "", x, c As Char, f As Boolean, r = Sub(z) Console.Write(z), p = Sub(y, h) Console.SetCursorPosition(y, h), a = Sub() Console.Clear(), q = Function() Console.ReadKey(1), d = Sub()
                                                                                                                                                                                                                                                                                                                          r("       +--------+S       |        |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S                |S   ---------------------".Replace("S", vbCrLf))
                                                                                                                                                                                                                                                                                                                          p(0, 2)
                                                                                                                                                                                                                                                                                                                          r(String.Join(vbCrLf, "    /------\S    | O   O|S    \  ... /S     ------ S        |   S        |   S        |   S        |   S -------+-------S        |   S        |   S        |   S       / \  S      /   \  S     /     \  S    /       \  ".Split("S").Take(m * 4)))
                                                                                                                                                                                                                                                                                                                      End Sub
        Console.CursorVisible = 0
        Do
            a()
            d()
            p(30, 10)
            f = 0
            For Each x In w
                If g.Contains(x) Then
                    r(x)
                Else
                    r(" ")
                    f = 1
                End If
                Console.CursorTop += 1
                Console.CursorLeft -= 1
                r("_")
                Console.CursorTop -= 1
                r(" ")
            Next
            If Not f Then
                a()
                d()
                p(30, 10)
                r("You win! Press any key to close.")
                q()
                End
            End If
            p(30, 13)
            r(e)
            Do
                c = q().KeyChar
            Loop Until Char.IsLetter(c)
            If g.Contains(c) Then
                e = "You have already guessed that letter."
            Else
                g &= c
                If w.Contains(c) Then
                    e = "There is a" & If("aehilmnorsx".Contains(c), "n", "") & " """ & c & """ in the word."
                Else
                    e = "There is no """ & c & """ in the word. Try again."
                    m += 1
                End If
            End If
        Loop Until m = 4
        a()
        d()
        p(30, 10)
        r("You lose! Press any key to close.")
        q()
    End Sub
End Module

Là tất cả các vết lõm thực sự cần thiết?
Lowjacker

nó làm cho nó dễ đọc hơn phải không?
Nate Koppenhaver

Như trong khối? Không, không bắt buộc, nhưng tôi không coi đó là nhân vật.
Ry-

0

Powershell, 125 byte

$w=$h=$args|random|% t*y
for($n=10){$w-replace"[ $h]",'_'-join' ';$n
if(!$h+!$n){break}$n-=($c=Read-Host)-notin$h
$h=$h-ne$c}

Kịch bản kiểm tra ít chơi gôn hơn:

$f = {

$word=$hidden=$args|random|% toCharArray    # let $word and $hidden are a random word chars
#$word                                      # uncomment this to cheating
for($n=10){                                 # forever for with init section
    $word-replace"[ $hidden]",'_'-join' '   # display the word with hidden letters
    $n                                      # display $n
    if(!$hidden+!$n){break}                 # break loop if hidden array is empty or n equal to 0
    $n-=($c=Read-Host)-notin$hidden         # input $c from user, decrease $n if $c does not in $hidden array
    $hidden=$hidden-ne$c                    # recreate $hidden array with removed $c
}

}

$words = gc .\wordlist.txt
&$f $words

Ví dụ đầu ra khi trình phát đoán bị mất :

_ _ _ _ _ _ _ _
10
i
_ _ _ _ _ _ _ _
9
e
_ _ e _ _ _ _ e
9
o
o _ e _ _ o _ e
9
a
o _ e _ _ o _ e
8
q
o _ e _ _ o _ e
7
q
o _ e _ _ o _ e
6
q
o _ e _ _ o _ e
5
q
o _ e _ _ o _ e
4
q
o _ e _ _ o _ e
3
q
o _ e _ _ o _ e
2
q
o _ e _ _ o _ e
1
q
o _ e _ _ o _ e
0

Ví dụ đầu ra khi trình phát đoán thắng :

_ _ _ _ _ _ _ _ _ _
10
e
_ _ _ _ e _ _ _ _ _
10
o
_ o _ _ e _ _ _ _ _
10
i
_ o _ _ e _ _ i _ _
10
a
_ o _ _ e _ _ i a _
10
l
_ o _ _ e _ _ i a l
10
c
c o _ _ e _ c i a l
10
m
c o m m e _ c i a l
10
t
c o m m e _ c i a l
9
r
c o m m e r c i a l
9
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.