Como fazer um jogo de pedra, papel e tesoura em Java (com imagens)

Índice:

Como fazer um jogo de pedra, papel e tesoura em Java (com imagens)
Como fazer um jogo de pedra, papel e tesoura em Java (com imagens)

Vídeo: Como fazer um jogo de pedra, papel e tesoura em Java (com imagens)

Vídeo: Como fazer um jogo de pedra, papel e tesoura em Java (com imagens)
Vídeo: Como melhorar o realismo das Texturas no Sketchup com o Texture Positioning 2024, Maio
Anonim

Rock, Paper, Scissors é um jogo de mão jogado por duas pessoas. Ambas as pessoas diriam "pedra, papel, tesoura" e então simultaneamente formariam um de três objetos (pedra, papel ou tesoura) com a mão estendida. O vencedor é determinado pelas formações de mãos. A tesoura vence o papel, o papel vence a pedra e a pedra vence a tesoura. Se ambos os jogadores jogarem a mesma formação de mão, é considerado empate. Vamos escrever um jogo simples em Java para simular Pedra, Papel, Tesoura onde um jogador é o usuário e o outro é o computador.

Passos

1585279 1 1
1585279 1 1

Etapa 1. Crie a classe principal e chame-a

Pedra Papel Tesoura

.

Esta será a aula onde escreveremos o jogo. Você pode escolher outro nome, como

Jogo

ou

Principal

. Escreva declarações de método para o construtor e o método principal.

public class RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}

1585279 2 1
1585279 2 1

Etapa 2. Crie uma enumeração para os gestos das mãos (pedra, papel ou tesoura)

Poderíamos usar strings para representar pedra, papel ou tesoura, mas uma enumeração nos permite predefinir nossas constantes, o que significa que usar a enumeração é um design melhor. Chamaremos nosso tipo de enum

Mover

com os valores

PEDRA

PAPEL

e

TESOURA

enum privado Move {ROCK, PAPER, SCISSORS}

1585279 3 1
1585279 3 1

Etapa 3. Crie duas aulas particulares

Do utilizador

e

Computador

.

Essas classes representarão nossos jogadores no jogo. Você pode optar por tornar essas aulas públicas. o

Do utilizador

classe será a classe que solicita ao usuário uma pedra, papel ou tesoura, portanto, precisaremos escrever um

getMove ()

método. o

Computador

a classe também precisará ter um

getMove ()

método para que o computador também possa fazer um movimento. Colocaremos marcadores de posição nesses métodos e os implementaremos posteriormente. o

Do utilizador

classe exigirá um construtor que configure o

Scanner

objeto para receber a entrada do usuário. Vamos colocar o

Scanner

como um campo privado para o usuário e, em seguida, inicie-o no construtor. Uma vez que estamos usando o

Scanner

precisamos escrever uma instrução de importação para ela no topo do nosso código. o

Computador

classe não requer um construtor, portanto, não precisamos escrever um; quando iniciamos o

Computador

objeto, estaremos apenas chamando o construtor padrão. Aqui está o nosso

Pedra Papel Tesoura

a classe parece agora:

import java.util. Scanner; public class RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} private class User {private Scanner inputScanner; public User () {inputScanner = new Scanner (System.in); } public Move getMove () {// TODO: Implementa este método return null; }} private class Computer {public Move getMove () {// TODO: Implementar este método return null; }} public RockPaperScissors () {} public static void main (String args) {}}

1585279 4 1
1585279 4 1

Etapa 4. Escreva o

getMove ()

método para o

Computador

classe.

Este método retornará um aleatório

Mover

. Podemos obter uma variedade de

Mover

enumerações chamando o

valores ()

método:

Move.values ()

. Para escolher um aleatório

Mover

enumeração nesta matriz de valores, precisamos gerar um índice aleatório que seja um número inteiro entre 0 e o comprimento de nossa matriz de valores. Para fazer isso, podemos usar o

nextInt ()

método do

Aleatória

classe da qual precisamos importar

java.util

. Depois de obter o índice aleatório, podemos retornar o

Mover

desse índice de nossa matriz de valores.

public Move getMove () {Move moves = Move.values (); Aleatório aleatório = novo Aleatório (); índice interno = random.nextInt (moves.length); movimentos de retorno [índice]; }

1585279 5 1
1585279 5 1

Etapa 5. Escreva o

getMove ()

método para o

Do utilizador

classe.

Este método retornará um

Mover

correspondente ao que o usuário inseriu. Esperamos que o usuário escreva "pedra", "papel" ou "tesoura". Primeiro, precisamos solicitar ao usuário uma entrada:

System.out.print ("Pedra, papel ou tesoura?")

. Então use o

nextLine ()

método do

Scanner

objeto para obter a entrada do usuário como uma string. Precisamos agora verificar se o usuário enviou um movimento válido, mas podemos ser tolerantes se o usuário digitou uma palavra incorretamente. Portanto, verificaremos apenas se a primeira letra da entrada do usuário é "R" (para pedra), "P" (para papel) ou "S" (para tesoura), e não nos importamos com o caso porque vamos primeiro usar o

toUpperCase ()

método do

Fragmento

classe para tornar a string de entrada do usuário toda em maiúsculas. Se o usuário não tiver inserido uma entrada correta remotamente, solicitaremos novamente ao usuário. Então, dependendo do que o usuário inseriu, retornaremos um movimento correspondente.

public Move getMove () {// Solicita ao usuário System.out.print ("Pedra, papel ou tesoura?"); // Obtenha a entrada do usuário String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// O usuário inseriu uma chave de entrada válida (firstLetter) {case 'R': return Move. ROCK; case 'P': retorna Move. PAPER; case 'S': retorna Move. SCISSORS; }} // O usuário não inseriu uma entrada válida. Solicite novamente. return getMove (); }

1585279 6
1585279 6

Etapa 6. Escreva um

jogar de novo()

método para o

Do utilizador

classe.

O usuário deve ser capaz de jogar o jogo indefinidamente. A fim de determinar se o usuário deseja jogar novamente, precisamos escrever um

jogar de novo()

método que retorna um booleano informando ao jogo se o usuário decidiu jogar novamente ou não. Neste método, estamos usando o

Scanner

que iniciamos anteriormente no construtor para obter um "Sim" ou um "Não" do usuário. Verificaremos apenas se a primeira letra é 'Y' para determinar se o usuário deseja jogar novamente. Qualquer outra entrada significará que o usuário não deseja jogar novamente.

public boolean playAgain () {System.out.print ("Deseja jogar novamente?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }

1585279 7
1585279 7

Etapa 7. Conecte o

Do utilizador

e

Computador

aulas juntas no

Pedra Papel Tesoura

classe.

Agora que terminamos de escrever o

Do utilizador

e

Computador

classes, podemos nos concentrar em trabalhar em nosso jogo real. Crie campos privados para o

Do utilizador

e

Computador

aulas no

Pedra Papel Tesoura

classe. Precisaremos acessar esses campos para acessar o

getMove ()

métodos quando estamos jogando o jogo. No construtor para o

Pedra Papel Tesoura

classe, inicie esses campos. Também precisaremos acompanhar a pontuação em

userScore

e

computerScore

campos, que precisamos iniciar como 0 no construtor. Precisamos controlar o número de jogos também, que também será um campo iniciado como 0.

usuário usuário privado; computador privado; private int userScore; private int computerScore; private int numberOfGames; public RockPaperScissors () {user = new User (); computador = novo computador (); userScore = 0; computerScore = 0; numberOfGames = 0; }

1585279 8
1585279 8

Etapa 8. Estenda o

Mover

enum para incluir um método que nos diz qual movimento vence em cada caso.

Precisamos escrever um

compareMoves ()

método que retorna 0 se os lances forem iguais, 1 se o lance atual vencer o outro lance e -1 se o lance atual perder para o outro lance. Isso será útil para determinar o vencedor no jogo. Para implementar esse método, primeiro retornaremos 0 se os movimentos forem os mesmos e, portanto, tivermos um empate. Em seguida, escreva uma instrução switch para retornar 1 ou -1.

enum privado Move {ROCK, PAPER, SCISSORS; / ** * Compara este movimento com outro para determinar um empate, uma vitória ou * uma derrota. * * @param otherMove * move para comparar com * @return 1 se este movimento bater o outro movimento, -1 se este movimento perder para * o outro movimento, 0 se estes movimentos empatarem * / public int compareMoves (Move otherMove) {/ / Empate if (this == otherMove) return 0; switch (this) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); case SCISSORS: return (otherMove == PAPER? 1: -1); } // Nunca deve chegar aqui return 0; }}

1585279 9
1585279 9

Etapa 9. Crie um

Começar o jogo()

método no

Pedra Papel Tesoura

classe.

Este método será o jogo. Comece colocando um simples

System.out.println

no método.

public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); }

1585279 10
1585279 10

Etapa 10. Obter movimentos do usuário e do computador

No

Começar o jogo()

método, use o

getMove ()

métodos do

Do utilizador

classe e o

Computador

classe para obter os movimentos do usuário e do computador.

Mover userMove = user.getMove (); Mover computerMove = computer.getMove (); System.out.println ("\ nVocê jogou" + userMove + "."); System.out.println ("Computador jogado" + computerMove + ". / N");

1585279 11
1585279 11

Etapa 11. Compare as duas jogadas e determine se o usuário venceu ou o computador venceu

Use o

compareMoves ()

método do

Mover

enum para determinar se o usuário venceu ou não. Se o usuário venceu, aumente a pontuação do usuário em 1. Se o usuário perder, aumente a pontuação do computador em 1. Se houver empate, não aumente nenhuma das pontuações. Em seguida, aumente o número de jogos jogados por um.

int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {case 0: // Tie System.out.println ("Tie!"); pausa; caso 1: // O usuário ganha System.out.println (userMove + "bate" + computerMove + ". Você ganhou!"); userScore ++; pausa; case -1: // O computador ganha System.out.println (computerMove + "bate" + userMove + ". Você perdeu."); computerScore ++; pausa; } numberOfGames ++;

1585279 12
1585279 12

Etapa 12. Pergunte se o usuário deseja jogar novamente

Se o usuário quiser jogar novamente, ligue

Começar o jogo()

novamente. Caso contrário, ligue

printGameStats ()

que imprimirá as estatísticas do jogo. Vamos escrever esse método na próxima etapa.

if (user.playAgain ()) {System.out.println (); Começar o jogo(); } else {printGameStats (); }

1585279 13
1585279 13

Etapa 13. Escreva o

printGameStats ()

método.

Este método exibirá as estatísticas do jogo: número de vitórias, número de derrotas, número de empates, número de jogos disputados e porcentagem de jogos vencidos pelo usuário. A porcentagem de jogos ganhos é calculada por (# vitórias + (# empates / 2)) / (# jogos disputados). Este método usa

System.out.printf

para imprimir o texto formatado.

privado void printGameStats () {int wins = userScore; perdas int = computerScore; empates int = numberOfGames - userScore - computerScore; porcentagem duplaWon = (vitórias + (duplas) empates) / 2) / númeroOfGames; // Linha System.out.print ("+"); printDashes (68); System.out.println ("+"); // Imprimir títulos System.out.printf ("|% 6s |% 6s |% 6s |% 12s |% 14s | / n", "GANHA", "PERDAS", "TIES", "JOGOS JOGADOS", "PORCENTAGEM GANHOU"); // Linha System.out.print ("|"); printDashes (10); System.out.print ("+"); printDashes (10); System.out.print ("+"); printDashes (10); System.out.print ("+"); printDashes (16); System.out.print ("+"); printDashes (18); System.out.println ("|"); // Imprimir valores System.out.printf ("|% 6d |% 6d |% 6d |% 12d |% 13.2f %% | / n", vitórias, derrotas, empates, numberOfGames, percentWon * 100); // Linha System.out.print ("+"); printDashes (68); System.out.println ("+"); }

1585279 14
1585279 14

Etapa 14. Inicie o jogo na classe principal

Na classe principal, inicialize uma instância do

Pedra Papel Tesoura

classe e ligue para o

Começar o jogo()

método.

public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }

1585279 15
1585279 15

Etapa 15. Teste seu jogo

Agora que passamos por todos os esforços para escrever o jogo Pedra, Papel e Tesoura, é hora de compilar e testar tudo!

Programa de Amostra

import java.util. Random; import java.util. Scanner; public class RockPaperScissors {usuário usuário privado; computador privado; private int userScore; private int computerScore; private int numberOfGames; enum privado Move {ROCK, PAPER, SCISSORS; / ** * Compara este movimento com outro para determinar um empate, uma vitória ou * uma derrota. * * @param otherMove * move para comparar com * @return 1 se este movimento bater o outro movimento, -1 se este movimento perder para * o outro movimento, 0 se estes movimentos empatarem * / public int compareMoves (Move otherMove) {/ / Empate if (this == otherMove) return 0; switch (this) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); case TESOURAS: return (otherMove == PAPER? 1: -1); } // Nunca deve chegar aqui return 0; }} private class User {private Scanner inputScanner; public User () {inputScanner = new Scanner (System.in); } public Move getMove () {// Solicita ao usuário System.out.print ("Pedra, papel ou tesoura?"); // Obtenha a entrada do usuário String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// O usuário inseriu uma chave de entrada válida (firstLetter) {case 'R': return Move. ROCK; case 'P': retorna Move. PAPER; case 'S': retorna Move. SCISSORS; }} // O usuário não inseriu uma entrada válida. Solicite novamente. return getMove (); } public boolean playAgain () {System.out.print ("Deseja jogar novamente?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }} private class Computador {public Move getMove () {Move moves = Move.values (); Aleatório aleatório = novo Aleatório (); índice interno = random.nextInt (moves.length); movimentos de retorno [índice]; }} public RockPaperScissors () {user = new User (); computador = novo computador (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Obter movimentos Mover userMove = user.getMove (); Mover computerMove = computer.getMove (); System.out.println ("\ nVocê jogou" + userMove + "."); System.out.println ("Computador jogado" + computerMove + ". / N"); // Compare as jogadas e determine o vencedor int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {case 0: // Tie System.out.println ("Tie!"); pausa; caso 1: // O usuário ganha System.out.println (userMove + "bate" + computerMove + ". Você ganhou!"); userScore ++; pausa; case -1: // O computador ganha System.out.println (computerMove + "bate" + userMove + ". Você perdeu."); computerScore ++; pausa; } numberOfGames ++; // Peça ao usuário para jogar novamente if (user.playAgain ()) {System.out.println (); Começar o jogo(); } else {printGameStats (); }} / ** * Imprime as estatísticas do jogo. Calcula o empate como 1/2 de vitória em * porcentagem ganha. * / private void printGameStats () {int wins = userScore; perdas internas = computerScore; empates int = numberOfGames - userScore - computerScore; porcentagem duplaWon = (vitórias + (duplas) empates) / 2) / númeroOfGames; // Linha System.out.print ("+"); printDashes (68); System.out.println ("+"); // Imprimir títulos System.out.printf ("|% 6s |% 6s |% 6s |% 12s |% 14s | / n", "GANHA", "PERDAS", "TIES", "JOGOS JOGADOS", "PORCENTAGEM GANHOU"); // Linha System.out.print ("|"); printDashes (10); System.out.print ("+"); printDashes (10); System.out.print ("+"); printDashes (10); System.out.print ("+"); printDashes (16); System.out.print ("+"); printDashes (18); System.out.println ("|"); // Imprimir valores System.out.printf ("|% 6d |% 6d |% 6d |% 12d |% 13.2f %% | / n", vitórias, derrotas, empates, numberOfGames, percentWon * 100); // Linha System.out.print ("+"); printDashes (68); System.out.println ("+"); } private void printDashes (int numberOfDashes) {for (int i = 0; i <numberOfDashes; i ++) {System.out.print ("-"); }} public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }}

Recomendado: