AIと戦って、あなたの人生のリスク診断 >>

色を変化させた文字をncursesライブラリを使用し,表示できることはわかったのですが,色を変化させた文字を常に変化させておく方法はないのでしょうか?(文字を表示する関数を呼び出しで実行すると2回目呼び出したときに、最初に呼び出した方の文字の色が変化してしまいます・・・)

実行環境はvineLinuxを使用し,C言語で記述しています.(以下に関数のコード記載します)
void MakeCard(int x,int y,char crd[]){
start_color();
init_pair(COLOR_RED,COLOR_RED,COLOR_WHITE);
init_pair(COLOR_BLACK,COLOR_BLACK,COLOR_WHITE);

if(crd[0]=='D' || crd[0]=='H')/*受けた文字列の先頭がDかHなら文字を赤くする*/
attrset(COLOR_PAIR(COLOR_RED));
else
attrset(COLOR_PAIR(COLOR_BLACK));

mvprintw(y+24,x+7,"%s",crd);
refresh();
}


改善点などなんでも良いです。未熟な自分にご享受ください!お願いします!

このQ&Aに関連する最新のQ&A

C言語 環境」に関するQ&A: C言語の環境設定

A 回答 (1件)

init_pair( )に指定するのは、1から始まる自分定義のペア番号、前景色、背景色ですよ。


で、表示属性はattrset( )で指定するのではなく、attron( )とattroff( )のペアで指定しましょう。
それで以下のようにしてみます。
初期化コードは1回で良いので初期化関数を定義しました。あとカラーペア番号もマクロにしてマジックナンバーにならないようにしています。
全角のスペースでインデントしてあるので試す場合には注意してくださいね。

#include <ncurses.h>
#include <stdlib.h>
#define RED_SUIT 1
#define BLACK_SUIT 2
void InitScreen(void)
{
  initscr();
  if (has_colors() == FALSE) {
    endwin();
    exit(EXIT_FAILURE);
  }
  start_color();
  init_pair(RED_SUIT, COLOR_RED, COLOR_WHITE);
  init_pair(BLACK_SUIT, COLOR_BLACK, COLOR_WHITE);
}
void MakeCard(int x, int y, char *crd)
{
  short suit;
  switch (crd[0]) {
    case 'H': case 'D':
      suit = RED_SUIT;
      break;
    case 'S': case 'C':
      suit = BLACK_SUIT;
      break;
    default:
      return;
      break;
  }
  attron(COLOR_PAIR(suit));
  mvprintw(y + 24, x + 7, "%s", crd);
  attroff(COLOR_PAIR(suit));
  refresh();
}
int main(int argc, char **argv)
{
  InitScreen();

  MakeCard(0, 0, "S 10");
  MakeCard(0, 1, "H J");
  MakeCard(0, 2, "D 9");
  MakeCard(0, 3, "C A");

  getch();
  endwin();
  exit(EXIT_SUCCESS);
}
    • good
    • 0
この回答へのお礼

素早い回答ありがとうございました!おかげで何とかうまくいきそうです!

お礼日時:2012/06/27 15:24

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qfgetsなどのときのstdinのバッファを消すには?

こんにちは,今C(C++でない)を使用しています。
たとえば,
char str[20]
fgets(str,sizeof(str),stdin)
としたときに20字以上を打つと,stdinのバッファに20字以上の分が残ったままになります。

C++などでは
fflush(stdin)で,うまくいきますが,普通のCでは対応がされていないみたいでうまくいきません。

よろしくお願いします。

Aベストアンサー

あ,テキスト入力だからこんな大掛かりなことしなくてもいいんだ.
末尾に'\n'が出るまで掃出せばいいんですよね.

fgets(str, sizeof(str), stdin);
if ( str[strlen(str)-1] != '\n' ){
while( getchar() != '\n' );
}

でいいんだ.失礼しました.

Qlinux上でgetchを使いたい

linux上でgetch()を使おうと思い、<conio.h>をインクルードしたのですが、未定義のエラーが出てしまいます。どうやら、linuxでは、<conio.h>が無い?みたいなのですが、どうやったら、getch()を使用できるようになるのでしょうか??

Aベストアンサー

基本的には #1 さんの参考 URL の方法でいいですが,
mygetch() を呼ぶたびに tcgetattr(),tcsetattr() するのでちょっと無駄が多い.
(性能低下を招くほどではありませんが.)

アプリケーションの起動から終了まで,あるいは一定期間 raw モードだけを
使うのなら,次のサンプルのように一度端末モード設定をしてあとは普通に
getchar() を使う方が効率は (少しですが) いいです.

/*--------------------------------------------------------------------------
サンプル
・1文字入力するたびに標準出力に出力する.
・制御文字は16進で出力.
・CTRL-D を押すと終了.
--------------------------------------------------------------------------*/
#include <stdio.h>
#include <unistd.h>
#include <termios.h>

#define QUIT_CHAR 0x04 /* CTRL-D を押すと終了する.*/

// 端末設定保存用大域変数
struct termios CookedTermIos; // cooked モード用
struct termios RawTermIos; // raw モード用


int main(void)
{
  int c;

  // 初期状態の端末設定 (cooked モード) を取得・保存する.
  tcgetattr(STDIN_FILENO, &CookedTermIos);

  // raw モードの端末設定を作成・保存する.
  RawTermIos = CookedTermIos;
  cfmakeraw(&RawTermIos);

  // 端末を raw モードに設定する.
  tcsetattr(STDIN_FILENO, 0, &RawTermIos);

  // 1文字入力されるごとに標準出力にエコーする.
  while((c = getchar()) != QUIT_CHAR) {
    if(isprint(c)) {
      // 印字可能文字の場合:そのまま表示.
      putchar(c);
    } else {
      // 制御文字の場合:16進で出力.
      printf("<%02X>", c);
      if(c == '\n') fputs("\r\n", stdout);
    }
  }

  // 端末設定を元に戻す.
  tcsetattr(STDIN_FILENO, 0, &CookedTermIos);
  putchar('\n');
  return 0;
}

基本的には #1 さんの参考 URL の方法でいいですが,
mygetch() を呼ぶたびに tcgetattr(),tcsetattr() するのでちょっと無駄が多い.
(性能低下を招くほどではありませんが.)

アプリケーションの起動から終了まで,あるいは一定期間 raw モードだけを
使うのなら,次のサンプルのように一度端末モード設定をしてあとは普通に
getchar() を使う方が効率は (少しですが) いいです.

/*--------------------------------------------------------------------------
サンプル
・1文字入力するたびに...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。


人気Q&Aランキング