質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

604閲覧

c言語 テトリス作成 回転(SRS)の実装

sakanasakana39

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2024/06/17 05:59

実現したいこと

テトリスでスペースキーを押したら右回転するようにしたい。

発生している問題・分からないこと

スペースキーを押してもまず反応しない。矢印キーの右や左の移動は出来るが回転が行われない。

該当のソースコード

game.c

1void startTetrisGame(int x, int y) 2{ 3 // ゲームの初期化 4 GameState game; 5 Block currentBlock; 6 initGame(&game); 7 generateNewBlock(&currentBlock); 8 9 // ゲームループ 10 timeout(500); // 0.2秒待機 11 while (!game.gameOver) 12 { 13 int ch = getch(); 14 switch (ch) 15 { 16 case KEY_LEFT: 17 if (currentBlock.x > 0) 18 { // 左端に到達していない場合にのみ左に移動 19 currentBlock.x--; 20 if (checkCollision(&game, &currentBlock)) 21 { 22 currentBlock.x++; 23 } 24 } 25 break; 26 case KEY_RIGHT: 27 currentBlock.x++; 28 if (checkCollision(&game, &currentBlock)) 29 { 30 currentBlock.x--; 31 } 32 break; 33 case ' ': 34 rotateBlockWithSRS(&game, &currentBlock, 1); // スペースキーで右回転 35 break; 36 default: 37 break; 38 } 39 40 // ブロックの落下 41 currentBlock.y++; 42 if (checkCollision(&game, &currentBlock)) 43 { 44 currentBlock.y--; 45 mergeBlock(&game, &currentBlock); 46 removeLine(&game); 47 generateNewBlock(&currentBlock); 48 if (checkCollision(&game, &currentBlock)) 49 { 50 game.gameOver = 1; 51 } 52 } 53 54 drawGame(&game); 55 drawBlock(&currentBlock); 56 refresh(); 57 } 58 59 // ゲームオーバー時の処理 60 clear(); 61 mvprintw(y / 2, x / 2 - 5, "ゲームオーバー"); 62 mvprintw(y / 2 + 1, x / 2 - 10, "sキーを押してタイトルに戻る"); 63 refresh(); 64 65 // スコアを更新 66 updateRankingFile(game.score); 67 68 // 's'キーが押されるまで待機 69 timeout(-1); // キー入力を待機する 70 while (getch() != 's'); 71} 72

srs.c

1void rotateBlockWithSRS(GameState *game, Block *block, int direction) 2{ 3 bool rotated = false; 4 5 // 回転方向に基づいて回転関数を選択 6 if (direction == 1) 7 { // 右回転 8 if (block->shape == SHAPE_I) 9 { 10 rotated = RotateRightI(game, block); 11 } 12 else if(block->shape == SHAPE_O){ 13 rotated = true; 14 } 15 else 16 { 17 rotated = RotateRight3(game, block); 18 } 19 } 20 else if (direction == -1) 21 { // 左回転 22 // 左回転の場合、右回転を3回行うことで左回転と同等にする 23 for (int i = 0; i < 3; i++) 24 { 25 if (block->shape == SHAPE_I) 26 { 27 rotated = RotateRightI(game, block); 28 } 29 else if (block->shape != SHAPE_O) 30 { 31 rotated = RotateRight3(game, block); 32 } 33 if (!rotated) 34 break; 35 } 36 } 37 38 // 回転に成功した場合、新しい角度を設定 39 if (rotated) 40 { 41 if (direction == 1) 42 { 43 block->angle = (block->angle + 1) % 4; 44 } 45 else if (direction == -1) 46 { 47 block->angle = (block->angle + 3) % 4; 48 } 49 } 50} 51

rotate.c

1// Iミノの回転処理 2bool RotateRightI(GameState *game, Block *block) 3{ 4 if (CanRotate(game, block, true, -2, 0)) 5 return RotateRight(game, block, 0, 0); 6 7 if (block->angle == Angle0) 8 { 9 if (CanRotate(game, block, true, -2, 0)) 10 return RotateRight(game, block, -2, 0); 11 if (CanRotate(game, block, true, 1, 0)) 12 return RotateRight(game, block, 1, 0); 13 if (CanRotate(game, block, true, -2, 1)) 14 return RotateRight(game, block, -2, 1); 15 if (CanRotate(game, block, true, 1, -2)) 16 return RotateRight(game, block, 1, -2); 17 } 18 else if (block->angle == Angle90) 19 { 20 if (CanRotate(game, block, true, -1, 0)) 21 return RotateRight(game, block, -1, 0); 22 if (CanRotate(game, block, true, 2, 0)) 23 return RotateRight(game, block, 2, 0); 24 if (CanRotate(game, block, true, -1, -2)) 25 return RotateRight(game, block, -1, -2); 26 if (CanRotate(game, block, true, 2, 1)) 27 return RotateRight(game, block, 2, 1); 28 } 29 else if (block->angle == Angle180) 30 { 31 if (CanRotate(game, block, true, 2, 0)) 32 return RotateRight(game, block, 2, 0); 33 if (CanRotate(game, block, true, -1, 0)) 34 return RotateRight(game, block, -1, 0); 35 if (CanRotate(game, block, true, 2, -1)) 36 return RotateRight(game, block, 2, -1); 37 if (CanRotate(game, block, true, -1, 2)) 38 return RotateRight(game, block, -1, 2); 39 } 40 else if (block->angle == Angle270) 41 { 42 if (CanRotate(game, block, true, -2, 0)) 43 return RotateRight(game, block, -2, 0); 44 if (CanRotate(game, block, true, 1, 0)) 45 return RotateRight(game, block, 1, 0); 46 if (CanRotate(game, block, true, 1, 2)) 47 return RotateRight(game, block, 1, 2); 48 if (CanRotate(game, block, true, -2, -1)) 49 return RotateRight(game, block, -2, -1); 50 } 51 return false; 52} 53 54// I,O以外の回転処理 55bool RotateRight3(GameState *game, Block *block) 56{ 57 if (CanRotate(game, block, true, 0, 0)) 58 return RotateRight(game, block, 0, 0); 59 60 if (block->angle == Angle0) 61 { 62 if (CanRotate(game, block, true, -1, 0)) 63 return RotateRight(game, block, -1, 0); 64 if (CanRotate(game, block, true, -1, -1)) 65 return RotateRight(game, block, -1, -1); 66 if (CanRotate(game, block, true, 0, 2)) 67 return RotateRight(game, block, 0, 2); 68 if (CanRotate(game, block, true, -1, 2)) 69 return RotateRight(game, block, -1, 2); 70 } 71 else if (block->angle == Angle90) 72 { 73 if (CanRotate(game, block, true, 1, 0)) 74 return RotateRight(game, block, 1, 0); 75 if (CanRotate(game, block, true, 1, 1)) 76 return RotateRight(game, block, 1, 1); 77 if (CanRotate(game, block, true, 0, -2)) 78 return RotateRight(game, block, 0, -2); 79 if (CanRotate(game, block, true, 1, -2)) 80 return RotateRight(game, block, 1, -2); 81 } 82 else if (block->angle == Angle180) 83 { 84 if (CanRotate(game, block, true, 1, 0)) 85 return RotateRight(game, block, 1, 0); 86 if (CanRotate(game, block, true, 1, -1)) 87 return RotateRight(game, block, 1, -1); 88 if (CanRotate(game, block, true, 0, 2)) 89 return RotateRight(game, block, 0, 2); 90 if (CanRotate(game, block, true, 1, 2)) 91 return RotateRight(game, block, 1, 2); 92 } 93 else if (block->angle == Angle270) 94 { 95 if (CanRotate(game, block, true, -2, 0)) 96 return RotateRight(game, block, -2, 0); 97 if (CanRotate(game, block, true, -2, 1)) 98 return RotateRight(game, block, -2, 1); 99 if (CanRotate(game, block, true, 0, -2)) 100 return RotateRight(game, block, 0, -2); 101 if (CanRotate(game, block, true, -1, -2)) 102 return RotateRight(game, block, -1, -2); 103 } 104 return false; 105} 106

canrotate.c

1bool CanRotate(GameState *game, Block *block, bool isRight, int x, int y) 2{ 3 TetriminoAngle nextAngle; 4 TetriminoPosition tetri[4]; 5 6 if (isRight) 7 nextAngle = Angle90; 8 else 9 nextAngle = Angle270; 10 11 // m_TetriminoPositionX, m_TetriminoPositionY の初期状態を仮定して考える 12 // GetTetriminosPosition(tetri, 4); の実装は必要に応じて置き換える 13 14 // 一時的な計算 15 for (int i = 0; i < 4; i++) 16 { 17 tetri[i].m_column -= m_TetriminoPositionX; 18 tetri[i].m_row -= m_TetriminoPositionY; 19 } 20 21 // m_CurTetriminoType に応じた初期ブロックの取得 22 if (m_CurTetriminoType != SHAPE_I && m_CurTetriminoType != SHAPE_O) 23 { 24 // GetInitBlocksRotate33(tetri, 4, nextAngle); の実装は必要に応じて置き換える 25 } 26 else if (m_CurTetriminoType == SHAPE_I) 27 { 28 // GetInitBlocksRotate44(tetri, 4, nextAngle); の実装は必要に応じて置き換える 29 } 30 31 // SRSを適用した場合の回転軸のズレを加える 32 for (int i = 0; i < 4; i++) 33 { 34 tetri[i].m_column += x; 35 tetri[i].m_row += y; 36 } 37 38 // 現在の m_TetriminoPositionX と m_TetriminoPositionY の分だけ平行移動させる 39 for (int i = 0; i < 4; i++) 40 { 41 tetri[i].m_column += m_TetriminoPositionX; 42 tetri[i].m_row += m_TetriminoPositionY; 43 } 44 45 // これで回転後のブロックの座標が取得できた 46 // 後は当たり判定を行う 47 // フィールドの外に出たり、すでに固定されているブロックがある場合は移動・回転できない 48 for (int i = 0; i < 4; i++) 49 { 50 if (tetri[i].m_column > COLUMN_MAX - 1 || tetri[i].m_column < 0 || 51 tetri[i].m_row > ROW_MAX - 1 || tetri[i].m_FixedBlocks != NULL) 52 { 53 return false; 54 } 55 } 56 57 UNUSED(nextAngle); 58 return true; 59}

rotaterihgt.c

1//右回転 2bool RotateRight(GameState *game, Block *block, int x, int y) 3{ 4 bool ret = false; 5 6 //ブロックがIでもOでもない 7 if (block->shapeMatrix != SHAPE_I && block->shapeMatrix != SHAPE_O) 8 { 9 ret = RotateRight3(game, block); 10 } 11 else if (block->shapeMatrix == SHAPE_I) 12 { 13 ret = RotateRightI(game, block); 14 } 15 16 return ret; 17}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

チャットgptや検索サイトではあまり意味のある回答がこなかった。回転だけの実装はできたが、SRSが出来ておらず、回転した後壁際に寄れなかったり判定の動かし方がわからない。

rotate.cの回転方法の引数の部分があっているのかがわからない

補足

c言語
ncursesを使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2024/06/17 06:29 編集

> rotate.cの回転方法の引数の部分があっているのかがわからない あなたが書いた関数の引数の仕様をあなた自身がわからない(?) というのは,どういう意味ですか? (そんな仕様が不明なものを他者に見せたところで「あっているのか」なんて他者にはわかりようが無いのでは…?) そのような状況下で 一体何をどうAIに尋ねてみたり検索してみたのか,こちらには想像もつきませんが, 実装の各所の正しい挙動というのをあなたはご存じなのですから,そんな変な事してないでデバッグしたら良いのでは? とか思うのですが. (本当に,純粋に,ご自身でデバッグするのが最も手っ取り早いと思う.そんな怒涛の if の羅列を見せられた側はそれだけで圧倒されてしまいますが,これを書いたあなた自身であれば話は別:特定の問題が発生する状況下では特定の実装箇所だけに着目すれば良いこともわかっている 等々,他者とあなたとではスタート地点が違うので.)
can110
jimbe

2024/06/17 07:48

動かして現象を再現したいのですが、提示されているコードの他に何を用意すれば同じ環境で動かすことが出来るでしょうか。
TN8001

2024/06/17 08:19

> c言語 C言語の質問であれば「C#」・「C++」タグは外してください。 (C言語の質問に)回答する気がある方は「C」をMYタグ登録されていると思うので、対象を広げる必要はありません^^
jimbe

2024/06/17 17:43

私には、 RotateRight が RotateRightI や RotateRight3 を呼び、 RotateRightI や RotateRight3 は RotateRight を呼んでいるように見えるんですが、どう動くのでしょう。 一生懸命変えている x,y は使われてませんし…。
guest

回答1

0

キー入力のほうは分からないので、 SRS の確認みたいなのだけ SRS Super Rotation System を見て書いてみました。
とりあえず凸状態の T ミノが一番下に移動した直後に右回転したらというテストをハードコードしています。(これしか試してないですが^^;)
ゲーム画面を模して操作出来るようにしてみました。
カーソルキーで上下左右に移動・スペースで右回転・ 1 ~ 7 で 7 つの形を選べます(選ぶと位置が上に戻ります)。終わりは ESC キーです。
全く質問のコードが入って無いので、参考にさえなるかどうか。

c

1#include <unistd.h> 2#include <ncurses.h> 3 4#ifndef KEY_ESC 5#define KEY_ESC (0x1b) 6#endif 7 8//Super Rotate System パターン 9int SRS_3x3_R[] = { //3x3,右回転(回転前の角度の順にすること) 10 -1,0, -1,-1, 0, 2, -1, 2, //A→B: 1.左1 2.左1上1 3.下2 4.左1下2 11 1,0, 1, 1, 0,-2, 1,-2, //B→C: 1.右1 2.右1下1 3.上2 4.右1上2 12 1,0, 1,-1, 0, 2, 1, 2, //C→D: 1.右1 2.右1上1 3.下2 4.右1下2 13 -2,0, -2, 1, 0,-2, -1,-2 //D→A: 1.左2 2.左2下1 3.上2 4.左1上2 14}; 15int SRS_3x3_L[] = { //3x3,左回転 16 1,0, 1,-1, 0, 2, 1, 2, //A→D: 1.右1 2.右1上1 3.下2 4.右1下2 17 1,0, 1, 1, 0,-2, 1,-2, //B→A: 1.右1 2.右1下1 3.上2 4.右1上2 18 -1,0, -1,-1, 0, 2, -1, 2, //C→B: 1.左1 2.左1上1 3.下2 4.左1下2 19 -1,0, -1, 1, 0,-2, -1,-2 //D→C: 1.左1 2.左1下1 3.上2 4.左1上2 20}; 21int SRS_I_R[] = { //'I',右回転 22 -2,0, 1,0, -2, 1, 1,-2, //A→B: 1.左2 2.右1 3.左2下1 4.右1上2 23 -1,0, 2,0, -1,-2, 2, 1, //B→C: 1.左1 2.右2 3.左1上2 4.右2下1 24 2,0, -1,0, 2,-1, -1, 2, //C→D: 1.右2 2.左1 3.右2上1 4.左1下2 25 -2,0, 1,0, 1, 2, -2,-1 //D→A: 1.左2 2.右1 3.右1下2 4.左2上1 26}; 27int SRS_I_L[] = { //'I',左回転 28 -1,0, 2,0, -1,-2, 2, 1, //A→D: 1.左1 2.右2 3.左1上2 4.右2下1 29 2,0, -1,0, 2,-1, -1, 2, //B→A: 1.右2 2.左1 3.右2上1 4.左1下2 30 1,0, -2,0, 1, 2, -2,-1, //C→B: 1.右1 2.左2 3.右1下2 4.左2上1 31 1,0, -2,0, -2, 1, 1,-2 //D→C: 1.右1 2.左2 3.左2下1 4.右1上2 32}; 33 34//ミノ種類 (=BLOCKS のインデックス) 35typedef enum { 36 BLOCK_O=0, BLOCK_T, BLOCK_S, BLOCK_Z, BLOCK_L, BLOCK_J, BLOCK_I, N_BLOCK_TYPES 37} BLOCK_TYPE; 38 39//ミノを構成する要素数 40#define N_ITEMS 4 41#define N_LEN (N_ITEMS*2) //xy の組数 42 43//ミノ 44typedef struct { 45 int rotate; //回転パターン有無 1=有, 0=無 46 int *layout; //図形パターン, xy の組が 4 つ. rotate=1 なら追加で右 90/180/270 度回転パターン 47 int *srs_r, *srs_l; //SRSパターン 48} BLOCK; 49BLOCK BLOCKS[] = { 50 { //O 51 0, //回転無し 52 (int[]){ 0,0, 0,1, 1,0, 1,1 }, //A 53 NULL, NULL 54 }, 55 { //T 56 1, //回転有り 57 (int[]){ 58 1,0, 0,1, 1,1, 2,1, //A 59 1,0, 1,1, 2,1, 1,2, //B 60 0,1, 1,1, 2,1, 1,2, //C 61 1,0, 0,1, 1,1, 1,2 },//D 62 SRS_3x3_R, SRS_3x3_L 63 }, 64 { //S 65 1, 66 (int[]){ 67 1,0, 2,0, 0,1, 1,1, 68 1,0, 1,1, 2,1, 2,2, 69 1,1, 2,1, 0,2, 1,2, 70 0,0, 0,1, 1,1, 1,2 }, 71 SRS_3x3_R, SRS_3x3_L 72 }, 73 { //Z 74 1, 75 (int[]){ 76 0,0, 1,0, 1,1, 2,1, 77 2,0, 1,1, 2,1, 1,2, 78 0,1, 1,1, 1,2, 2,2, 79 1,0, 0,1, 1,1, 0,2 }, 80 SRS_3x3_R, SRS_3x3_L 81 }, 82 { //L 83 1, 84 (int[]){ 85 2,0, 0,1, 1,1, 2,1, 86 1,0, 1,1, 1,2, 2,2, 87 0,1, 1,1, 2,1, 0,2, 88 0,0, 1,0, 1,1, 1,2 }, 89 SRS_3x3_R, SRS_3x3_L 90 }, 91 { //J 92 1, 93 (int[]){ 94 0,0, 0,1, 1,1, 2,1, 95 1,0, 2,0, 1,1, 1,2, 96 0,1, 1,1, 2,1, 2,2, 97 1,0, 1,1, 0,2, 1,2 }, 98 SRS_3x3_R, SRS_3x3_L 99 }, 100 { //I 101 1, 102 (int[]){ 103 0,1, 1,1, 2,1, 3,1, 104 2,0, 2,1, 2,2, 2,3, 105 0,2, 1,2, 2,2, 3,2, 106 1,0, 1,1, 1,2, 1,3 }, 107 SRS_I_R, SRS_I_L 108 } 109}; 110 111typedef enum { 112 DIR_LEFT=-1, DIR_RIGHT=1 113} DIR; 114 115typedef enum { 116 ANGLE_A=0, ANGLE_B, ANGLE_C, ANGLE_D, N_ANGLES 117} ANGLE; 118 119ANGLE rotate_angle(ANGLE old, DIR dir) { 120 return (old + N_ANGLES + dir) % N_ANGLES; 121} 122 123int *get_angled_layout(BLOCK *block, int angle) { 124 return block->layout + (block->rotate ? N_LEN*angle : 0); 125} 126 127typedef struct { 128 int width, height, outer_value; 129 int *items; 130} PANEL; 131 132int get_panel_item(PANEL *panel, int x, int y) { 133 if(x < 0 || panel->width <= x || y < 0 || panel->height <= y) return panel->outer_value; 134 return panel->items[panel->width * y + x]; 135} 136 137void set_panel_item(PANEL *panel, int x, int y, int value) { 138 if(x < 0 || panel->width <= x || y < 0 || panel->height <= y) return; 139 panel->items[panel->width * y + x] = value; 140} 141 142int is_placeable(BLOCK *block, int angle, int x, int y, PANEL *panel) { 143 int *b = get_angled_layout(block, angle); 144 for(int i=0; i<N_ITEMS; i++, b+=2) { 145 if(get_panel_item(panel, x+b[0], y+b[1])) return 0; //false 146 } 147 return 1; //true 148} 149 150typedef struct { 151 BLOCK *block; 152 int x, y; 153 ANGLE angle; 154} DROP_BLOCK; 155 156void rotate_block(DROP_BLOCK *drop, DIR dir, PANEL *panel) { 157 if(!drop->block->rotate) return; //回転処理は無い 158 159 int new_angle = rotate_angle(drop->angle, dir); 160 if(is_placeable(drop->block, new_angle, drop->x, drop->y, panel)) { 161 drop->angle = new_angle; 162 return; 163 } 164 165 int *srs = dir==DIR_RIGHT ? drop->block->srs_r : dir==DIR_LEFT ? drop->block->srs_l : NULL; 166 if(!srs) return; //SRS が無い 167 168 int *p = &srs[drop->angle * 4*2]; 169 for(int i=0; i<4; i++) { //srsのデータは dx,dy の組が 4 件固定 170 int new_x = drop->x + *p++; 171 int new_y = drop->y + *p++; 172 if(is_placeable(drop->block, new_angle, new_x, new_y, panel)) { //軸を移動させれば置けるなら 173 drop->x = new_x; //軸を移動 174 drop->y = new_y; 175 drop->angle = new_angle; 176 return; 177 } 178 } 179} 180 181#define PANEL_X_OFFSET 2 182 183void print(PANEL *panel, DROP_BLOCK *drop) { 184 clear(); 185 for(int y=0; y<=panel->height; y++) { 186 int xx = 0; 187 mvprintw(y, xx, "<!"); 188 xx += PANEL_X_OFFSET; 189 for(int x=0; x<panel->width; x++, xx+=2) { 190 mvprintw(y, xx, y==panel->height?"==":get_panel_item(panel,x,y)?"[]":" "); 191 } 192 mvprintw(y, xx, "!>"); 193 } 194 int *b = get_angled_layout(drop->block, drop->angle); 195 for(int i=0; i<N_ITEMS; i++, b+=2) { 196 mvprintw(drop->y+b[1], (drop->x+b[0])*2+PANEL_X_OFFSET, "[]"); 197 } 198 refresh(); 199} 200 201int main(void) { 202 PANEL panel = { 203 10, 12, 2, 204 (int[]){ //空き位置は 0, 障害物は !0 205 0,0,0,0,0,0,0,0,0,0, 206 0,0,0,0,0,0,0,0,0,0, 207 0,0,0,0,0,0,0,0,0,0, 208 0,0,0,0,0,0,0,0,0,0, 209 0,0,0,0,0,0,0,0,0,0, 210 0,0,0,0,0,0,0,0,0,0, 211 0,0,0,0,0,0,0,0,0,0, 212 0,0,0,0,0,0,0,0,0,0, 213 0,0,0,0,1,0,0,0,0,1, 214 1,0,0,0,1,1,1,0,0,1, 215 1,1,0,1,1,0,0,0,0,1, 216 1,0,0,1,1,0,0,0,0,1 } 217 }; 218 219 initscr(); 220 noecho(); //入力表示無し 221 curs_set(0); //カーソル非表示 222 cbreak(); //入力バッファ無し 223 keypad(stdscr, 1); //カーソルキー入力 224 timeout(100); //入力待ち時間[ms] 225 226 //初期(これは正常に置けるものとする) 227 DROP_BLOCK drop; 228 drop.x = 4; 229 drop.y = 0; 230 drop.angle = ANGLE_A; 231 drop.block = &BLOCKS[BLOCK_T]; 232 233 for(int ch; (ch=getch())!=KEY_ESC; ) { 234 if(ch == KEY_LEFT || ch == KEY_RIGHT || ch == KEY_UP || ch == KEY_DOWN) { //移動 235 int dx = ch == KEY_LEFT ? -1 : ch == KEY_RIGHT ? 1 : 0; 236 int dy = ch == KEY_UP ? -1 : ch == KEY_DOWN ? 1 : 0; 237 if(is_placeable(drop.block, drop.angle, drop.x+dx, drop.y+dy, &panel)) { 238 drop.x += dx; 239 drop.y += dy; 240 } 241 } 242 if(ch == ' ') { //回転 243 rotate_block(&drop, DIR_RIGHT, &panel); 244 } 245 if('1' <= ch && ch < '1'+N_BLOCK_TYPES) { //切り替え 246 drop.x = 4; 247 drop.y = 0; 248 drop.angle = ANGLE_A; 249 drop.block = &BLOCKS[ch - '1']; 250 } 251 252 print(&panel, &drop); 253 } 254 255 endwin(); 256}

Cygwinスクリーンショット

投稿2024/06/18 17:39

編集2024/06/22 07:29
jimbe

総合スコア13168

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問