Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 |

 

  Вопрос: игра Сапер Добавлено: 04.10.10 18:37  

Автор вопроса:  
подскажите пожалуйста
как в сапере сделать поле приближенное к стандартному полю майкрософт
и
как сделать, что при нажатие mousebutton.left и mouse button.right выделялись 8 клеточек вокруг нажатой
я предполагаю что через процедуру mousedown
но как объеденить это действие не знаю

очень буду признателен если напишете пример с комментариями

Ответить

  Ответы Всего ответов: 31  

Номер ответа: 1
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #1
Добавлено: 04.10.10 19:36
"как в сапере сделать..." в каком?
"стандартному полю майкрософт" Какое такое стандартное поле?
как сделать, что при нажатие mousebutton.left и mouse button.right выделялись 8 клеточек вокруг нажатой
я предполагаю что через процедуру mousedown
но как объеденить это действие не знаю
И похоже как объединять мысли свои тоже не знаешь.

Видимо ты ничего не умеешь делать, но хочешь все это объединить во что-то непонятное, предварительно по**@в мозги другим?

Ответить

Номер ответа: 2
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #2
Добавлено: 04.10.10 20:42
он хочет сделать копию виндового сапера очевидно, но не знает как.

Ответить

Номер ответа: 3
Автор ответа:
 Серёга



ICQ: 262809473 

Вопросов: 17
Ответов: 561
 Web-сайт: houselab.narod.ru
 Профиль | | #3
Добавлено: 04.10.10 21:24
очень буду признателен если напишете пример с комментариями

- ты сам то что нибудь написал? Попытка то была или нет?

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 05.10.10 10:12
Как сделать в операционной системе UI максимально приближеный к MacOS?

Ответить

Номер ответа: 5
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #5 Добавлено: 05.10.10 12:47
артем забыл добавить "подскажите плиз буду очень признателен!"

Ответить

Номер ответа: 6
Автор ответа:
 



Вопросов: 2
Ответов: 12
 Профиль | | #6 Добавлено: 05.10.10 15:52
в delphi я знаю как написать, пишу щас в visual studio 2005 под basic(первый раз его открыл,т.к. на работе сказали на нем пиши)
логику знаю как писать,проблема с графикой.
допустим


Sub Kletka(ByVal row As Integer, ByVal col As Integer, ByVal status As Integer)
        ;Dim Gr As Graphics = MyBase.CreateGraphics
        ;Dim 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) ' процедура выводит поле
        ;Dim 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

Ответить

Номер ответа: 7
Автор ответа:
 



Вопросов: 2
Ответов: 12
 Профиль | | #7 Добавлено: 05.10.10 16:01
или посоветуйте литературу пожалуйста

Ответить

Номер ответа: 8
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #8 Добавлено: 05.10.10 16:15
ничего не понятно что к чему. изъснись точнее + используй тэг SOURCE

Ответить

Номер ответа: 9
Автор ответа:
 



Вопросов: 2
Ответов: 12
 Профиль | | #9 Добавлено: 05.10.10 16:23
непонятен код или непонятны мои рассуждения/вопросы/прочие реплики?

Ответить

Номер ответа: 10
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #10 Добавлено: 05.10.10 17:07
и то и другое, честно говоря. нужно все переделывать

Ответить

Номер ответа: 11
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #11 Добавлено: 05.10.10 17:11
  1. MsgBox("строка " & row & vbCrLf & "столбец " & col & vbCrLf & "Pole " & Pole(row, col)
ну, кто так делает?
  1. MessageBox.Show(String.Format("Строка {0}{1}столбец {2}{1}Поле {3}", row, ControlChars.NewLine, col, Pole(row, col))
Вот как-то так

И смысл называть переменные\процедуры транслитом? По русски нежелательно, используй английский. Расширяй свой словарный запас. Клетка = Cell, Поле = Field, etc.

Ответить

Номер ответа: 12
Автор ответа:
 



Вопросов: 2
Ответов: 12
 Профиль | | #12 Добавлено: 05.10.10 17:15
я как бы и собираюсь это сделать,поэтому зашел на форум и спрашиваю как это лучше сделать
1.чтобы создать поле похожее на поле стандартного сапера можно:
я считаю что можно сделать через прорисовку поля массивом
или
сделать рисунки клетки.дублировать его на сколько нам нужно
10х10,20х20 или можно задать самому
но как это сделать кодом я мало представляю

Ответить

Номер ответа: 13
Автор ответа:
 



Вопросов: 2
Ответов: 12
 Профиль | | #13 Добавлено: 05.10.10 17:17
с радостью занялся бы английским и поехал на обучение в Лондон,но к сожалению не позволяет время,которого нет.

Ответить

Номер ответа: 14
Автор ответа:
 



Вопросов: 2
Ответов: 12
 Профиль | | #14 Добавлено: 05.10.10 17:27


Public Class Form1
    Const KV = 10 ' количество клеток по вертикали
    Const KG = 10 ' количество клеток по горизонтали
    Const KM = 10 ' количество мин
    Const W = 40 ' ширина клетки поля
    Const H = 40 ' высота клетки поля
    ' массив минное поле
    ;Dim Pole(KV + 1, KG + 1) As Integer
    ' значение элементов массива:
    ' 0...8 - количество мин в соседних клетках, 9 - в клетке мина,
    ' 100..109 - клетка открыта, 200..209 - в клетку поставлен флаг
    ;Dim nMin As Integer ' количество найденных мин
    ;Dim nFlag As Integer ' количество выставленных флагов
    ;Dim status As Integer ' статус игры: 0 - начало игры, 1 - идет игра, 2 - результат игры

    Private Sub Сапер_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' загрузка формы
        ;Dim 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)
        ;Dim Gr As Graphics = MyBase.CreateGraphics
        ;Dim 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) ' процедура выводит поле
        ;Dim 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() ' процедура генерирует новое игровое поле
        ;Dim row, col As Integer ' координаты клетки
        ;Dim n As Integer ' количество поставленных мин
        ;Dim k As Integer ' количество мин в соседних клетках
        ' очистка игрового поля
        For row = 1 To KV
            For col = 1 To KG
                Pole(row, col) = 0
            Next col
        Next (row)
        
        ' расстановка мин
        Randomize() ' инициализация ГСЧ
        n = 0 ' количество мин
        ;Do
            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) ' процедура выводит флаг
        ;Dim Gr As Graphics = MyBase.CreateGraphics
        ;Dim Флаг As Image = Image.FromFile("flag.ico";)
        ;Dim 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) ' процедура выводит мину
        ;Dim Gr As Graphics = MyBase.CreateGraphics
        ;Dim Мина As Image = Image.FromFile("mina.ico";)
        ;Dim 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
        ;Dim 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
   

End Class

Ответить

Номер ответа: 15
Автор ответа:
 



Вопросов: 2
Ответов: 12
 Профиль | | #15 Добавлено: 05.10.10 17:29
криво косо, но работает обычная форма и menuStrip

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам