Что нового

[Осваивающий] Вывод змейки в консоль (в виде буквы S)

CreatoR

Must AutoIt!
Команда форума
Администратор
Задача:
Вывести в консоль змейку, в виде английской буквы S.

[box title=Пример]
Код:
 ***************
*
*
*
 **************
               *
               *
               *
               *
***************
[/box]

Условия:
[list type=decimal]
[*]Вывод должен осуществляться по вызову функции Snake(), которая принимает 4 параметра:
[box title=Параметры]
$W - Ширина змейки (допускается только численное значение не меньше 3-ёх)
$H - Высота змейки (допускается только численное значение не меньше 5-ти)
$sPen_Char - Символ вывода змейки, в примере выше это * (допускается только 1 символ, и не может быть пустой строкой)
$sBk_Char - Символ фонового заполнения змейки, в примере выше это ' ', т.е пробел (допускается только 1 символ, и не может быть пустой строкой)[/box]

[*]Использование подключаемых библиотек запрещено.
[*]Использование рекурсии запрещено.
[*]Для построения змейки использование цикла обязательно!
[*]Позволено использовать не более чем 1 цикл.
[*]Требуется предусмотреть корректность указанных параметров (см. описание к параметрам выше), в случае некорректности устанавливать код ошибки.
[/list]



Победитель в конкурсе:
glax24 - получил Золотую звезду!
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Ну конечно, а куда ещё? :laugh:
 

inververs

AutoIT Гуру
[#]
Код:
Snake(10, 5,"8")

Func Snake($W, $H, $sPen_Char = '*')
	If $H <= 4 Then
		ConsoleWrite('! Маленькая высота' & @LF)
		Return SetError(1, 0, 0)
	EndIf
	$sLine_1 = '|' & StringFormat('%' & $W - 1 & 's', $sPen_Char) & @CR
	$sLineHalf_1 = StringFormat('%' & Int($H / 2) - 1 & 's', '')
	$sLineMidle = '|' & StringFormat('%' & $W - 2 & 's', $sPen_Char) & '|' & @CR
	$sLineHalf_2 = StringFormat('%' & $H - 2 - Int($H / 2) & 's', '')
	$sLine_Last = StringFormat('%' & $W - 1 & 's', $sPen_Char) & '|'
	ConsoleWrite(StringReplace(StringReplace($sLine_1, ' ', $sPen_Char), '|', ' ') & @LF)
	ConsoleWrite(StringReplace($sLineHalf_1, ' ', $sPen_Char & @CR) & @LF)
	ConsoleWrite(StringReplace(StringReplace($sLineMidle, ' ', $sPen_Char), '|', ' ') & @LF)
	ConsoleWrite(StringReplace($sLineHalf_2, ' ', StringFormat('%'&$W&'s', $sPen_Char) & @CR) & @LF)
	ConsoleWrite(StringReplace(StringReplace($sLine_Last, ' ', $sPen_Char), '|', ' ') & @LF)
EndFunc   ;==>Snake
[/#]

Код удалён за нарушение правил конкурса.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
inververs
Неплохо!

А с циклами?
:whistle:


P.S.
Это нарушение правил конкурса, твой ранг это Скриптер, а конкурс для Осваивающих!
 

WSWR

AutoIT Гуру
Мой пример.

OffTopic:
Т.к. некоторые моменты мне непонятны - что есть высота змейки, и должен ли ее вывод быть непрерывным или однократным, так что, возможно, не совсем правильно... :smile:


[#]
Код:
Snake(60, 9, '*')

Func Snake($W, $H, $sPen_Char)
	Local $i, $n, $s, $string1, $string2, $string3 
	$string1 = ''
	$string2 = ''
	$string3 = ''

	For $i = 1 To $W - 1
		$string1 &= $sPen_Char
		$string2 &= ' '
	Next
	$string1 = $string1 & $sPen_Char
	$string3 = $sPen_Char & $string2
	$string2 = $string2 & $sPen_Char

	$n = 0
	$s = 0
	$H=Round($H/2)-1
	ConsoleWrite($string1 & @LF)
	While 1
		$n += 1

		If Mod($n, $H) = 0 Then
			ConsoleWrite($string1 & @LF)
			$s += 1
		Else
			If Mod($s, 2) = 0 Then
				ConsoleWrite($string3 & @LF)
			Else
				ConsoleWrite($string2 & @LF)
			EndIf
		Endif
;~ 	If $n=$H*2 Then ExitLoop ; выхода при 1-кратном использовании
	WEnd
EndFunc   ;==>Snake
[/#]

Код удалён за нарушение правил конкурса.

А на уровень-то я и не посмотрел :whistle:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Ещё одно условие:

Для построения змейки использование циклов обязательно!
 

DarWiM

Продвинутый
[#]
Код:
ConsoleWrite(Snake()&@LF)

Func Snake($iW=15, $iH=10, $sPen_Char='*', $sBG_Char=' ')
	Local $iHead=Floor(($iH-3)/2), $iBottom=Ceiling(($iH-3)/2), $sReturn=''
	If $iW<2 Or $iH<5 Then Return 'Не получится нарисовать букву S'
	If StringLen($sPen_Char)>1 Or StringLen($sBG_Char)>1 Then Return 'Параметры заданы не верно'
	For $iCountH=1 To $iH
		For $iCountW=1 To $iW
			Select
				Case $iCountH=1
					$sReturn&=$sPen_Char
				Case $iCountH<$iHead+2 And $iCountW=1
					$sReturn&=$sPen_Char
				Case $iCountH<$iHead+2
					$sReturn&=$sBG_Char
				Case $iCountH=$iHead+2
					$sReturn&=$sPen_Char
				Case $iCountH<$iHead+$iBottom+3 And $iCountW=$iW
					$sReturn&=$sPen_Char
				Case $iCountH<$iHead+$iBottom+3
					$sReturn&=$sBG_Char
				Case $iCountH=$iHead+$iBottom+3
					$sReturn&=$sPen_Char
			EndSelect
		Next
		If $iCountH<>$iH Then $sReturn&[email protected]
	Next
	Return $sReturn
EndFunc
[/#]

Код удалён за нарушение правил конкурса.

P.S. Только на днях репутация перевалила через 50, даже не заметил, что ранг другой..
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Снова обновил условия, см. первое сообщение темы.
 

DarWiM

Продвинутый
CreatoR
OffTopic:
А у меня была проверка на корректность.. :smile:
 

glax24

Знающий
Вот что получилось
Код:
Snake()

;Функция выводит змейку в консоль
Func Snake($iW = 16, $iH = 9, $sPenChar = "*", $sBkChar = ' ')
	Local $i
	Local $iCentr ; Центр
	Local $sWLine  = "" ; Линия
	Local $iWCount = 0 ; Количество символов в строке
	Local $iLineCount = 0 ; Количество строк
	Local $iAllCount = $iH * $iW ; Общее количество символов
	Local $sSnakeMsg = ''

    ;Проверка данных
	Select
		Case Not StringIsInt($iW) Or $iW < 3
			Return SetError(1, 0, "")
		Case Not StringIsInt($iH) Or $iH < 5
			Return SetError(2, 0, "")
		Case StringLen($sPenChar) <> 1 Or Not IsString($sPenChar) Or Not $sPenChar
			Return SetError(3, 0, "")
		Case StringLen($sBkChar) <> 1 Or Not IsString($sBkChar) Or Not $sBkChar
			Return SetError(4, 0, "")
	EndSelect

	$iCentr = Int($iH / 2)

	For $i = 0 To $iAllCount

		$iWCount += 1

		Select
			;Верх линия
			Case $iLineCount = 0
				If $iWCount = 1 Then
					$sWLine &= $sBkChar
				Else
					$sWLine &= $sPenChar
				EndIf
				;Центр
			Case $iLineCount = $iCentr
				If $iWCount = 1 Or $iWCount = $iW Then
					$sWLine &= $sBkChar
				Else
					$sWLine &= $sPenChar
				EndIf
				;Нижняя линия
			Case $iLineCount = $iH - 1
				If $iWCount = $iW Then
					$sWLine &= $sBkChar
				Else
					$sWLine &= $sPenChar
				EndIf
			Case $iLineCount < $iCentr And $iLineCount
				;Рисует левую сторону
				If $iWCount = 1 Then
					$sWLine &= $sPenChar
				Else
					$sWLine &= $sBkChar
				EndIf
			Case $iLineCount > $iCentr And $iLineCount
				;Рисует правую сторону
				If $iWCount < $iW Then
					$sWLine &= $sBkChar
				Else
					$sWLine &= $sPenChar
				EndIf
		EndSelect

		If $iWCount = $iW Then
			ConsoleWrite($sWLine & @CRLF)
			$sSnakeMsg &= $sWLine & @CRLF
			$sWLine = ''
			$iWCount = 0
			$iLineCount += 1
		EndIf
	Next

	MsgBox(0,"Snake", $sSnakeMsg)

EndFunc   ;==>Snake
 
Верх