Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Неполные формы записи оператора цикла






Любую из трех составных частей оператора for можно опустить, только обязательно надо сохранять точки с занятой между ними. Допускается запись

for(; i < 5; i ++)

(перед первым циклом никаких предварительных действий не происходит) или

for(i = 1; i < 5;)

В последнем случае значение переменной i может увеличиваться внутри цикла, в его теле:

for(i = 1; i< 5;) i ++;

Можнозаписатьитак:» for(i = 1;; i ++)

Тогда считается, что значением неуказанного условного выражения всегда будет true, то есть подобный цикл будет выполняться бесконечное число раз, и может быть прерван только оператором break.

Всегда надо очень тщательно проверять условие прекращения цикла. Если оно опущено или всегда равно true, то программа может зациклиться (безостановочно выполнять одно и то же действие). Прервать работу такой программы бывает довольно трудно — не исключено и зависание Windows.

Можно также опускать две или даже все части оператора for. Например, профессиональными программистами нередко применяется такая форма оператора цикла:

for (;;)

{

// действия, среди которых обязательно должен быть оператор break

)

Такой цикл может повторяться бесконечное число раз. Он удобен, когда точно не известно, когда следует остановить работу for, а в теле имеется несколько условных операторов, самостоятельно определяющих момент остановки и необходимость выполнения оператора break.

В Си++ помимо логических операций «& &» и «||», для каждой из которых требуются два операнда, имеется также операция логического отрицания «!» (НЕ), которая записывается всегда слева от единственного операнда, то есть она работает как стандартная функция с единственным параметром, только не требует скобок. В рассматриваемом случае выражение, значением которого будет true, если игра продолжается, запишется так:

! Referee.GameFinish()

При вычислении такого выражения сначала будет получено значение Referee.GameFinish() (если игра продолжается, это будет false), а затем к нему будет применена операция!, и значение false изменится на противоположное значение true.

Операцию «!» корректно применять только к логическим значениям типа bool.

Результатом! true будет false, результатом! false — true.

Чтобы вызвать вспомогательную (не главную — она вызывается автоматически) форму создаваемой программы, надо использовать метод этой формы Show(): Имя формы-> Show(); Например: InputForm-> Show(); Только чтобы переменная InputForm была доступна (иногда говорят — видима) в файле DiceUnit.cpp, в него надо включить заголовочный файл v_Unit.h:

#include " v_Unit.h"

Для того, чтобы нельзя было переключиться на главное окно программы и продолжить с ним работу необходимо вызов второго окна определить как модальное, т.е. диалоговое.

Метод Show() заменяется на ShowModal() (показать как модальное окно):

 

Три «кита» Си++

Изученные в этой и предыдущих проектах операторы присваивания, условный оператор и оператор цикла позволяют запрограммировать решение любой, сколь угодно сложной задачи. Это доказано математически. Используя мощный аппарат классов и богатую палитру визуальных компонентов C++Builder, вы теперь можете написать приложение практически любой направленности. Все будет зависеть лишь от вашей настойчивости и готовности постоянно практиковаться в создании всевозможных программ.

Дело в том, что для решения задачи часто бывает недостаточно только одних операторов, даже самых мощных, и даже не трех, а тридцати трех. Любая более-менее интересная задача — это всегда обработка данных, нередко весьма сложно организованных.

 

Ход работы:

1. Выбор алгоритма поведения компьютерного игрока. При завершении первой части проекта, в итоге получилась рабочая программа, реализующая игру в КОСТИ. Но, если вы попробуете поиграть со своей программой, то вскоре убедитесь, что она будет как правило проигрывать. Это неудивительно, ведь логику работы компьютерного оппонента мы задали очень примитивно. Компьютер всегда отказывается от продолжения серии бросков и на каждом ходу довольствуется одним результатом.

1.1 Следующий этап в создании законченной программы — повышение силы игры компьютера. Чтобы его сила резко повысилась, необходимо в методе ComputerMove() класса TReferee реализовать более сильный алгоритм игры. Не вдаваясь в детали его создания, скажем, что близкая к самой лучшей стратегия выглядит так: кидать кубик, пока либо не наберется 20 и более очков, либо пока он не будет брошен пять раз (при дальнейшем бросании кубика риск получить «кол» и потерять накопленное становится слишком велик).Прежде всего в повторяемом логическом блоке (он еще называется телом цикла) надо проверить, не выпала ли на кубике единица. Если нет, то выпавшее значение надо прибавить к очкам, уже накопленным на данном ходу. Если выпала единица, то накопленные очки надо обнулить, прервать выброс кубика и передать ход. Также желательно проверить, не набрано ли 20 (или более) очков, и при необходимости прекратить бросать кубик.

 

Итоговый текст реализации метода CompirterMove() примет следующий вид:

void TReferee:: ComputerMove()

{ inti;

Computer.CurrentScores = 0;

for( i = 1; i< = 5; i ++)

{ if(Dice.GetDiceValue()! = 1)Computer.CurrentScores += Dice.LastValue;

else { Computer.CurrentScores = 0; break; }

if(Computer.CurrentScores> = 20) break;

}

Computer.Scores += Computer.CurrentScores;

Human.CurrentScores = 0;

}






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.