IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Игра Болтянского на Pascal, Игра Болтянского на Pascal с графикой
NickolsoN
сообщение 3.12.2010 23:25
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: NickolsoN

Репутация: -  0  +


Помогите написать программу.
Решение задании должно садержать
1. Доказательство выигрышной стратегии для игроков
2. Реализацию игры на компьютере с соблюдением уловий
- одним игроком в игре должен быть компьютер
- начальное состояние игры, два тех игр, где оно явно не задано, должно формироваться случайным образом (случайное число выбирается из экстетического представления картинки на экране);
- после представления начального состояния, а игре должен быть запрос Кто будет ходить
первым?»;
- игра должна быть оформлена с помощью графических средств*
- игра должна иметь «Заставку» и Правила игры
- управление игрой должно осуществляться либо с помощью управляющих клавиш клавиатуры либо мышкой
- компьютер должен играть по выигрышной стратегии: либо вследствие начальных данных игры, либо, следя за ходом человека, перехватив инициативу из-за его ошибки

Игра Болтянского
Играют двое. Первый выбирает натуральное число от 2 до 9, Второй умножает это число на выбираемое натуральное число от 2 до 9, затем первый выбирает число и умножает результат на любое натуральное число от 2 до 9 и т.д. Выигрывает тот, у кого впервые получится произведение,
больше заданного положительного числа C
Выяснить при каких С существует выигрышная ситуация у первого игрока,
при каких - у второго.

помогите пожалуйста, можно и без графики

Сообщение отредактировано: NickolsoN - 3.12.2010 23:51
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
NickolsoN
сообщение 5.12.2010 15:12
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: NickolsoN

Репутация: -  0  +


вот щас подлатал прогу, вывод нормально работает и нормально пишит кто выйграл, комп числа выдает случайным образом, без стратегии. Можно но ли, знаяя стратегию, отредактировать мою прогу? а насчет графики....никогда не пользовался))даже не представляю как)может вы поможете сначала со стратегией??пожалуйста=)

program boltyanskiy;
uses crt;
var
a,b,c,p,d,e:integer;
flag:boolean;

begin
repeat
clrscr;
p:=1; {prisvaivaem proizvedeniuy 1}
d:=1;
randomize;
write('Vvidite polozhitelnoe chislo C ( 0 - random C) = '); {zadaem C}
readln©;
if c=0 then
c:=random(1000);
writeln('chislo C = ',c);
write('kto hodit pervim?(1 - vi, 0 - komp) - '); {vibor pervogo hoda}
readln(a);
if a=1 then flag:=true;
repeat
if flag then begin
write('vvedite chislo ot 2 do 9 - ');
read(b);
p:=p*b;
writeln('vi vveli - ',b,', proizvedenie - ',p);
end else begin
d:=random(7)+2;
p:=p*d;
writeln('ya vvel - ',d,' ,proizvedenie - ',p); end;
flag:=not flag;
until (p>=c);
if flag then writeln('Ura!Ya viygral!') else writeln('Pozdravlyayu, vi viygrali!');
write('Esche sigraem? (1 - yes, 0 - no) - ');
read(e);
until (e=0);
end.


Сообщение отредактировано: NickolsoN - 5.12.2010 20:03
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 6.12.2010 5:18
Сообщение #3


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Хорошо. Ты сделал достаточно много, чтоб я убедился, что ты умеешь работать. Но ты не выполняешь все мои просьбы, и это затрудняет разговор. Это не упрек, скорее оправдание, почему я выкладываю свой вариант. Посмотри на него и сам сделай выводы.

Обрати внимание на такие моменты..
1. Форматирование программы. Сдвиги делаются не там, где тебе кажется красивее, а по правилам. Постарайся понять их на примере моего кода. Это тебе сильно поможет в будущем при написании более длинных программ.
2. Процедуры и функции используй не только для повторяющегося кода, но и для структуризации, чтоб выделить блоки, отличающиеся по смыслу.
3. Убери CRT. Никогда не делай ClrScr без осознанной необходимости. Мне уже надоело это всем говорить, читай тут: Матрица. Суммы диоганалей паралельных главной и побочной
4. Всегда старайся все числа убрать в константы. Например, тут есть числа 2 и 9. Вроде бы, они не должны меняться. На самом же деле может оказаться, когда ты придешь сдавать эту прогу препу, что он скажет: "хорошо, молодой человек, вы справились; а теперь та же задача для пределов 5 и 28..." И ты станешь ползать по всей программе, выискивая двойки и девятки..

Теперь по поводу стратегии.. Хорошо, я не буду убирать из своей проги алгоритм выигрышной стратегии. Постарайся с ним разобраться. Тебе придется это сделать, так как в задании есть вопрос: при каких С есть выигрышная стратегия. Задавай вопросы, если будет что-то неясно )).

const
d1= 2;
d2= 9;
Name: array [false..true] of string=(' I','You');
OfName: array [false..true] of string=(' My','Your');

var
c,m,n: LongInt;
Player: boolean; // false=computer, true=user


function AI: integer; // Artificial Intellect
var
d,e: LongInt;
begin
d:=c;
repeat
e:=(d-1)div n+1;
d:=(d-1)div(d2*d1)+1
until e<=9;
if e<2 then e:=2;
AI:=e
end;

function ManualMove: integer;
var
m: integer;
begin
Write('Make your move (',d1,' through ',d2,') : ');
ReadLn(m);
ManualMove:=m
end;

begin
repeat
WriteLn('Well, let''s play!');
Write('Enter the goal (0 for random) : ');
ReadLn©;
if c=0 then c:=Random(10000);
WriteLn('The goal is now set to ',c);
Write('Who moves first? 0 for computer (yes, that''s me!)), 1 for you : ');
ReadLn(m);
Player:=m=0;
n:=1;
while n<c do begin
Player:=not Player;
if Player then m:=ManualMove else m:=AI;
n:=n*m;
WriteLn(OfName[Player],' move was ',m,', the number is now ',n);
end;
WriteLn(Name[Player],' win!');
Write('Wanna play more? 0 for No, 1 for Yes: ');
ReadLn(m)
until m=0
end.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 7.12.2010 10:41
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Так. Кажется, я придумал, как объяснить эту интуицию.

См. рисунок: Прикрепленное изображение (масштаб пропорций не выдержан, иначе пришлось бы слишком мельчить)

Идет игра до цели C. Пусть МЫ играем проив НИХ. Игра находится в некоторой промежуточной стадии, произведение в настоящий момент равно P. Ход наш. И мы думаем то, что можем думать..

Во-первых, договоримся о терминах:
начало хода - это чему равно произведение к этому ходу;
сам ход - это на что мы домножаем (от 2 до 9);
результат хода - то, что получается после умножения начала на ход.
Например, если начало хода равно 12, а наш ход равен 3, то результат нашего хода есть 36.

Допустим, что выиграть сразу одним ходом мы не можем, потому что C слишком велико. Так вот, с самого начала ясно, что нам НЕЛЬЗЯ (если, конечно, мы хотим выиграть), чтоб результат нашего хода попал в промежуток от C/9 до C, потому что они (если они не дураки) сразу смогут выиграть. Этот ПЛОХОЙ для нас интервал изображен толстой красной линией.

Но с другой стороны, мы хотим, чтобы результат ИХ хода попал на этот участок. Желательно ЗАСТАВИТЬ их сделать такой ход. Для этого попробуем определить такой участок, любой ход с которого попадет в красный. Это сделать легко (проанализируй сам и поймешь), этот участок - от C/9/2 до C/9. Нам надо, чтобы они начинали свой ход внутри этого участка. А их начало - это наш предыдущий результат! Значит, нам надо СТРЕМИТЬСЯ попасть в этот кусок предыдущим ходом. На рисунке этот кусок изображен толстой зеленой линией.

Таким образом, мы выяснили, что нам желательно попасть ЗА число C/9/2. Другими словами, нашей ДАЛЬНЕЙ целью все еще является C, но появилась цель поближе. Назовем ее C1 (подразумевая, что то C было как бы C0). То есть, C1=C/18.

После этого мы можем абстрагироваться от дальней цели и заняться выполнением более близкой. Иными словами, теперь игра ведется не до C, а до C1. Если мы выиграем эту игру, то мы выиграем и всю игру. И мы можем повторить все те же самые рассуждения, но теперь про C1. И тогда мы найдем число C2, которое снова станет нашей новой целью. А между C2 и C1 - красный участок потоньше и зеленый участок потоньше. А за ним последкет C3 и так далее..

Так будет продолжаться до тех пор, пока текущее произведение P не попадет ЗА очередную Ci. Если оно окажется на красном куске - отлично, мы ходим так, чтобы попасть на следующий зеленый. Если нет - мы ходим как-то (при этом желательно выбрать маленький ход, чтоб затянуть игру) и хдем ИХ ошибки.

Это, так сказать, сухая теория. На практике все немного усложняется из-за того, что целые числа делятся не точно, а с остатком. Попробуй с учетом всего вышесказанного осмыслить функцию AI. Что будет неясно - задавай вопросы.
smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
NickolsoN   Игра Болтянского на Pascal   3.12.2010 23:25
Unconnected   И нафига тут графика вообще, интересно.. ну, обосн...   3.12.2010 23:31
NickolsoN   И нафига тут графика вообще, интересно.. ну, обос...   3.12.2010 23:52
Unconnected   Со стратегией наврал я.. наверное, выигрышная стра...   4.12.2010 0:14
Lapp   Игра Болтянского Играют двое. Первый выбирает нат...   4.12.2010 9:48
NickolsoN   Болтянский - хороший математик. Его самого я поч...   4.12.2010 10:04
Lapp   мне нужен не отткомпилированный файлик .pas,которы...   4.12.2010 11:20
-TarasBer-   > Со стратегией наврал я.. наверное, выигрышная...   4.12.2010 11:52
Unconnected   Почему бы и нет, наверное выиграю. Какая разница, ...   4.12.2010 11:56
RathaR   Lapp, а то что твоя прога разрешает умножать на ед...   4.12.2010 12:50
Lapp   Lapp, а то что твоя прога разрешает умножать на ед...   4.12.2010 13:01
Unconnected   Может, в этом секрет выигрышной стратегии :rolley...   4.12.2010 12:54
-TarasBer-   > Почему бы и нет, наверное выиграю. Какая разн...   4.12.2010 12:56
NickolsoN   короче с 5 вечера, до почти 1часа ночи пытался уло...   4.12.2010 17:36
Lapp   вот скелет проги написалХорошо, это совсем другой ...   5.12.2010 1:00
NickolsoN   вот щас подлатал прогу, вывод нормально работает и...   5.12.2010 15:12
Lapp   Хорошо. Ты сделал достаточно много, чтоб я убедил...   6.12.2010 5:18
Lapp   Так. Кажется, я придумал, как объяснить эту интуи...   7.12.2010 10:41
NickolsoN   Lapp, спасибо ВАМ !вот сидел алгоритм ваш пыта...   6.12.2010 21:49
Lapp   массиви строк, принимающие значение тру и фолс?Да....   7.12.2010 1:13
NickolsoN   Lapp, вы гений!! столь развернутый ответ д...   8.12.2010 18:29
Lapp   Lapp, вы гений!! столь развернутый ответ д...   9.12.2010 16:07
TarasBer   Кстати, известная идея - все возможные позиции раз...   9.12.2010 10:59
NickolsoN   Lapp, извините!в личке баловать больше не буду...   9.12.2010 16:19
Lapp   Какая тебе нужна графика? турбо-паскалевская? Ес...   9.12.2010 16:43


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 15:17
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"