Git Product home page Git Product logo

tetris's Introduction

最近、無意に任天堂ストアを開いてみると、上位に水メロンゲームやテトリスなどがランクインしていることに気づきました。私はまるでN64やファミコン時代に戻ったかのようで、正直に言って、日本の人々の好みや考え方をまったく理解できません。再び感じるのは、エンジニアとしては市場調査などをすることなく、専門家に任せるべきだということです。しかし、このゲームの開発が本当に難易度ゼロであることを証明するために、私は500行以上のコードで独自にテトリスを作成しました。ソースコード、プレイ動画、素材を提供し、C++とSDL2というシンプルな2Dグラフィックライブラリを使用しました。

最近无意中点开任天堂商店,发现排名靠前的竟然还有什么西瓜游戏,俄罗斯方块啥的,我甚至都以为自己回到了n64红白机的时代。我只能说作为外国人,我一点也理解不了日本民众的喜好和想法。我再一次感受到了作为工程师不要尝试去做市场调研之类的工作,分工要明确,交给专业的人去做。但是为了证明这个游戏的开发真的一点难度都没有,我用了500多行代码自己做了一个俄罗斯方块。我提供源代码和试玩视频还有素材,使用了c++和sdl2这样简单的2d图形库。

ゲーム画面とブロックの作成

ウィンドウを初期化し、その後背景画像を読み込み、さらにテトリスを生成します。テトリスには合計で七つの異なる形状があり、これを番号付けて、余りやランダムな数を使用して生成します。ブロックの情報は二次元配列を使用して保存され、これによりブロックの形状が表現されます。もしロシアのブロックをプレイしたことがあれば、これについては詳しく説明する必要はないでしょう。

我们初始化一个窗口,然后把背景图片载入,之后生成方块。俄罗斯方块中一共有七种方块,我们编号之后用取余数和随机数的方法来生成就行了。方块的存储会用到二维数组,主要是为了表现出方块的形状。如果你玩过俄罗斯方块,应该不用我多解释。

ブロックの回転、落下、および移動

左右の矢印キーを使用してブロックを横に移動し、下向きの矢印キーを使用してブロックを直接底部まで降ろし、上向きの矢印キーを使用して時計回りに回転させる機能を実装します。

特に注意が必要なのは、移動、降下、および回転(特に回転は見落とされやすい)の際に、ブロックがマップの範囲を超えていないかどうかを判断することです。もし範囲を超えていた場合、その操作をキャンセルする必要があります。もし判断がない場合、特にオブジェクトを構築するときに地図のサイズが事前に固定されている場合、スタックオーバーフローが発生し、プログラムがクラッシュします。そして、ブロックが底部に到達した場合、ブロックを固定する必要があります。ここでは、二次元配列で表されるマップの対応する要素を0から1に変更するだけで済みます。

我们用方向键的左右来实现方块的平移,下来实现直接降落到底部,上则表示顺时针旋转。

这里需要特别注意,当平移降落以及旋转(尤其是旋转,很容易被忽略),一定要做判断,方块是否超出了地图的范围,如果超出则取消此次操作。如果我们这里没有这个判断,那么在构造函数声明对象的时候,地图的尺寸是提前固定好的,这里就会导致栈溢出从而程序崩溃。然后如果降落到了底部,则需要对方块进行固化。这里只需要把二维数组表示的地图里对应的元素从0改为1即可。

ERASE

一行のブロックを消去し、得点を計算します。一度に消去できる行が多いほど、得点が高くなります。ここでは、各ブロックを固定するたびに、その行がすべて1であるかどうかを判断し、1であればその行を消去し、それ以降の行をすべて一段ずつ下げる処理を行います。これはシステムのリソースを最大限に使用する部分であり、効果的な最適化方法が見当たらないようです。時間の複雑さは下がらず、後続のブロックの降下もループで判断する必要があり、画面の更新に伴うコストも非常に大きいです。

消除一行方块并且计算得分。我们知道一次消除越多则得分越高,这里主要是每次固化方块的时候都进行一次判断,是否有一行元素全为1,若有则消除并且让之后的行都下降一行。这里是系统资源开销最大的地方,我想了很久似乎没有什么好的优化方法,时间复杂度始终下不来,因为后续的降落也是需要循环判断的,更新画面带来的开销也是非常大的。

遊び画面

コード

tetris's People

Contributors

kokorosinx avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.