Змінюй хід війни! Допомагай ЗСУ!

Сапер!

  • Автор теми Автор теми Aleon
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 08.03.2005
Повідом.: 18844
Сапер!!!

А кто то прошол(чесно)(без глюков) сапера ---- профисионал!!???
 
А что возникли сложности?
 
гы.... ))))

ну я проходил.... неоднократно..... на новичке ваще рекорд 7 секунд....
 
А что там такого сложного? Не фиг делать пройти... Правда, бывает, нужно именно угадывать, где мина, а не вычислять... Вот тогда и могут быть проколы. Ну я проходил и тоже неоднократно. НА других уровнях просто не играю - неинтересно :-)
На новичке вкладывался только в 8 с :(
 
А что там такого сложного? Не фиг делать пройти... Правда, бывает, нужно именно угадывать, где мина, а не вычислять... Вот тогда и могут быть проколы. Ну я проходил и тоже неоднократно. НА других уровнях просто не играю - неинтересно :-)
На новичке вкладывался только в 8 с :(

Частенько проходил (правда бывает, что некоторые мины - наугад, т.к. для расчета места нет возможностей) :-)
 
Ты программер? Тогда можно решить все как на первом курсе...
Статью вставляю с хакера ибо та, которой воспользовался когда-то я была куда менее подробной.

Для начала скопируем из системной папки сам файл winmine.exe. Осмотрим его внешне. Потыкаем по полю наугад .... ты попал на мину - проиграл, ну ладно, не беда! Смотрим верхнее меню, там есть пункт "Новая игра". Нажимаем и видим, что поле заполнено по-новому. Давайте посмотрим, что происходит по выбору этого пункта....

Загружаем Сапера в W32Dasm:

видим, что ID этого пункта меню равен [ID=01FEh]. В поиске вбиваем это значение, ищем... Находим это:

01001DD3 |.3D FE010000 CMP EAX, 1FE
01001DD8 |.0F84 EA000000 JE 01001EC8
именно тут и происходит выбор нашего пункта, идем по этому адресу. А тут:
01001EC8 |>E8 AD170000 CALL 0100367A
Хорошо, идем в эту процедуру... Она начинается так:
0100367A /$A1 AC560001 MOV EAX, DWORD PTR DS:[10056AC]
0100367F |.8B0D A8560001 MOV ECX, DWORD PTR DS:[10056A8]
По этим адресам лежат число клеток по X и Y, они (эти адреса) нам понадобятся!. Шагая по этой подпрограмме можно найти адрес с которого начинается рэндомно заполняющаяся карта... у меня он равен: 01005360h. Ну и начиная с этого адреса идут клетки поля, если в них находиться значение 8F, значит тут мина, иначе стоит FF, а начало и конец строки определяются как 10h, причем строчки находятся друг от друга на интервале 20h.

Этого нам достаточно для написания программы. На форме находится sg: TStringGrid...

Вот код:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;

type
TPole = record
x: Byte;
y: Byte;
End;

type
TForm1 = class(TForm)
Button1: TButton;
sg: TStringGrid;
procedure Button1Click(Sender: TObject);
private
SapMap: Tpole;
public
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
hWn: HWND;
PID, hProc, dwReaded: DWord;
buf: Byte;
i, r: Dword;
StartAddr: Dword;
begin
hWn := HWND(FindWindow(nil, PChar('Сапер')));
If IsWindow(hWn) Then
Begin
GetWindowThreadProcessId(hWn, PID);
hProc := OpenProcess(PROCESS_VM_READ, False, PID);
Try
If (hProc <> 0) Then
Begin
ReadProcessMemory(hProc, ptr($10056AC), @buf, 1, dwReaded);
SapMap.x := buf;
ReadProcessMemory(hProc, ptr($10056A8), @buf, 1, dwReaded);
SapMap.y := buf;

sg.ColCount := SapMap.x;
sg.RowCount := SapMap.y;
For i := 0 To (sg.ColCount - 1) Do
For r := 0 To (sg.RowCount - 1) Do sg.Cells[i,r] := ' ';

StartAddr := $01005361;
For i := 0 To (SapMap.y - 1) Do
Begin
For r := 0 To (SapMap.x - 1) Do
Begin
ReadProcessMemory(hProc, ptr((i*$20) + StartAddr + r), @buf, 1, dwReaded);
If (buf = $8F) Then sg.Cells[r, i] := 'X';
End;
End;

End;
Finally
CloseHandle(hProc);
End;
End;
end;

end.
 
Frosty сказав(ла):
Ты программер? Тогда можно решить все как на первом курсе...[BR/]Статью вставляю с хакера ибо та, которой воспользовался когда-то я была куда менее подробной.[BR/][BR/]Для начала скопируем из системной папки сам файл winmine.exe. Осмотрим его внешне. Потыкаем по полю наугад .... ты попал на мину - проиграл, ну ладно, не беда! Смотрим верхнее меню, там есть пункт "Новая игра". Нажимаем и видим, что поле заполнено по-новому. Давайте посмотрим, что происходит по выбору этого пункта....[BR/][BR/]Загружаем Сапера в W32Dasm: [BR/][BR/]видим, что ID этого пункта меню равен [ID=01FEh]. В поиске вбиваем это значение, ищем... Находим это: [BR/][BR/]01001DD3 |.3D FE010000 CMP EAX, 1FE [BR/]01001DD8 |.0F84 EA000000 JE 01001EC8[BR/]именно тут и происходит выбор нашего пункта, идем по этому адресу. А тут: [BR/]01001EC8 |>E8 AD170000 CALL 0100367A[BR/]Хорошо, идем в эту процедуру... Она начинается так: [BR/]0100367A /$A1 AC560001 MOV EAX, DWORD PTR DS:[10056AC][BR/]0100367F |.8B0D A8560001 MOV ECX, DWORD PTR DS:[10056A8][BR/]По этим адресам лежат число клеток по X и Y, они (эти адреса) нам понадобятся!. Шагая по этой подпрограмме можно найти адрес с которого начинается рэндомно заполняющаяся карта... у меня он равен: 01005360h. Ну и начиная с этого адреса идут клетки поля, если в них находиться значение 8F, значит тут мина, иначе стоит FF, а начало и конец строки определяются как 10h, причем строчки находятся друг от друга на интервале 20h.[BR/][BR/]Этого нам достаточно для написания программы. На форме находится sg: TStringGrid... [BR/][BR/]Вот код: [BR/][BR/]unit Unit1; [BR/][BR/]interface [BR/][BR/]uses [BR/]Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, [BR/]Dialogs, StdCtrls, Grids; [BR/][BR/]type [BR/]TPole = record [BR/]x: Byte; [BR/]y: Byte; [BR/]End; [BR/][BR/]type [BR/]TForm1 = class(TForm) [BR/]Button1: TButton; [BR/]sg: TStringGrid; [BR/]procedure Button1Click(Sender: TObject); [BR/]private [BR/]SapMap: Tpole; [BR/]public [BR/]end; [BR/][BR/]var [BR/]Form1: TForm1; [BR/][BR/]implementation [BR/][BR/]{$R *.dfm} [BR/][BR/]procedure TForm1.Button1Click(Sender: TObject); [BR/]Var [BR/]hWn: HWND; [BR/]PID, hProc, dwReaded: DWord; [BR/]buf: Byte; [BR/]i, r: Dword; [BR/]StartAddr: Dword; [BR/]begin [BR/]hWn := HWND(FindWindow(nil, PChar('Сапер'))); [BR/]If IsWindow(hWn) Then [BR/]Begin [BR/]GetWindowThreadProcessId(hWn, PID); [BR/]hProc := OpenProcess(PROCESS_VM_READ, False, PID); [BR/]Try [BR/]If (hProc <> 0) Then [BR/]Begin [BR/]ReadProcessMemory(hProc, ptr($10056AC), @buf, 1, dwReaded); [BR/]SapMap.x := buf; [BR/]ReadProcessMemory(hProc, ptr($10056A8), @buf, 1, dwReaded); [BR/]SapMap.y := buf; [BR/][BR/]sg.ColCount := SapMap.x; [BR/]sg.RowCount := SapMap.y; [BR/]For i := 0 To (sg.ColCount - 1) Do [BR/]For r := 0 To (sg.RowCount - 1) Do sg.Cells[i,r] := ' '; [BR/][BR/]StartAddr := $01005361; [BR/]For i := 0 To (SapMap.y - 1) Do [BR/]Begin [BR/]For r := 0 To (SapMap.x - 1) Do [BR/]Begin [BR/]ReadProcessMemory(hProc, ptr((i*$20) + StartAddr + r), @buf, 1, dwReaded); [BR/]If (buf = $8F) Then sg.Cells[r, i] := 'X'; [BR/]End; [BR/]End; [BR/][BR/]End; [BR/]Finally [BR/]CloseHandle(hProc); [BR/]End; [BR/]End; [BR/]end; [BR/][BR/]end.


Проще пройти самому, чем так. И приятнее :)
з.ы. я тоже думал, что не смогу пройти, ибо действительно зачастую приходится просто угадывать. Удалось всего лишь однажды пройти на профессионале. И при том без угадываний. Жестокая игра :)
 
Ты программер? Тогда можно решить все как на первом курсе...
Статью вставляю с хакера ибо та, которой воспользовался когда-то я была куда менее подробной.

Для начала скопируем из системной папки сам файл winmine.exe. Осмотрим его внешне. Потыкаем по полю наугад .... ты попал на мину - проиграл, ну ладно, не беда! Смотрим верхнее меню, там есть пункт "Новая игра". Нажимаем и видим, что поле заполнено по-новому. Давайте посмотрим, что происходит по выбору этого пункта....

Загружаем Сапера в W32Dasm:

видим, что ID этого пункта меню равен [ID=01FEh]. В поиске вбиваем это значение, ищем... Находим это:

01001DD3 |.3D FE010000 CMP EAX, 1FE
01001DD8 |.0F84 EA000000 JE 01001EC8
именно тут и происходит выбор нашего пункта, идем по этому адресу. А тут:
01001EC8 |>E8 AD170000 CALL 0100367A
Хорошо, идем в эту процедуру... Она начинается так:
0100367A /$A1 AC560001 MOV EAX, DWORD PTR DS:[10056AC]
0100367F |.8B0D A8560001 MOV ECX, DWORD PTR DS:[10056A8]
По этим адресам лежат число клеток по X и Y, они (эти адреса) нам понадобятся!. Шагая по этой подпрограмме можно найти адрес с которого начинается рэндомно заполняющаяся карта... у меня он равен: 01005360h. Ну и начиная с этого адреса идут клетки поля, если в них находиться значение 8F, значит тут мина, иначе стоит FF, а начало и конец строки определяются как 10h, причем строчки находятся друг от друга на интервале 20h.

Этого нам достаточно для написания программы. На форме находится sg: TStringGrid...

Вот код:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;

type
TPole = record
x: Byte;
y: Byte;
End;

type
TForm1 = class(TForm)
Button1: TButton;
sg: TStringGrid;
procedure Button1Click(Sender: TObject);
private
SapMap: Tpole;
public
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
hWn: HWND;
PID, hProc, dwReaded: DWord;
buf: Byte;
i, r: Dword;
StartAddr: Dword;
begin
hWn := HWND(FindWindow(nil, PChar('Сапер')));
If IsWindow(hWn) Then
Begin
GetWindowThreadProcessId(hWn, PID);
hProc := OpenProcess(PROCESS_VM_READ, False, PID);
Try
If (hProc <> 0) Then
Begin
ReadProcessMemory(hProc, ptr($10056AC), @buf, 1, dwReaded);
SapMap.x := buf;
ReadProcessMemory(hProc, ptr($10056A8), @buf, 1, dwReaded);
SapMap.y := buf;

sg.ColCount := SapMap.x;
sg.RowCount := SapMap.y;
For i := 0 To (sg.ColCount - 1) Do
For r := 0 To (sg.RowCount - 1) Do sg.Cells[i,r] := ' ';

StartAddr := $01005361;
For i := 0 To (SapMap.y - 1) Do
Begin
For r := 0 To (SapMap.x - 1) Do
Begin
ReadProcessMemory(hProc, ptr((i*$20) + StartAddr + r), @buf, 1, dwReaded);
If (buf = $8F) Then sg.Cells[r, i] := 'X';
End;
End;

End;
Finally
CloseHandle(hProc);
End;
End;
end;

end.

Спосибо но лудше самому!!!

Новичок 9
Любитель 101:(
 
Новичок - 9 сек;
Любитель - 55 сек;
Профи. - 276 сек!!! :yahoo: :yahoo: :yahoo:
 
Новичок - 9 сек;
Любитель - 55 сек;
Профи. - 276 сек!!! :yahoo: :yahoo: :yahoo:

Этими, как его, ну в общем будем меряццы? :-)

Проходил на нескольких машинах (дома и на работе).

На работе (на последней, которую поставил две недели назад):
Профя - 190 (хотя результаты на старой и получче были) ;)
 
Проходил на нескольких машинах (дома и на работе).

На работе (на последней, которую поставил две недели назад):
Профя - 190 (хотя результаты на старой и получче были) ;)[/QUOTE]

Будут улучшения напишу!!!:клас:
 
давайте может чемпионат по саперу организуем?
ггг:-)
 
Я ПРОШЕЛ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!:-) :-) :-) :-) :-) :-) :-) :-) :-)
 
молодец!
а вообще или жесткая удача или не менее жесткая логика, типа просчет на 10 :-) вариантов вперед!
 
:yahoo: Профи улучшил на 196 сек!!!:yahoo:
Любитель на 50 сек!
 
Останнє редагування:
профи 93 сек
 
Назад
Зверху Знизу