Что нового

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,473
Задача:
Вывести в консоль змейку, в виде английской буквы 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 - получил Золотую звезду!
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
А ответы куда, сюда публиковать?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,473
Ну конечно, а куда ещё? :laugh:
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
[#]
Код:
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!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,473
inververs
Неплохо!

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


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

WSWR

AutoIT Гуру
Сообщения
941
Репутация
362
Мой пример.

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:
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
:
:rofl: я тоже не понял что осваивающий это ранг
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,473
Ещё одно условие:

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

DarWiM

Продвинутый
Сообщения
527
Репутация
90
[#]
Код:
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!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,473
Снова обновил условия, см. первое сообщение темы.
 

DarWiM

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

glax24

Знающий
Сообщения
72
Репутация
14
Вот что получилось
ab6f3e76c8344ee1a2d067f7a0cba973.jpg
Код:
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
 
Верх