подскажите пожалуйста
как в сапере сделать поле приближенное к стандартному полю майкрософт
и
как сделать, что при нажатие mousebutton.left и mouse button.right выделялись 8 клеточек вокруг нажатой
я предполагаю что через процедуру mousedown
но как объеденить это действие не знаю
очень буду признателен если напишете пример с комментариями
"как в сапере сделать..." в каком?
"стандартному полю майкрософт" Какое такое стандартное поле?
как сделать, что при нажатие mousebutton.left и mouse button.right выделялись 8 клеточек вокруг нажатой
я предполагаю что через процедуру mousedown
но как объеденить это действие не знаю
И похоже как объединять мысли свои тоже не знаешь.
Видимо ты ничего не умеешь делать, но хочешь все это объединить во что-то непонятное, предварительно по**@в мозги другим?
в delphi я знаю как написать, пишу щас в visual studio 2005 под basic(первый раз его открыл,т.к. на работе сказали на нем пиши)
логику знаю как писать,проблема с графикой.
допустим
Sub Kletka(ByVal row As Integer, ByVal col As Integer, ByVal status As Integer)
 im Gr As Graphics = MyBase.CreateGraphics
 im X As Integer, Y As Integer ' координаты верхнего левого угла области вывода клетки
X = (col - 1) * W
Y = (row - 1) * H
If status = 0 Then 'начало игры
'рисуем синие клетки с черными границами и значениями массива Pole (в качестве подсказки)
Gr.FillRectangle(Brushes.DarkBlue, X + 5, Y + 25, W, H)
Gr.DrawRectangle(Pens.Black, X + 5, Y + 25, W, H)
'Gr.DrawString(Pole(row, col), Me.Font, Brushes.Blue, X + 15, Y + 40)
'MsgBox("строка " & row & vbCrLf & "столбец " & col & vbCrLf & "Pole " & Pole(row, col))
Exit Sub
ElseIf status = 2 And Pole(row, col) = 209 Then 'показываем все мины
Gr.FillRectangle(Brushes.Gray, X + 5, Y + 25, W, H)
Gr.DrawRectangle(Pens.DarkGray, X + 5, Y + 25, W, H)
Call Mina(X, Y)
Exit Sub
---------------------------------------
Sub ShowPole(ByVal status As Integer) ' процедура выводит поле
 im row As Integer, col As Integer
For row = 1 To KV
For col = 1 To KG
Call Kletka(row, col, status)
Next col
Next row
End Sub
рисую только так
флажки и мины сделал иконками и загружаю при нажатие клавишы right и left
но как сделать такое же как в стандартном виндовском не знаю
так же как объеденить 2 клавишы и выполнение вынкций с ними
но думаю что 1 Private Sub Form1_MouseDown(...)
2 e.Button = MouseButtons.Right
и e.Button = MouseButtons.Left
then...
как объеденить эти кнопки
ну это понятно что MouseButtons.Right MouseButtons.Left должны присвоится false или true
так же понятно что должна быть процедура Private Sub Form1_MouseUP
И смысл называть переменные\процедуры транслитом? По русски нежелательно, используй английский. Расширяй свой словарный запас. Клетка = Cell, Поле = Field, etc.
я как бы и собираюсь это сделать,поэтому зашел на форум и спрашиваю как это лучше сделать
1.чтобы создать поле похожее на поле стандартного сапера можно:
я считаю что можно сделать через прорисовку поля массивом
или
сделать рисунки клетки.дублировать его на сколько нам нужно
10х10,20х20 или можно задать самому
но как это сделать кодом я мало представляю
Public Class Form1
Const KV = 10 ' количество клеток по вертикали
Const KG = 10 ' количество клеток по горизонтали
Const KM = 10 ' количество мин
Const W = 40 ' ширина клетки поля
Const H = 40 ' высота клетки поля
' массив минное поле
 im Pole(KV + 1, KG + 1) As Integer
' значение элементов массива:
' 0...8 - количество мин в соседних клетках, 9 - в клетке мина,
' 100..109 - клетка открыта, 200..209 - в клетку поставлен флаг
 im nMin As Integer ' количество найденных мин
 im nFlag As Integer ' количество выставленных флагов
 im status As Integer ' статус игры: 0 - начало игры, 1 - идет игра, 2 - результат игры
Private Sub Сапер_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' загрузка формы
 im row As Integer, col As Integer
' В неотображаемые элементы массива (клетки по границе игрового поля) записывается число -3.
' Это значение используется процедурой n_ореn для завершения рекурсивного процесса открытия
' соседних пустых клеток
For row = 0 To KV + 1
For col = 0 To KG + 1
Pole(row, col) = -3
Next col
Next row
End Sub
' процедура выводит на форму содержимое клетки
Sub Kletka(ByVal row As Integer, ByVal col As Integer, ByVal status As Integer)
 im Gr As Graphics = MyBase.CreateGraphics
 im X As Integer, Y As Integer ' координаты верхнего левого угла области вывода клетки
X = (col - 1) * W
Y = (row - 1) * H
If status = 0 Then 'начало игры
'рисуем синие клетки с черными границами и значениями массива Pole (в качестве подсказки)
Gr.FillRectangle(Brushes.DarkBlue, X + 5, Y + 25, W, H)
Gr.DrawRectangle(Pens.Black, X + 5, Y + 25, W, H)
'Gr.DrawString(Pole(row, col), Me.Font, Brushes.Blue, X + 15, Y + 40)
'MsgBox("строка " & row & vbCrLf & "столбец " & col & vbCrLf & "Pole " & Pole(row, col))
Exit Sub
ElseIf status = 2 And Pole(row, col) = 209 Then 'показываем все мины
Gr.FillRectangle(Brushes.Gray, X + 5, Y + 25, W, H)
Gr.DrawRectangle(Pens.DarkGray, X + 5, Y + 25, W, H)
Call Mina(X, Y)
Exit Sub
End If
Select Case Pole(row, col) ' идет игра
Case Is = 9 'закрываем клетку (убираем "правильный" флаг)
Gr.FillRectangle(Brushes.DarkBlue, X + 5, Y + 25, W, H)
Gr.DrawRectangle(Pens.Black, X + 5, Y + 25, W, H)
'Gr.DrawString(Pole(row, col), Me.Font, Brushes.Blue, X + 15, Y + 40)
nFlag = nFlag - 1 : nMin = nMin - 1
MyBase.Text = "Сапер. Обнаружено мин: " & nMin & " из " & KM
Exit Select
Case Is < 100 'закрываем клетку (убираем флаг)
Gr.FillRectangle(Brushes.DarkBlue, X + 5, Y + 25, W, H)
Gr.DrawRectangle(Pens.Black, X + 5, Y + 25, W, H)
'Gr.DrawString(Pole(row, col), Me.Font, Brushes.Blue, X + 15, Y + 40)
nFlag = nFlag - 1
Case Is = 100 ' клетка открывается, в соседних клетках мин нет
Gr.FillRectangle(Brushes.Gray, X + 5, Y + 25, W, H)
Gr.DrawRectangle(Pens.DarkGray, X + 5, Y + 25, W, H)
Exit Sub
Case 101 To 108 ' клетка открывается, в соседних клетках мины есть
Gr.FillRectangle(Brushes.Gray, X + 5, Y + 25, W, H)
Gr.DrawRectangle(Pens.DarkGray, X + 5, Y + 25, W, H)
' вывод количества мин в соседних клетках
Gr.DrawString(Int(Pole(row, col)) - 100, MyBase.Font, Brushes.Blue, X + 15, Y + 40)
Exit Sub
Case Is = 109 ' на этой мине подорвались
Gr.FillRectangle(Brushes.Red, X + 5, Y + 25, W, H)
Gr.DrawRectangle(Pens.Black, X + 5, Y + 25, W, H)
Call Mina(X, Y)
Case Is = 209 'ставим "правильный" флаг в клетку
nMin = nMin + 1
nFlag = nFlag + 1
Call Flag(X, Y)
MyBase.Text = "Сапер. Обнаружено мин: " & nMin & " из " & KM
Exit Select
Case 200 To 208 'ставим флаг в клетку
nFlag = nFlag + 1
Call Flag(X, Y)
End Select
End Sub
Sub ShowPole(ByVal status As Integer) ' процедура выводит поле
 im row As Integer, col As Integer
For row = 1 To KV
For col = 1 To KG
Call Kletka(row, col, status)
Next col
Next row
End Sub
Sub n_open(ByVal row As Integer, ByVal col As Integer)
' рекурсивная процедура открывает текущую и все соседние клетки, в которых нет мин
If Pole(row, col) = 0 Then
Pole(row, col) = 100
Call Kletka(row, col, 1)
' примыкающие клетки по вертикали и горизонтали
Call n_open(row, col - 1)
Call n_open(row - 1, col)
Call n_open(row, col + 1)
Call n_open(row + 1, col)
' примыкающие диагонально
Call n_open(row - 1, col - 1)
Call n_open(row - 1, col + 1)
Call n_open(row + 1, col - 1)
Call n_open(row + 1, col + 1)
Else
If (Pole(row, col) < 100) And (Pole(row, col) <> -3) Then
Pole(row, col) = Pole(row, col) + 100
Call Kletka(row, col, 1)
End If
End If
End Sub
Sub newGame() ' процедура генерирует новое игровое поле
 im row, col As Integer ' координаты клетки
 im n As Integer ' количество поставленных мин
 im k As Integer ' количество мин в соседних клетках
' очистка игрового поля
For row = 1 To KV
For col = 1 To KG
Pole(row, col) = 0
Next col
Next (row)
' расстановка мин
Randomize() ' инициализация ГСЧ
n = 0 ' количество мин
 o
row = Int((KV * Rnd()) + 1)
col = Int((KG * Rnd()) + 1)
If (Pole(row, col) <> 9) Then
Pole(row, col) = 9
n = n + 1
End If
Loop Until (n = KM)
' вычисление количества мин в соседних клетках для каждой клетки
For row = 1 To KV
For col = 1 To KG
If Pole(row, col) = 9 Then ' т.е., если мина в клетке
k = 9
Else
k = 0
If Pole(row - 1, col - 1) = 9 Then k += 2
If Pole(row - 1, col) = 9 Then k += 2
If Pole(row - 1, col + 1) = 9 Then k += 2
If Pole(row, col - 1) = 9 Then k += 2
If Pole(row, col + 1) = 9 Then k += 2
If Pole(row + 1, col - 1) = 9 Then k += 2
If Pole(row + 1, col) = 9 Then k += 2
If Pole(row + 1, col + 1) = 9 Then k += 2
End If
Pole(row, col) = k
Next col
Next row
status = 0 ' начало игры
nMin = 0 ' нет обнаруженных мин
nFlag = 0 ' нет поставленных флагов
MyBase.Text = "Сапер"
End Sub
Sub Flag(ByVal X As Integer, ByVal Y As Integer) ' процедура выводит флаг
 im Gr As Graphics = MyBase.CreateGraphics
 im Флаг As Image = Image.FromFile("flag.ico"
 im pnt As New Point(X + 5, Y + 25)
Gr.DrawImage(Флаг, pnt)
'граница клетки
'Gr.DrawRectangle(Pens.Brown, X + 5, Y + 25, W, H)
End Sub
Sub Mina(ByVal X As Integer, ByVal Y As Integer) ' процедура выводит мину
 im Gr As Graphics = MyBase.CreateGraphics
 im Мина As Image = Image.FromFile("mina.ico"
 im pnt As New Point(X + 9, Y + 30)
Gr.DrawImage(Мина, pnt)
'граница клетки
'Gr.DrawRectangle(Pens.Brown, X + 5, Y + 25, W, H)
End Sub
Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
 im row As Integer, col As Integer
If status = 2 Then Exit Sub ' игра завершена
If status = 0 Then status = 1 ' первый щелчок
' преобразование координат мыши в индексы клетки поля
row = Int(e.Y / (H - 10))
col = Int(e.X / (W - 10)) + 0.5
'ЩЕЛКАТЬ НУЖНО СТАРАТЬСЯ ПО САМОМУ ЦЕНТРУ КЛЕТКИ
'MsgBox("строка " & row & vbCrLf & "столбец " & col & vbCrLf & "Pole = " & Pole(row, col))
' нажатие левой кнопки мыши
If e.Button = MouseButtons.Left Then
If Pole(row, col) = 9 Then
MessageBox.Show("Подорвались"
'открываем клетку, в которой есть мина
Pole(row, col) = 109
status = 2 ' игра закончена
Call Kletka(row, col, 2)
Else
If Pole(row, col) < 9 Then Call n_open(row, col) ' открытие клеток
End If
End If
' нажатие правой кнопки мыши
If e.Button = MouseButtons.Right Then
If Pole(row, col) >= 200 Then 'в клетке стоит флаг, пользователь хочет его убрать
Pole(row, col) = Pole(row, col) - 200
Call Kletka(row, col, status) 'убираем флаг
Else 'в клетке нет флага, а пользователь хочет его поставить
' если клетка открыта, то флаг нельзя поставить, если клетка закрыта - можно
If Pole(row, col) >= 100 Then
MessageBox.Show("Нельзя поставить флаг в открытую клетку.", "Сапер: расстановка флагов", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Exit Sub
End If
Pole(row, col) = Pole(row, col) + 200 'установка флага
Call Kletka(row, col, status) ' рисуем флаг
' если все флаги расставлены на правильных местах
If (nMin = KM) And (nFlag = KM) Then
status = 2 ' игра закончена
MessageBox.Show("Поздравления! Поле разминировано!", "Сапер: конец игры", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
Call ShowPole(status) ' вывод поля
End If
End If
End If
End Sub
Private Sub НоваяToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles НоваяToolStripMenuItem.Click
' выбор пункта меню "Игра - новая"
Call newGame() ' новая игра
Call ShowPole(status) ' вывод игрового поля
End Sub