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

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

新規登録して質問してみよう
ただいま回答率
85.37%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

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

Q&A

解決済

1回答

374閲覧

C言語を使用し、アセンブリを行うことでGBAで実行するためのコードで、Snake Gameを実現したいけどうまくできません。

tetra_28

総合スコア1

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

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

0グッド

0クリップ

投稿2024/07/06 07:17

実現したいこと

蛇を進んでいるようにするため頭が進んだ分後方部の体を背景色で塗りつぶし、進んでいるように見せたいです。

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

配列により体の位置を保管し、作成したDeleteSnakeメソッドを使用して最後尾の体部分を削除したいのですが、方向転換を行うと指している最後尾の体の座標がずれてしまいます。どのようにすればこの問題を解決できますか。11*7ブロックの中を移動し、それぞれブロックの中心近く(左上なら(19,19))に座標を与えており、それぞれブロックの中心からブロックの中心への数値の差は20です。

該当のソースコード

C

1 2 while (1) { 3 if ((((*key & right) == 0) || keyjudge == 1) && (getPixelColor(headx + 20, heady) != 0x7FE0)) { 4 keyjudge = 1; 5 delay(1000000); 6 if(deletejudge == 2){ 7 bodypoint[0][1] = bodypoint[0][1] + 20; 8 deletejudge = 1; 9 }else if(deletejudge == 4){ 10 bodypoint[0][1] = bodypoint[0][1] - 20; 11 deletejudge = 1; 12 } 13 DeleteSnake(bodypoint[0][0], bodypoint[0][1]); 14 SnakeBody(headx, heady, snakecolor); 15 headx = headx + 20; 16 bodypoint[0][0] = bodypoint[0][0] + 20; 17 SnakeHeadRight(headx, heady, snakecolor); 18 if((*key & down) == 0){ 19 keyjudge = 2; 20 } 21 if((*key & up) == 0){ 22 keyjudge = 4; 23 } 24 } else if ((((*key & down) == 0) || keyjudge == 2) && (getPixelColor(headx, heady + 20) != 0x7FE0)) { 25 keyjudge = 2; 26 delay(1000000); 27 if(deletejudge == 1){ 28 bodypoint[0][0] = bodypoint[0][0] + 20; 29 deletejudge = 2; 30 }else if(deletejudge == 3){ 31 bodypoint[0][0] = bodypoint[0][0] - 20; 32 deletejudge = 2; 33 } 34 DeleteSnake(bodypoint[0][0], bodypoint[0][1]); 35 SnakeBody(headx, heady, snakecolor); 36 heady = heady + 20; 37 bodypoint[0][1] = bodypoint[0][1] + 20; 38 SnakeHeadDown(headx, heady, snakecolor); 39 if((*key & right) == 0){ 40 keyjudge = 1; 41 } 42 if((*key & left) == 0){ 43 keyjudge = 3; 44 } 45 } else if ((((*key & left) == 0) || keyjudge == 3) && (getPixelColor(headx - 20, heady) != 0x7FE0)) { 46 keyjudge = 3; 47 delay(1000000); 48 if(deletejudge == 2){ 49 bodypoint[0][1] = bodypoint[0][1] + 20; 50 deletejudge = 3; 51 }else if(deletejudge == 4){ 52 bodypoint[0][1] = bodypoint[0][1] - 20; 53 deletejudge = 3; 54 } 55 DeleteSnake(bodypoint[0][0], bodypoint[0][1]); 56 SnakeBody(headx, heady, snakecolor); 57 headx = headx - 20; 58 bodypoint[0][0] = bodypoint[0][0] - 20; 59 SnakeHeadLeft(headx, heady, snakecolor); 60 if((*key & down) == 0){ 61 keyjudge = 2; 62 } 63 if((*key & up) == 0){ 64 keyjudge = 4; 65 } 66 } else if ((((*key & up) == 0) || keyjudge == 4) && (getPixelColor(headx, heady - 20) != 0x7FE0)) { 67 keyjudge = 4; 68 delay(1000000); 69 if(deletejudge == 1){ 70 bodypoint[0][0] = bodypoint[0][0] + 20; 71 deletejudge = 4; 72 }else if(deletejudge == 3){ 73 bodypoint[0][0] = bodypoint[0][0] - 20; 74 deletejudge = 4; 75 } 76 DeleteSnake(bodypoint[0][0], bodypoint[0][1]); 77 SnakeBody(headx, heady, snakecolor); 78 heady = heady - 20; 79 bodypoint[0][1] = bodypoint[0][1] - 20; 80 SnakeHeadUp(headx, heady, snakecolor); 81 if((*key & right) == 0){ 82 keyjudge = 1; 83 } 84 if((*key & left) == 0){ 85 keyjudge = 3; 86 } 87 } else if(getPixelColor(headx, heady) == 0x7FE0 || getPixelColor(headx, heady) == 0x7C00){ 88 while(1) 89 return(0); 90 }else{ 91 delay(1000000); 92 SnakeBody(headx, heady, snakecolor); 93 headx = headx + 20; 94 SnakeHeadRight(headx, heady, snakecolor); 95 } 96 } 97 return 0; 98} 99 100void SnakeHeadRight(hword startx, hword starty, hword color) { 101 hword xa, ya, xb, yb; 102 hword black = 0x0000; 103 hword white = 0xFFFF; 104 xa = startx - 8; 105 ya = starty - 8; 106 xb = startx + 10; 107 yb = starty + 10; 108 for (a = xa; a < xb; a++) { 109 for (b = ya; b < yb; b++) { 110 draw_point(a, b, color); 111 if ((a > xb - 11 && a < xb - 2) && ((b > ya + 2 && b < ya + 8) || (b > yb - 8 && b < yb - 2))) { 112 draw_point(a, b, white); 113 } 114 if ((a > xb - 7 && a < xb - 4) && ((b > ya + 3 && b < ya + 7) || (b > yb - 7 && b < yb - 3))) { 115 draw_point(a, b, black); 116 } 117 } 118 } 119} 120 121void SnakeHeadDown(hword startx, hword starty, hword color) { 122 hword xa, ya, xb, yb; 123 hword black = 0x0000; 124 hword white = 0xFFFF; 125 xa = startx - 8; 126 ya = starty - 8; 127 xb = startx + 10; 128 yb = starty + 10; 129 for (a = xa; a < xb; a++) { 130 for (b = ya; b < yb; b++) { 131 draw_point(a, b, color); 132 if ((b > yb - 11 && b < yb - 2) && ((a > xa + 2 && a < xa + 8) || (a > xb - 8 && a < xb - 2))) { 133 draw_point(a, b, white); 134 } 135 if ((b > yb - 7 && b < yb - 4) && ((a > xa + 3 && a < xa + 7) || (a > xb - 7 && a < xb - 3))) { 136 draw_point(a, b, black); 137 } 138 } 139 } 140} 141 142void SnakeHeadLeft(hword startx, hword starty, hword color) { 143 hword xa, ya, xb, yb; 144 hword black = 0x0000; 145 hword white = 0xFFFF; 146 xa = startx - 8; 147 ya = starty - 8; 148 xb = startx + 10; 149 yb = starty + 10; 150 for (a = xa; a < xb; a++) { 151 for (b = ya; b < yb; b++) { 152 draw_point(a, b, color); 153 if ((a < xa + 11 && a > xa + 2) && ((b > ya + 2 && b < ya + 8) || (b > yb - 8 && b < yb - 2))) { 154 draw_point(a, b, white); 155 } 156 if ((a < xa + 7 && a > xa + 4) && ((b > ya + 3 && b < ya + 7) || (b > yb - 7 && b < yb - 3))) { 157 draw_point(a, b, black); 158 } 159 } 160 } 161} 162 163void SnakeHeadUp(hword startx, hword starty, hword color) { 164 hword xa, ya, xb, yb; 165 hword black = 0x0000; 166 hword white = 0xFFFF; 167 xa = startx - 8; 168 ya = starty - 8; 169 xb = startx + 10; 170 yb = starty + 10; 171 for (a = xa; a < xb; a++) { 172 for (b = ya; b < yb; b++) { 173 draw_point(a, b, color); 174 if ((b < ya + 11 && b > ya + 2) && ((a > xa + 2 && a < xa + 8) || (a > xb - 8 && a < xb - 2))) { 175 draw_point(a, b, white); 176 } 177 if ((b < ya + 7 && b > ya + 4) && ((a > xa + 3 && a < xa + 7) || (a > xb - 7 && a < xb - 3))) { 178 draw_point(a, b, black); 179 } 180 } 181 } 182} 183 184void SnakeBody(hword startx, hword starty, hword color) { 185 hword xa, ya, xb, yb; 186 xa = startx - 8; 187 ya = starty - 8; 188 xb = startx + 10; 189 yb = starty + 10; 190 for (a = xa; a < xb; a++) { 191 for (b = ya; b < yb; b++) { 192 draw_point(a, b, color); 193 } 194 } 195} 196 197void DeleteSnake(hword talex, hword taley) { 198 hword xa, ya, xb, yb; 199 hword black = 0x0000; // 背景色を黒と仮定 200 xa = talex - 8; // `startx` の代わりに `talex` を使用 201 ya = taley - 8; // `starty` の代わりに `taley` を使用 202 xb = talex + 10; // 同様に `talex` を使用 203 yb = taley + 10; // 同様に `taley` を使用 204 for (a = xa; a < xb; a++) { 205 for (b = ya; b < yb; b++) { 206 draw_point(a, b, black); 207 } 208 } 209} 210 211void draw_point(hword x, hword y, hword color) { 212 hword *ptr; 213 ptr = (hword*) VRAM; 214 ptr += y * 240 + x; 215 *ptr = color; 216} 217 218// 指定した座標のピクセルの色を取得する関数 219hword getPixelColor(int x, int y) { 220 hword *ptr; 221 ptr = (hword*) VRAM; 222 return ptr[y * 240 + x]; 223} 224 225void delay(int count) { 226 int i; // ここで変数を宣言 227 for (i = 0; i < count; i++) { 228 asm("nop"); 229 } 230} 231 232

試したこと・調べたこと

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

Google等では何もわからず、GPTに聞くとDeleteSnakeメソッドがおかしいと返されましたが、修正を行ってもうまくいきませんでした。

補足

コード全体は載せられなかったため、気になる部分を載せさせていただきました。

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

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

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

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

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

jimbe

2024/07/06 07:59 編集

GBA ってなんでしょうか。 コードをパッと見てコピペで生やしたようなコードだらけですので、ちゃんと整理すればもっと短くなるはずです。(DeleteSnake は SnakeBody を color を 0 (黒) で呼べば流用できるはずです。) 蛇の体の各部分の座標を配列で持っているのなら消す座標はその最後尾を消すだけでしょう。
dodox86

2024/07/06 07:40

GBA、、、? 私も何かと思い、その略し方は知りませんでしたが、GBA=GAME BOY ADVANCE ぽいですね。提示されているコードにはアセンブリ言語のアの字も出てきていませんが、ゲーム畑の方々にはSnake Gameの一言で通じて、類型のあるコード片なのでしょうか。
dodox86

2024/07/06 07:50

「C言語でアセンブリを行ってGBAで実行」、、、C言語でプログラムをビルド、組み立て(アセンブリ)するという意味でしたでしょうか。ゲーム系は畑違いだったので、的外れなコメントだったかもしれません。失礼しました。
guest

回答1

0

自己解決

マスの分(x,y)を収める配列を用意しておき、1番目の配列を削除するものと決めておく。頭を格納するためにheadplaceという変数を作成し、赤色の玉とヘビの頭が被ったときに配列に収まっているものをすべて+1分格納場所をずらし、1番目部分には一つ前に削除した身体部分の座標を格納し、擬似的に体を伸ばす。

投稿2024/07/08 02:34

tetra_28

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問