2012-07-07 6 views
5

Więc pisałem nożyczki papier rock gry, kiedy przyszedł do napisania tej funkcji:Rock, papier, nożyczki. Określić wygraną/stratę/remis używając matematyki?

a jest odtwarzaczem za ruch, b jest odtwarzacz drugi za pojedynek. Wszystko, czego potrzebuję, to dowiedzieć się, czy gracz wygrał, przegrał lub był związany.

//rock=0, paper=1, scissors=2 
processMove(a, b) { 
    if(a == b) ties++; 
    else { 
      if(a==0 && b==2) wins++; 
     else if(a==0 && b==1) losses++; 
     else if(a==1 && b==2) losses++; 
     else if(a==1 && b==0) wins++; 
     else if(a==2 && b==1) wins++; 
     else if(a==2 && b==0) losses++; 
    } 
} 

Moje pytanie brzmi: Jaki jest najbardziej elegancki sposób napisania tej funkcji?

Edytuj: Szukam pojedynczej linijki.

+1

Szukanie czytelnego kodu jest znacznie lepsze niż szukanie jednokanałowych. –

+1

Spójrz na moją odpowiedź na podobne pytanie: http://stackoverflow.com/a/9553712/1207152 – sch

Odpowiedz

12
if (a == b) ties++; 
else if ((a - b) % 3 == 1) wins++; 
else losses++; 

muszę dokładnie wiedzieć, jakiego języka używasz, aby przekształcić go w ściśle jednolinijkową ...

Dla JavaScript (lub innych języków z obcym Modulus) stosowanie:

if (a == b) ties++; 
else if ((a - b + 3) % 3 == 1) wins++; 
else losses++; 
+0

rock vs nożyczki nie działa: '(0 - 2% 3) = -2'. Używanie 'javascript' –

+3

Wygląda na to, że brakuje pary nawiasów: ((a-b)% 3 == 1). W operatory C modulo jest wyższy w porządku operacji niż odejmowanie. – Tim

7

Matryca 3x3 byłaby "bardziej elegancka", jak przypuszczam.

char result = "TWLLTWWLT".charAt(a * 3 + b); 

(Zmieniano: Zapomniałem, że a i b były już zerowej pochodzenie.)

2

Przypuszczam, że można użyć operatora terniary tak -

if (b==0) a==1? wins++ : loss++; 

if (b==1) a==1? loss++ : wins++; 

if (b==2) a==1? loss++ : wins++; 
2

Można to zrobić za pomocą prostego wzoru matematycznego, aby uzyskać wynik, a następnie porównać z if jak ten:

var moves = { 
    'rock': 0, 
    'paper': 1, 
    'scissors': 2 
}; 
var result = { 
    'wins': 0, 
    'losses': 0, 
    'ties': 0 
}; 
var processMove = function (a, b) { 
    var processResult = (3 + b - a) % 3; 
    if (!processResult) { 
    ++result['ties']; 
    } else if(1 == processResult) { 
    ++result['losses']; 
    } else { 
    ++result['wins']; 
    } 
    return result; 
}; 

jsFiddle Demo


Jedna linia processMove funkcja bez powrotu:

var processMove = function (a, b) { 
    ((3 + b - a) % 3) ? 1 == ((3 + b - a) % 3) ? ++result.losses : ++result.wins : ++result.ties; 
}; 
1

Jak to zrobić w języku Java?

wynik = (komp - x)% 3;

System.out.println (result); 
if (result == 0)// if the game is tie 
{ 
    System.out.println ("A Tie!") ; 
} 

else if (result == 1 || result == 2) 
{ 
    //System.out.println (user + " " + "beats" + " " + computer_choice + " you win"); 
    System.out.println ("comp win"); 
} 

else 
{ 
    System.out.println ("you win"); 
    //System.out.println (computer_choice + " " + "beats" + " " + user + "you lose"); 
} 
Powiązane problemy