char型の全角描画についてご助力修正お願いします><

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
きちわた

char型の全角描画についてご助力修正お願いします><

#1

投稿記事 by きちわた » 10年前

動く棒の中に文字を印字するプログラムを作っております。

_
| |
| * |
| * |
| |
今アスタリスクのところを
下のように全角文字にしたいのですがどうすればいいでしょうか?
至急アドバイス、修正お願いします><
_
| |
|あ|
|い|
| |

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<unistd.h> //スリープ

#define max 10
#define N (20)

int  drawcoment(void);//
int  drawkichi(void);//
void clearBoard(char board[N][N]);//背景描画
void printBoard (char board[N][N]);//描画
void  result(int num, int mark);//結果
int main(int argc, const char * argv[])
{
    srand((unsigned)time(NULL)); //ランダム
    int j,i,z;
    printf("Let's draw!(1:YES 0:NO)\n");

    scanf("%d",&z); //選択の入力
    while (1) {
        if (z==0) { //0入力で終了
            break;
        }
        j=drawcoment();//抽選
        i=drawkichi();//抽選
        result(j,i);//結果
        printf("continue?(1:YES 0:NO)");
        scanf("%d",&z);//選択肢
        
    }
    return(0);
}

int  drawcoment(void){ //13の数をランダムで選出
    int num;
    num=rand()%13;
    
    return (num);
    
}
int  drawkichi(void){ //4つの数
    int num;
    num=rand()%4;
    
    return (num);
}
void  result(int num, int mark){ 
    char board[N][N];//ボード
    int count = 0; //カウンタ
    int x=0 , y=0; //初期値
    int a=0,b=0;
    char u[5][20]={"あ","い","う","え","お"};//もじ
    char v[13][999]={"1","3","5","7","11","13","17","19","23","29","31","37"};//num
    a=rand()%12;
    b=rand()%5;
    while(1){
        if(count > max-4){ //終了条件
            break;
        }
        //ボードのクリア
        clearBoard(board);
        board[x+max*2-2][y+1]='_';//横
        board[x+max*2][y] = '|';
        //縦
        board[x+max*2+1][y] = '|';
        board[x+max*2+2][y] = '|';
        board[x+max*2+3][y] = '|';
        board[x+max*2][y+2] = '|';
        //縦2
        board[x+max*2+1][y+2] = '|';
        board[x+max*2+2][y+2] = '|';
        board[x+max*2+3][y+2] = '|';
        //アルファベット
        board[x+max*2+2][y+1] = '*';
        board[x+max*2+3][y+1] = '*';
        x--;//上
        //画面クリア
        system("clear");
        //ボードの印字
        printBoard(board);
        count++; //カウントアップ
        usleep(100000); //止まる
    }

    printf("「%s」。",u[b]);//ひらがな
    printf("『%s』\n",v[a]);//数字
}
void clearBoard(char board[N][N]){ //背景
    int x,y;
    for(y=0; y<N; y++){
        for(x=0; x<N; x++){
            board[y][x] = ' ';
        }
    }
}
void printBoard (char board[N][N]) { //描画
    int x,y;
    for(y=0; y<N; y++){
        for(x=0;x<N; x++){
            printf("%c", board[y][x]);
        }
        printf("\n");
    }
    printf("\n");
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: char型の全角描画についてご助力修正お願いします><

#2

投稿記事 by みけCAT » 10年前

boardをchar型ではなくconst char*型の配列にして、各関数を適切に書き換えるのがいいかもしれません。
基本的に'を"に、%cを%sにすればいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: char型の全角描画についてご助力修正お願いします><

#3

投稿記事 by みけCAT » 10年前

そして、*のかわりに全角文字を入れればいいでしょう。

コード:

board[x+max*2+2][y+1] = "あ"; 
board[x+max*2+3][y+1] = "い";
※テストしていないので、間違っているかもしれません
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: char型の全角描画についてご助力修正お願いします><

#4

投稿記事 by みけCAT » 10年前

テストを行いました。
また、x=0のときboard[x+max*2]、board[x+max*2+1]、board[x+max*2+2]、board[x+max*2+3]は確保された領域の範囲外になってしまうので、直しておきました。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<unistd.h> //スリープ

#define max 10
#define N (20)

int  drawcoment(void);//
int  drawkichi(void);//
void clearBoard(const char * board[N][N]);//背景描画
void printBoard (const char * board[N][N]);//描画
void  result(int num, int mark);//結果
int main(int argc, const char * argv[])
{
    srand((unsigned)time(NULL)); //ランダム
    int j,i,z;
    printf("Let's draw!(1:YES 0:NO)\n");

    scanf("%d",&z); //選択の入力
    while (1) {
        if (z==0) { //0入力で終了
            break;
        }
        j=drawcoment();//抽選
        i=drawkichi();//抽選
        result(j,i);//結果
        printf("continue?(1:YES 0:NO)");
        scanf("%d",&z);//選択肢
        
    }
    return(0);
}

int  drawcoment(void){ //13の数をランダムで選出
    int num;
    num=rand()%13;
    
    return (num);
    
}
int  drawkichi(void){ //4つの数
    int num;
    num=rand()%4;
    
    return (num);
}
void  result(int num, int mark){ 
    const char * board[N+4][N];//ボード
    int count = 0; //カウンタ
    int x=0 , y=0; //初期値
    int a=0,b=0;
    char u[5][20]={"あ","い","う","え","お"};//もじ
    char v[13][999]={"1","3","5","7","11","13","17","19","23","29","31","37"};//num
    a=rand()%12;
    b=rand()%5;
    while(1){
        if(count > max-4){ //終了条件
            break;
        }
        //ボードのクリア
        clearBoard(board);
        board[x+max*2-2][y+1]="_";//横
        board[x+max*2][y] = "|";
        //縦
        board[x+max*2+1][y] = "|";
        board[x+max*2+2][y] = "|";
        board[x+max*2+3][y] = "|";
        board[x+max*2][y+2] = "|";
        //縦2
        board[x+max*2+1][y+2] = "|";
        board[x+max*2+2][y+2] = "|";
        board[x+max*2+3][y+2] = "|";
        //アルファベット
        board[x+max*2+2][y+1] = "あ";
        board[x+max*2+3][y+1] = "い";
        x--;//上
        //画面クリア
        system("clear");
        //ボードの印字
        printBoard(board);
        count++; //カウントアップ
        usleep(100000); //止まる
    }

    printf("「%s」。",u[b]);//ひらがな
    printf("『%s』\n",v[a]);//数字
}
void clearBoard(const char * board[N][N]){ //背景
    int x,y;
    for(y=0; y<N; y++){
        for(x=0; x<N; x++){
            board[y][x] = " ";
        }
    }
}
void printBoard (const char * board[N][N]) { //描画
    int x,y;
    for(y=0; y<N; y++){
        for(x=0;x<N; x++){
            printf("%s", board[y][x]);
        }
        printf("\n");
    }
    printf("\n");
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

きちわた

Re: char型の全角描画についてご助力修正お願いします><

#5

投稿記事 by きちわた » 10年前

みけCAT様
おかげ様で解決しました!
迅速な回答に感謝します!!
ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る