「数当てゲーム」のソースコード。


RGKT-NDS-STDY-007(010)


自作の inputf() 関数テスト用コードです。
晒しときます。


KAZUATE GAME eng ver.


コメントとかないけど難しいことしてないしまあ大丈夫。
至らないところとかツッコミ大歓迎です!
インクルードしてる inputf.h と inputf.c もちゃんとコメント書いてから公開しますんで
まずこっちを。


ゲームプログラムいまいちわかってないんですが。
こんな感じのループ処理じゃもっと複雑なものを作るとき大変ですよね(汗々)?


追記:
ゲーム的ループ処理書いてて思ったこと。
何かのまとまった処理はそのまとまった処理用の初期化処理とセットで用意した方が
ループ処理的に都合が良いと思った。
(GAME_MAIN の前に後付けで GAME_START を挿入したのがそれ。
GAME_CONTINUE から再び GAME_MAIN に戻そうとしたとき初期化処理(乱数生成)が出来ないことに気付いたので。
かといって GAME_CONTINUE から GAME_MAIN に戻すときの処理で
GAME_CONTINUE 内で初期化処理を書き足すのはスマートじゃないし
そうした書き方は、仮にコードが肥大化したら破綻が生じると思えたから。)


KAZUATE GAME eng ver. source

//---------------------------------------------------------------------------------
//	
//	KAZUATE GAME eng ver.
//	
//	Jan 31, 2009 - Feb 01, 2009
//	CODING BY. AYUMI @REGEKATSU
//	This program was made from devkitPro Version 1.4.9
//	
//	REGEKATSU
//	-Console/Homebrew Programming-
//
//	this web site.
//	http://akiba.geocities.jp/consolehomebrewprogramming/
//
//---------------------------------------------------------------------------------

#include <nds.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "inputf.h"

typedef enum GAME_MODE{
	GAME_INIT,
	GAME_TITLE,
	NAME_ENTRY,
	GAME_START,
	GAME_MAIN,
	GAME_CONTINUE,
	GAME_END
}GAME_MODE;

#define MAX_NUM 100
#define MAX_NAME 40

#define GAME_TITLE_MSG1 "\x1b[0;0HKAZUATE GAME"
#define GAME_TITLE_MSG2 "\x1b[2;0HPUSH A BUTTON!\n"
#define NAME_ENTRY_MSG "What's your name?\n"
#define GAME_START_MSG "KAZUATE Quiz!\nPlease input the number \nfrom 1 to %d.\n"
#define GAME_ANSWER_MSG_OSHII "It's near!\n"
#define GAME_ANSWER_MSG_CHIISAI "It's smaller.\n"
#define GAME_ANSWER_MSG_OOKII "It's larger.\n"
#define GAME_ANSWER_MSG_SEIKAI "It's correct!!\nCongratulations on %s!\n"
#define GAME_CONTINUE_MSG "Do you continue? Y:N\n"
#define GAME_END_MSG "OK\n"

int main(void)
{
	
	int n = -1, answer = 0;
	GAME_MODE game_mode = GAME_INIT;
	char c, s[MAX_NAME] = {'\0'};
	
	consoleDemoInit();
	lcdSwap();
	srand(time(NULL));
	
	while(1) {
		
		scanKeys();
		
		switch(game_mode){
			
		case GAME_INIT:
			
			consoleClear();
			iprintf(GAME_TITLE_MSG1);
			iprintf(GAME_TITLE_MSG2);
			game_mode = GAME_TITLE;
			break;
			
		case GAME_TITLE:
			
			if(keysDown() & KEY_A){
				game_mode = NAME_ENTRY;
				iprintf(NAME_ENTRY_MSG);
			}
			break;
			
		case NAME_ENTRY:
			
			if(inputf("%s", MAX_NAME, s))
				game_mode = GAME_START;
			break;
			
		case GAME_START:
			
			iprintf(GAME_START_MSG, MAX_NUM);
			n = -1;
			answer = rand() % MAX_NUM + 1;
			game_mode = GAME_MAIN;
			break;
			
		case GAME_MAIN:
			
			if(inputf("%D", 3, &n)){
				if((n == answer-1) || (n == answer+1)){
					iprintf(GAME_ANSWER_MSG_OSHII);
				}else if(n > answer + 1){
					iprintf(GAME_ANSWER_MSG_CHIISAI);
				}else if(n < answer - 1){
					iprintf(GAME_ANSWER_MSG_OOKII);
				}else if(n == answer){
					iprintf(GAME_ANSWER_MSG_SEIKAI, s);
					game_mode = GAME_CONTINUE;
					iprintf(GAME_CONTINUE_MSG);
				} 
			}
			break;
			
		case GAME_CONTINUE:
			
			if(inputf("%c", 1, &c)){
				if((c == 'y') || (c == 'Y'))
					game_mode = GAME_START;
				else if((c == 'n') || (c == 'N'))
					game_mode = GAME_END;
			}
			break;
			
		case GAME_END:
			
			iprintf(GAME_END_MSG);
			return 0;
			
		default:
			break;
			
		}
		
		swiWaitForVBlank();
		
	}
	
	return 0;
	
}