前提・実現したいこと
8X8のLEDと2個のスイッチがついたマイコンを使って簡単なゲームをつくろうとしています。ですがゲーム画面になってからうまく動かずに困っています。ゲームの動きとしては、最初の画面で一番下の段が光っており、次に光っている部分の1個上の段が光り、左右に移動しているのでそれをタイミングよくボタンを押して止めるといったものです。下の部分と上の部分の光っている部分が一つでも一致したら、成功でさらにその上の段が光り、同じことを繰り返すといったものです。イメージとしては、昔テレビ番組でやっていた東京フレンドパークという番組ののストッパーキューブリッチというゲームみたいな動きをします。
発生している問題・エラーメッセージ
エラーメッセージはないのですが、うまく機能していない部分があり、一番下が光った状態でその上ではなく2個上が光ってしまったり、謎に右端が縦にひかってしまいます。また、ボタンを押して止めた部分の光が保持されません。じぶんでも修正を試みたのですがうまくいかなくて困っております。
該当のソースコード
c言語 #include<string.h> #include<stdio.h> #include "user.h" unsigned char i; //カウンタ unsigned char s_count = 0; // つなげることに成功した回数(最大6回) unsigned char game_flag = 0; //画面遷移の変数 void user_init(void) { _sound(33, 2); } void appear_bridge(){ //橋の出現 caseのほうがいいのかな? if(s_count == 0){ led[6] = 0x1f; }else if(s_count == 1){ led[5] = 0xf1; }else if(s_count == 2){ led[4] = 0x0f; }else if(s_count == 3){ led[3] = 0x0f; }else if(s_count == 4){ led[2] = 0x07; }else if(s_count == 5){ led[1] = 0x03; }else if(s_count == 6){ led[0] = 0x01; } } void shift() //ライトを左右に動かすメソッド { static unsigned char span_cnt = 0; static unsigned char move_left = 0; char height = 6 - s_count; if (span_cnt++ > 10){ // 1s span_cnt = 0; if(led[height] & 0b10000000) move_left = 0; if(led[height] & 0b00000001) move_left = 1; if(move_left) led[height] = led[height] << 1; else led[height] = led[height] >> 1; } } void fresh(){ for (i=0; i<8; i++) led[i] = 0; } void game(void) { led[7] = 0xff; shift(); if(sw_flag){ sw_flag = 0; char height = 6 - s_count; if (led[height] = led[height+1] && led[height]){ s_count++; } else{ // 失敗 game_flag = 0; fresh(); return; } _sound(33, 1); char chata = 5;// チャタリング対策 while(chata>0) chata--; appear_bridge(); } if(s_count == 6){ // クリア _sound(33, 10); game_flag = 0; } } void title(void) { if(sw_flag){ //ボタン押されたらゲーム画面に遷移 sw_flag = 0; game_flag = 1; s_count = 0; appear_bridge(); } } void user_main(void) { switch(game_flag){ case 0: title(); //初期画面に遷移(スタートしたときや失敗したとき) break; case 1: game(); //ゲーム画面に遷移 break; } }
フレームワーク user.h #include <stdint.h> typedef unsigned char uchar; #define LED_SZ 8 enum{ BEEP_HIGH = 46, BEEP_LOW = 168, BEEP_C4 = 238, BEEP_D4 = 212, BEEP_E4 = 189, BEEP_F4 = 178, BEEP_G4 = 158, BEEP_A4 = 141, BEEP_B4 = 126, BEEP_C5 = 118, }; extern void _wait(uint8_t wait); extern uint8_t _rand(void); extern void _sound(uint8_t tone, uint8_t length); extern volatile uint8_t sw_flag; extern volatile uint8_t sw; extern volatile uint8_t led[LED_SZ]; extern void user_init(void); extern void user_main(void);
回答1件
あなたの回答
tips
プレビュー