Крестики Нолики

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

dumber
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 19.03.2009 (Чт) 18:46

Крестики Нолики

Сообщение dumber » 19.03.2009 (Чт) 18:55

[Хакер] :: Тема перенесена в подходящий раздел.

Здруствуйте. Перед тем как написать эту тему я воспользовался поиском=)) у меня довольно простая задача, написать крестики нолики на vb под консоль. в инете ничёго на эту тему не нашёл, некоторую часть кода я написал, но есть некоторые вопросы.... помогите please...
некоторые вещи неработают. например, у меня не получается отобразить не О не Х, за место этого программа просто погазывает цифры которые находятся в array.
Код: Выделить всё
Module Module1 
Dim Nought As Long = "0"
    Dim Cross As Long = "2"
    Dim arr(,) As Long
    Dim uRow As Long, ucol As Long
    Dim IsCross As Boolean
    Dim ans As String
Sub Main()
        Call Choose()
        Call loop1()
    End Sub
    Function loop1()
        For i = 0 To 8
            arr = createarray(2, 2)
            Console.WriteLine(" ")
            displayarray(arr)
        Next i
        End
    End Function
    Function createarray(ByVal uRow As Long, ByVal uCol As Long) As Long(,)
        Dim i As Long, j As Long
        Dim arr(uRow, uCol) As Long
        Console.WriteLine("Please input your coordinates:")
        uRow = Console.ReadLine
        uCol = Console.ReadLine
        For i = uRow To uRow
            For j = uCol To uCol
                arr(i, j) = i + j
            Next j
        Next i
        Return arr
    End Function
    Sub displayarray(ByVal arr(,) As Long)
        Dim i As Long, j As Long
        For i = 0 To 2
            For j = 0 To 2
                Console.Write(Trim$(arr(i, j)) + " ")
            Next j
            Console.WriteLine()
        Next
    End Sub
    Private Sub choose()
        won = False
        Console.WriteLine("Do you want X to go first?(y/n)")
        ans = Console.ReadLine
        If ans = "y" Then
            IsCross = True
            Console.WriteLine("Player 1: " & Cross)
        ElseIf ans = "n" Then
            IsCross = False
            Console.WriteLine("Player 1: " & Nought)
        End If
    End Sub
End Module

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Крестики Нолики

Сообщение MIT » 19.03.2009 (Чт) 21:19

Не знаю, код не проверял, но в глаза бросаются следующие строчки:

С какого, простите, будет выводится X или O, если
dumber писал(а):Console.WriteLine("Player 1: " & Cross)
...
Console.WriteLine("Player 1: " & Nought)
при том, что
dumber писал(а):Dim Nought As Long = "0"
Dim Cross As Long = "2"
:?:

Так же как-то странно выглядят циклы
dumber писал(а):For i = uRow To uRow
For j = uCol To uCol
т.е. только один проход. Так и надо?..
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Крестики Нолики

Сообщение Хакер » 19.03.2009 (Чт) 21:27

Автор, ты пишешь не на вб, а на вб.нет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Крестики Нолики

Сообщение MIT » 19.03.2009 (Чт) 21:37

Взял посмотреть твой код. Может что еще умное напишу :)

Да, кстати, всвязи с тем, что
Хакер писал(а):Автор, ты пишешь не на вб, а на вб.нет.
фтопку Long,Trim$ и, по возможности, Arr(,).

добавлено:
Мда... :?
Код неработоспособный впринципе, непонятно откуда там вообще могут взяться X или O, непонятно как идет работа с массивом...
За спасибо могу переписать до чего-нибудь нормального :wink:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Крестики Нолики

Сообщение MIT » 19.03.2009 (Чт) 22:23

Гы!
Давно не писал игрушек, поэтому даже без просьб навалял консольные крестики-нолики (для 2х человек, с проверкой на выигранность партии) :D
Код: Выделить всё
Module Module1
    Dim arr(,) As MyPoint
    Dim player As Boolean

    Private Enum MyPoint
        n
        X
        O
    End Enum

    Sub Main()
        ReDim arr(2, 2)
        loop1()
    End Sub

    Function loop1()
        For i As Integer = 0 To 8
            Do Until SetNextValue(i) : Loop
            Console.WriteLine(" ")
            If CheckArr() Then
                Console.WriteLine("Ур-ра, товарищи! Игрок ""{0}"" выиграл!!!{1}", IIf(Not player, MyPoint.O, MyPoint.X), vbCrLf)
                displayarray()
                Exit For
            End If
            displayarray()
        Next i

        Console.WriteLine("Написано MIT`ом с форума bbs.vbstreets.ru")
        Console.ReadLine()
        End
    End Function

    Private Function SetNextValue(ByVal [Step] As Integer) As Boolean
        Console.WriteLine("Сейчас ход №{0}; ходим: {1}; Введите координаты хода", [Step], IIf(player, MyPoint.O, MyPoint.X))
        Dim uRow As Integer = -1
        Do Until uRow >= 0 And uRow <= 2
            If uRow <> -1 Then Console.WriteLine("Нефиг чушь писать!")
            Console.Write("Row: ")
            uRow = Integer.Parse(Console.ReadLine)
        Loop
        Dim uCol As Integer = -1
        Do Until uCol >= 0 And uCol <= 2
            If uCol <> -1 Then Console.WriteLine("Нефиг чушь писать!")
            Console.Write("Col: ")
            uCol = Integer.Parse(Console.ReadLine)
        Loop

        If arr(uRow, uCol) = MyPoint.n Then
            arr(uRow, uCol) = IIf(player, MyPoint.O, MyPoint.X)
            player = Not player
            Return True
        End If
        Console.WriteLine("Занято!")
        Return False
    End Function

    Private Function CheckArr() As Boolean
        For i As Integer = 0 To 2
            If arr(i, 0) <> MyPoint.n AndAlso (arr(i, 0) = arr(i, 1) And arr(i, 0) = arr(i, 2)) Then Return True
            If arr(0, i) <> MyPoint.n AndAlso (arr(0, i) = arr(1, i) And arr(0, i) = arr(2, i)) Then Return True
        Next
        If arr(0, 0) <> MyPoint.n AndAlso (arr(0, 0) = arr(1, 1) And arr(0, 0) = arr(2, 2)) Then Return True
        If arr(0, 2) <> MyPoint.n AndAlso (arr(0, 2) = arr(1, 1) And arr(0, 2) = arr(2, 0)) Then Return True

    End Function

    Private Sub displayarray()
        For i As Integer = 0 To 2
            Console.WriteLine("{0} {1} {2}", arr(i, 0), arr(i, 1), arr(i, 2))
        Next
    End Sub
End Module


Вот так вот. Мне аж самому понравилось :D
2dumber: извини, что за тебя все сделал, просто пописАл для души - расслабился
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

dumber
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 19.03.2009 (Чт) 18:46

Re: Крестики Нолики

Сообщение dumber » 20.03.2009 (Пт) 1:50

спасибо, спаисбо, спасибо тебе MIT...могу ещё много раз написать спасибо=)спасибо, спаисбо, спасибоспасибо, спаисбо, спасибоспасибо, спаисбо, спасибоспасибо, спаисбо, спасибоспасибо, спаисбо, спасибоспасибо, спаисбо, спасибоспасибо, спаисбо, спасибоспасибо, спаисбо, спасибоспасибо, спаисбо, спасибоспасибо, спаисбо, спасибо

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: Крестики Нолики

Сообщение 1Steps » 20.03.2009 (Пт) 2:52

Mit писал(а):Вот так вот. Мне аж самому понравилось :D
Рано радуешься.
А если юзер введет букву, то
Код: Выделить всё
uRow = Integer.Parse(Console.ReadLine)
выдаст исключение. Не предусмотрел?
И ещё. Зачем добавлять в консоль новый ход. Лучше её очистить и обновить введенный ход.

И это только минимум. :D
Удалена за ненадобностью.

dumber
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 19.03.2009 (Чт) 18:46

Re: Крестики Нолики

Сообщение dumber » 20.03.2009 (Пт) 3:22

спасибо ещё раз) мне тоже на счёт
Код: Выделить всё
uRow = Integer.Parse(Console.ReadLine)
интересно было.. как это можно исправить? и ещё вопрос)так как я сейчас пишу коментарии к коду и мне некоторые моменты вообще не ясны, например
Код: Выделить всё
Dim uRow As Integer = -1
---что значит это -1? и что значит Integer.Parse?

dumber
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 19.03.2009 (Чт) 18:46

Re: Крестики Нолики

Сообщение dumber » 20.03.2009 (Пт) 3:28

to 1Steps
а если очистить и обновить введённы код то это делается через Console.Clear()?

аааа...всё с этим разобрался=)

dumber
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 19.03.2009 (Чт) 18:46

Re: Крестики Нолики

Сообщение dumber » 20.03.2009 (Пт) 3:46

Также для провекри ничьей я тут вот чтото попыталя написать=)
Код: Выделить всё
Private Sub CheckDraw()
        If Not arr(0, 0) = "" And Not arr(0, 1) = "" And Not arr(0, 2) = "" Then
            If Not arr(1, 0) = "" And Not arr(1, 1) = "" And Not arr(1, 2) = "" Then
                If Not arr(2, 0) = "" And Not arr(2, 1) = "" And Not arr(2, 2) = "" Then
                    If Not Won Then
                        Console.WriteLine("Draw")
                    End If
                End If
            End If
        End If
    End Sub


вставил я это всё хозяйство в loop1, но если получается ничья то Draw не работает

Код: Выделить всё
    Function loop1()
        For i As Integer = 0 To 8
            Console.WriteLine(" ")
            Call help()
            Console.WriteLine(" ")
            Do Until SetNextValue(i) : Loop
            If CheckArr() Then
                Console.WriteLine("Yeah!! Player ""{0}"" Won!!!{1}", IIf(Not player, MyPoint.O, MyPoint.X), vbCrLf)
                displayarray()
                Exit For
               [b] If CheckDraw() Then
                    Console.WriteLine("This is a Draw", IIf(Not player, MyPoint.O, MyPoint.X), vbCrLf)
                End If[/b]
            End If
            Console.Clear()
            displayarray()
        Next i
        Console.WriteLine("")
        Console.ReadLine()
        End
    End Function

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Крестики Нолики

Сообщение MIT » 20.03.2009 (Пт) 8:15

1Steps писал(а):Рано радуешься.
А если юзер введет букву, то
Код: Выделить всё
uRow = Integer.Parse(Console.ReadLine)
выдаст исключение. Не предусмотрел?
Ну поменяй ты Integer.Parse на Val, кто против-то?

1Steps писал(а):И ещё. Зачем добавлять в консоль новый ход. Лучше её очистить и обновить введенный ход.
Это изначальная концепция. Если хочешь - хоть ИИ тебе напишу.

1Steps писал(а):И это только минимум.
Ааа, ну да. Ведь можно было сделать на DX10, со сложнейшей анимацией, килограмовыми текстурами, с ИИ, да еще и правил каких-нибудь новых придумать. Можно конечно, никто и не спорит :)

dumber писал(а):что значит это -1?
Это флаг того, что в переменной ничего еще нет.
Добавлено: Хм. Если пользователь введет "-1", то предупреждения не вылезет. Впринципе можно тогда String и Nothing использовать...
dumber писал(а):и что значит Integer.Parse?
Стандартная .NET`овская функция, которая пытается из строки (типа String) получить число (в данном случае Integer - 32 бита)

dumber писал(а):вставил я это всё хозяйство в loop1, но если получается ничья то Draw не работает
Ты не туды суешь. Смотри:
Код: Выделить всё
            If CheckArr() Then
                Console.WriteLine("Yeah!! Player ""{0}"" Won!!!{1}", IIf(Not player, MyPoint.O, MyPoint.X), vbCrLf)
                displayarray()
                Exit For
               If CheckDraw() Then
                    Console.WriteLine("This is a Draw", IIf(Not player, MyPoint.O, MyPoint.X), vbCrLf)
                End If
            End If

If CheckArr() Then - проверка на выигранность партии кем-либо. Если партия выиграна, то, собственно, и сработает код расположенный ниже.

Код: Выделить всё
Exit For
If CheckDraw() Then
Exit For - выход из цикла, т.е. после этой строчк уж точно ничего не произойдет - код просто не выполнится.
CheckDraw - точно такое же условие, как и CheckArr, соответственно ставить их надо в один ряд, примерно так:
Код: Выделить всё
If CheckArr() Then
...
ElseIf CheckDraw() Then
...
End If


Сделай по аналогии с CheckArr - пусть CheckDraw будет логической функцией и возвращать True, если, собственно, ничья

Еще добавлено: кстати, такой способ проверки на ничью не годится. Во-первых, сравнивать надо с MyPoint.n, а во-вторых можно сделать намного рациональнее :wink:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

dumber
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 19.03.2009 (Чт) 18:46

Re: Крестики Нолики

Сообщение dumber » 20.03.2009 (Пт) 12:38

спасибо MIT за помошь...)ну я так понимаю чтобы написать код для ничьей, можно пример кода использовать который то для выйгрыша написал...
а как мне его изменить надо?=) или если можешь то объясни как этот код работает и я сам попробую его изменить=)
Код: Выделить всё
Private Function CheckArr() As Boolean
        For i As Integer = 0 To 2
            If arr(i, 0) <> MyPoint.n AndAlso (arr(i, 0) = arr(i, 1) And arr(i, 0) = arr(i, 2)) Then Return True
            If arr(0, i) <> MyPoint.n AndAlso (arr(0, i) = arr(1, i) And arr(0, i) = arr(2, i)) Then Return True
        Next
        If arr(0, 0) <> MyPoint.n AndAlso (arr(0, 0) = arr(1, 1) And arr(0, 0) = arr(2, 2)) Then Return True
        If arr(0, 2) <> MyPoint.n AndAlso (arr(0, 2) = arr(1, 1) And arr(0, 2) = arr(2, 0)) Then Return True
    End Function

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Крестики Нолики

Сообщение MIT » 20.03.2009 (Пт) 13:18

Как работает?
Давай поясню. Значит, что мы имеем: поле 3х3, и правила победы. Правила простые - если в любой горизонтальной или вертикальной линии либо же по диагонали стоят одинаковые, но не нулевые элементы, значит победа.
Разберем построчно:
For i As Integer = 0 To 2 - поскольку правила как для вертикали, так и для горизонтали у нас аналогичны, то мы проверим совпадения за один цикл.
Код: Выделить всё
If arr(i, 0) <> MyPoint.n AndAlso (arr(i, 0) = arr(i, 1) And arr(i, 0) = arr(i, 2)) Then Return True
Если строка под номером i имеет первый элемент не нулевой (If arr(i, 0) <> MyPoint.n), то можно осуществлять проверку. AndAlso сдесь выполняет объединение взаимоисключающих условий, т.е. если первое условие не выполняется, то расчет второго не производится. Далее мы просто сравниваем первый (напомню, не нулевой) элемент со вторым и с третим; если они равны, значит строка содержит одинаковые значения, а значит партия выиграна (тогда функция возвращает True).
Аналогично для столбцов - только цифры и переменная поменяны местами.
В данном случае сравнение с двумя элементами можно описать вручную, но если бы поле у нас было бы, например, 25х25, то тут уже должны использоваться вложенные циклы.

Поскольку сравнение по диагоналям производится по статичным (неизменным) адресам, то эта проверка записана фиксированно и вне цикла.
Код If arr(0, 0) <> MyPoint.n AndAlso (arr(0, 0) = arr(1, 1) And arr(0, 0) = arr(2, 2)) Then Return True аналогичен вышеописанному, и здесь просто проверяются угловые точки.

Что сделать, что бы проверить на ничью:
Надо понимать, что ничья - это когда заполнены все места, однако партия не выиграна. Т.е. если после девяти проходов цикла в процедуре loop1 функция CheckArr ни разу не вернула True, значит ничья, соответственно и проверка тут не нужна.
Но если тебе все же (из спортивного интереса) хочется такую проверки сделать, то можно:
1) либо вызвать CheckArr, и если она вернула False, то проверить массив на наличие в нем пустых (MyPoint.n) элементов; если такие найдутся - значит партия не завершена, если их нет, то значит ничья.
2) скопировать и переделать CheckArr таким образом, что бы производилась обратная проверка, т.е. сравнивать не на совпадение, а на различие. Думаю ты и сам сможешь такое написать - сложного тут нисего нет :wink:

добавлено: вообще еще можно сделать проверку на теоретическую ничью, т.е. когда свободные места еще остались, но выиграть уже не получится ни при каком раскладе. Но мне, если честно, немного лениво :mrgreen:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

dumber
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 19.03.2009 (Чт) 18:46

Re: Крестики Нолики

Сообщение dumber » 21.03.2009 (Сб) 3:11

спасибо всем кто помог=) вот решил выложить что я доделал)может комунибудь пригодится=)

Код: Выделить всё
Module Module1
    Dim arr(,) As MyPoint
    Dim player As Boolean
    Private Enum MyPoint
        a
        X
        O
    End Enum
    Sub Main()
        ReDim arr(2, 2)
        loop1()
    End Sub
    Function loop1()
        Console.WriteLine("Do you want X to go first?(true/false)")
        player = Val(Console.ReadLine)
        If player = True Then
            player = MyPoint.X
            Console.WriteLine("Player 1: X")
        Else
            player = MyPoint.O
            Console.WriteLine("Player 1: O")
        End If
        For i As Integer = 0 To 8
            Console.WriteLine(" ")
            Call help()
            Console.WriteLine(" ")
            Do Until SetNextValue(i) : Loop
            If CheckArr() Then
                Console.WriteLine("Yeah!! Player ""{0}"" Won!!!", IIf(Not player, MyPoint.O, MyPoint.X))
                displayarray()
                Exit For
            End If
            Console.Clear()
            displayarray()
        Next i
        If CheckArr() = False Then
            Console.WriteLine(" ")
            Console.WriteLine("This is a Draw!")
        End If
        Console.WriteLine("")
        Console.ReadLine()
        End
    End Function
    Private Function SetNextValue(ByVal [Step] As Integer) As Boolean
        Console.WriteLine("This is move #{0}; ""{1}"" Player is making it; Choose your coordinates:", [Step], IIf(player, MyPoint.O, MyPoint.X))
        Dim uRow As Integer = -1
        Do Until uRow >= 0 And uRow <= 2 '
            If uRow <> -1 Then Console.WriteLine("This move is outside the array")
            Console.Write("Row: ")
            uRow = Val(Console.ReadLine)
        Loop
        Dim uCol As Integer = -1
        Do Until uCol >= 0 And uCol <= 2
            If uCol <> -1 Then Console.WriteLine("This move is outside the array")
            Console.Write("Col: ")
            uCol = Val(Console.ReadLine)
        Loop
        Console.WriteLine(" ")
        If arr(uRow, uCol) = MyPoint.a Then
            arr(uRow, uCol) = IIf(player, MyPoint.O, MyPoint.X)
            player = Not player
            Return True 'returns the value
        End If
        Console.WriteLine("This coordinates are taken!")
        Return False
    End Function
    Private Function CheckArr() As Boolean
        For i As Integer = 0 To 2
            If arr(i, 0) <> MyPoint.a AndAlso (arr(i, 0) = arr(i, 1) And arr(i, 0) = arr(i, 2)) Then Return True
            If arr(0, i) <> MyPoint.a AndAlso (arr(0, i) = arr(1, i) And arr(0, i) = arr(2, i)) Then Return True
        Next
        If arr(0, 0) <> MyPoint.a AndAlso (arr(0, 0) = arr(1, 1) And arr(0, 0) = arr(2, 2)) Then Return True
        If arr(0, 2) <> MyPoint.a AndAlso (arr(0, 2) = arr(1, 1) And arr(0, 2) = arr(2, 0)) Then Return True
    End Function
    Private Sub displayarray()
        For i As Integer = 0 To 2
            Console.WriteLine("{0} {1} {2}", arr(i, 0), arr(i, 1), arr(i, 2))
        Next
    End Sub
    Private Sub help()
        Dim tictactoe(2, 2) As String
        Console.WriteLine("Coordinates Table: (Row,Column)")
        tictactoe(0, 0) = "0,0"
        tictactoe(0, 1) = "0,1"
        tictactoe(0, 2) = "0,2"
        tictactoe(1, 0) = "1,0"
        tictactoe(1, 1) = "1,1"
        tictactoe(1, 2) = "1,2"
        tictactoe(2, 0) = "2,0"
        tictactoe(2, 1) = "2,1"
        tictactoe(2, 2) = "2,2"
        Dim i, j As Integer
        For i = 0 To 2
            For j = 0 To 2
                Console.Write(tictactoe(i, j) + " ")
            Next j
            Console.WriteLine("")
        Next i
    End Sub
End Module

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Крестики Нолики

Сообщение MIT » 21.03.2009 (Сб) 10:30

Ошибка:
Код: Выделить всё
        player = Val(Console.ReadLine)
        If player = True Then
Это две взаимоисключающие ошибки, т.к. Val вернет тебе 0 (в строке нет ни одной цифры, причем вернет в независимости от того что ты там напишешь: True или False). Если ты хочешь использовать true/false, то код должен выглядеть так:
Код: Выделить всё
        player = Console.ReadLine.ToLower
        If player = "true" Then


Добавлено:
:roll:
Извини, а ты на переменных экономишь что ли?
Код: Выделить всё
        player = Console.ReadLine.ToLower
        If player = "true" Then
            player = MyPoint.X
            Console.WriteLine("Player 1: X")
        Else
            player = MyPoint.O
            Console.WriteLine("Player 1: O")
        End If

КАК в логическую переменную ты сможешь записать Enum собственного изготовления (да еще и String)?

Попозже добавлено:
Вот исправленная версия
Код: Выделить всё
Module Module1
    Dim arr(,) As MyPoint
    Dim player As Boolean
    Private nums() As Char = New Char() {"0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c}
    Private Enum MyPoint
        a
        X
        O
    End Enum
    Sub Main()
        ReDim arr(2, 2)
        loop1()
    End Sub
    Function loop1()
        Console.WriteLine("Do you want X to go first?(true/false)")
        If Console.ReadLine.ToLower = "true" Then
            Console.WriteLine("Player 1: X")
        Else
            player = True
            Console.WriteLine("Player 1: O")
        End If

        For i As Integer = 0 To 8
            Console.WriteLine(" ")
            Call help()
            Console.WriteLine(" ")
            Do Until SetNextValue(i) : Loop
            If CheckArr() Then
                Console.WriteLine("Yeah!! Player ""{0}"" Won!!!", IIf(Not player, MyPoint.O, MyPoint.X))
                displayarray()
                Exit For
            End If
            Console.Clear()
            displayarray()
        Next i
        If CheckArr() = False Then
            Console.WriteLine(" ")
            Console.WriteLine("This is a Draw!")
        End If
        Console.WriteLine("")
        Console.ReadLine()
        End
    End Function
    Private Function SetNextValue(ByVal [Step] As Integer) As Boolean
        Console.WriteLine("This is move #{0}; ""{1}"" Player is making it; Choose your coordinates:", [Step], IIf(player, MyPoint.O, MyPoint.X))
        Dim uRow As Integer = -1

        Do Until uRow >= 0 And uRow <= 2
            Console.Write("Row: ")
            Dim input As String = Console.ReadLine
            If String.IsNullOrEmpty(input) Then 'ввели пустую строку
                Console.WriteLine("А можно попобробнее?..")
            ElseIf input.IndexOfAny(nums) = -1 Then 'строка не содержит цифр, а значит и Val скорее всего вернет 0
                Console.WriteLine("А вам число не в напряг ввести?")
            Else
                Dim v As Integer
                If Integer.TryParse(input, v) Then 'пытаемся пропарсить введенную строку как число. Если оно не число, значит функция вернет False
                    If v >= 0 And v <= 2 Then
                        uRow = v
                    Else
                        Console.WriteLine("Не-не-не-не-не! Мне надо корректное число, лежащее в пределе от 0 до 2!")
                    End If
                Else
                    Console.WriteLine("Нефиг чушь писать, могу ведь и обидеться!")
                End If
            End If
        Loop

        Dim uCol As Integer = -1
        Do Until uCol >= 0 And uCol <= 2
            Console.Write("Col: ")
            Dim input As String = Console.ReadLine
            If String.IsNullOrEmpty(input) Then 'ввели пустую строку
                Console.WriteLine("А можно попобробнее?..")
            ElseIf input.IndexOfAny(nums) = -1 Then 'строка не содержит цифр, а значит и Val скорее всего вернет 0
                Console.WriteLine("А вам число не в напряг ввести?")
            Else
                Dim v As Integer
                If Integer.TryParse(input, v) Then 'пытаемся пропарсить введенную строку как число. Если оно не число, значит функция вернет False
                    If v >= 0 And v <= 2 Then
                        uCol = v
                    Else
                        Console.WriteLine("Не-не-не-не-не! Мне надо корректное число, лежащее в пределе от 0 до 2!")
                    End If
                Else
                    Console.WriteLine("Нефиг чушь писать, могу ведь и обидеться!")
                End If
            End If
        Loop

        Console.WriteLine(" ")
        If arr(uRow, uCol) = MyPoint.a Then
            arr(uRow, uCol) = IIf(player, MyPoint.O, MyPoint.X)
            player = Not player
            Return True 'return the value
        End If
        Console.WriteLine("This coordinates are taken!")
        Return False
    End Function
    Private Function CheckArr() As Boolean
        For i As Integer = 0 To 2
            If arr(i, 0) <> MyPoint.a AndAlso (arr(i, 0) = arr(i, 1) And arr(i, 0) = arr(i, 2)) Then Return True
            If arr(0, i) <> MyPoint.a AndAlso (arr(0, i) = arr(1, i) And arr(0, i) = arr(2, i)) Then Return True
        Next
        If arr(0, 0) <> MyPoint.a AndAlso (arr(0, 0) = arr(1, 1) And arr(0, 0) = arr(2, 2)) Then Return True
        If arr(0, 2) <> MyPoint.a AndAlso (arr(0, 2) = arr(1, 1) And arr(0, 2) = arr(2, 0)) Then Return True
    End Function
    Private Sub displayarray()
        Console.WriteLine("┌──┬──┬──┐")
        For i As Integer = 0 To 2
            Console.WriteLine("│{0} │{1} │{2} │", IIf(arr(i, 0) = MyPoint.a, " ", arr(i, 0)), IIf(arr(i, 1) = MyPoint.a, " ", arr(i, 1)), IIf(arr(i, 2) = MyPoint.a, " ", arr(i, 2)))
            If i < 2 Then Console.WriteLine("├──┼──┼──┤")
        Next
        Console.WriteLine("└──┴──┴──┘")
    End Sub
    Private Sub help()
        Dim tictactoe(2, 2) As String
        Console.WriteLine("Coordinates  Table: (Row,Column)") 'вообще-то либо "Table coordinates" либо "Coordinates of the table"
        tictactoe(0, 0) = "[0,0]"
        tictactoe(0, 1) = "[0,1]"
        tictactoe(0, 2) = "[0,2]"
        tictactoe(1, 0) = "[1,0]"
        tictactoe(1, 1) = "[1,1]"
        tictactoe(1, 2) = "[1,2]"
        tictactoe(2, 0) = "[2,0]"
        tictactoe(2, 1) = "[2,1]"
        tictactoe(2, 2) = "[2,2]"
        Dim i, j As Integer
        For i = 0 To 2
            For j = 0 To 2
                Console.Write(tictactoe(i, j) + "  ")
            Next j
            Console.WriteLine("")
        Next i
        'и, да, вот еще что: процедура displayarray делает почти тоже самое. Не проще ли было переписать ее?
        'вот как-нибудь вот так вот:
        'For i As Integer = 0 To 2
        '    Console.WriteLine("[{0},0]  [{0},1]  [{0},2]", i)
        'Next
        'ну ведь проще же...
    End Sub
End Module
Может автору пригодиться...

Еще попозже добавлено:
заменил try на tryparse
дополнил процедуру displayarray большей наглядностью
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 89

    TopList  
cron