ページ 11

初投稿です。

Posted: 2011年2月01日(火) 20:44
by sain7
ここのプログラムから例えばキーボード入力(リアルタイム)?でAを押したときに
マップのローマ字のAが赤くするにはどうしたらいいのでしょうか...
ゲームの作成途中で、まったくわからなくなったため投稿させていただきました。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*構造体定義*/
typedef struct
{
char type;/*種類*/
int omote;/*表フラグ*/
int atari;/*当りフラグ*/
}KEY;
//マップデータ
#define MAXWIDTH 12
#define MAXHEIGHT 9
int g_mapdata[MAXHEIGHT][MAXWIDTH] = {
	// 0  1  2  3  4  5  6  7  8  9  10 11
	{  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},	//0
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},	//1
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},	//2
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},	//3
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},	//4
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},	//5	
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},	//6
	{  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},	//7
	{  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}	//8
};
KEY dt[26];
//プロトタイプ宣言
void shuffle(KEY *);
void init(KEY *);
void mapdeta(void);//マップ作成関数
/****************************/
//メイン関数
/****************************/
void main(void)
{
	srand((unsigned int)time(NULL));
	system("cls");	
	mapdeta();
}

void init(KEY *pt){
char c[26]={'A','B','C','D',
	     	'E','F','G','H',
     		'I','J','K','L',
			'M','N','O','P',
		    'Q','R','S','T',
		    'U','V','W','X',
		    'Y','Z'};/*種類*/
	int i,j;
	for(i=0;i<MAXHEIGHT;++i){
		for(j=0;j<MAXWIDTH;j++){
			pt->type=c[rand()%26];	
			pt++;
		}
	}
}
void shuffle(KEY *pt)
{
KEY wk;/*入れ替え用のワークエリア*/
int i,rnd;/*要素番号用、乱数用*/
i=26;
while(i>1)
	{
		rnd=rand()%i;/*乱数セット*/
		wk=*(pt+rnd);
		*(pt+rnd)=*(pt+i-1);
		*(pt+i-1)=wk;
		i--;
		
	}
}
void mapdeta(void){
int i,j;
	for(i=0;i<MAXHEIGHT;i++)
	{
		for(j=0;j<MAXWIDTH;j++)
		{
			switch(g_mapdata[i][j])
			{
			case 0:
			printf("■");
			break;
			case 1:
			init(&dt[0]);
			shuffle(&dt[0]);
			printf("%c ",dt[i].type);
			break;	
			default:
			printf("XXX");
			break;
			}
		}
	
	printf("\n");
	}

}

Re: 初投稿です。

Posted: 2011年2月01日(火) 22:23
by softya(ソフト屋)
OSやらコンパイラを書いてもらうと答えやすいですが、例えばWindowsだとWin32APIなどを使う必要があります。

Re: 初投稿です。

Posted: 2011年2月01日(火) 22:32
by sain7
返信ありがとうございます。
コンパイラーはVisual Studio2008 でOSはwindows 7です。

Re: 初投稿です。

Posted: 2011年2月01日(火) 22:37
by softya(ソフト屋)
過去ログですが、文字の色替えの話題がありますので参考になると思います。
http://dixq.net/forum/viewtopic.php?f=3&t=7539&p=63004
上記ログの内容で、分からない事は聞いてください。

Re: 初投稿です。

Posted: 2011年2月01日(火) 22:53
by sain7
申し訳ありません...
#include<windows.h>を使うということはわかりましたが
勉強不足のせいで、根本的にどう書いたらいいのかわかりません・・・

Re: 初投稿です。

Posted: 2011年2月01日(火) 23:30
by softya(ソフト屋)
まぁ理解は難しいので、パターンを覚えて使ってください。

コード:

//グローバル変数にしてください。
HANDLE hCout;//コンソールのハンドル
CONSOLE_SCREEN_BUFFER_INFO csbi; // コンソール画面の情報

// ここからはmainの先頭に。
    hCout = GetStdHandle(STD_OUTPUT_HANDLE); // 標準出力のハンドルを取得する。
    GetConsoleScreenBufferInfo(hCout, &csbi); // 画面の情報を取得する

//ここからはmainの最後に。
     SetConsoleTextAttribute(hCout, csbi.wAttributes); // 最初に取得した画面情報の色に戻して終了する(これがないとプログラムが終わっても色が変わったままになってしまう。)
で色を変えるときは、
SetConsoleTextAttribute(hCout, FOREGROUND_RED); // 前面(文字)を赤に変更
で8色に変化します。
SetConsoleTextAttribute(hCout, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN); // 文字は白
で白になります。
勝手に戻らないので的確に変えてください。

Re: 初投稿です。

Posted: 2011年2月08日(火) 17:29
by sain7
返事遅れてすみませんでした。
あの後いろいろと試してみたらできました。
softya(ソフト屋)さん本当にありがとうございました。