はてなキーワード: Voidとは
あとワークエリアは流石にu8 buf[16]; とかしておいて
「(s16)(((s16*)buf)+0) は x で…+2 は y で…」なんてやってられないので
(snip)
とかで this = (HOGE)buf; してから this->x とか this->y とか にしたらだいぶ見た目がふつうになったンゴ!
(わかる人ならこれで大丈夫だと思うけど)いくらなんでも説明が雑すぎたので集合知のためにもう少し詳しく残しておきますね。
typedef struct { Map *map; s16 x, y; s16 n, c; s16 w, h; } TH_REGISTER_MAP, *TH_LPREGISTER_MAP; u8 g_pThisRegister[16]; void thDemo_WallpaperInit(void) { /* s16 *reg = (s16*)g_pThisRegister; *(reg + 0) = 0; *(reg + 1) = 0; *(reg + 2) = 256; *(reg + 3) = 160; **/ TH_LPREGISTER_MAP reg = (TH_LPREGISTER_MAP)g_pThisRegister; reg-> map = g_pMaps[1]; reg-> x = 0; reg-> y = 0; reg-> w = 256; reg-> h = 160; } void thDemo_WallpaperMain(void) { /* Map *map = g_pMaps[1]; TH_LPREGISTER_S16 reg = (TH_LPREGISTER_S16)g_pThisRegister; *(reg + 0) = *(reg + 0) + 1; *(reg + 1) = *(reg + 1) + 1; MAP_scrollTo(map, ((*(reg + 0)) % (*(reg + 2))), ((*(reg + 1)) % (*(reg + 3)))); **/ TH_LPREGISTER_MAP reg = (TH_LPREGISTER_MAP)g_pThisRegister; reg->x++; reg->y++; MAP_scrollTo(reg->map, (reg->x) % (reg->w), (reg->y) % (reg->h)); }
あなた様のおっしゃる通りに、法律で人の自由を縛ることにはもっと慎重であるべきだと猛省いたしました。
単なる土下座に留まらず、中国より古来から伝わる「三跪九叩頭の礼」を致します。
なお、冗長な記述を避けるためにJavaで記述させていただきます。
public static void main (String[] args){
for(int i=1; i<=3; i++) {
System.out.println("跪");
for(int j=1; j<=3; j++) {
System.out.println("起");
}
System.out.println("起立");
}
}
}
御清聴の程有難く存じます。
私は直接ウェブ検索を行うことはできませんが、あなた自身で関連するキーワードで検索エンジンを使用することができます。以下は、検索する際に使えるキーワードの例です:
"cloud smoke vortex art"
"mysterious swirling cloud illustration"
"smoke entering vortex central light"
"fantasy cloud swirl center"
"artistic representation of smoke entering central void in clouds"
これらのキーワードを使用して検索すると、あなたが表現しようとしているイメージに近いアートやイラストが見つかる可能性があります。画像検索結果から、目的に合ったものを見つけることができるでしょう。
横じゃが、こんな感じでいいんかね?ChatGPTじゃなくてBing先生だが同じ事やろ
わいの問:
今週の水曜日の日付を出力するJavaコードを教えてください。
import java.time.LocalDate; import java.time.DayOfWeek; import java.time.format.DateTimeFormatter; public class Main { public static void main(String[] args) { // 現在の日付を取得 LocalDate today = LocalDate.now(); // 今週の水曜日の日付を取得 LocalDate wednesday = today.with(DayOfWeek.WEDNESDAY); // 日付をフォーマットして出力 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); System.out.println(wednesday.format(formatter)); } }
(動かしてはないけど、まあパッと見でおかしい所は無さそうやし、動くやろ。。。)
もうこのやりとりの時点でダメやん?
ダメじゃねえよ。要件を正確に記述できないならコードなんて書けるわけない。
空気読んでいい感じに読み取ってよというのを求めてるなら、仕様書すら書けないダメプログラマーってことだろ。
コンピューターの中では数字で日付は管理されててそれはJavaでは日付のオブジェクトとして表されるんだけど、「今週=現在の週の水曜日」を表すオブジェクトが欲しい
やったぞ
java.time パッケージの LocalDate クラスや TemporalAdjusters クラスを使用して、「今週の水曜日」の日付オブジェクトを取得できます。
以下のコードは、現在の日付に基づいて今週の水曜日の LocalDate オブジェクトを返す Java の関数です。
import java.time.temporal.TemporalAdjusters;
public static void main(String[] args) {
System.out.println(getThisWeeksWednesday());
}
public static LocalDate getThisWeeksWednesday() {
LocalDate today = LocalDate.now();
return today.with(TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY));
}
}
この関数は現在の日付を取得し、それを TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY) メソッドに渡して、今週の水曜日の日付を取得します。今日が水曜日である場合、それが返されます。それ以外の場合は、次の水曜日の日付が返されます。
今日が週内のどの日であったとしても(木曜日や金曜日であったとしても)その週の水曜日を表すオブジェクトを返す関数を示してください。
それには、今週の最初の日を求め、そこから水曜日までの日数を加算するアプローチを使用します。以下のコードでは、週の最初の日を月曜日と仮定しています:
import java.time.temporal.TemporalAdjusters;
public static void main(String[] args) {
System.out.println(getThisWeeksWednesday());
}
public static LocalDate getThisWeeksWednesday() {
LocalDate today = LocalDate.now();
LocalDate monday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
return monday.plusDays(2);
}
}
このコードは、まず今日の日付を取得し、それから TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY) メソッドを使用して今週の月曜日の日付を取得します。そして、月曜日から2日後の日付(水曜日)を取得するために plusDays(2) メソッドを使用します。
VOID通ったいま、ちょっと前にVOIDのHO2とHO4は人間そっくりな見た目のアンドロイドで来るべきだしあまりにも人間離れしてメカメカしい見た目はKPが止めるべきって言ってやや燃えてたふせったー思い出したなあ。
通過した今はその意見ちょっと分かるんだけど未通過ではそんなの分かるわけないし、KPだってぴくるーの仮置きイラストでオッケー出したら当日全然メカで来た、とかもありえるだろうし難しいなあ。金出して立ち絵依頼してきてたり、時間かけて自分で描いてたりするだろうし、そこでいやだめですピクルーの絵でやってください、とは言えない。
VOIDってなんか近未来のかっこいい戦闘できる有名シナリオ!と思ってあなたはアンドロイドですって言われたらそりゃあ『ぼくのかんがえたさいきょうのあんどろいど』作ってきちゃうよなあ。
バンド名: Shadowrealm
アルバムタイトル: Apocalypse Chronicles
説明: このアルバムは、終末、死生観、地獄など、深いテーマに基づいた曲で構成されています。"Apocalypse Chronicles"は、世界が滅亡に向かう物語を表現しており、バンド名の"Shadowrealm"は、深く謎めいた世界観を表現しています。
この曲は、人類の終末時について歌っています。悲惨な状況にある人々が、最後の希望として再び希望を見つけ、力を取り戻すために戦う物語です。
神の怒りが地上に降り注ぎ、人間たちは絶望に陥ります。この曲は、神の正義と償いについて歌っています。
地獄の火が全てを焼き尽くす世界を表現しています。曲の中では、この火に包まれた者たちが、激しい苦痛に耐えながら、絶望とともに永遠に生きることを歌っています。
不死の戦士たちが集い、戦いの準備を始めます。曲の中では、彼らが魔法と剣で敵を倒し、最終的に勝利を手にする姿が描かれています。
死後の世界で待ち受ける謎めいた影たちが、死者を誘惑していきます。この曲は、死生観について考えるきっかけを与えるような深い世界観が表現されています。
黒魔術を使う霊能者の支配する世界を描いた曲です。彼の魔法によって、死者たちが蘇り、地上に畏怖の念を与えます。
地獄に落ちた魂たちが、一つにまとまり、軍団を作り出す様子が描かれます。曲の中では、彼らが地上に攻め込み、人々を苦しめる様子が描かれています。
何もない虚無の世界に取り残された人々が、自分たちの存在意義を問いかけます。この曲は、生と死、善と悪、そして存在意義についての深い哲学的思考が表現されています。
あれ見てちょっとでも面白いと思った人とはもう会話できる気がしないんだよな。
1カット1カット全てがダメというかマジで何も伝わってこないというか
これ絶対何も言いたいことない人拘りとかなんもない人が中核になって作ってる。
それがもう全体に現れてるので1クールどころか初回1話全部どころか
1話の序盤3分ぐらいで見るに耐えなくてオエッとなる。
不味いというより味がなんもしない。
薄め過ぎたジュース飲まされてるような感じ。
勿論ちゃんと全部見て理屈っぽく一個一個ダメさ説明しようとしたら出来るけど
そこまでする元気もわかないというかそこまでする値打ちが無いというか。
だからわかってほしいんだけど
作品のどこかが思想的に気に入らないとかそういう内容のある嫌悪やアンチ感情じゃなくて
単純にこれ薄めたジュースだろって意味でこんなもんがテレビで流れてるのが信じられないんだよな。
でも俺が見た限り作画がいいところなんか一個もない。
https://www.youtube.com/watch?v=A6UVAzUM-uo
たまたまつべで出てきた後半の方の切り抜きで見せ場のアクションだと思うけどすげーだろこれ。
どういう奴がレイアウト切ってるんだ。クリエイティブってナニ?って聞きたくなる。
上手いとか下手とか言うより虚無を感じる。なんなんだこれ?なんなんだこれ?
(百合どころかメイン2人に限らず全てのキャラの会話や感情がなんも無いように俺には見えるが。)
こんなに本当の意味で虚ろというかnullというかvoidというか
こんなもん見て何も感じないのか?異様さを感じないのか?
「変な味がする」どころじゃねーぞこれは。わからないのか?
不正解でscore += 0; と書いているのは静的解析がelse節を省略すると指摘してくるから。
何もしていない、はそのとおり。
不等号がいい具合に化けてるのでそのままにしておく。
import java.util.*; public class Main { public static void main(String[] args) { // 入力のparse (中略:int numに問題の数、String list[i][] に問題のリストを格納している) // 採点 int point = 0; for (int i = 0; i < num; i++) { String question = list[i][0]; String answer = list[i][1]; if (question.equals(answer)) { // 完全一致 point += 2; } else { if (question.length() == answer.length()) { // 文字数は等しい(部分点の可能性がある) point += scoring(question, answer); } else { // 不正解 point += 0; } } } System.out.println(point); } // 長さが同じ文字列を採点する // 長さが違う文字列を受け渡したときは正しく動作しない private static int scoring(String question, String answer) { int length = question.length(); int score = 2; for (int i = 0; i < length; i++) { (中略:文字が違うたびにscoreを-1して、socreが0以下になったらそのままreturn) } return score; } }
自動で安価をつけて返信するプログラムでもこんなに長く複雑になる(一部抜粋)
/**************************************
以下のCSV_DIR, FILE_PATHS, SETTINGSを書き換えてね。 <h3>o- *************************************/</h3>
//CSVファイルが置かれてるディレクトリのパス。投稿前にエラー出たら大体ここの設定ミス。 例:"C:\\Users\\sakuraimasahiro\\Documents\\iMacros\\Macros\\rentou\\";
'C:\\Users\\USER\\Desktop\\iMacros\\Macros\\rentou\\';
//ファイルのパス。CSVは絶対パスで、拡張子も必要。iimは相対パスでよく、拡張子不要。
const FILE_PATHS = {
textCsv: CSV_DIR + 'textNoAnker.csv',
//レス用投稿文が書かれたCSV。通常とレス用で分けないなら同じファイルを使えばいい。
replyTextCsv: CSV_DIR + 'textReply.csv',
};
baseWaitTime: 5,
//baseWaitTime+0~waitTimeRange(ランダム)だけ待つ
waitTimeRange: 5,
//連投しすぎだと忠告された場合に処理を一時停止させる時間(秒)
waitTimeForAvoidingPunishment: 60 * 30,
//メール
mail: 'sage',
//名前設定
name: '',
//以下、偽装ワッチョイ設定。浪人でワッチョイを非表示にしてるときだけtrueにしてね。
//妙なニックネーム(ワッチョイ、アウアウウーなど)をランダムで決めて付加するかどうか。true=付加する。false=付加しない。
//妙なニックネームの後に付く8桁の文字列をランダムで決めて付加するかどうか。
},
//アンカー無し投稿をするならtrue。しないならfalse。noAnkerPostかreplyPostのどちらかはtrueにすること(両方trueでもOK)。
//アンカー付き投稿(返信)をするならtrue。しないならfalse。もしnoAnkerPostとreplyPostの両方がtrueの場合、投稿は返信が優先され、返信対象が見つからなくなったらアンカー無し投稿をする。
//最初に取得するアンカー無し投稿文CSVファイルの行番号。もし返信用と同じCSVファイルを使うなら-1と入力。
noAnkerPostTextCsvStartRow: 1,
//最初に取得する返信用投稿文CSVファイルの行番号。もしアンカー無しと同じCSVファイルを使うなら-1と入力。
//テキストCSV/返信用テキストCSVの取得行が最終行に達したら最初の行まで戻るかどうか。true=戻る。false=マクロ終了。
//返信する場合、これより小さなレス番には返信しない。返信を投稿すると、この数値は前回の返信先のレス番に更新される。
minAnker: 895,
//返信する場合、名前に以下の文字列を含む投稿にアンカーをつけて返信する(ワッチョイやIPなど名前フィールドにあるものならなんでも可)。配列で複数指定可能。指定無しなら空配列([])。filterNamesとfilterNamesNotIncluded共に無指定ならレス番1から順に返信していく(minAnkerが設定されてればそこから順に)。以下のfilter系は全て併用可能。
//↑とは逆に、名前に以下の文字列を含まない投稿にアンカーをつけて返信する。↑と併用も可能。
//返信する場合、本文に以下の文字列を含む投稿にアンカーをつけて返信する。
filterText: ['自演かな', '自演わらわら', 'スクリプト使うの', '安価ガバ', '>>660', '自演で擁護', '最後' ,'あいうえお', 'かきくけこ', 'さしすせそ', 'なにぬねの', 'はひふへほ', 'まみむめも', 'やいゆえよ', 'やゆよ', 'らりるれろ', 'わいうえを', 'わをん', 'わいうえをん'],
},
//自分のIPアドレスの確認。VPNとかでIPを変更してマクロを動かしてるとき、突然VPNが作動しなくなってIPが元に戻ったときにマクロを止めるためのもの。
//以下の文字列が自分の現在のIPアドレスに含まれている場合、マクロを一時停止する。基本的に自分の本当のIPアドレスを入力。
},
//浪人設定。最後に動作を確認したのは5年くらい前で、今も同じように動作するかは、浪人を持ってないから確認できずわからない。
//浪人にログインしてるかどうかをチェックするかどうか。trueならする。falseならしない。trueにしていてもし浪人にログインしていないことを確認したらログインしにいく。
password: '1234',
},
};
/**************************************
設定箇所終わり。
https://info.5ch.net/index.php/%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E6%97%A9%E8%A6%8B%E8%A1%A8 <h3>o- *************************************/</h3>
/**************************************
・NULL演算子(??)は使えない。論理積(&&)は使える。
・オブジェクトの分割代入はできない。
・importはできない。 <h3>o- *************************************/</h3>
/**************************************
関数 <h3>o- *************************************/</h3>
/**
* ここから始まる。
*/
checkSettings();
var _TextCsvCursors = new TextCsvCursors(
SETTINGS.postSettings.noAnkerPostTextCsvStartRow > 0
? SETTINGS.postSettings.noAnkerPostTextCsvStartRow - 1
: SETTINGS.postSettings.noAnkerPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
SETTINGS.postSettings.replyPostTextCsvStartRow > 0
? SETTINGS.postSettings.replyPostTextCsvStartRow - 1
: SETTINGS.postSettings.replyPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
);
var _LoopStatuses = new LoopStatuses(0, SETTINGS.postSettings.minAnker);
const _MyPosterName = new MyPosterName({
name: SETTINGS.nameSettings.name,
});
const _ThreadUrl = openPromptThreadUrl();
//ループ
while (true) {
SETTINGS.ipSettings.checkIp && checkCurrentIpNotTheIp();
//スレを開く
openUrl(_ThreadUrl.fullUrlHttps());
//浪人にログインする設定なら、浪人にログインしているかどうかを確認し、していなければログインしにいく。
if (SETTINGS.roninSettings.checkLogin) {
}
}
if (SETTINGS.postSettings.replyPost) {
const targetAnkerNumber = createPostDOMList()
.filterPostnumberHigher(_LoopStatuses.currentMinAnker())
.filterByPostername(SETTINGS.postSettings.filterNames)
.filterByPosternameNotIncluded(
SETTINGS.postSettings.filterNamesNotIncluded,
)
.filterByText(SETTINGS.postSettings.filterText)
if (targetAnkerNumber !== null) {
const r = _TextCsvCursors.takeNextRowTextAsReply(targetAnkerNumber);
messageDisplay(`返信対象有り。アンカー先: ${targetAnkerNumber}`);
return {
...r,
updatedLoopStatuses:
_LoopStatuses.updateMinAnker(targetAnkerNumber),
};
}
}
if (SETTINGS.postSettings.noAnkerPost) {
//返信対象無し、或いは返信しない設定の場合。アンカー無し投稿文を作る。
const r = _TextCsvCursors.takeNextRowTextAsNoAnker();
messageDisplay('返信対象無し。アンカー無し投稿。');
return {
...r,
updatedLoopStatuses: _LoopStatuses,
};
}
return null;
})();
if (p) {
//投稿。
nickname: SETTINGS.nameSettings.nickname,
korokoro: SETTINGS.nameSettings.korokoro,
area: SETTINGS.nameSettings.area,
}),
SETTINGS.mail,
p.text,
);
//_TextCsvCursorsと_LoopStatusesを更新。
_TextCsvCursors = p.updatedTextCsvCursors;
_LoopStatuses = p.updatedLoopStatuses.incrementPostCount();
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
} else {
`返信対象が現われるのを待機中...。`,
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
}
wait(SETTINGS.baseWaitTime + randomRange(0, SETTINGS.waitTimeRange));
}
}
/**
* 投稿処理と投稿結果を見てリトライしたりマクロ終了したり。
* @param {string} serverName サーバー名
* @param {MyPosterName} _MyPosterName
* @param {string} postMail メール
*/
serverName,
postMail,
_MyText,
retryTimes = 0,
) {
const r =
retryTimes === 0
? new ValuesOfPost(serverName, _MyPosterName, postMail, _MyText).post(
postTo5chTread,
)
serverName,
postMail,
_MyText,
).postSubstring(retryTimes, postTo5chTread, postConfirm);
if (r) {
back();
return;
}
wait(7);
const error = createPostErrorMessage().analyze();
messageDisplay(error.message);
if (error.order === 'KILL') {
kill();
} else if (error.order === 'SKIP') {
return;
} else if (error.order === 'TRUNCATE') {
back();
serverName,
postMail,
_MyText,
retryTimes + 1,
);
} else if (error.order === 'WAIT') {
wait(SETTINGS.waitTimeForAvoidingPunishment);
serverName,
postMail,
_MyText,
retryTimes,
);
} else if (error.order === 'LOGIN') {
serverName,
postMail,
_MyText,
retryTimes,
);
}
return;
}
/**
* 現在のIPアドレスに、SETTINGS.ipSettings.avoidTheIpの値が含まれていないことを確認する。含まれていたらマクロを一時停止。
* @returns
*/
function checkCurrentIpNotTheIp() {
openUrl('https://www.cman.jp/network/support/go_access.cgi');
const _IpAdress = createIpAdressFromCMan();
if (_IpAdress.includes(SETTINGS.ipSettings.avoidTheIp)) {
pause('現在のIPに指定した値が含まれていることを確認。');
}
return;
}
/**
* @returns
*/
if (
SETTINGS.postSettings.noAnkerPost === false &&
SETTINGS.postSettings.replyPost === false
) {
return kill('設定エラー。noAnkerPostとreplyPost両方ともfalseになってる。');
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow < 0 &&
SETTINGS.postSettings.replyPostTextCsvStartRow < 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRowとreplyPostTextCsvStartRow両方とも-1になってる。',
);
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow === 0 ||
SETTINGS.postSettings.replyPostTextCsvStartRow === 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRow/replyPostTextCsvStartRowの初期値は-1或いは1以上で。',
);
}
}
/**
* 入力フォームを表示して入力されたスレのURLを受け取る。
*/
function openPromptThreadUrl() {
const url = prompt('スレURLを入力');
}
/**
* 開いてるスレのレス全て読み取ってPostListインスタンスを作って返す。
* 重すぎるので使うのやめ。どうやらインスタンスの大量生成が原因な模様。
*/
const posts = window.document.getElementsByClassName('post');
return new PostList(Array.from(posts).map((e) => new Post(e)));
}
/**
* 開いてるスレのレス全て取得してPostDOMListに格納して返す。
* @returns
*/
function createPostDOMList() {
const posts = window.document.getElementsByClassName('post');
for (let index = 0; index < posts.length; index++) {
//HTMLCollectionからElementを1つずつ抽出して配列に。
arrPostDOMList.push(posts.item(index));
}
return new PostDOMList(arrPostDOMList);
}
/**
* 開いてる投稿結果画面に表示されてるエラーを読み取ってPostErrorMessageインスタンスを作って返す。
*/
function createPostErrorMessage() {
window.document
Steamで買った『Recursed』というゲームを全ステージクリアしたので、記念に感想を書く。
Steam:Recursed
https://store.steampowered.com/app/497780/Recursed/?l=japanese
一見すると『Recursed』は2Dのレトロな雰囲気のアクションゲームである。操作はシンプルで、方向キーで左右に移動し、アクションはジャンプと物をつかむ/投げるだけだからだ。部屋の中を移動してブロックをつかんで足場を作ったり、鍵をつかんで扉を開錠したりしてゴールへと到着(crystalを獲得)すればステージクリアだ。
ステージの始めはチュートリアルの様に簡単だが、ステージを経るごとに難しくなり、そのうち何度も試行錯誤したり難しさのあまり何十分も頭を抱えたりもした。
この複雑さを生み出す要因は箱(ゲーム中表記ではChest)である。このゲームでは箱の中へジャンプすることで部屋の内に入れるが、一度箱の外にでると箱の内部状態はリセットされてしまうのだ。よって箱の中にブロックや鍵などのオブジェクトを持ち込んでも保存することはできないし、ブロックの位置もリセットされるし、開錠した扉もまた施錠されてしまうことになる。
さらに大きな特徴として、箱を持ち歩いて移動することができるのだ。それにより、箱を持ったまま別の箱に入ったり箱を持って箱の外にでることもできる。
そして、ステージを経ると箱の中の部屋は箱の外と同じ部屋という場面に出くわす。Recursedは『再帰呼び出し』という意味らしいが、まさにこのゲームのタイトル通りの現象が起こるのだ。そして、以降のステージでは再帰を交えることでパズルの複雑さはより深まっていく。
再帰は数学的帰納法やアルゴリズムでは定番の概念だが、それがパズルとなってプレイヤーの思考回路を奪ってくる。私はかつて社畜プログラマとしてJavaプログラミングを経験していたので、箱に入ることはメソッドを呼び出すことの様に感じた。オブジェクトを持って箱に入ることは引数を使ってメソッドを実行することであり、オブジェクトを持って箱の外に出ることはreturn文でメソッドを終わらせることであった。
「ゴール前の段差が大きくブロックが必要だから、ブロック生成メソッドを呼び出してブロックオブジェクトを返り値として渡さなくてはいけないけど、そうすると鍵オブジェクトをゴールメソッドの引数として渡すことができなくて……、いっそのこと、ブロックメソッド内からゴールメソッドを呼び出すべきか……、メソッドの返り値は一つだけだが何度も呼び出せばいけるか? この緑色のオーラはなんだ? Staticを意味するのか? Staticなオブジェクトの位置情報をあらかじめ変更しておけば、ゴールメソッドで引数渡しをする必要がなくなるのか?」
こんなことを一つのステージをクリアするだけのために何十分も考えていたのだ。念のために書いておくが、ゲーム内には数学用語やプログラミング用語は一切出てこない。ただ単に、私にJavaプログラミングの経験があるからその用語でパズルを考えていただけだ。ゲーム内で箱から出入りしたりオブジェクトを箱の中から出し入れするとどうなるかを、Eclipseでステップ実行するように想起していた。ちなみに、ゲーム内で存在しない部屋や壁の中に移動しようとするとparadoxが発生して強制的に特殊な部屋へ移動されるが、私はその度にステップ実行でExceptionに遷移されたことの様に感じた。他の言語に精通するプログラマだったり数学畑の人ならば、私とは異なる概念でパズルを思考をするのだろうか。
プログラマを辞めて何年もプログラミング的思考をしてこなかった私でも全ステージクリアすることができたのだから、学校でプログラムを学んでいたり現役でプログラミングをしてきた人ならばこのゲーム『Recursed』をクリアすることは可能だろう。いっそのこと、『Recursed』のクリアすらできない人にプログラミングができるのか? と煽ってみたいくらいだ。
ちなみに、もし私が社畜プログラマ時代にこのゲームをやったらブチ切れていただろう。なんで仕事でプログラミングで脳を酷使した上に自宅のゲームでも同じようなプログラム的な思考をしなければならないんだよと。プログラミングから何年も離れていた今の私にとって『Recursed』は、プログラミングや単体テストが無事成功した時の快楽を思い出させるものだった。
『Recursed』はパズルとしての難易度は非常に高いが、理不尽な解法を求められることはない。理不尽な解法のクイズやパズルには怒りが湧いてくる。ひと昔前のクイズ番組を見たことのある人なら『モヤッとボール』を投げつけたくなる、と言えばその感情が伝わるだろう。『Recursed』はどんなに難しいステージでも、ただただ開発者のパズル作成能力に感嘆するだけで怒りは湧いてこない。
似たようなアクション風パズルゲームとして有名なのは『The Witness』であろう。『The Witness』も私が好きなパズルゲームであり、ゲームとして高い評価を得ていることに間違いはないのだが、しばしば理不尽な解法を求められるパズルがありその度に私は怒りが湧いてきたものだ。そう考えると、『Recursed』はパズルとしての洗練さだけなら『The Witness』を超えるものだと私は思う。
具体的にパズルを解説するととただのネタバレになってしまうので(もっとも、文字だけでパズルの解法を説明できないのだが)、『Recursed』で私が好きなステージを述べる。順番は攻略順に並べた。
チュートリアルの様に簡単だったこれまでのステージから突如再帰の概念を見せつけられることで、このゲームのタイトル名の意味を理解することになった。
鍵を手に入れたら扉に到達できず、先に扉に到達したら鍵が手に入らずで、まさにインターロックの名前に相応しいステージだった。
一画面だけのオブジェクトが少ないシンプルなステージだが、氷の壁に阻まれてゴールできず苦戦した。試行錯誤の繰り返しの末クリアできたが、何故クリアできたのかがわからない。
The Voidのステージはどれもこれまでの集大成という感じでやりごたえあったが、中でも頭をひねらせたのがこれ。ゴールの部屋を水没させたり水の無い状態で入ったりして鍵を運搬するのに苦労した。
箱を左右へ投げて移動を繰り返して、高い位置にあるゴールを目指すのがまさにEscalateというステージ名そのものだった。paradoxを発生した後のパターンが複雑だったのが印象に残っている。paradoxを発生させたらcrystal獲得(通常のクリア)できないのかよ……という落胆は大きかった。しかし、それだけにcrystal獲得とdiamond獲得(paradox発生によるクリア)のどちらも大きな達成感を得られた。
簡単そうに見えて難しく、唯一ステージを飛ばして次のステージへと進んだので印象に残っている。後に複数日に及ぶ数時間の試行錯誤で改めてこのステージをクリアができて、クリアにかかった時間が最も長くなったステージでもある。しかしながら、おそらく開発者の想定外の方法でのクリアであり。初期画面から右の方へ一切行かずにOobleckさえ使用しないというクリア方法にスッキリしなかった。といっても、開発者の想定を無視するゴリ押し的なクリアを見つけたのはこのステージだけだった。
The Void/Escalateと似たコンセプトのステージだが、釜(JavaにおけるThread?)のギミックを利用したより複雑な構成となっている。高い位置にあるゴールを目指すのは、やはりFlightというステージ名そのものだった。
この記事を投稿する前にエンディングを見れていないことに気づいた。
全ステージクリア(全てのCrystal取得)したからと、この記事を執筆するためにネタバレを気にせず攻略情報を調べていたけど、エンディングなんてわかる訳ねえよ。The Void/Trilemmaの最後にCrystal取得とは関係ない意味深なオブジェクトがあることには気づいていたけど……。ちなみに、私のSteam実績によるとdiamondとrubieの全取得はできてないけれども、もう取得する気力はない。パズルゲームガチ勢にとっては、実績全解除を目指さない私は軟弱者に映るのだろうか? 攻略を調べずに実績全解除できる人は、高い論理的思考能力を有しているに違いない。
Kindleに溜め込んだ商業BLのコレクションたち。最もお気に入りの作品たちについては前に書いてしまったので、今回は書かない。今回は「しゅみじゃない」~「けっこう好き」までのレベルが入り乱れる。せっかくの増田だし、辛辣なレビュー書いても消されたりしないので、素直に思ったことをぶちまけよう。
初めて買った商業BL。上下巻ある。表紙が綺麗だけど、中身はというと、そこまで絵が上手という訳でも……。特別下手でもないが。綺麗めの少女漫画といった感じ。ストーリーは、白泉社の匂いがする。と思ったら、作者は白泉社の、雑誌で少女漫画家としてデビューした人だった。
主人公(攻め)がドクズなので、受けの粘り勝ちなラストだけど、それでいいのかお前(受け)は? ともやもやした。あと、BLで性格の悪い脇役の女を見せつけられるのは、あまり気分のいいものではない。少女漫画でも性格の悪い脇役の女の登場はあまりいい気分ではないけど、まあ、必要悪だから仕方ないなと思う。
男だらけの登場人物の中で紅一点の女キャラが性悪って……。と思ったけど、初読み商業BLだったので、まあそういうもんなのかなと思ったし、実際、BLワールドでは女が悪役はそんなに珍しいものではないと後に知る。(悪役で出てくるくらいなら女一切出て来なくてよし!勢もBL読みには多いようだと、更に後に知る)
既刊三巻まで。一時期Rentaの広告でやたら出てきたので、興味本位で購入。もともと「メス堕ちBL」という企画のために作られた短編を長編化したものらしい。メス堕ちBLて。商業BL、たまに男性向けエロも真っ青なえげつない企画があるよな……。
そんな訳で、一巻は果てしなくセックスしてる(というか受けが攻めにレイプされている)感じなのだが、徐々にエロの頻度は減っていき、三巻では遂にエロはご褒美(巻末描き下ろしだけ)となる。
物語はタイトル通り嫁入り譚。だが主人公はララの双子の兄ラムダン(受け)で、彼が妹の代わりに政略結婚相手に嫁ぐというもの。どう見てもちんちんあるのに旦那(攻め)を騙し切れてるとけっこう長いこと信じている受け(濡れ場で紐パンぜったい脱がない)がすごい。んなわけあるかい!
パンツ脱がなければ大丈夫と思ってる受けとか、飛んでくる弓矢がどう見ても矢印とか、突っ込み処が色々ありつつ、ストーリーは少女漫画を通り越して昼ドラの泥つき具合で進んでいく。途中から登場した攻めの第二夫人がすごくいい子で自分から身を引いて退場となる辺りは清々し少女漫画のよう。
BL読んでる感がどんどんなくなってきたので、三巻でストーリーに一段落着いたことだし、これ以降は読まなくてもいいかなと思った。いやまあ、少女漫画が好きではない人間には商業BLの7割くらいはノットフォーミーなんだけれども。
ところで、登場人物の装束や村や街の風景がどう見てもチベット。しかし、チベットって一夫多妻というより一妻多夫のイメージがあったのだが? 幼い頃に許嫁が決まっていて、許嫁同士で遊んでいたとかいう描写は、中国のどこだかの幼児婚的なものに見える。
アサリがBLする。ミル貝もBLする。たしかアサリが攻めだったと思う(人間が受け)。ミル貝は立派なものをお持ちながら受けである。アサリに詳しくなれるかもしれない。西洋画パロディが素敵。
誤タップにより購入してしまい、購入した途端にページが開かれてしまったので、返品できなかった。悲しい。
サンプル1ページ目を読んで合わないと思った作品はほんとうに合わないと思い知る。悪くはないと思うけど、私には合わない。
作者のペンネームが中二病拗らせている感あるけど、作風は中二病が炸裂し爆発している。サンプル1ページ目の主人公(受け)のビアズリー的な美に惹かれて購入したが、なかなか良かった。BL世間的評価がどうであれ自分にはヒットした。
あれ、これBL? BLでない? よくわからない。商業BLも読むんならこれ読んでみれと強くおすすめされた1冊。特に私の推しジャンルの二次創作クラスタにはたいそうウケるらしい。が、私には全く面白さがわからなかった。ここまで何が面白いのかわからないという作品に当たったのはじめて。まあ、同クラスタの人ほど案外趣味合わないというのは、よくあることかな。『地獄楽』(これは少年漫画だが)とかも、正直わからんと思ったし。推しに似てると言われても……。
表紙の銃口を向けられている方が攻め。銃を向けている方が受け。仕事でヘマをして逃亡の身になったヤクザ(攻め)とその舎弟(受け)が海沿いの街を転々とするロードムービー。オールドファッションなヤクザスタイルだけど、時代は現代。平成前期くらいで時代に取り残されてしまったような懐かしい旅風景。
おすすめかというと微妙だけど、個人的にはかなり好き。最寄りのTSUTAYAのBL本棚では、イチオシ作品として飾られていたので、人気はあるのだろう。
そういえば、同作者の非BL作品が町田啓太主演でドラマになったかこれからドラマになるかだったような。
うん、思ってたんと違った!
私が持ってる商業BL漫画のなかで唯一の、18禁作品。これ以外はどんなにエロがあっても18禁にはならないのだった。前述の『ララの結婚』など、そうとうエロいはずなんだけどなー。
だがKindleにかかればVOIDも白抜き修正祭りさ! 18禁というレーティングで描かれた漫画であるので、同作者の他の作品とは違い、体位で局部を見えなくする技を使わずに描かれているせいで、よりいっそう白抜き修正祭りになってしまっている。あと、ほかに何が18禁なのかというと、アブノーマルなプレイがある。道具使用とか、プレイを超えた言葉や身体的な暴力とか。受けをただ虐待するSMのようなやつ。
エロがメインの作品なので、座裏屋先生らしくハイクオリティーの映画的な画面構成だけど、ストーリーの面白さとか辻褄とかは今一つ。受けが可哀想過ぎるし無理やりハピエンにまとめているのが却って理不尽に思えてしまうので、私はあまり好きではない。
本物の18禁(修正無し)だったらしい紙の方は受注販売だったために、現在は新品での入手は不可能。中古本がとんでもないプレミア価格で売りに出されていることがある。
商業BL入門時代に、とりあえず一人の作家さんにしぼって単行本を集めてみるかと思って買った。そしてここで挫折した。(他にも初期短編集も買ったけど。)『カッコウの夢』『ララの結婚』ほどは少女漫画的ではない。あまり記憶に残らない作品だった。
主人公二人が粕谷と葛谷という名前からしてろくでもなさそう(実在の粕谷さんと葛谷さんにはすみませんが)な二人の織り成すリバーシブルなギャグBL。
ひとしきり笑う。時々可哀想。
続きはまた後で。
javascript:void((function(){document.body.innerHTML=document.body.innerHTML.replace(/削除したい文字列/g,'');})());
で良くない?