「false」を含む日記 RSS

はてなキーワード: falseとは

2019-09-28

ねえねえどうしてこれ動かないの

ティラノスクリプトswitch文書いたんだけど動かん

addEventListener('keydown', ifKeydown, false);

function ifKeydown(event){
    switch(event.keyCode){
        case '37':
            $('.player').css('left','-=80');
            break;
        case '38':
            $('.player').css('top','-=62');
            break;
        case '39':
            $('.player').css('left','+=80');
            break;
        case '40':
            $('.player').css('top','+=62');
            break;
    }
}

↓こんな感じでif文でごりごり書いてったら動くけど間にもっと処理追加したいかswitchがいい

    if(event.keyCode=='37') $('.player').css('left','-=80');
    if(event.keyCode=='38') $('.player').css('top','-=62');
    if(event.keyCode=='39') $('.player').css('left','+=80');
    if(event.keyCode=='40') $('.player').css('top','+=62');

2019-09-25

ママに聞くんだけど

public string Hoge(bool? isPiyo)
{
    if(isPiyo.HasValue)
    {
        if(isPiyo.Value)
        {
            return “trueすこ”;
        }
        else
        }
            return “falseすこ”;
        }
    }
    else
    {
        return “nullすこ”
    }
}

こういうメソッドでNullの時が例外的な処理じゃなく、正常なパターンも想定しているやつすこじゃない

みんなはすこ?

(ママに聞け)

(ママプログラムわかるわけないだろ)

(ママに聞いたんか?)

(聞いてないんご……)

(ならママに聞け)

(はい…… ママに聞きます)

2019-09-24

MITメディアラボ フード・コンピュータ 性能偽装環境汚染隠蔽疑惑

フード・コンピューター (food computer) のプレゼン配信していたTEDが、2点の批判についてページを公開した。

フード・コンピュータープレゼンのようには動かない

汚染水排出MITメディアラボオープン農業構想を州の環境保護局が調査

フード・コンピューター疑惑検証メディアラボ所長(当時)がうやむやにした疑いなど機能偽装について

Hype vs. Reality at the MIT Media Lab (The Chronicle of Higher Education)

オープン農業構想のプロジェクトリーダー Caleb Harper が建築を学んだ後この構想に至った経緯や、プレゼン偽装するよう指示された研究員が、開発していない機器無関係プロジェクト写真入りで紹介されたこと(プロジェクト担当者の水増し)も説明されている。

フード・コンピューター検証問題提起MITメディアラボ所長(当時)伊藤穣一氏がうやむやにして問題放置

As research lead, Babakinejad felt it was his responsibility to raise these issues with Harper and other members of the team, and he did so in an email. He also raised his concerns with Ito. In an email, he told the director that the Open Agriculture Initiative had not been able to create a controlled environment in the food computers, and that the devices had been sent to schools and a refugee camp without being tested to ensure that they worked. He worried that Harper was misleading funders. Ito responded by asking if he could raise these issues with Harper. Babakinejad agreed to let Ito share his general concerns. (Ito did not respond to a request for comment. A Media Lab spokeswoman declined to comment.)

プロジェクトにおけるresearch leadとして、Babakinejadはフード・コンピューター問題光合成のためのLEDによる熱で温度が安定しない、二酸化炭素酸素湿度を調整できない)を提起する責任があると感じ、その問題メールでHarperや他の研究員に提起した。その心配伊藤穣一MITメディアラボ所長(当時)にも提起した。「オープン農業構想はフード・コンピューターの中で制御された環境をつくることができていません。その装置はきちんと動作するか検証されないまま学校難民キャンプに送付されました。」Harperが資金提供者を誤解させていることが心配だった。伊藤所長は、その問題をHarperとともに提起できる(その問題をHarperに話していい)か、彼に質問しました。Babakinejadは自分懸念伊藤所長から他に伝えることを了解しました。(伊藤穣一氏にコメントを依頼したが、返答なし。メディアラボ広報担当コメント拒否

プロジェクトリーダー Caleb Harper への取材

Harper's optimism helps raise money, and without money he won’t be able to see this dream of an international network of food computers come true. His critics, he said, “are basically jealous because I raise a lot of funding while giving away knowledge for free.” Harper also said that he doesn’t mislead the public. He’s explained his progress in great detail in a series of Medium posts, he said. Some may have misinterpreted his vision as current reality, he said, but if they listened closely they would not be mistaken. “Can you email a tomato to someone today? No,” he said. “Did I say that in my TED talk? Yes. Did I say it was today? No. I said, you will be able to email a tomato.”

Harperの楽観主義資金集めに役立ちました。その資金がなければ、フード・コンピューター国際的ネットワークが実現しませんでした。Harperによれば、自分への批判基本的には嫉妬、なぜなら知識無料提供しているのに多くの資金を集めているから。Harperは、自分一般の人を誤解させていない、Medium に詳細を書いた進捗状況の記事をずっと書いているから、とも言いました。自分展望を今の現実と誤解している人がいるかも知れないが、もししっかり聞いていたなら、誤解は決してしない。「トマトメール今日送れますか?いいえ」「TEDトークで私は言ったでしょうか。ええ。それが今日だと私は言いましたか?いいえ。私は、トマトメールを将来送れるようになる、と言ったんです。」

It's true that Harper didn’t quite say that food computers can email tomatoes or apples, though you could be forgiven for thinking exactly that. He frequently leaves the impression that the project has achieved, or is on the brink of achieving, an enormous breakthrough. It’s a style that has attracted the sort of high-profile attention, not to mention corporate funding, that fuels projects at the MIT Media Lab, and his willingness to showcase food computers beset with problems feels consistent with Ito’s “deploy or die” philosophy.

かにHarperは、フード・コンピュータートマトリンゴメールできるとは言っていない。しかし今できると考えてしまうのもしかたない。彼は、自分プロジェクトがすでに大きなブレークスルーを達成したか、今すぐにも達成しそうだという印象を頻繁に残している。その方法で、いわゆる有名人やもちろん企業投資の注目を集め、MITメディアラボプロジェクト資金が集まる。問題が山積している食料コンピューターをHarperが展示し続けるというのは、伊藤穣一氏の「実装なくば死を」の考えに一致しているようだ。

M.I.T. Media Lab, Already Rattled by the Epstein Scandal, Has a New Worry (The New York Times)

You seem to think endlessly reiterating untrue claims will lend them credibility, but it won’t,” Dr. Babakinejad wrote to Mr. Harper. “By persisting in this course of action, you have been putting M.I.T. and everyone associated with you at risk and I think it’s time that you were made to face up to that and take responsibility for it.”

正しくない主張を終わることなく繰り返していればその主張に真実味が出てくると考えているようですが、ありえません」とBarakinejadは(雇用契約更新がされなかった後)Harperに書いた。「そういった行動を続けることで、MITあなた関係している全員を危険さらし続けています。それ(正しくない主張を繰り返すこと)に向き合って、責任を取るときだと思います。」

大事デモ自動のはずの光の量を人手で調節

The food computers, which researchers have envisioned selling to the public, are supposed to provide plants with just the right amount of light. But when the light function was not working, another member of the OpenAg team said, speaking on the condition of anonymity to describe sensitive events, an engineer manually rigged the device so that light would shine at the correct level during an important demonstration.

フード・コンピューターは、一般に売り込むために研究者想像したものですが、適切な光の量をちょうど植物供給すると思われていますしかし、光の装置機能しないとき匿名を条件にしたあるオープン農業構想チームの研究員によれば、大事デモとき技術者装置不正操作して、適正レベルに光らせていました

専門家によるフード・コンピューター評価

コーネル大学教授植物学)Thomas Bjorkman によると、オープン農業構想の論文が書いているような機能を持つ箱はあるが、操作するのに費用が掛かり、24キロワット240個の100ワット電球を同時に光らせる)エネルギー必要になる。

論文学術価値について、「制御環境を使った農業工場の現状はとても進んでいるので、植物栽培研究実践について影響はほとんどない。」とBjorkman教授コメントした。

MITメディアラボ伊藤穣一所長(当時)がフード・コンピューターについての訴えをうやむやに(The Chronicle of Higher Education 記事と同じ出来事

In an email exchange with Mr. Ito, Dr. Babakinejad expressed his concern about what he said were Mr. Harper’s false claims in a draft of the academic paper, the “60 Minutes” interview and lectures.
“Up to now,” Dr. Babakinejad wrote, “we have not been able to achieve a ‘controlled environment’ nor been able to create an atmosphere (Climate control) as he leads people to believe in his talks. His claims about developments such as implementations of image processing, microbiome dosing, creating different climates and collecting credible data from bots across the world are not true.”
Mr. Ito wrote in his reply: “Can I say that you have concerns about whether the food computers have been able to create a controlled environment which would put into questions some of the claims we make about the data and outcomes?”
Dr. Babakinejad replied in the affirmative, and the exchange ended.

MITメディアラボ伊藤穣一所長(当時)とやりとししたメールで、Barakinejadは論文ドラフトドキュメンタリー番組インタビュー講義でのHarperの誤った主張に関する心配を書いていました。

現在まで、Harperが講演で人々を信じさせているような、制御された環境も出来ていないし、天候の制御も出来ていない。画像処理実装マイクロバイオーム、異なる気候を作ること、世界中ボットから信頼できるデータを集めること、といった開発についての主張は正しくありません。」伊藤穣一氏の返事は「フード・コンピューター制御された環境を作れるかどうかによって、データや結果に関しての主張のいくつかに疑問が生まれる、という懸念を持っているということでしょうか」

Babakinejadは肯定的な返事を返したが、そこでやりとりは終わった。

根拠のない統計を周りが止めても、Harperは講演で使った

他に「リンゴは収穫してから店頭に並ぶまで平均11か月(最近は14か月)掛かっている」の11か月という統計根拠がないと指摘しても、Harperは止めなかった。アメリカ農務省の答え「その統計不正確」

郊外研究施設周辺の環境汚染MITによる組織隠蔽

MIT Media Lab Kept Regulators in the Dark, Dumped Chemicals in Excess of Legal Limit (Propublica and WBUR)

以下では、MITメディアラボオープン農業構想をメディアラボMIT環境健康安全オフィスMITマサチューセッツ州環境保護局を州と略記。

報道における汚染水隠蔽時系列

2015年 オープン農業構想 (Open Agriculture Initiative) がCaleb HarperによりMITメディアラボで開始

2016年8月 コンサルタントMITメディアラボ施設ディレクターメール水耕栽培用の水の窒素量を10ppm以下に抑えるなら、排水用の貯水池が最適」

2017年6月ごろ Babak BabakinejadがHarperのグループに参加

2017年10月 Babakinejadがresearch leadに昇進し、汚染水排出した施設での勤務を開始

2017年12月 マサチューセッツ州監査員が貯水池の利用に制限付き許可を出す。

2018年3月22日 ラボノートの記録によると、廃棄濃度を報告義務の限度を大幅に超える(水の量が多く、許可制限内では希釈できない)。

2018年4月研究員メディアラボ)BabakinejadがHarperにメール汚染水窒素量が制限を大幅に超えているとHarperに報告(1度目)

2018年4月16日 (研究員メディアラボMIT)Babakinejadがメール汚染水窒素量が大幅に超えているとHarperとMITに報告。HarperはBabakinejadにMITへの直接報告を禁止

2018年4月17日 MITのPhyllis CarterがHarper, Babakinejad, ほかのメンバーメール「先週のサンプルにおける窒素量は140ppm。このレベル排水許可されない。」(MITはこの時点で州の規則違反となる環境汚染を把握

時期不明 HarperはBabakinejadに勤務時間中の作業内容を30分ごとに記録するよう指示(Babakinejadは報復だと感じた)

2018年中旬 BabakinejadがHarperのグループから去る。

2019年1月 (州→MITマサチューセッツ州担当者 Joseph CeruttiがMIT環境健康安全オフィスPhyllis Carterにメールで、貯水池排出された汚染水窒素量の月例報告を催促。

MIT→州)Carterは4月から6月まで何も貯水池排出していないと返答(1-3月、7-12月の報告を送らず、無視

2019年2月(州→MITメディアラボ) 報告が届かないので、CeruttiはCarterとHarperに、2週間以内に回答がなければ、違反通知、罰金許可取り消しを警告

メディアラボ→州)HarperはCeruttiへ即座に返答「農業廃液は野外に捨てて、米国環境保護庁の地下注入管プログラム (UIC) のシステムには入れていない。これはMIT合意した手続き」(貯水池のみの利用という

2019-08-19

大学の両輪は「研究」と「教育」

山梨学院大学で労使紛争が起こっているようである

山梨学院大学で異常事態…「非常勤講師切り捨て」とモラルの崩壊(田中 圭太郎)

しかし私の興味を引いたのは、山梨学院大学教育に重きを置いて高度な研究機関となることは目指さないと公言していることに対して、田中氏が以下の批判をしている点である

言うまでもなく、大学の両輪は「研究」と「教育」であるはずだ。しかし「研究者は今後雇用しない」と受け止められる文言が、ここには堂々と書かれているのだ。

ツイッター上でも大学教員を中心に山梨学院大批判的な声が上がっているが、大学の両輪は「研究」と「教育」である、というのは現代において言うまでもない当然の前提なのだろうか。例えば、『経済学部タチバナキ教授が見たニッポンの大学教授と大学生』(橘木 俊詔)によると、「アメリカ大学ではトップ50までが研究中心の大学、それ以外は教育中心の大学と二分化」されているようである教員キャリアも、それに応じて研究中心と教育中心のそれぞれのスペシャリストとして専門分化しているようだ。

また日本においては、大学教員研究に重きを置くと第一線での研究活動多忙を極めるので、学生教育がその合間になるという実態がある、と氏は指摘する。そこで日本においても米国と同じく、研究中心か教育中心かのいずれかに教員キャリア分岐していくだろう、と氏は予想している。

世界トップ学術業績を出している米国大学研究中心と教育中心に分業しており、加えて研究を重視する教員による教育が手薄になりやすいという日本大学問題意識考慮すると、山梨学院大教育中心に舵を切るという方針は、大学存在意義否定するものとは言い難いように思う。少なくとも「言うまでもなく、大学の両輪は「研究」と「教育」であるはずだ」の一言で終わらせるのではなく、研究中心と教育中心に分化した場合にどのような弊害が生じうるのか、そして米国ではどのような弊害が生じたか、など丁寧な議論を展開した上でこの方針批判するべきだろう。

2019-07-18

anond:20190718113048

元増田の主張はこういうことなんだよ!親が居る居ないは関係ない

以下のis普通()関数の判定ロジックは正しくないのではないか?

function is普通() {
	if (!親と喋ったことある      ) return false;
	if (!親に触ったことある      ) return false;
	if (!親に相談事する          ) return false;
	if (!親は困ったら助けてくれる) return false;
	if (!親の所在がわかっている  ) return false;
	if (!親に連絡いつでも取れる  ) return false;
	return true;
}

2019-07-14

はてブTOPエントリfalse economyのやつ

こいつはこいつで言ってること所々おかしくね?別にオフィスビルが立派である必要はないだろ。部屋が涼しければ服洗わないし風呂入らないの?ジャップの非合理さには俺も辟易してるしこのおっさんには基本的賛同したい所だが、例として挙げてる話がどれもちょっと拙すぎないか

これを増田辺りで書いてもスルーされるか鼻くそみたいな反応が付くんだろうが外人が言うとありがたがるバカブクマカー共が可視化されてて不愉快痛快。

anond:20190714131638

月額課金制は長く使うほど損をするぞ これもFalse economyの弊害

2019-07-01

anond:20190701144403

あなたtrueですかっていうアンケートに「undefined」って答えたら「false」にされたことがある

いやいや「undefined」であって「false」ではないよそこんところちゃんとしてくれや

2019-06-01

KOMの芹沢博士無能じゃない?

周りに聞いてばかりで知識も無くアイディアも出さず。視聴者に対する状況説明を「博士に対する説明」でやっちゃってるせいで何のためにいるんだって思っちゃうけど、まあiPS研の山中先生みたいなもんか。広報資金集めが仕事ゴジラファン

false kingワロタ宗教家やんけ

2019-05-28

anond:20190528222909

いやでもfalseファルスって言ったりdenyをデニーと読む

明らかな間違いは駄目でしょ

2019-03-28

if (Trueの条件式) <> (Falseの条件式)がfalseになるんだが

何がダメなのかわからへん

2019-02-05

遅まきながら、転生したくなってrustでwebassemblyなんか始めてみようと職場PCで内職開始。。。のはずがWSLでrustup-intがうまくいかない。

proxy環境からかな?と思うもそれならcurlでこけるはずだ。

default host tripleという聞きなれない設定がstable-x86_64-"unknown"-linux-gnuからなのかとCustomize installationをいじるもうまくいかない。

なんやねん、一生java6で腐ってろと言う貧乏神なのかと毒づいたら下記に書いてあった。

https://github.com/rust-lang/rustup.rs/issues/1529

"The situation has been occured in the office, which has proxy and self-trusted certificate."

...やっぱり自社のプロキシ問題かよ。MTTMで今もばっちり解析されているのかよ。オレオレとかまじやめてよ。。

書いてあるとおり、git config http.sslVerify false入力したらばっちりうまくいった。

@sshplendidさんはどうやって気づいたのだろう。あなたは神だ。最高。

。。。環境構築に手間取りすぎて早くも心が折れそう。今日は帰る。

2019-01-20

なんとなく生きてきたけど

今までなんとなく生きてきた。

なんとなくでもそれなりにこなすのは得意だった。

ただ、それなりにこなすことができれば満足して、それ以上の努力はしてこなかった。

いや、努力が苦手だった。楽しいことだけを好んでやっていた。

漫画だと一夜漬けのシーンは数コマで終わるのに、学生時代に真似したところで一夜漬けを始めて1時間で眠りこけてた。

から将来の夢を見つけることもできなかった。

ただ、なんとなく生きていた。

小学校の頃は勉強しなくてもテストは満点近かった。

この頃から目立ちたがりだった気がする。

中学校では生徒会長もやっていた。

テストの点数は右肩下がりだったが、問題のあるレベルじゃなかった。別に焦りもしなかった。

面白そう、という理由総合学科高校入学した。

そこには確かな夢を持った同級生がたくさんいた。

きっと自分高校の3年間でやりたいことを見つけられるんだと信じていた。

3年間で彼女がいた時期もあった。自覚は無かったけど、所謂青春がそこにあったんだと思う。

ただ、将来の話題になると、具体的には何も思い浮かばなかった。

卒業前に題材自由ミニ卒論を完成させなければいけないんだけれども、題材を考える時間が一番長かった。

大して時間もかけずに、陳腐な内容で適当お茶を濁して終わらせた記憶が残ってる。

学科柄、就職を進路に決めている人が多い中、なんとなく進学を決めた。

成績も優秀では無く中の下に成り下がっていたので、推薦入試も使えなかった。

やりたい事がみつからいからこそ、少しでも有名な大学に進学しなければと考えていた。

そんな後ろ向きな目標必死勉強することも出来ず、受験勉強もなんとなくだった。

一般受験をする生徒は珍しいので、同級生先生応援してくれた。

ありがたかったけど、反面全然勉強してない罪悪感も辛かった。

結局第一志望のMARCHは落ちた。

現役時代ですらまともに勉強できないのに、浪人が出来るとは思えなかった。そのまま第二希望で1ランク下の大学入学した。

就職した同級生は皆輝いていた。何とかして自分も輝きたくて焦った。

でも、何となくで入った心理学科の授業はまったく面白くなかった。興味も持てなかった。

時間だけは沢山ある中、ネットゲーム実装されたばかりの対人コンテンツランキングに入ることが出来た。

ゲームのフレンドから賞賛された、知らないプレイヤーに声をなんどもかけられた。

そしてなにより、自分名前ランキングボードに載っている事が最高だった。

一度ランキングに載ってからはそれまで以上に時間を費やした。

ただ、それも長くは続かなかった。

コンテンツ人口が増え、コミュニティや戦い方が成熟し、要求されるスキルが上昇していくのについていく事が出来なかった。

声をかけられることもパタンとなくなり、かといって追いつこうと練習することもなかった。

ゲームですら努力はできなかった。

ランキング上位への熱意も冷め切って気づいた頃には、単位の全く取れてない留年確定の大学生がそこにいるだけだった。

留年して通学する貯金もなく、そもそも心理学への興味が一切なかったので大学中退した。

兎に角働かなければ食っていけない状況に追い込まれて、SIer就職した。

面接で「君と是非働きたい」なんて言われて浮かれたけど、今思えば誰にでも同じことを言ってるに決まってる。

最初に配属された現場プログラミングのプの時も無い倉庫整理だった。

中高と体育会系部活所属していたので、上下関係には慣れてたし、挨拶や体力に問題はなかった。

それなりにこなすだけで雇用元の社員にも気に入ってもらえた。

「直接雇いたいから連絡をくれ」と言われたが、22歳の自分にはこれからずっと倉庫整理で食っていくなんて考えられなかった。

何と言えばいいのか、変なプライドがあったんだと思う。

小中高と目立ちたがりだった自分がそんな誰にでも出来る仕事をこなして爺ちゃんになるなんて考えたくもなかった。

契約期間も終わり、次の現場通信系の検証業務だった。

プログラミングのプくらいはあるかもしれないが、

メインはExcelに書いてあるように操作して、PASSかFALSEをつけていくだけだ。

これもそれなりにこなすだけだったけど、最初倉庫整理よりかは給料がよかった。

今まで買えなかった漫画ゲームを買える経済的余裕もでてきて、

毎月の給料で今まで金銭理由で楽しめなかったコンテンツを味わって2年が経った。

ゲーム漫画楽しいけど、仕事は相変わらずそれなりにこなすだけだった。

それなりにこなして、小さなチームのリーダーにもなった。

といっても特段業務内容に変化は無かった。

このまま何となく勤続年数に応じて給料が上がっていき、何となく生きていくんだろうかと不安になったし、まあそれでもいいかと思うようになっていた。

けど、変わった。

年末山手線高輪ゲートウェイ駅開通のテレビCMを見たときに急に何かに気づいたような感覚に襲われた。

テレビCMを見てそんな感覚になったのは初めてだった。

「あ、これがやりたいことだ」と感じた。

これ、というのが簡潔にいうと「自分が関わったのがわかる形で"何か"を作り、残したい」だった。

言い換えれば、自分存在を認めてもらいたい、つまり承認欲求が溜まりに溜まったものなんだろうか。

から目立ちたがり屋だった事、ネトゲランキング名前を残すことに躍起になっていたこからも、人より承認欲求特に高いのかもしれない。

"何か"は別に高輪ゲートウェイ駅みたいに実体である必要もない。

なるべく多くの人にこれは自分が作ったんだといって見てもらいたい。

具体的ではないけど、夢に近いものテレビCMを見て気づいた。

義務教育プログラミングカリキュラムが導入されているこの時代スタートは遅いけど、まだ諦めるには早いのかもしれない。そう思った。

どうすれば「"何か"を作る事」に近づくことができるかを考えて、開発側の業務に移れるようPythonの勉強を始めた。

Progateでチュートリアルやった後に何に手を付ければわからなくて、既に壁にぶつかってる。

きっとここから努力するってことなんだろう。

特にスキルも身につけずアラサーを迎えたITエンジニアだけど、この気持ち言語化してみたくて書いた。

やりたい事が見つかったからなのか、敬遠していたFaceBookを見ることができた。

文化祭映像を作ってた友人はYoutuberになってたし、高校卒業前に惚れてた笑顔が素敵な女の子舞台俳優になってた。

Facebook自体がそういう場所から、というのはあるかもしれないけど、いまだみんな輝いている。

もし、何かみんながわかるようなものを作って残せたら、またここで報告したい。

2019-01-03

anond:20190103193157

結構面倒

過去ブロックを覚えておく領域

int blocks[100][100];

過去ブロックを再描画

	BOOL WriteBoxOLDBox()
	{
		int width = 24;

		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 48));
		for (int y = 0; y < 30; y++)
		{
			for (int x = 0; x < 8; x++)
			{
				if (blocks[y][x] == 0)
				{
					continue;
				}

				RECT Rect = { 0,0,48,48 };
				BOOL ret;

				Rect.left = width * x + 1;
				Rect.right = width * (x + 1) - 1;
				Rect.top = width * y + 1;
				Rect.bottom = width * (y + 1) - 1;

				ret = FillRect(hdc, &Rect, hBrush);


			}
		}

		DeleteObject(hBrush);

		return FALSE;
	}

この辺は めんどくさくはあるけど みてわかってほしい

描画したWriteBoxとおなじ BOXが落ちた場所BOXの有無)を保存しておく

ここがわかりにくいといえば わかりにくい

	BOOL SaveBoxI()
	{
		blocks[y  ][x] = 1;
		blocks[y+1][x] = 1;
		blocks[y+2][x] = 1;
		blocks[y+3][x] = 1;
		return TRUE;
	}

anond:20190103184241

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//

	int blocks[100][100];

	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;
		boxType = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		for(int x = 0 ; x < 100 ; x++)
		{
			for (int y = 0; y < 100; y++)
			{
				blocks[y][x] = 0;
			}
		}

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 100 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	int boxType;

	BOOL WriteBoxOLDBox()
	{
		int width = 24;

		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 48));
		for (int y = 0; y < 30; y++)
		{
			for (int x = 0; x < 8; x++)
			{
				if (blocks[y][x] == 0)
				{
					continue;
				}

				RECT Rect = { 0,0,48,48 };
				BOOL ret;

				Rect.left = width * x + 1;
				Rect.right = width * (x + 1) - 1;
				Rect.top = width * y + 1;
				Rect.bottom = width * (y + 1) - 1;

				ret = FillRect(hdc, &Rect, hBrush);


			}
		}

		DeleteObject(hBrush);

		return FALSE;
	}


	BOOL WriteBox()
	{
		WriteBoxOLDBox();

		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}

		return TRUE;
	}

	BOOL WriteBoxZ()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);


		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL WriteBoxL()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 246 , 48));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) -1 ;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) -1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL WriteBoxI()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB( 246 , 48 , 48));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL SaveBoxI()
	{
		blocks[y  ][x] = 1;
		blocks[y+1][x] = 1;
		blocks[y+2][x] = 1;
		blocks[y+3][x] = 1;
		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 20) {
			switch (boxType)
			{
			case 0:
				SaveBoxI();
				break;
			case 1:
				break;
			case 2:
				break;
			}

			y = 0;
			boxType++;
			if (boxType > 2)
			{
				boxType = 0;
			}
		}

		this->WriteBox();

		return TRUE;
	}



	BOOL OnKey(WPARAM wParam)
	{
		if (wParam == VK_LEFT)
		{
			x++;
		}
		if (wParam == VK_RIGHT)
		{
			x--;
		}
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey(wParam);
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190103170543

テトリス

落ちてくるブロックの描き方

わかりやす関数化してみた

まずはブロックの種類は3種類

 

WriteBoxLとWriteBoxIとWriteBoxZ

の違いをよく見比べて

自力で違いがわかれば

プログラマーにはなれるとおもう

とはいえ、コレを自力でわかるならもっと儲かる仕事あるとはおもうけどな

 

	BOOL WriteBox()
	{
		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}
	}
// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;
		boxType = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	int boxType;

	BOOL WriteBox()
	{
		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}
	}

	BOOL WriteBoxZ()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);


		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL WriteBoxL()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) -1 ;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) -1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL WriteBoxI()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
			boxType++;
			if (boxType > 2)
			{
				boxType = 0;
			}
		}

		this->WriteBox();

		return TRUE;
	}



	BOOL OnKey()
	{
		x++;
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey();
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190101175055

テトリス風?プログラムに向けて

第何回だろうな

キー入力を追加した

まだ、何を押してもブロックが右に移動するだけ(右端にいくと左にワープ

タイマー自動落下

 

でもまぁ ここまでサンプルがあるとほぼテトリスは見えてきた

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		Rect.left = 48 * x;
		Rect.right = 48 * (x+1);
		Rect.top = 48 * y;
		Rect.bottom = 48 * (y+1);
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
		}
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL OnKey()
	{
		x++;
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey();
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

2019-01-01

anond:20190101174626

こんな感じ

GetMessageの上にタイマーも扱える

MsgWaitForMultipleObjectsExを追加

GetMessageだとタイマーを処理できないのでPeekMessageに変更

>なぜかは ちょっと考えると面白い

Getとき必要なかった 終了処理を追加

msg.message == WM_QUIT

この部分 QUITメッセージが来たら終了する

obj == WAIT_TIMEOUT

タイマーを追加

y++で高さを変更してから

作画を呼ぶ

こんだけ

<が<

>が&GT

&が&

にかわっちゃってるので各自で置換してね

	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}
アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん