HSP3에서 유파를 구현해 봅니다.
소개
원작자 : 자바로 유파를 구현해 보자 - Qiita
각 언어판의 구현이 유행하고 있습니다만, 이제 열거할 수 없을 정도로 퍼져 버렸으므로 이쪽을 부디.
【매일 자동 갱신】유파파 LGTM 랭킹! - Qiita
이제 자신이 사용한 적이 있는 언어는 다 써버렸다… 라고 생각했습니다만 .
그래서 HSP3로 써 보았습니다. 이 자료를 원하기 때문에 HSP3.51을 설치했습니다.
15년 정도 만지지 않았던 적도 있어(당시는 HSP2.55라든지 2.6라든지…), 언어 사양이 바뀌거나 단순히 잊고 있거나 했기 때문에, 의외로 고생했습니다.
코드
Qiita는 HSP의 신택스 하이라이트를 지원하지 않는 것 같습니다. . .
yubaba.hsp#uselib "kernel32.dll"
#cfunc lstrlenW "lstrlenW" var ; Windows API
randomize ; 乱数シードの初期化
screen 0, 1000, 400 ; ウィンドウサイズの指定
font "", 24 ; フォントの指定
objmode 2 ; コントロールのフォントも変更する
mes "契約書だよ。そこに名前を書きな。"
name = ""
input name, 500, 30, 30 ; テキストボックス作成
objsize 100, 30
button "送信", *clicked ; ボタン作成
stop
*clicked
sdim nameUnicode, 64 ; 文字列バッファを初期化
cnvstow nameUnicode, name ; マルチバイト文字列操作のためUnicodeに変換
mes "フン。" + name + "というのかい。贅沢な名だねぇ。"
newNameIndex = rnd(lstrlenW(nameUnicode))
sdim newNameUnicode ; Unicodeベースで1文字取り出す
memcpy newNameUnicode, nameUnicode, 2, 0, newNameIndex * 2
newName = cnvwtos(newNameUnicode) ; 通常の文字列に変換
mes "今からお前の名前は" + newName + "だ。いいかい、" + newName + "だよ。分かったら返事をするんだ、" + newName + "!!"
실행 예
텍스트 상자에 이름을 넣고 "보내기"버튼을 누르면 유파가 대답합니다.
HSP (Hot Soup Processor)
코드주의(특히 멀티바이트 관련)
령화가 되면 HSP에서도 유니코드(UTF-16)는 당연히 사용할 수 있게 되어 있다고 생각했습니다만, 비교적 귀찮았습니다.
멀티바이트 문자를 고려하여 문자열을 잘라내려면 먼저 원하는 문자열을 유니코드로 변환합니다.
cnvstow nameUnicode, name ; 文字数操作のためUnicodeに変換
그런 다음 입력된 이름의 문자 수를 계산하여 가져올 문자의 인덱스를 선택합니다. 문자 수 카운트 부분에서 Windows API를 사용하고 있습니다.
newNameIndex = rnd(lstrlenW(nameUnicode))
관련 :
lstrlenW
를 사용하기 위해서, 스크립트의 선두에서 이하와 같이 선언하고 있습니다.
#uselib "kernel32.dll"
#cfunc lstrlenW "lstrlenW" var
관련 : lstrlenW function (winbase.h) - Win32 apps | Microsoft Docs
그리고 선택한 색인으로 한 문자를 가져옵니다. 유니코드는 문자 당 2바이트이므로 문자 수와 원본 인덱스를 두 배로 합니다.
memcpy newNameUnicode, nameUnicode, 2, 0, newNameIndex * 2
여기서 strmid
를 사용하고 싶습니다만, 유니코드 문자열에서는 종단 이외에 NULL 문자(C언어로 말하는 \0
)가 나타나는 경우가 있기 때문에, 올바르게 동작하지 않습니다.
마지막으로, 가져온 문자를 일반 문자열로 되돌립니다.
newName = cnvwtos(newNameUnicode) ; 通常の文字列に変換
약속
이름을 넣지 않고 제출하면 떨어집니다. 원작 리스펙트
HSP3 프로그래밍 매뉴얼 「4.9. API 호출」
Reference
이 문제에 관하여(HSP3에서 유파를 구현해 봅니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/everylittle/items/b7c0bdc846f91bcae3b0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Qiita는 HSP의 신택스 하이라이트를 지원하지 않는 것 같습니다. . .
yubaba.hsp
#uselib "kernel32.dll"
#cfunc lstrlenW "lstrlenW" var ; Windows API
randomize ; 乱数シードの初期化
screen 0, 1000, 400 ; ウィンドウサイズの指定
font "", 24 ; フォントの指定
objmode 2 ; コントロールのフォントも変更する
mes "契約書だよ。そこに名前を書きな。"
name = ""
input name, 500, 30, 30 ; テキストボックス作成
objsize 100, 30
button "送信", *clicked ; ボタン作成
stop
*clicked
sdim nameUnicode, 64 ; 文字列バッファを初期化
cnvstow nameUnicode, name ; マルチバイト文字列操作のためUnicodeに変換
mes "フン。" + name + "というのかい。贅沢な名だねぇ。"
newNameIndex = rnd(lstrlenW(nameUnicode))
sdim newNameUnicode ; Unicodeベースで1文字取り出す
memcpy newNameUnicode, nameUnicode, 2, 0, newNameIndex * 2
newName = cnvwtos(newNameUnicode) ; 通常の文字列に変換
mes "今からお前の名前は" + newName + "だ。いいかい、" + newName + "だよ。分かったら返事をするんだ、" + newName + "!!"
실행 예
텍스트 상자에 이름을 넣고 "보내기"버튼을 누르면 유파가 대답합니다.
HSP (Hot Soup Processor)
코드주의(특히 멀티바이트 관련)
령화가 되면 HSP에서도 유니코드(UTF-16)는 당연히 사용할 수 있게 되어 있다고 생각했습니다만, 비교적 귀찮았습니다.
멀티바이트 문자를 고려하여 문자열을 잘라내려면 먼저 원하는 문자열을 유니코드로 변환합니다.
cnvstow nameUnicode, name ; 文字数操作のためUnicodeに変換
그런 다음 입력된 이름의 문자 수를 계산하여 가져올 문자의 인덱스를 선택합니다. 문자 수 카운트 부분에서 Windows API를 사용하고 있습니다.
newNameIndex = rnd(lstrlenW(nameUnicode))
관련 :
lstrlenW
를 사용하기 위해서, 스크립트의 선두에서 이하와 같이 선언하고 있습니다.#uselib "kernel32.dll"
#cfunc lstrlenW "lstrlenW" var
관련 : lstrlenW function (winbase.h) - Win32 apps | Microsoft Docs
그리고 선택한 색인으로 한 문자를 가져옵니다. 유니코드는 문자 당 2바이트이므로 문자 수와 원본 인덱스를 두 배로 합니다.
memcpy newNameUnicode, nameUnicode, 2, 0, newNameIndex * 2
여기서
strmid
를 사용하고 싶습니다만, 유니코드 문자열에서는 종단 이외에 NULL 문자(C언어로 말하는 \0
)가 나타나는 경우가 있기 때문에, 올바르게 동작하지 않습니다.마지막으로, 가져온 문자를 일반 문자열로 되돌립니다.
newName = cnvwtos(newNameUnicode) ; 通常の文字列に変換
약속
이름을 넣지 않고 제출하면 떨어집니다. 원작 리스펙트
HSP3 프로그래밍 매뉴얼 「4.9. API 호출」
Reference
이 문제에 관하여(HSP3에서 유파를 구현해 봅니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/everylittle/items/b7c0bdc846f91bcae3b0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)