ジャンケンゲームを作ろう。その3。


RGKT-NDS-HMBR-003(003)


遊べるまでにしました。
あいこでしょ」は…難しいっすねw実装はしましたが。
スイッチ分岐が精一杯。もうちょっと良くならぬものかと。


絵さえ乗っければ多少は見れるものに成るかな?どうかな?


「ジャンケンゲーム(試作版)」のCソースです。
200行くらいになっちゃいました><
朝の時点じゃあ50〜60行だったような気がしたのですが…。



//---------------------------------------------------------------------------------
//	
//	JANKEN GAME. prototype ver.
//	
//	Feb 08, 2009 - Feb 09, 2009
//	CODING BY. AYUMI.K@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>


typedef enum{
	PLAY_INIT,
	PLAY_TITLE,
	PLAY_START,
	PLAY_GAME,
	PLAY_END,
}PLAY_MODE;

typedef enum{
	GOO   = 0,
	CHOKI = 1,
	PAR   = 2
}JANKEN_HAND;

typedef enum{
	AIKO  = 0,
	KACHI = 1,
	MAKE  = -1
}JANKEN_JUDG;


bool isKeysDown(uint32);
JANKEN_HAND getPlayerHand(void);
JANKEN_HAND getCpuHand(void);
JANKEN_JUDG judgHand(JANKEN_HAND, JANKEN_HAND);
void drawHand(JANKEN_HAND);


bool isKeysDown(uint32 keypad_bits)
{
	if(keysDown() & keypad_bits)
		return true;
	return false;
}

JANKEN_HAND getPlayerHand(void)
{
	if(keysDown() & KEY_LEFT){
		return GOO;
	}else if(keysDown() & KEY_UP){
		return CHOKI;
	}else if(keysDown() & KEY_RIGHT){
		return PAR;
	}
	return GOO;
}

JANKEN_HAND getCpuHand(void)
{
	return rand() % 2 + 1;
}

JANKEN_JUDG judgHand(JANKEN_HAND player_hand, JANKEN_HAND cpu_hand)
{
	
	if(player_hand == cpu_hand){
		return AIKO;
	}else if(cpu_hand == (player_hand + 1) % 3){
		return KACHI;
	}else{
		return MAKE;
	}
	return AIKO;
}

void drawHand(JANKEN_HAND janken_hand)
{
	switch(janken_hand){
	case GOO:
		iprintf("GOO\n");
		break;
	case CHOKI:
		iprintf("CHOKI\n");
		break;
	case PAR:
		iprintf("PAR\n");
		break;
	default:
		break;
	}
}

int main(void)
{
	
	int score = 0, play_count = 0;
	PLAY_MODE play_mode = PLAY_INIT;
	JANKEN_JUDG judgment = MAKE;
	JANKEN_HAND player_hand = GOO, cpu_hand = GOO;
	
	srand(time(NULL));
	consoleDemoInit();
	
	iprintf("JANKEN GAME.\n prototype ver.\n");
	iprintf("Feb 09, 2009\n");
	iprintf("CODING BY.\nAYUMI.K @REGEKATSU\n\n");
	
	while(1){
		
		scanKeys();
		
		switch(play_mode){
		case PLAY_INIT:	//ゲーム初期化「コインいっこいれる」
			iprintf("score:%d, play count: %d\n", score, play_count);
			iprintf("INSERT COIN\n");
			play_mode = PLAY_TITLE;
		case PLAY_TITLE:	//ゲームタイトル、ゲーム開始待ち
			if(keysDown() & KEY_START){
				iprintf("CHARIN!\n");
				play_count++;
				play_mode = PLAY_START;
			}
			break;
		case PLAY_START:	//ゲーム開始「じゃんけん、」、ゲーム繰り返し「あいこで、」
			if(judgment)
				iprintf("JANKEN ");
			else
				iprintf("AIKO de ");
			
			play_mode = PLAY_GAME;
			break;
		case PLAY_GAME:	//ゲームプレイ中「ぽんっ」、「しょっ」
			if(isKeysDown(KEY_LEFT | KEY_UP | KEY_RIGHT)){
				player_hand = getPlayerHand();
				cpu_hand = getCpuHand();
				
				if(judgment)
					iprintf("PONG!\n");
				else
					iprintf("SHO!\n");
				
				iprintf("PLAYER ");
				drawHand(player_hand);
				
				iprintf("CPU ");
				drawHand(cpu_hand);
				
				if((judgment = judgHand(player_hand, cpu_hand)))
					play_mode = PLAY_END;
				else
					play_mode = PLAY_START;
			}
			break;
		case PLAY_END:	//ゲーム終了。勝敗表示、スコア加減算
			
			if(judgment == KACHI)
				iprintf("KACHI!\n");
			else if(judgment == MAKE)
				iprintf("MAKE!\n");
			
			score += judgment;
			play_mode = PLAY_INIT;
			break;
			
		default:
			break;
		}
		
		swiWaitForVBlank();
		
	}
	
	return 0;
	
}