Рок, қағаз, қайшы - бұл екі адам ойнайтын қол ойыны. Екі адам да «тас, қағаз, қайшы» деп айтады, сосын қолмен созылған үш заттың бірін (тас, қағаз немесе қайшы) құрайды. Жеңімпазды қолмен құрастыру арқылы анықтайды. Қайшы қағазды, қағаз рокты, ал тас қайшыны ұрады. Егер екі ойыншы да бір қолмен ойнайтын болса, бұл тең есеп болып саналады. Біз Java -де рок, қағаз, қайшыны имитациялау үшін қарапайым ойын жазамыз, онда бір ойыншы - пайдаланушы, ал екіншісі - компьютер.
Қадамдар
Қадам 1. Негізгі сыныпты құрыңыз және оны шақырыңыз
RockPaperScissors
.
Бұл біз ойын жазатын сынып болады. Сіз оны басқа нәрсеге атауды таңдай аласыз
Ойын
немесе
Негізгі
. Конструктор мен негізгі әдіс үшін әдіс декларациясын жазыңыз.
қоғамдық класс RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Қадам 2. Қол қимылдарына (тас, қағаз немесе қайшы) арналған санақ жасаңыз
Біз рокты, қағазды немесе қайшыны бейнелеу үшін жолдарды қолдана алар едік, бірақ санау бізге тұрақтыларды алдын ала анықтауға мүмкіндік береді, яғни санауды қолдану - жақсы дизайн. Біз enum түрін атаймыз
Жылжыту
құндылықтармен
РОК
ҚАҒАЗ
және
ҚАЙШЫ
жеке нөмірді жылжыту {ROCK, PAPER, SCISSORS}
Қадам 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) {}}
4 -қадам
getMove ()
үшін әдіс
Компьютер
сынып
Бұл әдіс кездейсоқтықты қайтарады
Жылжыту
. Біз массив ала аламыз
Жылжыту
нөмірлеріне қоңырау шалу арқылы
құндылықтар()
әдіс:
Move.values ()
. Кездейсоқ таңдау үшін
Жылжыту
осы мәндер массивінде санау, біз 0 мен мәндер жиымының ұзындығы арасындағы бүтін сан болатын кездейсоқ индексті құруымыз керек. Ол үшін біз
nextInt ()
әдісі
Кездейсоқ
біз импорттауымыз керек сынып
java.util
. Кездейсоқ индексті алғаннан кейін біз оны қайтара аламыз
Жылжыту
бұл индексті біздің мәндер массивінен.
public Move getMove () {Move move = Move.values (); Кездейсоқ кездейсоқ = жаңа кездейсоқ (); int index = random.nextInt (moves.length); қайтару қозғалыстары [индекс]; }
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 () қайтару; }
Қадам 6. a жазыңыз
қайта ойнау()
үшін әдіс
Қолданушы
сынып
Пайдаланушы ойынды қайта -қайта ойнауға қабілетті болуы керек. Пайдаланушының қайтадан ойнағысы келетінін анықтау үшін бізге a жазу керек
қайта ойнау()
пайдаланушы қайтадан ойнауға шешім қабылдады ма, жоқ па ойынға логикалық мәнді қайтаратын әдіс. Бұл әдісте біз
Сканер
біз бұрын конструкторда қолданушыдан «иә» немесе «жоқ» алуды бастадық. Біз пайдаланушының қайта ойнағысы келетінін анықтау үшін тек бірінші әріптің «Y» екенін тексереміз. Кез келген басқа кіріс пайдаланушының қайта ойнағысы келмейтінін білдіреді.
public boolean playAgain () {System.out.print («Қайта ойнағыңыз келе ме?»); UserInput жолы = inputScanner.nextLine (); userInput = userInput.toUpperCase (); userInput.charAt (0) == 'Y' қайтару; }
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; }
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; }}
Қадам 9. a жасаңыз
startGame ()
ішіндегі әдіс
RockPaperScissors
сынып
Бұл әдіс ойын түрінде болады. Қарапайым сөзден бастаңыз
System.out.println
әдісінде.
public void startGame () {System.out.println («ROCK, PAPER, SCISSORS!»); }
Қадам 10. Пайдаланушы мен компьютерден қадамдар алыңыз
Ішінде
startGame ()
әдісін қолданыңыз
getMove ()
әдістері
Қолданушы
сынып және
Компьютер
пайдаланушы мен компьютердің қозғалысын алу үшін класс.
UserMove = user.getMove () жылжытыңыз; Жылжыту computerMove = computer.getMove (); System.out.println («\ nСен» + userMove + «ойнадың.»); System.out.println («Компьютер ойнады» + computerMove + «. / N»);
Қадам 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 ++;
Қадам 12. Пайдаланушы қайтадан ойнағысы келетінін сұраңыз
Егер пайдаланушы қайтадан ойнағысы келсе, қоңырау шалыңыз
startGame ()
қайтадан Әйтпесе, қоңырау шалыңыз
printGameStats ()
ол ойын статистикасын басып шығарады. Біз бұл әдісті келесі қадамда жазамыз.
if (user.playAgain ()) {System.out.println (); startGame (); } басқа {printGameStats (); }
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 («+»); }
Қадам 14. Ойынды негізгі сыныптан бастаңыз
Негізгі класта. Экземплярын инициализациялаңыз
RockPaperScissors
сыныпқа қоңырау шалыңыз
startGame ()
әдіс.
public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }
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 (); }}