Java -де рок, қағаз, қайшы ойынын қалай жасауға болады (суреттермен)

Мазмұны:

Java -де рок, қағаз, қайшы ойынын қалай жасауға болады (суреттермен)
Java -де рок, қағаз, қайшы ойынын қалай жасауға болады (суреттермен)

Бейне: Java -де рок, қағаз, қайшы ойынын қалай жасауға болады (суреттермен)

Бейне: Java -де рок, қағаз, қайшы ойынын қалай жасауға болады (суреттермен)
Бейне: Finding Inspiration For Vintage Shoot From John Cowan 2024, Сәуір
Anonim

Рок, қағаз, қайшы - бұл екі адам ойнайтын қол ойыны. Екі адам да «тас, қағаз, қайшы» деп айтады, сосын қолмен созылған үш заттың бірін (тас, қағаз немесе қайшы) құрайды. Жеңімпазды қолмен құрастыру арқылы анықтайды. Қайшы қағазды, қағаз рокты, ал тас қайшыны ұрады. Егер екі ойыншы да бір қолмен ойнайтын болса, бұл тең есеп болып саналады. Біз Java -де рок, қағаз, қайшыны имитациялау үшін қарапайым ойын жазамыз, онда бір ойыншы - пайдаланушы, ал екіншісі - компьютер.

Қадамдар

1585279 1 1
1585279 1 1

Қадам 1. Негізгі сыныпты құрыңыз және оны шақырыңыз

RockPaperScissors

.

Бұл біз ойын жазатын сынып болады. Сіз оны басқа нәрсеге атауды таңдай аласыз

Ойын

немесе

Негізгі

. Конструктор мен негізгі әдіс үшін әдіс декларациясын жазыңыз.

қоғамдық класс RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}

1585279 2 1
1585279 2 1

Қадам 2. Қол қимылдарына (тас, қағаз немесе қайшы) арналған санақ жасаңыз

Біз рокты, қағазды немесе қайшыны бейнелеу үшін жолдарды қолдана алар едік, бірақ санау бізге тұрақтыларды алдын ала анықтауға мүмкіндік береді, яғни санауды қолдану - жақсы дизайн. Біз enum түрін атаймыз

Жылжыту

құндылықтармен

РОК

ҚАҒАЗ

және

ҚАЙШЫ

жеке нөмірді жылжыту {ROCK, PAPER, SCISSORS}

1585279 3 1
1585279 3 1

Қадам 3. Екі жеке сынып жасаңыз

Қолданушы

және

Компьютер

.

Бұл сабақтар біздің ойыншыларды ойында көрсетеді. Сіз бұл сабақтарды көпшілікке жариялауды таңдай аласыз. The

Қолданушы

класс пайдаланушыны тасқа, қағазға немесе қайшыға шақыратын сынып болады, сондықтан бізге жазу керек

getMove ()

әдіс. The

Компьютер

сыныпта а болуы керек

getMove ()

Компьютер қозғалысты жасай алатын әдіс. Біз осы әдістерге толтырушыларды енгіземіз және оларды кейінірек енгіземіз. The

Қолданушы

class орнататын конструктор қажет болады

Сканер

пайдаланушы енгізетін объект. Біз қоямыз

Сканер

пайдаланушы үшін жеке өріс ретінде, содан кейін оны конструкторда бастаңыз. Біз қолданатындықтан

Сканер

class, бізге кодтың жоғарғы жағында импорт туралы мәлімдеме жазу керек. The

Компьютер

класс конструкторды қажет етпейді, сондықтан бізге оны жазудың қажеті жоқ; біз іске қосқан кезде

Компьютер

объект болса, біз әдепкі конструкторды шақырамыз. Міне біздің

RockPaperScissors

сынып қазір сияқты:

java.util. Scanner импорттау; қоғамдық класс RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} private class User {private Scanner inputScanner; public User () {inputScanner = new Scanner (System.in); } public Move getMove () {// TODO: Бұл әдісті енгізу null; }} жеке сынып компьютері {public Move getMove () {// TODO: Бұл әдісті енгізу null қайтару; }} жалпыға ортақ RockPaperScissors () {} жалпыға ортақ статикалық бос (String args) {}}

1585279 4 1
1585279 4 1

4 -қадам

getMove ()

үшін әдіс

Компьютер

сынып

Бұл әдіс кездейсоқтықты қайтарады

Жылжыту

. Біз массив ала аламыз

Жылжыту

нөмірлеріне қоңырау шалу арқылы

құндылықтар()

әдіс:

Move.values ()

. Кездейсоқ таңдау үшін

Жылжыту

осы мәндер массивінде санау, біз 0 мен мәндер жиымының ұзындығы арасындағы бүтін сан болатын кездейсоқ индексті құруымыз керек. Ол үшін біз

nextInt ()

әдісі

Кездейсоқ

біз импорттауымыз керек сынып

java.util

. Кездейсоқ индексті алғаннан кейін біз оны қайтара аламыз

Жылжыту

бұл индексті біздің мәндер массивінен.

public Move getMove () {Move move = Move.values (); Кездейсоқ кездейсоқ = жаңа кездейсоқ (); int index = random.nextInt (moves.length); қайтару қозғалыстары [индекс]; }

1585279 5 1
1585279 5 1

5 -қадам

getMove ()

үшін әдіс

Қолданушы

сынып

Бұл әдіс a қайтарады

Жылжыту

пайдаланушы енгізген мәліметтерге сәйкес келеді. Біз пайдаланушыдан «рок», «қағаз» немесе «қайшы» жазуды күтеміз. Біріншіден, біз пайдаланушыны енгізуді сұрауымыз керек:

System.out.print («Тас, қағаз немесе қайшы?»)

. Содан кейін пайдаланыңыз

nextLine ()

әдісі

Сканер

пайдаланушы жолын жол ретінде алу объектісі. Бізге қазір қолданушының дұрыс қадам жасағанын тексеру қажет, бірақ егер қолданушы сөзді қате жазса, біз жұмсақ бола аламыз. Біз тек пайдаланушы енгізудің бірінші әрпінің «R» (рок үшін), «P» (қағаз үшін) немесе «S» (қайшы үшін) екенін тексереміз, және біз бұл жағдайға мән бермейміз, себебі біз алдымен қолданамыз

toUpperCase ()

әдісі

Жол

пайдаланушы енгізу жолын барлық бас әріппен жасау үшін класс. Егер пайдаланушы қашықтан дұрыс енгізуді енгізбеген болса, біз пайдаланушыны қайта шақырамыз. Содан кейін, пайдаланушы енгізген нәрсеге байланысты, біз сәйкес қозғалысты қайтарамыз.

public Move getMove () {// System.out.print пайдаланушысын шақыру («Тас, қағаз немесе қайшы?»); // String userInput = inputScanner.nextLine () пайдаланушы кірісін алу; userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Пайдаланушы жарамды енгізу қосқышын енгізді (firstLetter) {case 'R': Move. ROCK қайтару; жағдай 'P': Move. PAPER қайтару; case 'S': Move. SCISSORS қайтару; }} // Пайдаланушы жарамды кіріс енгізген жоқ. Қайта шақыру. getMove () қайтару; }

1585279 6
1585279 6

Қадам 6. a жазыңыз

қайта ойнау()

үшін әдіс

Қолданушы

сынып

Пайдаланушы ойынды қайта -қайта ойнауға қабілетті болуы керек. Пайдаланушының қайтадан ойнағысы келетінін анықтау үшін бізге a жазу керек

қайта ойнау()

пайдаланушы қайтадан ойнауға шешім қабылдады ма, жоқ па ойынға логикалық мәнді қайтаратын әдіс. Бұл әдісте біз

Сканер

біз бұрын конструкторда қолданушыдан «иә» немесе «жоқ» алуды бастадық. Біз пайдаланушының қайта ойнағысы келетінін анықтау үшін тек бірінші әріптің «Y» екенін тексереміз. Кез келген басқа кіріс пайдаланушының қайта ойнағысы келмейтінін білдіреді.

public boolean playAgain () {System.out.print («Қайта ойнағыңыз келе ме?»); UserInput жолы = inputScanner.nextLine (); userInput = userInput.toUpperCase (); userInput.charAt (0) == 'Y' қайтару; }

1585279 7
1585279 7

7 -қадам

Қолданушы

және

Компьютер

ішіндегі сыныптар

RockPaperScissors

сынып

Енді біз жазуды аяқтадық

Қолданушы

және

Компьютер

сабақтарда біз өзіміздің нақты ойынымызға жұмыс жасай аламыз. Үшін жеке өрістер жасаңыз

Қолданушы

және

Компьютер

ішіндегі сыныптар

RockPaperScissors

сынып Біз кіру үшін осы өрістерге кіруіміз керек

getMove ()

ойын ойнау кезіндегі әдістер. Үшін конструкторда

RockPaperScissors

сынып, осы өрістерді бастаңыз. Сонымен қатар, біз ұпай санын қадағалауымыз керек

userScore

және

computerScore

өрістерде біз конструкторда 0 деп бастауымыз керек. Біз ойындардың санын қадағалап отыруымыз керек, ол 0 деп басталатын өріс болады.

жеке қолданушы; жеке компьютерлік компьютер; жеке int userScore; жеке int computerScore; жеке int numberOfGames; қоғамдық RockPaperScissors () {user = new User (); компьютер = жаңа компьютер (); userScore = 0; computerScore = 0; numberOfGames = 0; }

1585279 8
1585279 8

8 -қадам

Жылжыту

enum әр жағдайда қай қадам жеңетінін айтатын әдісті қосады.

Біз а жазуымыз керек

салыстыруMoves ()

егер қозғалыстар бірдей болса, 0 қайтаратын әдіс, егер ағымдағы қозғалыс екінші қозғалысты ұрса, 1, ал егер ағымдағы қозғалыс басқа қозғалыста ұтылса --1 қайтарады. Бұл ойында жеңімпазды анықтау үшін пайдалы болады. Бұл әдісті енгізу үшін, егер қозғалыстар бірдей болса, біз 0 -ді қайтарамыз, сондықтан бізде теңдік бар. Содан кейін 1 немесе -1 қайтару үшін коммутатор туралы мәлімдеме жазыңыз.

жеке тізім Move {ROCK, PAPER, Scissor; /** * Бұл қимылды теңдікті, жеңісті немесе * ұтылысты анықтаудың басқа қадамымен салыстырады. * * @param otherMove * салыстыру үшін * @return 1 -ге көшіңіз, егер бұл қозғалыс басқа қозғалысты жеңсе, -1, егер бұл қозғалыс * басқа қозғалыстан ұтылса, -1, егер бұл қозғалыстар тең болса * / public int comparMoves (Move otherMove) { / / Егер байланыстырыңыз (this == otherMove) 0 қайтарса; switch (this) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); қайшы қайшы: қайтару (otherMove == PAPER? 1: -1); } // Мұнда ешқашан жетпеу керек 0; }}

1585279 9
1585279 9

Қадам 9. a жасаңыз

startGame ()

ішіндегі әдіс

RockPaperScissors

сынып

Бұл әдіс ойын түрінде болады. Қарапайым сөзден бастаңыз

System.out.println

әдісінде.

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

1585279 10
1585279 10

Қадам 10. Пайдаланушы мен компьютерден қадамдар алыңыз

Ішінде

startGame ()

әдісін қолданыңыз

getMove ()

әдістері

Қолданушы

сынып және

Компьютер

пайдаланушы мен компьютердің қозғалысын алу үшін класс.

UserMove = user.getMove () жылжытыңыз; Жылжыту computerMove = computer.getMove (); System.out.println («\ nСен» + userMove + «ойнадың.»); System.out.println («Компьютер ойнады» + computerMove + «. / N»);

1585279 11
1585279 11

Қадам 11. Екі қозғалысты салыстырыңыз және пайдаланушы ұтты ма, әлде компьютер жеңді ме, соны анықтаңыз

Пайдаланыңыз

салыстыруMoves ()

-дан алынған әдіс

Жылжыту

enum - бұл пайдаланушының ұтқанын немесе ұтпағанын анықтау үшін. Егер пайдаланушы ұтса, пайдаланушы ұпайын 1 -ге арттырыңыз. Егер қолданушы ұтылса, компьютердегі ұпай санын 1 -ге арттырыңыз. Егер тең нәтиже болса, онда ұпайлардың ешқайсысын көбейтпеңіз. Содан кейін бір ойнаған ойындар санын көбейтіңіз.

int solishкеніMoves = userMove.compareMoves (computerMove); switch (салыстыруMoves) {жағдай 0: // System.out.println байланыстыру («Байла!»); үзіліс; 1 -жағдай: // User System.out.println жеңеді (userMove + «ұрады» + computerMove + «. Сіз жеңдіңіз!»); userScore ++; үзіліс; case -1: // Компьютер System.out.println жеңеді (computerMove + «ұрады» + userMove + «. Сіз ұтылдыңыз.»); computerScore ++; үзіліс; } numberOfGames ++;

1585279 12
1585279 12

Қадам 12. Пайдаланушы қайтадан ойнағысы келетінін сұраңыз

Егер пайдаланушы қайтадан ойнағысы келсе, қоңырау шалыңыз

startGame ()

қайтадан Әйтпесе, қоңырау шалыңыз

printGameStats ()

ол ойын статистикасын басып шығарады. Біз бұл әдісті келесі қадамда жазамыз.

if (user.playAgain ()) {System.out.println (); startGame (); } басқа {printGameStats (); }

1585279 13
1585279 13

13 -қадам

printGameStats ()

әдіс.

Бұл әдіс ойынның статистикасын көрсетеді: жеңістер саны, ұтылыстар саны, байланыстар саны, ойнаған ойындар саны және пайдаланушы ұтқан ойындар пайызы. Жеңілген ойындардың пайызы (# жеңіс + (# байланыстар/2))/(# ойындар) арқылы есептеледі. Бұл әдіс қолданылады

System.out.printf

пішімделген мәтінді басып шығару үшін.

private void printGameStats () {int wins = userScore; int loss = computerScore; int tie = numberOfGames - userScore - computerScore; қос пайыздық Won = (жеңеді + ((қос) байланыстар) / 2) / numberOfGames; // Сызық System.out.print («+»); printDashes (68); System.out.println («+»); // Басып шығару атаулары System.out.printf («| %6s | %6s | %6s | %12s | %14s | / n», «ЖЕҢІМДЕР», «ЖОҒАЛТУЛАР», «БАЙЛАНЫСТАР», «ОЙНАЛҒАН ОЙЫНДАР», «ПАЙЫЗДЫҚ)» Жеңді »); // Line 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 («|»); // Басып шығару мәндері System.out.printf («| %6d | %6d | %6d | %12d | %13.2f %% | / n», жеңістер, шығындар, байланыстар, numberOfGames, пайыздық Жеңіс * 100); // Сызық System.out.print («+»); printDashes (68); System.out.println («+»); }

1585279 14
1585279 14

Қадам 14. Ойынды негізгі сыныптан бастаңыз

Негізгі класта. Экземплярын инициализациялаңыз

RockPaperScissors

сыныпқа қоңырау шалыңыз

startGame ()

әдіс.

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

1585279 15
1585279 15

15 -қадам. Өз ойын тексеріңіз

Енді біз «Тас, қағаз, қайшы» ойынын жазудың барлық күш -жігерін бастан өткергендіктен, бәрін жинап, тексеретін уақыт келді!

Бағдарлама үлгісі

java.util. Random импорттау; java.util. Scanner импорттау; қоғамдық класс RockPaperScissors {жеке пайдаланушы; жеке компьютер; жеке int userScore; жеке int computerScore; жеке int numberOfGames; жеке тізім Move {ROCK, PAPER, Scissor; /** * Бұл қимылды теңдікті, жеңісті немесе * ұтылысты анықтаудың басқа қадамымен салыстырады. * * @param otherMove * салыстыру үшін * @return 1 -ге көшіңіз, егер бұл қозғалыс басқа қозғалысты жеңсе, -1, егер бұл қозғалыс * басқа қозғалыстан ұтылса, -1, егер бұл қозғалыстар тең болса * / public int comparMoves (Move otherMove) { / / Bie if (this == otherMove) 0 қайтарса; switch (this) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); қайшы қайшы: қайтару (otherMove == PAPER? 1: -1); } // Бұл жерге ешқашан жетпеу керек 0; }} жеке класс User {private Scanner inputScanner; public User () {inputScanner = new Scanner (System.in); } public Move getMove () {// System.out.print пайдаланушысын шақыру («Тас, қағаз немесе қайшы?»); // String userInput = inputScanner.nextLine () пайдаланушы кірісін алу; userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Пайдаланушы жарамды енгізу қосқышын енгізді (firstLetter) {case 'R': Move. ROCK қайтару; жағдай 'P': Move. PAPER қайтару; case 'S': Move. SCISSORS қайтару; }} // Пайдаланушы жарамды кіріс енгізген жоқ. Қайта шақыру. getMove () қайтару; } public boolean playAgain () {System.out.print («Қайта ойнағыңыз келе ме?»); UserInput жолы = inputScanner.nextLine (); userInput = userInput.toUpperCase (); userInput.charAt (0) == 'Y' қайтару; }} жеке сынып компьютері {public Move getMove () {Move move = Move.values (); Кездейсоқ кездейсоқ = жаңа кездейсоқ (); int index = random.nextInt (moves.length); қайтару қозғалыстары [индекс]; }} жалпыға ортақ RockPaperScissors () {user = new User (); компьютер = жаңа компьютер (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println («ROCK, PAPER, SCISSORS!»); // Қозғалыстарды алу Move userMove = user.getMove (); Жылжыту computerMove = computer.getMove (); System.out.println («\ nСен» + userMove + «ойнадың.»); System.out.println («Компьютер ойнады» + computerMove + «. / N»); // Қозғалыстарды салыстырыңыз және жеңімпазды анықтаңыз int comparMoves = userMove.compareMoves (computerMove); switch (салыстыруMoves) {жағдай 0: // System.out.println байланыстыру («Байла!»); үзіліс; 1 -жағдай: // User System.out.println жеңеді (userMove + «ұрады» + computerMove + «. Сіз жеңдіңіз!»); userScore ++; үзіліс; case -1: // Компьютер System.out.println жеңеді (computerMove + «ұрады» + userMove + «. Сіз ұтылдыңыз.»); computerScore ++; үзіліс; } numberOfGames ++; // Пайдаланушыдан қайта ойнауды сұраңыз, егер (user.playAgain ()) {System.out.println (); startGame (); } басқа {printGameStats (); }} /*** Ойынның статистикасын басып шығарады. Байланыстарды 1/2 жеңіспен * пайыздық жеңіс ретінде есептейді. */ private void printGameStats () {int wins = userScore; int loss = computerScore; int tie = numberOfGames - userScore - computerScore; қос процентWon = (жеңеді + ((қос) байланыстар) / 2) / numberOfGames; // Сызық System.out.print («+»); printDashes (68); System.out.println («+»); // Басып шығару атаулары System.out.printf («| %6s | %6s | %6s | %12s | %14s | / n», «ЖЕҢІМДЕР», «ЖОҒАЛТУЛАР», «БАЙЛАНЫСТАР», «ОЙНАЛҒАН ОЙЫНДАР», «ПАЙЫЗДЫҚ)» Жеңді »); // Line 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 («|»); // Басып шығару мәндері System.out.printf («| %6d | %6d | %6d | %12d | %13.2f %% | / n», жеңістер, шығындар, байланыстар, numberOfGames, пайыздық Жеңіс * 100); // Сызық 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 (); }}

Ұсынылған: