「Class」を含む日記 RSS

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

2020-02-23

2020年プログラミング言語解説

Ruby

まつほろひとゆきが作った日本産コンピューター言語パールというコンピューター言語を元に作られていてWebサービスを作るためのフレームワークを搭載している。代表的WebフレームワークtDiary

C

デニス立地さんがNTTで開発した言語マルチクスというOS作成するために作られた。わざと複雑な言語仕様にすることで自分役職ポジションを守ろうとしていたが、思った以上に世の中の人間はこの言語を使いこなしてしまい、超有名な言語になってしまった。スーファミゲーム制作にさえ使えなほどの超高級言語

まじないと呼ばれるプリプロセッサでの書き換えが必要な謎の文字列を埋め込む必要があったり、言語仕様曖昧な部分も多く、同じソースなのに実行環境によって動きが異なる、欠陥言語である。(32bit向けプログラムが64bit環境動作しないなど)

C++

オブジェクト指向言語。すべてのオブジェクト指向言語はこいつから始まった。

主にWindows上で動作するゲームを作るための言語。今ではUnityとか色々なゲーム開発の環境とかあるが、結局はパフォーマンスとか考えたらC++使うことになる。

代表作はOpenGLDirectX、Window10、LibreOffice など

Java

JavaScriptから派生した言語。読み方は(ジャワジャワ島のジャワ。)。もともとはOracle創始者博士趣味作成して、現在Oracleデータベースの基礎となるテクノロジーアプレットという実行するための専用プログラムインストールしないと、Javaで作ったプログラム(.classファイル)は動作しない。マークコーヒーだと思われがちだが、紅茶(ジャワティー)である

アンドロイドOS作成するためにも使われており、アンドロイドOSカーネルJava制御されている。そのため定期的にGCが走るので、アンドロイド端末は定期的に動作を停止することがある(いわゆるプチフリーズ)。

対策するためにはGC戦略見直してヒープ領域サイズメモリに乗せるキャッシュサイズなどの調整が必要であるが、げんざいのGoogleにはこれらを調整する人員はすでにいない。

このように業務データベースから携帯電話まで幅広く使われているので、Java技術があっても市場価値殆どないと言われている。(みんな使えて当たり前)

PHP

晩年政界への進出を目論んでいた松下幸之助が、未来社会を見据えて開発した言語。主にWebアプリケーション作成するために使われている。PはパナソニックのP。を略してPHP

かんたんにシェルコマンドを実行できたり、クエリストリングに代入した値を直接グローバル評価できたりするなど、洗練されていてとても便利な言語である

HTMLメール本文の中にもPHPの処理を書き込むことができる。

この世のすべてのサーバーに実行環境存在するので、PHPコードさえあれば、コンパイル不要でどのような環境でも動作する。

C言語の100倍生産性が高く、WikipediaFacebookSlackなどの超一流のサイトサービスで大量のアクセスを捌いている。

WardPressと呼ばれるフレームワーク(全世界Webサイト3分の1以上はWardPressで作成されている)を作成している言語であり、この言語なくして今のWeb存在していない。

データベースとも親和性がある、などと言われることもあるが特に根拠はない。

Go

韓国人棋士を倒したAIに特化したプログラム言語Googleが開発しており、もともとはDartという名前だったが、汚いという理由でなまえがGoに変わった。そのため現在Dartという言語存在していない。

AIに特化しているというだけあり、低レイヤむけの実行ファイル作成する必要があるため、コンパイル必要ではあるが、だいたいどの環境向けのバイナリも生成することができる。

デフォルトディープラーニングを使うための機能を持っていたり、プログラムを並列実行するための機能が備わっているので、コア数の多い環境で高速に動くプログラムを作りやすい。

JavaScript

Javaの元になったプロトタイプベースオブジェクト指向言語。読み方はジャワエスクリプト。W3Mというブラウザの上でインタラクティブWebサイトを動かすために作成された言語。もともとブラウザの上で動くための言語だったが、後にSafariブラウザに搭載されていたV6エンジンというJavaScript言語の実行エンジンを分離してNPMというJavaScriptを直接実行できる環境となった。

それ以降JavaScriptはブラウザ以外にVRゴーグルの中などで動くようになった。

並列プログラミング不可能な作りのため、コールバックを多用して、スパゲッティコードを量産することができる。

NPMを使う奴らは、JSブラウザ環境で使われる言語であることを全然考えてないため、WebpackとかBabelといった謎の開発環境をシコシコ積み上げている。いつかその塔は爆発し崩れ去ることになるであろう。

jQuery

Javaと同じくJavaScriptから派生した言語Javaとは互換性は無いが、JavaScriptの上位互換があるため、JavaScriptのコードをそのまま実行することができる。

$マークから始まる命令のみで構成されているとても縁起のいいプログラミング言語。おもにパララックスなどを実現するために利用されていて、WardPressなどのドライバとしても使われている。

JavaScriptの改良版であり、現在JavaScriptと言われているプログラム言語の99%はjQueryのことである。そのため現在慣習的にJavaScriptと呼ばれているもののほぼ全てはjQueryである

jQueryを覚えればJavaScriptは覚えなくても良い。などと言われるが、正確にはjQueryを覚えた頃にはJavaScriptも覚えている。というのが正確である

TypeScript

JavajQueryなどと同じくJavaScriptから派生した言語Microsoftが開発した関数型言語。開発時はF#(エフシャープ)というコードネームだった。

型に特化した言語であり、Microsoft製のVSCodeというIDE環境しか開発、実行が出来ない。(ただしMacLinux上でも動作可能)

TypeScriptを動かすにはサーバーVSCodeインストールする必要があり、言語IDEバージョンアップも多いため、メンテナスンスが困難である

Swift

iOSを作るために開発された言語関数型言語

前進となるObjectiv-Cという言語が、気持ち悪い構文であったため開発者が不足しており、このままではOSメンテナンスもままならない、という理由最初バージョンわずか14日間で作られた言語

Apple製品の上でしか動作しない。ビルドが非常に遅く一日に60回が限度である

LISP

((最強の言語。全ては関数であり、値であり、式である。)

(制御構文も、(一種の式であり、値である。)))

anond:20200223081114

増田さんはClass imbalance problemってご存じですかあ?

機械学習適用するうえで訓練データクラスに偏りがあった時に、その中でも割合の高いクラス予測が偏っちゃうっていう問題です。

それもそのはずですね

たとえば

シーザー・ツェペリ」を求めて「シーザー」で検索した人が(今まで)80人いたとする

ジュリアス・シーザー」を求めて「シーザー」で検索した人が(今まで)20人いたとする

この傾向が変わらないとすると、あるユーザー100人が次に「シーザー」で検索した時に、何を候補として表示すれば最も多くのユーザーを満足させられるでしょうか?

100人に対して「シーザー・ツェペリ」ですね。

1:1でランダムで表示すると50%のユーザー、8:2でランダムに表示すると68%のユーザーしか満足させられませんからね。


それもこれも情報の不足が問題になっているのです「何を探しているか」をきちんと相手に知らせてあげないと、受け取った側は「みんなが探しているものだろうな」、と考えるしかないんです。

から増田さん、これから検索対象がユニークに持つ情報入力に加えてあげてくださいね角度とか

2020-01-12

永遠に書きあがりそうもないやつ

何かの参考とかにしたらダメです。書き始めて半年つんだけどこっからどう直したらいいんだか(何をゴールにしたらいいのか)わからない。。

追記:合流性とか強正規化可能性とか停止性とか、全部チューリング不完全で、事前の静的解析で使うメモリの最大量が確定できる、とかそういう風に読み替えられる人を増やしたいのです、数式の添え字とΣと∫にびびらない人を増やしたいようなもの

理論理学の一分野である証明から成長した、数理論理学理論計算機科学境界領域研究領域である型理論(type theory)は、大規模なプログラムの内的な整合性のチェックを行うための方法論を必要とする情報処理技術の分野で関心を集めている。

 そもそも「型」(type)とは何か。プログラミング言語一般的にはレコード関数といったプログラム構成する「値」(value)の定義をする道具である(*1)。その言語コンパイラ作成者はこれらレコード関数などの値、もしくは第一級の対象(first-class object)の種類を区別する型システム(type system)を必要とする。抽象代数学観点からすると、「型」とはこれらの値もしくは第一級の対象が属する高階の対象(higher order object)としての空間(space)ないし代数系(algebraic system)で、型システムはそれら「型」とそれら相互関係(relation)つまり型のなす順序構造(order structure)ないし束構造(lattice structrure)であるといえる。

 プログラム構成する値すべてに型が付くためには、曖昧でない(*2)こと、自己矛盾していないこと、悪循環を含まないこと、それぞれの値の内容をチェックするために無限時間を要しない(*3)ことなどが必要で、これらを満たすなら、プログラムは有限時間で実行を終え、停止する。手続き型言語では無限ループ、型無しラムダ計算では無限再帰によって型付け不能プログラムを書くことができるが、型理論はこれらのチューリング完全な計算機意図しない停止しないプログラムから守る装甲でもあり、再帰メモリ確保で好き勝手をさせないための拘束具でもある。型が付くプログラムには単に停止するというだけでなく、可能な実行経路(訂正:経路→方法)のすべてで同じ結果を出すなど種々の良い性質がある。

1)この定義現実に使われているプログラミング言語の特徴を覆い切れていない、狭い不満足な定義だが本稿では都合上この定義立脚して限定的議論する。例えば変数(variable)というものを持つプログラミング言語もあり広く使われているが、これについてはレコード関数と同じように性質の良いものとして扱うことが難しい。難しさの原因は次の注の内容と関連する。近年は変数を扱うかわりに値の不変のコピー(immutable copy)やその参照に名前を付ける機能を持つプログラミング言語が増えている。

2) 現実情報システムでは、COBOL言語レコード定義C言語の共用体、一般的関数ポインタVisual Basic言語のvariant型変数のように、同一領域に異なる型の値が共存する共用型(union type)の値がしばしば必要となる。共用型の値はgoto文を排除した構造化/オブジェクト指向プログラミングにおいて条件キャストクラス分岐などによる実行経路の複雑さの主要な原因になるが、これは和型(sum type)すなわち相異なる型の非交和(disjoint sum)として定義することで曖昧さな定義できる。

3) ゲームプログラムネットワークサービスにおいてしばしばみられるように、入力として無限リスト任意に深い木のようなものを想定する場合には明らかに(条件を満たさない限り)停止しないことが正しい動作となり、この場合は最外周のループを(←どうする?)メモリリークを起こさないなど別の考慮必要となる。

2019-12-26

anond:20191226212012

こっちはみらい翻訳

"I love you." と5行目の主語は同じくダメ。あと、4行目5行目の後半の目的語ちゃん特定できていない。

Googleの勝ちか。

Pudding is delicious. I love you.

Fruit jelly... is certainly delicious.

It is juicy and has a fruity texture, and the pulp and seeds are in it to reproduce the texture.

But if you have raw fruit and a really fancy fruit jelly, you'll get some fruit, right?

If you have egg and milk sets and pudding lined up, take them out.

So please give me a high-class pudding as a gift.

2019-10-20

ウェブカツ!!」は記事剽窃をしているのか?売上は?調べてみました!

ウェブカツというプログラミングスクールについて、twitter上で記事の剽窃をしているのではないかという疑問が挙がっていました。

ウェブカツの「顧問であるかずきち氏はこれを「頭悪すぎて呆れちゃう」と一蹴していましたが、はたしてどうなのか……?

ウェブカツは果たして剽窃をしているのか!?調べました。

めしJavaScriptやjQueryでの変数が「空かどうか」のチェック方法 (魚拓 https://megalodon.jp/2019-1020-0037-32/https://webukatu.com:443/wordpress/blog/821)を見てみましょう。

記事中に出てくる「jQueryではたとえ、参照したIDclassが無くてもjQueryオブジェクト作成されるためチェックが出来ません」で検索してみると、

Web'Notesというサイトがヒットしました。

記事全体を見比べてみると、なんと、目次が完全に一致しています

ですが、目次程度なら同じ言語ライブラリ解説している以上は偶然の一致もありえます

そこで本文も比較してみると、驚くべきことがわかりました。

Web'Notesの「結果をまとめるとこのようになります」がウェブカツでは「結果をまとめるとこんな感じ」に変わっているなど些細な違いはありますが、記事構成文章表現まで、ほとんど一致しているのです!

全く偶然とは思えないレベルでよく似ています

ですが、これだけでは本当に剽窃がされているのか、されているとしてどちらが行っているのかまではわかりませんね……

少なくとも、両方の記事がいつから存在たかは調べる必要がありそうです。

ウェブカツの記事には、2016年8月16日と書かれてますね。他の記事を見る限り、ウェブカツでは、作成後に更新した記事には更新日も掲載されるようなので(えらいですね!)、おそらくこれが作成日でしょう。

一方Web'Notesの記事がいつから存在するかというと、WayBackMachineを見る限り2015年には存在していたようです。

他にも、ウェブカツの様々な記事について、よく似た他の記事存在するようです(随時追記)。

ttps://docs.google.com/spreadsheets/d/1HwRyUP62afk9jjXArax8NhiYxnt330DMSQTe9eB3h24 (うまくリンクが貼れないので古の記法で勘弁してください!)

いかがでしたでしょうか、果たしてウェブカツはWELQや侍エンジニアのようなパクリサイトや触法プログラミングスクールの仲間なのか…… みなさんはどう思われましたか

ウェブカツは月に数千万の売上があるかもしれないので、「よく似た記事」を書いた方々は要注目です!

個人的には、かずきち氏はtwitterプロフィールでcodecampをディスっているのに、codecampのもの酷似した記事存在するのが面白いと思いました!

様々な先例にならってDMCA濫用などをしてくれるともっと面白くなると思います

もっとも、ウェブカツの「顧問であるかずきち氏は著作権問題について「立ち小便の軽犯罪や店のコンセント使った窃盗レベル」とおっしゃっているので、そのようなことは期待できなさそうですが……

とにかく、目が離せませんね!

2019-09-13

anond:20190913094635

C#でのclassとstructでは実体参照と値渡しみたいな違いがあってよくstructの方はメモリ効率が悪い、みたいなことを言われるんやけど、

個人的には「最初に読み込んであとは更新が無い」データはstructで扱うんがベストだと思うてるよ。

もち、classインスタンスを利用するのもアリ。利用は好き好きよ。

anond:20190913094344

教えてもらったこっちのほうで検討しようと思う。

List<List<なんか>> hensuu;

質問ばっかで悪いが、

ClassをListに押し込む(?)のもアリなのか?

C#リスト複数項目入れることは出来るのか?

最近C#質問ばっかしててごめん。知恵袋でやれといわれそうだ。

でも、あちらよりこちらの方が親切で丁寧な回答が来ることが多い気がする。

何よりレスが早い。

それはさておき。

C#のListってあるが、これに複数項目入れることは出来るのだろうか。

2次元とかじゃなくて、ClassをまとめてListに入れるみたいな。

IDNameAgeなどなど……キーワードで内容も特定したい。

ClassをListに入れるというのもあるみたいだが、

デメリットがありそうな気がして出来ていない。

MainクラスHumanクラスなどの情報を入れる。情報をもとにJudgmentクラス判別?する。

  人間名前が「華子」だったらAを実行……などその後の処理にも関わるから分割したい。

HumanクラスではID,名前、年齢などの変数定義

Judgmentクラスで、引数?の数字を元に、学生社会人かなどを分ける。

うーん、自分でも何が言いたいんだか分からなくなってきてしまった。

クラスについてはざっくり理解したつもりだったんだけど。

2019-09-12

プログラムはやりたい事を箇条書きできれば問題ないって教わった

結構得意なほうだったけど、classとかオーバーフローとかオーバーロードとか

新しい用語が出てくると良く分からなくなってしまう。

2019-09-10

anond:20190910174722

classで参照するとき名前とは別で……?

別のclassファイルでも「ちひろ」って定義してたら

ちひろはどうなっちゃうの?

namespaceって何の意味があるの?

全部のclassに同じnamespaceが書いてる(humanとか)として

それに何の意味があるの?

anond:20190910162422

回答さんきゅー。CLIってコマンドラインか。

コマンドベースで実行する事は無いか大丈夫かな。

俺も最近Unityを始めたんだ。まだ分からないことだらけ。

Person person = new Person();

この書き方が謎なんだが、必ずこう書くものなのか?

Person Person では何か不味いのだろうか。

変数の前の「Set」みたいな…ただのClassまじないだと思って良いのだろうか。

>>

People Person = new People();

<<

これはアリだよな?

C#classファイルを分ける意味

MainClass.cs

public class MainClass

{

  // Main メソッド

  public static void Main()

  {

   Person person = new Person();

   person.firstName = "山田";

   person.lastName = "太郎";

   Console.WriteLine(person.GetFullName()); // "山田 太郎" と表示される

  }

}

Person.cs

public class Person

{

  // FirstName プロパティ

  private string firstName;

  public string FirstName

  {

   get { return firstName; }

   set { firstName = value; }

  }

  // LastName プロパティ

  private string lastName;

  public string LastName

  {

   get { return lastName; }

   set { lastName = value; }

  }

  // フルネームを取得するメソッド

  public string GetFullName()

  {

   return firstName + " " + lastName;

  }

}

午前中にC#について聞いてた人がいて、ついでに聞きたい。

classファイルを分けたりする事があると思う。

   Person person = new Person();

このclass定義?なんだが、

必ず大文字文字定義するんだろうか。

new Person(); としたら、勝手に「Person.cs」の中の「Person」クラスを探してくれるんだろうか。

C#プログラム動作を1行1行確認したい。

前の増田が言っていた、Listのやつも知りたい。

paizaとかで入門動画見てれば分かるだろうか。

anond:20190910121653

理解度0.1

Goals

Goal.cs

compositeGoal.cs

GoalSeek.cs

GoalWander.cs

GoalPickup.cs

GoalGetItem.cs

GoalAttackTarget.cs

GoalAttack.cs

Brain.cs

Plans.cs

PlanBase

PlanWander.cs

PlanGetPower.cs

PlanGetEnergy.cs

PlanAttackTarget.cs

PlanObject.cs

Reward.cs

Planner

PlannerBase.cs

CharaPlanner.cs

Memory

Memory.cs

AIBase

AIBase.cs

ここまでclassファイル必要なのか!?と思ってるところ。

1つ1つ読むにしても……やっぱり分からない箇所が出てくるから読み解けないしなぁ。

anond:20190910104714

List<Object>だったらそのインスタンスは「オブジェクトリスト」だし、List<シンドラー>だったら「シンドラーリスト」ってこと。

そのObjectとかシンドラーとかは急に現れたんだけれど、

元はどこから来ているんだろう?

ただの変数定義と一緒で、これから値が入っていく感じ?

それともclassとかでListに値が入っていく感じ?

classでListに値を入れていくにしても

この書き方だと良く分からない。

anond:20190910103350

それは助かる。

かに聞きたいところが全くかかれてなかった。

AI意思決定を作るのに凄く興味があって

人工知能本とか読み漁ってるんだ。最終的にUnityゲームを作ろうと思ってる。

まず、Listの<>の名称がListではない別のものになっている件。

このRewardやPlanはどこから来ているのか。別の.csファイルクラスとかから来ているのか。

class Plan {

public GoalType goalType; // 実行する目標種別

 public List<Reward> rewardProspects; // 報酬の見込み

}

//実行可能プランリストアップ

List<Plan> plans = EnumerateExectablePlans();

//最も評価の高いプランを算出

float maxValue = 0;

Plan execPlan = null;

foreach( var plan in plans ){

//プラン現在欲求と、プラン報酬に基づいて評価

float value = EvaluatePlan( plan );

  if( value >= maxValue ){

execPlan = plan;

}

}

//一番評価値の高かったプラン目標を設定

実行可能プランリストアップするための関数

List<Plan> EnumerateExectablePlans() {

List<Plan> plans = new List<Plan>();

//記憶登録されているオブジェクトを列挙

  List<Objectobjects = EnumerateMemolizedObjects();

  //オブジェクトに紐づいたプランを、リストに追加

foreach( var object in objects ){

plans.Add( objects.plan );

}

   ・

   ・

   ・

}

上記は謎が多くて分からない。結果をList<Plan>として保存?するみたいなイメージなのか?

List<Plan> plans = new List<Plan>();??

やっぱり初歩的なところから勉強しなおしたほうが良いかもしれない。

List系は苦手だった。

ソース元のサイトは以下

ゲームAI – 基礎編(2) – 『はじめてのエージェントベースアーキテクチャ

http://tech.cygames.co.jp/archives/2364/

C#クラスや、その他基本と違うやり方でC#ファイル同士で連携とられると分からなくなる

入門用の書籍とか読むと、大体理解できていると思うんだけど

ネット上に落ちているC#ファイル同士で連携を取らせる手法などになってくると

複雑になってくるからか良く分からなくなってしまう。

C#csファイル同士で連携をとって

class使ったりList?みたいな<>に変数名を入れたような<food> みたいなやつだったり

そういう手法が書いてるところって無い?

スラスラ読める Unity C#ふりがなプログラミング (ふりがなプログラミングシリーズ) とか

その他C#本持ってるけど、実用的じゃないんだよなぁ。

2019-09-04

C#Strategyって書き方があると思ってた

たんに「Strategy」っていうパターンの話であって

そういう「class」とか「funciton」とかの構文の話じゃないんだな!

紛らわしい。

2019-08-07

C#入門したい

C#勉強がしたい。

classとか良く分からない。

良い感じのプログラムの組み方も分からない。

良い入門サイトいかな。探すか。

2019-07-23

ol,ulをフルリセットした後、デザイン作ってもらったんとは別で

ブラウザデフォ表示のスタイル個別に使うからclass作っといてが通じなくて死んでるんだけど

2019-05-05

anond:20190504053302

学校で「クラス」の話題が出ない日はないと思う

クラス」(class)は「階級」という意味から

日常的に「階級」という言葉は使われている

2019-04-14

急募キーワードリンクを赤く染めたい

普通に染めようとすると………

急募キーワードリンクを赤く染めたい

となって、キーワードリンクだけ黒のままになってしまう。

class="keyword"で囲まれてるのはわかるんだが、ここからCSSを上書きする方法がわからない。

2019-01-06

import pprint


class Value:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __repr__(self):
        return f'{type(self).__name__}({self.x}, {self.y})'


def create_2D_list(a, b):
    _2D_list = []
    for i in range(a):
        _1D_list = []
        _2D_list.append(_1D_list)
        for j in range(b):
            _1D_list.append(Value(i, j))
    return _2D_list


pprint.pprint(create_2D_list(2, 3))
# [[Value(0, 0), Value(0, 1), Value(0, 2)],
#  [Value(1, 0), Value(1, 1), Value(1, 2)]]

2019-01-03

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;
}

ログイン ユーザー登録
ようこそ ゲスト さん