以下のようなソースで、C言語から将棋のゲームを途中まで作成しています。
以下はvisualstdioで動作します。添付画像では9 9 3 9を入力して、先歩を
移動して後歩を取っています。プログラムの構造的には他にいいアイデアは、
ないでしょうか。C言語の勉強により、さくっと作りましたので、構造的に、
いいアイデアがあれば、お聞きしたいです。将棋の盤をもっと現実的にする
いい方法があれば、何かお聞きしてもよろしいですか。
#pragma once typedef struct koma_info { int tate; // 位置_縦 int yoko; // 位置_横 int sente; // 先手_後手 char koma[10]; // 駒の種類 } person; typedef struct koma_shurui { char koma[10]; // 駒の種類 } motikoma;
shougi_shisaku.cpp
// shougi_shisaku.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。 // #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <iostream> #include "shougi_shisaku.h" extern void explode(const char*, char*, int); // 項目を取り出す person data[81]; // 駒のデータの読み込み person dataretu[81]; // 駒のデータのコピー先 motikoma sente[20]; //先手の持ち駒 motikoma gote[20]; //先手の持ち駒 char kuuhaku[] = " "; char tate_str[] = "一二三四五六七八九"; char koma_str_aite[10] = {}; int tate_mae = 0, yoko_mae = 0, tate_ato = 0, yoko_ato = 0, sente_cnt = 0,gote_cnt = 0 ; void banmen_hyouji() { int readtate, readyoko, coma_cnt = 0; char sub_str[4]; printf("将棋盤\n"); printf("|9 |8 |7 |6 |5 |4 |3 |2 |1 \n"); printf("--------------------------------------------------------------------------------------------\n"); for (readtate = 1; readtate < 10; readtate++) { for (readyoko = 9; readyoko > 0; readyoko--) { if (dataretu[coma_cnt].tate == readtate && dataretu[coma_cnt].yoko == readyoko && dataretu[coma_cnt].koma[0] != '\0') { // 駒の情報がある時 printf("|%s ", &dataretu[coma_cnt].koma[0]); coma_cnt++; } else { // 駒の情報がない時 printf("|%s ", kuuhaku); coma_cnt++; } if (readyoko == 1) { // 縦の駒番号を表示する。 // strから部分文字列を切り出す strncpy_s(sub_str, tate_str + (readtate - 1) * 2, 2); sub_str[3] = '\0'; // 切り出した部分の終端文字を追加 printf("|%s ", sub_str); } } printf("\n"); printf("--------------------------------------------------------------------------------------------\n"); } printf("|先手の持ち駒 %s\n", sente[sente_cnt - 1].koma); } void taikyoku_kaisi() { int koma_data,idoumotosenteno,idousakisenteno; char koma_str[10] = {}; size_t length = 0; printf("***先手の番です***\n"); printf("***どの地点を動かしますか***\n"); scanf_s("%d%d", &tate_mae,&yoko_mae); printf("***どこにを動かしますか***\n"); scanf_s("%d%d", &tate_ato, &yoko_ato); for (koma_data = 0; koma_data < 81; koma_data++){ if (dataretu[koma_data].tate == tate_mae && dataretu[koma_data].yoko == yoko_mae) { length = strlen(dataretu[koma_data].koma); idoumotosenteno = dataretu[koma_data].sente; } if (dataretu[koma_data].tate == tate_ato && dataretu[koma_data].yoko == yoko_ato){ length = strlen(dataretu[koma_data].koma); idousakisenteno = dataretu[koma_data].sente; printf("|%d \n", length); } } // 自分の駒があるので、移動できない。 if (length != 0 && idoumotosenteno == idousakisenteno) { goto skip; } // 移動する駒の文字列を保存する。 for (koma_data = 0; koma_data < 81; koma_data++){ if (dataretu[koma_data].tate == tate_mae && dataretu[koma_data].yoko == yoko_mae){ memcpy((void *)koma_str, &dataretu[koma_data].koma[0], 4); memset((void *)dataretu[koma_data].koma, '\0', 10); } } // 駒を移動先の文字列に格納する。 for (koma_data = 0; koma_data < 81; koma_data++){ if (dataretu[koma_data].tate == tate_ato && dataretu[koma_data].yoko == yoko_ato){ memcpy((void*)sente[sente_cnt].koma, (const void*)dataretu[koma_data].koma, 10); // printf("|koma_str_aite%s \n", koma_str_aite); sente_cnt = sente_cnt + 1; memcpy((void*)dataretu[koma_data].koma, (const void*)koma_str, 10); } } skip: return; } int main() { FILE* fp; char buf[512], * cp; int tatehoukou; printf("\n***将棋ゲーム***\n"); fopen_s(&fp,"shougi_banmen.csv", "r"); // 将棋のファイルを開く if (fp == NULL) goto END; // ファイルを開けない tatehoukou = 0; memset(&data[0], '\0', sizeof(data)); // データの全文字をNULLに memset(&sente[0], '\0', sizeof(sente)); // データの全文字をNULLに memset(&gote[0], '\0', sizeof(gote)); // データの全文字をNULLに while (1) { cp = fgets(buf, 256, fp); // 1レコードを読む if (cp == NULL) break; // EOF explode(",", buf, tatehoukou); // csvデータを1行ずつ、項目を取り出す tatehoukou = tatehoukou + 1; if (tatehoukou == 9) break; } fclose(fp); // 将棋のファイルを閉じる // memcpyを使ったコピー memcpy(&dataretu, &data, sizeof(person)*81); banmen_hyouji(); taikyoku_kaisi(); banmen_hyouji(); END:; }
shougi_banmen.csv
後香,後桂,後銀,後金,後王,後金,後銀,後桂,後香, ,後飛,,,,,,後角,, 後歩,後歩,後歩,後歩,後歩,後歩,後歩,後歩,後歩, ,,,,,,,,, ,,,,,,,,, ,,,,,,,,, 先歩,先歩,先歩,先歩,先歩,先歩,先歩,先歩,先歩, ,先角,,,,,,先飛,, 先香,先桂,先銀,先金,先王,先金,先銀,先桂,先香,
explode.cpp
#include <stdio.h> #include <iostream> #include "shougi_shisaku.h" void explode(const char*, char*, int); // 項目を取り出す extern person data[81]; // 駒のデータの読み込み int koma_cnt = 0; void explode( /*----------------------------------*/ /* CSVデータから項目を取り出す */ /*----------------------------------*/ const char* kugiri, // 区切り文字 char* buf, // CSVの1レコード int tatehoukou) { char* cp0, * cp; int yokohoukou = 0, len; cp0 = buf; // CSVデータの先頭アドレス for (yokohoukou = 0; yokohoukou < 9; yokohoukou++) { if (*cp0 == 0x22) cp0++; // 最初の"(0x22)を除く cp = strstr(cp0, kugiri); // 区切り文字を検索 if (cp == NULL) break; // 区切り文字なし len = cp - cp0; // 項目の文字数 if (*(cp - 1) == 0x22) len--; // 最後の"(0x22)を除く if (len > 0) // 項目あり { memcpy(&data[koma_cnt].koma[0], cp0, len); // 項目の文字列をコピー data[koma_cnt].tate = tatehoukou + 1; data[koma_cnt].yoko = 9 - yokohoukou; if (strncmp(data[koma_cnt].koma, "先", 2) == 0){ data[koma_cnt].sente = 1; } else { data[koma_cnt].sente = 2; } koma_cnt = koma_cnt + 1; }else{ data[koma_cnt].tate = tatehoukou + 1; data[koma_cnt].yoko = 9 - yokohoukou; koma_cnt = koma_cnt + 1; } cp0 = cp + 1; // 次の文字のアドレス } }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。