成りルーチンの追加とバグ修正を行いました。

とりあえず、人間対人間用の将棋盤が完成しました。

駒の動きやルールがないけど、お互いにルールを守れば指せるかな。


ソース:stime_16022501


/* stime.c */

#define KUHAKU " " //KUHAKUを" "と定義

#define FU "歩" //FUを歩と定義
#define KYO "香" //KYOを香と定義
#define KEI "桂" //KEIを桂と定義
#define GIN "銀" //GINを銀と定義
#define KIN "金" //KINを金と定義
#define KAKU "角" //KAKUを角と定義
#define HI "飛" //HIを飛と定義
#define GYOKU "玉" //GYOKUを玉と定義

#define AOIRO "\x1b[34m" //AOIROを青色のエスケープシーケンスと定義
#define KIHONIRO "\x1b[39m" //KIHONIROを基本色のエスケープシーケンスと定義
#define B_AKA "\x1b[41m" //B_AKAを赤色背景のエスケープシーケンスと定義
#define B_AOIRO "\x1b[44m" //B_AOIROを青色背景のエスケープシーケンスと定義
#define B_KIHONIRO "\x1b[49m" //B_KIHONIROを基本色背景のエスケープシーケンスと定義

#define G_FU AOIRO"歩"KIHONIRO //G_FUを青色の歩と定義
#define G_KYO AOIRO"香"KIHONIRO //G_KYOを青色の香と定義
#define G_KEI AOIRO"桂"KIHONIRO //G_KEIを青色の桂と定義
#define G_GIN AOIRO"銀"KIHONIRO //G_GINを青色の銀と定義
#define G_KIN AOIRO"金"KIHONIRO //G_KINを青色の金と定義
#define G_KAKU AOIRO"角"KIHONIRO //G_KAKUを青色の角と定義
#define G_HI AOIRO"飛"KIHONIRO //G_HIを青色の飛と定義
#define OU AOIRO"王"KIHONIRO //G_OUを青色の王と定義

#define N_FU B_AKA"と"B_KIHONIRO //N_FUを赤色背景のとと定義
#define N_KYO B_AKA"香"B_KIHONIRO //N_KYOを赤色背景の香と定義
#define N_KEI B_AKA"桂"B_KIHONIRO //N_KEIを赤色背景の桂と定義
#define N_GIN B_AKA"銀"B_KIHONIRO //N_GINを赤色背景の銀と定義
#define N_KAKU B_AKA"馬"B_KIHONIRO //N_KAKUを赤色背景の馬と定義
#define N_HI B_AKA"龍"B_KIHONIRO //N_HIを赤色背景の龍と定義

#define N_G_FU B_AOIRO"と"B_KIHONIRO //N_G_FUを青色背景のとと定義
#define N_G_KYO B_AOIRO"香"B_KIHONIRO //N_G_KYOを青色背景の香と定義
#define N_G_KEI B_AOIRO"桂"B_KIHONIRO //N_G_KEIを青色背景の桂と定義
#define N_G_GIN B_AOIRO"銀"B_KIHONIRO //N_G_GINを青色背景の銀と定義
#define N_G_KAKU B_AOIRO"馬"B_KIHONIRO //N_G_KAKUを青色背景の馬と定義
#define N_G_HI B_AOIRO"龍"B_KIHONIRO //N_G_HIを青色背景の龍と定義

#define N_H_FU "と" //N_H_FUをとと定義
#define N_H_KYO "成香" //N_H_KYOを成香と定義
#define N_H_KEI "成桂" //N_H_KEIを成桂と定義
#define N_H_GIN "成銀" //N_H_GINを成銀と定義
#define N_H_KAKU "馬" //N_H_KAKUを馬と定義
#define N_H_HI "龍" //N_H_HIを龍と定義

#define KUHAKU_N 0 // KUHAKU_Nを" "の番号0(00000000)と定義
#define FU_N 1 // FU_Nを先手の歩の番号1(00000001)と定義
#define KYO_N 2 // KYO_Nを先手の香の番号2(00000010)と定義
#define KEI_N 3 // KEI_Nを先手の桂の番号3(00000011)と定義
#define GIN_N 4 // GIN_Nを先手の銀の番号4(00000100)と定義
#define KIN_N 5 // KIN_Nを先手の金の番号5(00000101)と定義
#define KAKU_N 6 // KAKU_Nを先手の角の番号6(00000110)と定義
#define HI_N 7 // HI_Nを先手の飛の番号7(00000111)と定義
#define GYOKU_N 8 // GYOKU_Nを先手の玉の番号8(00001000)と定義
#define NARI_N 8 // NARI_Nを成り変換番号8(00001000)と定義
#define N_FU_N 9 // N_FU_Nを先手のとの番号9(00001001)と定義
#define N_KYO_N 10 // N_KYO_Nを先手の成香の番号10(00001010)と定義
#define N_KEI_N 11 // N_KEI_Nを先手の成桂の番号11(00001011)と定義
#define N_GIN_N 12 // N_GIN_Nを先手の成銀の番号12(00001100)と定義
#define N_KAKU_N 14 // N_KAKU_Nを先手の馬の番号14(00001110)と定義
#define N_HI_N 15 // N_HI_Nを先手の龍の番号15(00001111)と定義
#define GOTE_N 16 // GOTE_Nを先手→後手番号16(00010000)と定義
#define G_FU_N 17 // G_FU_Nを後手の歩の番号17(00010001)と定義
#define G_KYO_N 18 // G_KYO_Nを後手の香の番号18(00010010)と定義
#define G_KEI_N 19 // G_KEI_Nを後手の桂の番号19(00010011)と定義
#define G_GIN_N 20 // G_GIN_Nを後手の銀の番号20(00010100)と定義
#define G_KIN_N 21 // G_KIN_Nを後手の金の番号21(00010101)と定義
#define G_KAKU_N 22 // G_KAKU_Nを後手の角の番号22(00010110)と定義
#define G_HI_N 23 // G_HI_Nを後手の飛の番号23(00010111)と定義
#define OU_N 24 // OU_Nを後手の王の番号24(00011000)と定義
#define N_G_FU_N 25 // N_G_FU_Nを後手のとの番号25(00011001)と定義
#define N_G_KYO_N 26 //N_G_KYO_Nを後手の成香の番号26(00011010)と定義
#define N_G_KEI_N 27 //N_G_KEI_Nを後手の成桂の番号27(00011011)と定義
#define N_G_GIN_N 28 //N_G_GIN_Nを後手の成銀の番号28(00011100)と定義
#define N_G_KAKU_N 30 // N_G_KAKU_Nを後手の馬の番号30(00011110)と定義
#define N_G_HI_N 31 // N_G_HI_Nを後手の龍の番号31(00011111)と定義

#define SENTE 0 //SENTEを0と定義
#define GOTE 1 //GOTEを1と定義

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int tesuu_n; //手数カウント

int s_te_m_r; //先手の指し手の移動元(列)
int s_te_m_g; //先手の指し手の移動元(行)
int s_te_s_r; //先手の指し手の移動先(列)
int s_te_s_g; //先手の指し手の移動先(行)
int s_te_n; //先手の成りフラグ

int g_te_m_r; //後手の指し手の移動元(列)
int g_te_m_g; //後手の指し手の移動元(行)
int g_te_s_r; //後手の指し手の移動先(列)
int g_te_s_g; //後手の指し手の移動先(行)
int g_te_n; //後手の成りフラグ

int s_tem_m_koma_n = 0; //先手の指し手の移動元(駒番号)
int s_tem_s_koma_n = 0; //先手の指し手の移動先(駒番号)
int g_tem_m_koma_n = 0; //後手の指し手の移動元(駒番号)
int g_tem_s_koma_n = 0; //後手の指し手の移動先(駒番号)
int sasite_koma_n = 0; //指し手表示用(駒番号)

char *koma_h[] = {
KUHAKU, // 要素0にKUHAKUをセット
FU, // 要素1にFUをセット
KYO, // 要素2にKYOをセット
KEI, // 要素3にKEIをセット
GIN, // 要素4にGINをセット
KIN, // 要素5にKINをセット
KAKU, // 要素6にKAKUをセット
HI, // 要素7にHIをセット
GYOKU, // 要素8にGYOKUをセット
N_FU, // 要素9にN_FUをセット
N_KYO, //要素10にN_KYOをセット
N_KEI, //要素11にN_KEIをセット
N_GIN, //要素12にN_GINをセット
KUHAKU, //要素13にKUHAKUをセット
N_KAKU, //要素14にN_KAKUをセット
N_HI, //要素15にN_HIをセット
KUHAKU, //要素16にKUHAKUをセット
G_FU, //要素17にG_FUをセット
G_KYO, //要素18にG_KYOをセット
G_KEI, //要素19にG_KEIをセット
G_GIN, //要素20にG_GINをセット
G_KIN, //要素21にG_KINをセット
G_KAKU, //要素22にG_KAKUをセット
G_HI, //要素23にG_HIをセット
OU, //要素24にOUをセット
N_G_FU, //要素25にN_G_FUをセット
N_G_KYO, //要素26にN_G_KYOをセット
N_G_KEI, //要素27にN_G_KEIをセット
N_G_GIN, //要素28にN_G_GINをセット
N_G_KAKU, //要素30にN_G_KAKUをセット
N_G_HI //要素31にN_G_HIをセット
};

char *koma_s_h[] = {
KUHAKU, // 要素0にKUHAKUをセット
FU, // 要素1にFUをセット
KYO, // 要素2にKYOをセット
KEI, // 要素3にKEIをセット
GIN, // 要素4にGINをセット
KIN, // 要素5にKINをセット
KAKU, // 要素6にKAKUをセット
HI, // 要素7にHIをセット
GYOKU, // 要素8にGYOKUをセット
N_H_FU, // 要素9にN_H_FUをセット
N_H_KYO, //要素10にN_H_KYOをセット
N_H_KEI, //要素11にN_H_KEIをセット
N_H_GIN, //要素12にN_H_GINをセット
KUHAKU, //要素13にKUHAKUをセット
N_H_KAKU, //要素14にN_H_KAKUをセット
N_H_HI, //要素15にN_H_HIをセット
KUHAKU, //要素16にKUHAKUをセット
FU, //要素17にFUをセット
KYO, //要素18にKYOをセット
KEI, //要素19にKEIをセット
GIN, //要素20にGINをセット
KIN, //要素21にKINをセット
KAKU, //要素22にKAKUをセット
HI, //要素23にHIをセット
OU, //要素24にOUをセット
N_H_FU, //要素25にN_H_FUをセット
N_H_KYO, //要素26にN_H_KYOをセット
N_H_KEI, //要素27にN_H_KEIをセット
N_H_GIN, //要素28にN_H_GINをセット
N_H_KAKU, //要素30にN_H_KAKUをセット
N_H_HI //要素31にN_H_HIをセット
};

/* 盤面の初期設定 */
int banmen[9][9] = { { G_KYO_N, G_KEI_N, G_GIN_N, G_KIN_N, OU_N, G_KIN_N, G_GIN_N, G_KEI_N, G_KYO_N },
{ KUHAKU_N, G_KAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, G_HI_N, KUHAKU_N },
{ G_FU_N, G_FU_N, G_FU_N, G_FU_N, G_FU_N, G_FU_N, G_FU_N, G_FU_N, G_FU_N },
{ KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N },
{ KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N },
{ KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N },
{ FU_N, FU_N, FU_N, FU_N, FU_N, FU_N, FU_N, FU_N, FU_N },
{ KUHAKU_N, HI_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KAKU_N, KUHAKU_N },
{ KYO_N, KEI_N, GIN_N, KIN_N, GYOKU_N, KIN_N, GIN_N, KEI_N, KYO_N } };

/* 持ち駒の構造体 */
struct Motigoma{
int kazu;
int fu;
int kyo;
int kei;
int gin;
int kin;
int kaku;
int hi;
};

struct Motigoma s_motigoma = { 0, 0, 0, 0, 0, 0, 0, 0 }; //先手の持ち駒の構造体
struct Motigoma g_motigoma = { 0, 0, 0, 0, 0, 0, 0, 0 }; //後手の持ち駒の構造体
int s_motigoma_n; //先手の持ち駒番号
int g_motigoma_n; //後手の持ち駒番号

int banmen_hyouji(); //盤面の表示関数
int sente_nyuuryoku(); //先手の指し手の入力関数
int gote_nyuuryoku(); //後手の指し手の入力関数
int sasite_hyouji(int); //指し手の表示関数
int sasite_nyuuryoku(); //指し手の入力関数
int motigoma_hyouji(); //持ち駒の表示関数
int motigoma_nyuuryoku(struct Motigoma *); //持ち駒の入力関数

/* 先手の指し手の入力関数 */
int sente_nyuuryoku()
{
while (1)
{
s_tem_m_koma_n = 0;
sasite_koma_n = 0;

/* 先手の指し手の移動元(列)の入力 */
printf("\n先手の指し手の移動元(列)か持ち駒(0)を入力してください:");

s_te_m_r = sasite_nyuuryoku(); //指し手を取得

if (s_te_m_r == 0){ //持ち駒が選択された場合
if (s_motigoma.kazu == 0){
printf("\n持ち駒がありません。");
continue;
}
s_motigoma_n = motigoma_nyuuryoku(&s_motigoma);
if (s_motigoma_n > 0){
s_tem_m_koma_n = s_motigoma_n;
sasite_koma_n = s_tem_m_koma_n;
break;
}
}
else {
s_motigoma_n = 0;

/* 先手の指し手の移動元(行)の入力 */
printf("\n先手の指し手の移動元(行)か前に戻る(0)を入力してください:");

s_te_m_g = sasite_nyuuryoku(); //指し手を取得

if (s_te_m_g == 0) //前に戻るが選択された場合
continue;

s_tem_m_koma_n = banmen[s_te_m_g - 1][s_te_m_r - 1]; //先手の指し手の移動元(駒番号)を保存
sasite_koma_n = s_tem_m_koma_n;

}

if ((FU_N <= s_tem_m_koma_n) && (s_tem_m_koma_n <= GYOKU_N)) //移動元が先手の駒の場合
break;
else if ((N_FU_N <= s_tem_m_koma_n) && (s_tem_m_koma_n <= N_HI_N)) //移動元が先手の成駒の場合
break;
else if (s_motigoma_n == 0) //元に戻る場合
continue;
else
printf("\n先手の駒を入力してください。");
}

while (1)
{
/* 先手の指し手の移動先(列)の入力 */
printf("\n先手の指し手の移動先(列)か前に戻る(0)を入力してください:");

s_te_s_r = sasite_nyuuryoku(); //指し手を取得

if (s_te_s_r == 0) //前に戻るが選択された場合
continue;

/* 先手の指し手の移動先(行)の入力 */
printf("\n先手の指し手の移動先(行)か前に戻る(0)を入力してください:");

s_te_s_g = sasite_nyuuryoku(); //指し手を取得

if (s_te_s_g == 0) //前に戻るが選択された場合
continue;

s_tem_s_koma_n = banmen[s_te_s_g - 1][s_te_s_r - 1]; //先手の指し手の移動先(駒番号)を保存
if ((s_tem_s_koma_n == OU_N) && (s_motigoma_n == 0)) //移動先が後手の王で移動元が持ち駒でない場合
return 1; //詰み(先手の勝利)
else if ((s_te_m_r == s_te_s_r) && (s_te_m_g == s_te_s_g)) //移動元と移動先が同じ場合
printf("\n移動可能な移動先を入力してください。");
else if (s_tem_s_koma_n == GYOKU_N) //移動先が先手の玉の場合(味方の駒取得可能特別ルール内の例外)
printf("\n移動可能な移動先を入力してください。");
else if (s_motigoma_n > 0 && (s_tem_s_koma_n != KUHAKU_N))
printf("\n駒がない場所を入力してください。");
else
break;
}

/* 先手の移動元か移動先が後手陣地で移動元が持ち駒でない場合 */
if (((FU_N <= s_tem_m_koma_n) && (s_tem_m_koma_n <= GYOKU_N)) && (s_te_m_g < 4 || s_te_s_g < 4) && s_motigoma_n == 0) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
s_te_n = _getche();
if (s_te_n == '1'){ //成りが選択されたら
s_tem_m_koma_n = s_tem_m_koma_n | NARI_N; //移動元駒をビット和で成駒に変換
break; //whileループを抜ける
}
else
{
s_te_n = 0;
break; //whileループを抜ける
}
}
}
else {
s_te_n = 0;
}

banmen[s_te_m_g - 1][s_te_m_r - 1] = KUHAKU_N; //先手の指し手の移動元に空白を保存

if (s_tem_s_koma_n != KUHAKU_N) { //移動先に駒がある場合
/* 移動先が歩の場合 */
if ((s_tem_s_koma_n == G_FU_N) || (s_tem_s_koma_n == FU_N) || (s_tem_s_koma_n == N_G_FU_N) || (s_tem_s_koma_n == N_FU_N)){
s_motigoma.fu++; //歩を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
/* 移動先が香の場合 */
else if ((s_tem_s_koma_n == G_KYO_N) || (s_tem_s_koma_n == KYO_N) || (s_tem_s_koma_n == N_G_KYO_N) || (s_tem_s_koma_n == N_KYO_N)){
s_motigoma.kyo++; //香を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
/* 移動先が桂の場合 */
else if ((s_tem_s_koma_n == G_KEI_N) || (s_tem_s_koma_n == KEI_N) || (s_tem_s_koma_n == N_G_KEI_N) || (s_tem_s_koma_n == N_KEI_N)){
s_motigoma.kei++; //桂を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
/* 移動先が銀の場合 */
else if ((s_tem_s_koma_n == G_GIN_N) || (s_tem_s_koma_n == GIN_N) || (s_tem_s_koma_n == N_G_GIN_N) || (s_tem_s_koma_n == N_GIN_N)){
s_motigoma.gin++; //銀を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
/* 移動先が金の場合 */
else if ((s_tem_s_koma_n == G_KIN_N) || (s_tem_s_koma_n == KIN_N)){
s_motigoma.kin++; //金を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
/* 移動先が角の場合 */
else if ((s_tem_s_koma_n == G_KAKU_N) || (s_tem_s_koma_n == KAKU_N) || (s_tem_s_koma_n == N_G_KAKU_N) || (s_tem_s_koma_n == N_KAKU_N)){
s_motigoma.kaku++; //角を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
/* 移動先が飛の場合 */
else if ((s_tem_s_koma_n == G_HI_N) || (s_tem_s_koma_n == HI_N) || (s_tem_s_koma_n == N_G_HI_N) || (s_tem_s_koma_n == N_HI_N)){
s_motigoma.hi++; //飛を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
}

banmen[s_te_s_g - 1][s_te_s_r - 1] = s_tem_m_koma_n; //先手の指し手の移動先に移動元の駒を保存

return 0;
}

/* 後手の指し手の入力関数 */
int gote_nyuuryoku()
{
while (1)
{
g_tem_m_koma_n = 0;
sasite_koma_n = 0;

/* 後手の指し手の移動元(列)の入力 */
printf(AOIRO"\n後手の指し手の移動元(列)か持ち駒(0)を入力してください:"KIHONIRO);

g_te_m_r = sasite_nyuuryoku(); //指し手を取得

if (g_te_m_r == 0){ //持ち駒が選択された場合
if (g_motigoma.kazu == 0){
printf(AOIRO"\n持ち駒がありません。"KIHONIRO);
continue;
}
g_motigoma_n = motigoma_nyuuryoku(&g_motigoma);
if (g_motigoma_n > 0){
g_tem_m_koma_n = g_motigoma_n | GOTE_N; //持ち駒をビット和で後手の駒に変換
sasite_koma_n = g_tem_m_koma_n;
break;
}
}
else {
g_motigoma_n = 0;

/* 後手の指し手の移動元(行)の入力 */
printf(AOIRO"\n後手の指し手の移動元(行)か前に戻る(0)を入力してください:"KIHONIRO);

g_te_m_g = sasite_nyuuryoku(); //指し手を取得

if (g_te_m_g == 0) //前に戻るが選択された場合
continue;

g_tem_m_koma_n = banmen[g_te_m_g - 1][g_te_m_r - 1]; //後手の指し手の移動元(駒番号)を保存
sasite_koma_n = g_tem_m_koma_n;

}

if ((G_FU_N <= g_tem_m_koma_n) && (g_tem_m_koma_n <= OU_N)) //移動元が後手の駒の場合
break;
else if ((N_G_FU_N <= g_tem_m_koma_n) && (g_tem_m_koma_n <= N_G_HI_N)) //移動元が後手の成駒の場合
break;
else
printf(AOIRO"\n後手の駒を入力してください。"KIHONIRO);
}

while (1)
{
/* 後手の指し手の移動先(列)の入力 */
printf(AOIRO"\n後手の指し手の移動先(列)か前に戻る(0)を入力してください:"KIHONIRO);

g_te_s_r = sasite_nyuuryoku(); //指し手を取得

if (g_te_s_r == 0) //前に戻るが選択された場合
continue;

/* 後手の指し手の移動先(行)の入力 */
printf(AOIRO"\n後手の指し手の移動先(行)を入力してください:"KIHONIRO);

g_te_s_g = sasite_nyuuryoku(); //指し手を取得

g_tem_s_koma_n = banmen[g_te_s_g - 1][g_te_s_r - 1]; //後手の指し手の移動先(駒番号)を保存
if ((g_tem_s_koma_n == GYOKU_N) && (g_motigoma_n == 0)) //移動先が先手の玉で移動元が持ち駒でない場合
return 1; //詰み(先手の勝利)
else if ((g_te_m_r == g_te_s_r) && (g_te_m_g == g_te_s_g)) //移動元と移動先が同じ場合
printf(AOIRO"\n移動可能な移動先を入力してください。"KIHONIRO);
else if (g_tem_s_koma_n == OU_N) //移動先が後手の王の場合(味方の駒取得可能特別ルール内の例外)
printf(AOIRO"\n移動可能な移動先を入力してください。"KIHONIRO);
else if (g_motigoma_n > 0 && (g_tem_s_koma_n != KUHAKU_N))
printf(AOIRO"\n駒がない場所を入力してください。"KIHONIRO);
else
break;
}

/* 後手の移動元か移動先が先手陣地で移動元が持ち駒でない場合 */
if (((G_FU_N <= g_tem_m_koma_n) && (g_tem_m_koma_n <= OU_N)) && (g_te_m_g > 6 || g_te_s_g > 6) && (g_motigoma_n == 0)) {
printf(AOIRO"\n成りますか?(Yes:1, No:0):"KIHONIRO); //成るか確認

while (1){
g_te_n = _getche();
if (g_te_n == '1'){ //成りが選択されたら
g_tem_m_koma_n = g_tem_m_koma_n | NARI_N; //移動元駒をビット和で成駒に変換
break; //whileループを抜ける
}
else
{
g_te_n = 0;
break; //whileループを抜ける
}
}
}
else {
g_te_n = 0;
}

banmen[g_te_m_g - 1][g_te_m_r - 1] = KUHAKU_N; //後手の指し手の移動元に空白を保存

if (g_tem_s_koma_n != KUHAKU_N) { //移動先に駒がある場合
/* 移動先が歩の場合 */
if ((g_tem_s_koma_n == G_FU_N) || (g_tem_s_koma_n == FU_N) || (g_tem_s_koma_n == N_G_FU_N) || (g_tem_s_koma_n == N_FU_N)) {
g_motigoma.fu++; //歩を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
/* 移動先が香の場合 */
else if ((g_tem_s_koma_n == G_KYO_N) || (g_tem_s_koma_n == KYO_N) || (g_tem_s_koma_n == N_G_KYO_N) || (g_tem_s_koma_n == N_KYO_N)){
g_motigoma.kyo++; //香を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
/* 移動先が桂の場合 */
else if ((g_tem_s_koma_n == G_KEI_N) || (g_tem_s_koma_n == KEI_N) || (g_tem_s_koma_n == N_G_KEI_N) || (g_tem_s_koma_n == N_KEI_N)){
g_motigoma.kei++; //桂を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
/* 移動先が銀の場合 */
else if ((g_tem_s_koma_n == G_GIN_N) || (g_tem_s_koma_n == GIN_N) || (g_tem_s_koma_n == N_G_GIN_N) || (g_tem_s_koma_n == N_GIN_N)){
g_motigoma.gin++; //銀を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
/* 移動先が金の場合 */
else if ((g_tem_s_koma_n == G_KIN_N) || (g_tem_s_koma_n == KIN_N)){
g_motigoma.kin++; //金を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
/* 移動先が角の場合 */
else if ((g_tem_s_koma_n == G_KAKU_N) || (g_tem_s_koma_n == KAKU_N) || (g_tem_s_koma_n == N_G_KAKU_N) || (g_tem_s_koma_n == N_KAKU_N)){
g_motigoma.kaku++; //角を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
/* 移動先が飛の場合 */
else if ((g_tem_s_koma_n == G_HI_N) || (g_tem_s_koma_n == HI_N) || (g_tem_s_koma_n == N_G_HI_N) || (g_tem_s_koma_n == N_HI_N)){
g_motigoma.hi++; //飛を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
}

banmen[g_te_s_g - 1][g_te_s_r - 1] = g_tem_m_koma_n; //後手の指し手の移動先に移動元の駒を保存

return 0;
}

/* 指し手の表示関数 */
int sasite_hyouji(int teban)
{
if (teban == SENTE){
tesuu_n++; //手数カウントを増やす

switch (s_te_s_g)
{
case 1:
printf("\n%d.先手:%d一%s", tesuu_n, s_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 2:
printf("\n%d.先手:%d二%s", tesuu_n, s_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 3:
printf("\n%d.先手:%d三%s", tesuu_n, s_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 4:
printf("\n%d.先手:%d四%s", tesuu_n, s_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 5:
printf("\n%d.先手:%d五%s", tesuu_n, s_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 6:
printf("\n%d.先手:%d六%s", tesuu_n, s_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 7:
printf("\n%d.先手:%d七%s", tesuu_n, s_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 8:
printf("\n%d.先手:%d八%s", tesuu_n, s_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 9:
printf("\n%d.先手:%d九%s", tesuu_n, s_te_s_r, koma_s_h[sasite_koma_n]);
break;
default:
break;
}

if (s_te_n == '1') //先手が成るか
printf("成");

if (s_motigoma_n > 0)
printf("打");
else {
switch (s_te_m_g)
{
case 1:
printf("(%d一)", s_te_m_r);
break;
case 2:
printf("(%d二)", s_te_m_r);
break;
case 3:
printf("(%d三)", s_te_m_r);
break;
case 4:
printf("(%d四)", s_te_m_r);
break;
case 5:
printf("(%d五)", s_te_m_r);
break;
case 6:
printf("(%d六)", s_te_m_r);
break;
case 7:
printf("(%d七)", s_te_m_r);
break;
case 8:
printf("(%d八)", s_te_m_r);
break;
case 9:
printf("(%d九)", s_te_m_r);
break;
default:
break;
}
}
}

if (teban == GOTE){
tesuu_n++; //手数カウントを増やす

switch (g_te_s_g)
{
case 1:
printf(AOIRO"\n%d.後手:%d一%s"KIHONIRO, tesuu_n, g_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 2:
printf(AOIRO"\n%d.後手:%d二%s"KIHONIRO, tesuu_n, g_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 3:
printf(AOIRO"\n%d.後手:%d三%s"KIHONIRO, tesuu_n, g_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 4:
printf(AOIRO"\n%d.後手:%d四%s"KIHONIRO, tesuu_n, g_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 5:
printf(AOIRO"\n%d.後手:%d五%s"KIHONIRO, tesuu_n, g_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 6:
printf(AOIRO"\n%d.後手:%d六%s"KIHONIRO, tesuu_n, g_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 7:
printf(AOIRO"\n%d.後手:%d七%s"KIHONIRO, tesuu_n, g_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 8:
printf(AOIRO"\n%d.後手:%d八%s"KIHONIRO, tesuu_n, g_te_s_r, koma_s_h[sasite_koma_n]);
break;
case 9:
printf(AOIRO"\n%d.後手:%d九%s"KIHONIRO, tesuu_n, g_te_s_r, koma_s_h[sasite_koma_n]);
break;
default:
break;
}

if (g_te_n == '1') //後手が成るか
printf(AOIRO"成"KIHONIRO);

if (g_motigoma_n > 0)
printf(AOIRO"打"KIHONIRO);
else {
switch (g_te_m_g)
{
case 1:
printf(AOIRO"(%d一)"KIHONIRO, g_te_m_r);
break;
case 2:
printf(AOIRO"(%d二)"KIHONIRO, g_te_m_r);
break;
case 3:
printf(AOIRO"(%d三)"KIHONIRO, g_te_m_r);
break;
case 4:
printf(AOIRO"(%d四)"KIHONIRO, g_te_m_r);
break;
case 5:
printf(AOIRO"(%d五)"KIHONIRO, g_te_m_r);
break;
case 6:
printf(AOIRO"(%d六)"KIHONIRO, g_te_m_r);
break;
case 7:
printf(AOIRO"(%d七)"KIHONIRO, g_te_m_r);
break;
case 8:
printf(AOIRO"(%d八)"KIHONIRO, g_te_m_r);
break;
case 9:
printf(AOIRO"(%d九)"KIHONIRO, g_te_m_r);
break;
default:
break;
}
}
}

printf("\n");

return 0;
}


将時画面16022501


持ち駒のカウントと使用する関数を追加しました。

strcpy_s関数がうまくいかないので、駒番号をメインにするように修正しました。

一部、バグ修正他行いました。


ソース:stime_16022401


/* stime.c */

#define KUHAKU " " //KUHAKUを" "と定義

#define FU "歩" //FUを歩と定義
#define KYO "香" //KYOを香と定義
#define KEI "桂" //KEIを桂と定義
#define GIN "銀" //GINを銀と定義
#define KIN "金" //KINを金と定義
#define KAKU "角" //KAKUを角と定義
#define HI "飛" //HIを飛と定義
#define GYOKU "玉" //GYOKUを玉と定義

#define AOIRO "\x1b[34m" //AOIROを青色のエスケープシーケンスと定義
#define KIHONIRO "\x1b[39m" //AOIROを基本色のエスケープシーケンスと定義

#define G_FU AOIRO"歩"KIHONIRO //G_FUを青色の歩と定義
#define G_KYO AOIRO"香"KIHONIRO //G_KYOを青色の香と定義
#define G_KEI AOIRO"桂"KIHONIRO //G_KEIを青色の桂と定義
#define G_GIN AOIRO"銀"KIHONIRO //G_GINを青色の銀と定義
#define G_KIN AOIRO"金"KIHONIRO //G_KINを青色の金と定義
#define G_KAKU AOIRO"角"KIHONIRO //G_KAKUを青色の角と定義
#define G_HI AOIRO"飛"KIHONIRO //G_HIを青色の飛と定義
#define OU AOIRO"王"KIHONIRO //G_OUを王と定義

#define KUHAKU_N 0 // KUHAKU_Nを" "の番号0(00000000)と定義
#define FU_N 1 // FU_Nを先手の歩の番号1(00000001)と定義
#define KYO_N 2 // KYO_Nを先手の香の番号2(00000010)と定義
#define KEI_N 3 // KEI_Nを先手の桂の番号3(00000011)と定義
#define GIN_N 4 // GIN_Nを先手の銀の番号4(00000100)と定義
#define KIN_N 5 // KIN_Nを先手の金の番号5(00000101)と定義
#define KAKU_N 6 // KAKU_Nを先手の角の番号6(00000110)と定義
#define HI_N 7 // HI_Nを先手の飛の番号7(00000111)と定義
#define GYOKU_N 8 // GYOKU_Nを先手の玉の番号8(00001000)と定義
#define GOTE_N 16 // GOTE_Nを先手→後手番号16(00010000)と定義
#define G_FU_N 17 // G_FU_Nを後手の歩の番号17(00010001)と定義
#define G_KYO_N 18 // G_KYO_Nを後手の香の番号18(00010010)と定義
#define G_KEI_N 19 // G_KEI_Nを後手の桂の番号19(00010011)と定義
#define G_GIN_N 20 // G_GIN_Nを後手の銀の番号20(00010100)と定義
#define G_KIN_N 21 // G_KIN_Nを後手の金の番号21(00010101)と定義
#define G_KAKU_N 22 //G_KAKU_Nを後手の角の番号22(00010110)と定義
#define G_HI_N 23 // G_HI_Nを後手の飛の番号23(00010111)と定義
#define OU_N 24 // OU_Nを後手の王の番号24(00011000)と定義

#define SENTE 0 //SENTEを0と定義
#define GOTE 1 //GOTEを1と定義

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int tesuu_n; //手数カウント

int s_te_m_r; //先手の指し手の移動元(列)
int s_te_m_g; //先手の指し手の移動元(行)
int s_te_s_r; //先手の指し手の移動先(列)
int s_te_s_g; //先手の指し手の移動先(行)
int s_te_n; //先手の成りフラグ

int g_te_m_r; //後手の指し手の移動元(列)
int g_te_m_g; //後手の指し手の移動元(行)
int g_te_s_r; //後手の指し手の移動先(列)
int g_te_s_g; //後手の指し手の移動先(行)
int g_te_n; //後手の成りフラグ

int s_tem_m_koma_n = 0; //先手の指し手の移動元(駒番号)
int s_tem_s_koma_n = 0; //先手の指し手の移動先(駒番号)
int g_tem_m_koma_n = 0; //後手の指し手の移動元(駒番号)
int g_tem_s_koma_n = 0; //後手の指し手の移動先(駒番号)

char *koma_h[] = {
KUHAKU, // 要素0にKUHAKUをセット
FU, // 要素1にFUをセット
KYO, // 要素2にKYOをセット
KEI, // 要素3にKEIをセット
GIN, // 要素4にGINをセット
KIN, // 要素5にKINをセット
KAKU, // 要素6にKAKUをセット
HI, // 要素7にHIをセット
GYOKU, // 要素8にGYOKUをセット
KUHAKU, // 要素9にKUHAKUをセット
KUHAKU, //要素10にKUHAKUをセット
KUHAKU, //要素11にKUHAKUをセット
KUHAKU, //要素12にKUHAKUをセット
KUHAKU, //要素13にKUHAKUをセット
KUHAKU, //要素14にKUHAKUをセット
KUHAKU, //要素15にKUHAKUをセット
KUHAKU, //要素16にKUHAKUをセット
G_FU, //要素17にG_FU_Nをセット
G_KYO, //要素18にG_KYO_Nをセット
G_KEI, //要素19にG_KEI_Nをセット
G_GIN, //要素20にG_GIN_Nをセット
G_KIN, //要素21にG_KIN_Nをセット
G_KAKU, //要素22にG_KAKU_Nをセット
G_HI, //要素23にG_HI_Nをセット
OU //要素24にOU_Nをセット
};

/* 盤面の初期設定 */
int banmen[9][9] = { { G_KYO_N, G_KEI_N, G_GIN_N, G_KIN_N, OU_N, G_KIN_N, G_GIN_N, G_KEI_N, G_KYO_N },
{ KUHAKU_N, G_KAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, G_HI_N, KUHAKU_N },
{ G_FU_N, G_FU_N, G_FU_N, G_FU_N, G_FU_N, G_FU_N, G_FU_N, G_FU_N, G_FU_N },
{ KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N },
{ KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N },
{ KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N },
{ FU_N, FU_N, FU_N, FU_N, FU_N, FU_N, FU_N, FU_N, FU_N },
{ KUHAKU_N, HI_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KUHAKU_N, KAKU_N, KUHAKU_N },
{ KYO_N, KEI_N, GIN_N, KIN_N, GYOKU_N, KIN_N, GIN_N, KEI_N, KYO_N } };

/* 持ち駒の構造体 */
struct Motigoma{
int kazu;
int fu;
int kyo;
int kei;
int gin;
int kin;
int kaku;
int hi;
};

struct Motigoma s_motigoma = { 0, 0, 0, 0, 0, 0, 0, 0 }; //先手の持ち駒の構造体
struct Motigoma g_motigoma = { 0, 0, 0, 0, 0, 0, 0, 0 }; //後手の持ち駒の構造体
int s_motigoma_n; //先手の持ち駒番号
int g_motigoma_n; //後手の持ち駒番号

int banmen_hyouji(); //盤面の表示関数
int sente_nyuuryoku(); //先手の指し手の入力関数
int gote_nyuuryoku(); //後手の指し手の入力関数
int sasite_hyouji(int); //指し手の表示関数
int sasite_nyuuryoku(); //指し手の入力関数
int motigoma_hyouji(); //持ち駒の表示関数
int motigoma_nyuuryoku(struct Motigoma *); //持ち駒の入力関数

int main()
{

tesuu_n = 0; //手数カウント初期化
system("cls"); //画面クリア
motigoma_hyouji(); //持ち駒表示関数
banmen_hyouji(); //盤面表示関数

while (1){
if (sente_nyuuryoku() == 1){ //先手の指し手の入力関数
printf("\n詰みました。先手の勝利です。");
break;
}

system("cls"); //画面クリア
sasite_hyouji(SENTE); //先手の指し手表示関数
motigoma_hyouji(); //持ち駒表示関数
banmen_hyouji(); //盤面表示関数

if (gote_nyuuryoku() == 1){ //後手の指し手の入力関数
printf(AOIRO"\n詰みました。後手の勝利です。"KIHONIRO);
break;
}

system("cls"); //画面クリア
sasite_hyouji(GOTE); //後手の指し手表示関数
motigoma_hyouji(); //持ち駒表示関数
banmen_hyouji(); //盤面表示関数
}

return 0;
}

/* 盤面表示関数 */
int banmen_hyouji()
{
printf("\n");
printf(" 9 8 7 6 5 4 3 2 1 \n");
printf("┌─┬─┬─┬─┬─┬─┬─┬─┬─┐\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│一\n", koma_h[banmen[0][8]], koma_h[banmen[0][7]], koma_h[banmen[0][6]], koma_h[banmen[0][5]], koma_h[banmen[0][4]], koma_h[banmen[0][3]], koma_h[banmen[0][2]], koma_h[banmen[0][1]], koma_h[banmen[0][0]]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│二\n", koma_h[banmen[1][8]], koma_h[banmen[1][7]], koma_h[banmen[1][6]], koma_h[banmen[1][5]], koma_h[banmen[1][4]], koma_h[banmen[1][3]], koma_h[banmen[1][2]], koma_h[banmen[1][1]], koma_h[banmen[1][0]]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│三\n", koma_h[banmen[2][8]], koma_h[banmen[2][7]], koma_h[banmen[2][6]], koma_h[banmen[2][5]], koma_h[banmen[2][4]], koma_h[banmen[2][3]], koma_h[banmen[2][2]], koma_h[banmen[2][1]], koma_h[banmen[2][0]]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│四\n", koma_h[banmen[3][8]], koma_h[banmen[3][7]], koma_h[banmen[3][6]], koma_h[banmen[3][5]], koma_h[banmen[3][4]], koma_h[banmen[3][3]], koma_h[banmen[3][2]], koma_h[banmen[3][1]], koma_h[banmen[3][0]]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│五\n", koma_h[banmen[4][8]], koma_h[banmen[4][7]], koma_h[banmen[4][6]], koma_h[banmen[4][5]], koma_h[banmen[4][4]], koma_h[banmen[4][3]], koma_h[banmen[4][2]], koma_h[banmen[4][1]], koma_h[banmen[4][0]]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│六\n", koma_h[banmen[5][8]], koma_h[banmen[5][7]], koma_h[banmen[5][6]], koma_h[banmen[5][5]], koma_h[banmen[5][4]], koma_h[banmen[5][3]], koma_h[banmen[5][2]], koma_h[banmen[5][1]], koma_h[banmen[5][0]]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│七\n", koma_h[banmen[6][8]], koma_h[banmen[6][7]], koma_h[banmen[6][6]], koma_h[banmen[6][5]], koma_h[banmen[6][4]], koma_h[banmen[6][3]], koma_h[banmen[6][2]], koma_h[banmen[6][1]], koma_h[banmen[6][0]]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│八\n", koma_h[banmen[7][8]], koma_h[banmen[7][7]], koma_h[banmen[7][6]], koma_h[banmen[7][5]], koma_h[banmen[7][4]], koma_h[banmen[7][3]], koma_h[banmen[7][2]], koma_h[banmen[7][1]], koma_h[banmen[7][0]]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│九\n", koma_h[banmen[8][8]], koma_h[banmen[8][7]], koma_h[banmen[8][6]], koma_h[banmen[8][5]], koma_h[banmen[8][4]], koma_h[banmen[8][3]], koma_h[banmen[8][2]], koma_h[banmen[8][1]], koma_h[banmen[8][0]]);
printf("└─┴─┴─┴─┴─┴─┴─┴─┴─┘");

return 0;
}

/* 先手の指し手の入力関数 */
int sente_nyuuryoku()
{
while (1)
{
s_tem_m_koma_n = 0;

/* 先手の指し手の移動元(列)の入力 */
printf("\n先手の指し手の移動元(列)か持ち駒(0)を入力してください:");

s_te_m_r = sasite_nyuuryoku(); //指し手を取得

if (s_te_m_r == 0){ //持ち駒が選択された場合
if (s_motigoma.kazu == 0){
printf("\n持ち駒がありません。");
continue;
}
s_motigoma_n = motigoma_nyuuryoku(&s_motigoma);
if (s_motigoma_n > 0){
s_tem_m_koma_n = s_motigoma_n;
break;
}
}
else {
s_motigoma_n = 0;

/* 先手の指し手の移動元(行)の入力 */
printf("\n先手の指し手の移動元(行)か前に戻る(0)を入力してください:");

s_te_m_g = sasite_nyuuryoku(); //指し手を取得

if (s_te_m_g == 0) //前に戻るが選択された場合
continue;

s_tem_m_koma_n = banmen[s_te_m_g - 1][s_te_m_r - 1]; //先手の指し手の移動元(駒番号)を保存
}

if ((FU_N <= s_tem_m_koma_n) && (s_tem_m_koma_n <= GYOKU_N)) //移動元が先手の駒の場合
break;
else if (s_motigoma_n == 0) //元に戻る場合
continue;
else
printf("\n先手の駒を入力してください。");
}

while (1)
{
/* 先手の指し手の移動先(列)の入力 */
printf("\n先手の指し手の移動先(列)か前に戻る(0)を入力してください:");

s_te_s_r = sasite_nyuuryoku(); //指し手を取得

if (s_te_s_r == 0) //前に戻るが選択された場合
continue;

/* 先手の指し手の移動先(行)の入力 */
printf("\n先手の指し手の移動先(行)か前に戻る(0)を入力してください:");

s_te_s_g = sasite_nyuuryoku(); //指し手を取得

if (s_te_s_g == 0) //前に戻るが選択された場合
continue;

s_tem_s_koma_n = banmen[s_te_s_g - 1][s_te_s_r - 1]; //先手の指し手の移動先(駒番号)を保存
if ((s_tem_s_koma_n == OU_N) && (s_motigoma_n == 0)) //移動先が後手の王で移動元が持ち駒でない場合
return 1; //詰み(先手の勝利)
else if ((s_te_m_r == s_te_s_r) && (s_te_m_g == s_te_s_g)) //移動元と移動先が同じ場合
printf("\n移動可能な移動先を入力してください。");
else if (s_tem_s_koma_n == GYOKU_N) //移動先が先手の玉の場合(味方の駒取得可能特別ルール内の例外)
printf("\n移動可能な移動先を入力してください。");
else if (s_motigoma_n > 0 && (s_tem_s_koma_n != KUHAKU_N))
printf("\n駒がない場所を入力してください。");
else
break;
}

/* 先手の移動元か移動先が後手陣地で移動元が持ち駒でない場合 */
if ((s_te_m_g < 4 || s_te_s_g < 4) && s_motigoma_n == 0) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
s_te_n = getchar();
if (s_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
s_te_n = 0;
}

banmen[s_te_m_g - 1][s_te_m_r - 1] = KUHAKU_N; //先手の指し手の移動元に空白を保存

if (s_tem_s_koma_n != KUHAKU_N) { //移動先に駒がある場合
if ((s_tem_s_koma_n == G_FU_N) || (s_tem_s_koma_n == FU_N)){ //移動先が歩の場合
s_motigoma.fu++; //歩を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
else if ((s_tem_s_koma_n == G_KYO_N) || (s_tem_s_koma_n == KYO_N)){ //移動先が香の場合
s_motigoma.kyo++; //香を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
else if ((s_tem_s_koma_n == G_KEI_N) || (s_tem_s_koma_n == KEI_N)){ //移動先が桂の場合
s_motigoma.kei++; //桂を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
else if ((s_tem_s_koma_n == G_GIN_N) || (s_tem_s_koma_n == GIN_N)){ //移動先が銀の場合
s_motigoma.gin++; //銀を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
else if ((s_tem_s_koma_n == G_KIN_N) || (s_tem_s_koma_n == KIN_N)){ //移動先が金の場合
s_motigoma.kin++; //金を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
else if ((s_tem_s_koma_n == G_KAKU_N) || (s_tem_s_koma_n == KAKU_N)){ //移動先が角の場合
s_motigoma.kaku++; //角を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
else if ((s_tem_s_koma_n == G_HI_N) || (s_tem_s_koma_n == HI_N)){ //移動先が飛の場合
s_motigoma.hi++; //飛を持ち駒に加える
s_motigoma.kazu++; //持ち駒カウントを増やす
}
}

banmen[s_te_s_g - 1][s_te_s_r - 1] = s_tem_m_koma_n; //先手の指し手の移動先に移動元の駒を保存

return 0;
}

/* 後手の指し手の入力関数 */
int gote_nyuuryoku()
{
while (1)
{
g_tem_m_koma_n = 0;

/* 後手の指し手の移動元(列)の入力 */
printf(AOIRO"\n後手の指し手の移動元(列)か持ち駒(0)を入力してください:"KIHONIRO);

g_te_m_r = sasite_nyuuryoku(); //指し手を取得

if (g_te_m_r == 0){ //持ち駒が選択された場合
if (g_motigoma.kazu == 0){
printf(AOIRO"\n持ち駒がありません。"KIHONIRO);
continue;
}
g_motigoma_n = motigoma_nyuuryoku(&g_motigoma);
if (g_motigoma_n > 0){
g_tem_m_koma_n = g_motigoma_n | GOTE_N; //持ち駒をビット和で後手の駒に変換
break;
}
}
else {
g_motigoma_n = 0;

/* 後手の指し手の移動元(行)の入力 */
printf(AOIRO"\n後手の指し手の移動元(行)か前に戻る(0)を入力してください:"KIHONIRO);

g_te_m_g = sasite_nyuuryoku(); //指し手を取得

if (g_te_m_g == 0) //前に戻るが選択された場合
continue;

g_tem_m_koma_n = banmen[g_te_m_g - 1][g_te_m_r - 1]; //後手の指し手の移動元(駒番号)を保存
}

if ((G_FU_N <= g_tem_m_koma_n) && (g_tem_m_koma_n <= OU_N)) //移動元が後手の駒の場合
break;
else
printf(AOIRO"\n後手の駒を入力してください。"KIHONIRO);
}

while (1)
{
/* 後手の指し手の移動先(列)の入力 */
printf(AOIRO"\n後手の指し手の移動先(列)か前に戻る(0)を入力してください:"KIHONIRO);

g_te_s_r = sasite_nyuuryoku(); //指し手を取得

if (g_te_s_r == 0) //前に戻るが選択された場合
continue;

/* 後手の指し手の移動先(行)の入力 */
printf(AOIRO"\n後手の指し手の移動先(行)を入力してください:"KIHONIRO);

g_te_s_g = sasite_nyuuryoku(); //指し手を取得

g_tem_s_koma_n = banmen[g_te_s_g - 1][g_te_s_r - 1]; //後手の指し手の移動先(駒番号)を保存
if ((g_tem_s_koma_n == GYOKU_N) && (g_motigoma_n == 0)) //移動先が先手の玉で移動元が持ち駒でない場合
return 1; //詰み(先手の勝利)
else if ((g_te_m_r == g_te_s_r) && (g_te_m_g == g_te_s_g)) //移動元と移動先が同じ場合
printf(AOIRO"\n移動可能な移動先を入力してください。"KIHONIRO);
else if (g_tem_s_koma_n == OU_N) //移動先が後手の王の場合(味方の駒取得可能特別ルール内の例外)
printf(AOIRO"\n移動可能な移動先を入力してください。"KIHONIRO);
else if (g_motigoma_n > 0 && (g_tem_s_koma_n != KUHAKU_N))
printf(AOIRO"\n駒がない場所を入力してください。"KIHONIRO);
else
break;
}

/* 後手の移動元か移動先が先手陣地で移動元が持ち駒でない場合 */
if ((g_te_m_g > 6 || g_te_s_g > 6) && g_motigoma_n == 0) {
printf(AOIRO"\n成りますか?(Yes:1, No:0):"KIHONIRO); //成るか確認

while (1){
g_te_n = getchar();
if (g_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
g_te_n = 0;
}

banmen[g_te_m_g - 1][g_te_m_r - 1] = KUHAKU_N; //後手の指し手の移動元に空白を保存

if (g_tem_s_koma_n != KUHAKU_N) { //移動先に駒がある場合
if ((g_tem_s_koma_n == G_FU_N) || (g_tem_s_koma_n == FU_N)) { //移動先が歩の場合
g_motigoma.fu++; //歩を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
else if ((g_tem_s_koma_n == G_KYO_N) || (g_tem_s_koma_n == KYO_N)){ //移動先が香の場合
g_motigoma.kyo++; //香を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
else if ((g_tem_s_koma_n == G_KEI_N) || (g_tem_s_koma_n == G_KEI_N)){ //移動先が桂の場合
g_motigoma.kei++; //桂を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
else if ((g_tem_s_koma_n == G_GIN_N) || (g_tem_s_koma_n == GIN_N)){ //移動先が銀の場合
g_motigoma.gin++; //銀を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
else if ((g_tem_s_koma_n == G_KIN_N) || (g_tem_s_koma_n == KIN_N)){ //移動先が金の場合
g_motigoma.kin++; //金を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
else if ((g_tem_s_koma_n == G_KAKU_N) || (g_tem_s_koma_n == KAKU_N)){ //移動先が角の場合
g_motigoma.kaku++; //角を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
else if ((g_tem_s_koma_n == G_HI_N) || (g_tem_s_koma_n == HI_N)){ //移動先が飛の場合
g_motigoma.hi++; //飛を持ち駒に加える
g_motigoma.kazu++; //持ち駒カウントを増やす
}
}

banmen[g_te_s_g - 1][g_te_s_r - 1] = g_tem_m_koma_n; //後手の指し手の移動先に移動元の駒を保存

return 0;
}

/* 指し手の表示関数 */
int sasite_hyouji(int teban)
{
if (teban == SENTE){
tesuu_n++; //手数カウントを増やす

switch (s_te_s_g)
{
case 1:
printf("\n%d.先手:%d一%s", tesuu_n, s_te_s_r, koma_h[s_tem_m_koma_n]);
break;
case 2:
printf("\n%d.先手:%d二%s", tesuu_n, s_te_s_r, koma_h[s_tem_m_koma_n]);
break;
case 3:
printf("\n%d.先手:%d三%s", tesuu_n, s_te_s_r, koma_h[s_tem_m_koma_n]);
break;
case 4:
printf("\n%d.先手:%d四%s", tesuu_n, s_te_s_r, koma_h[s_tem_m_koma_n]);
break;
case 5:
printf("\n%d.先手:%d五%s", tesuu_n, s_te_s_r, koma_h[s_tem_m_koma_n]);
break;
case 6:
printf("\n%d.先手:%d六%s", tesuu_n, s_te_s_r, koma_h[s_tem_m_koma_n]);
break;
case 7:
printf("\n%d.先手:%d七%s", tesuu_n, s_te_s_r, koma_h[s_tem_m_koma_n]);
break;
case 8:
printf("\n%d.先手:%d八%s", tesuu_n, s_te_s_r, koma_h[s_tem_m_koma_n]);
break;
case 9:
printf("\n%d.先手:%d九%s", tesuu_n, s_te_s_r, koma_h[s_tem_m_koma_n]);
break;
default:
break;
}

if (s_te_n == '1') //先手が成るか
printf("成");

if (s_motigoma_n > 0)
printf("打");
else {
switch (s_te_m_g)
{
case 1:
printf("(%d一)", s_te_m_r);
break;
case 2:
printf("(%d二)", s_te_m_r);
break;
case 3:
printf("(%d三)", s_te_m_r);
break;
case 4:
printf("(%d四)", s_te_m_r);
break;
case 5:
printf("(%d五)", s_te_m_r);
break;
case 6:
printf("(%d六)", s_te_m_r);
break;
case 7:
printf("(%d七)", s_te_m_r);
break;
case 8:
printf("(%d八)", s_te_m_r);
break;
case 9:
printf("(%d九)", s_te_m_r);
break;
default:
break;
}
}
}

if (teban == GOTE){
tesuu_n++; //手数カウントを増やす

switch (g_te_s_g)
{
case 1:
printf(AOIRO"\n%d.後手:%d一%s"KIHONIRO, tesuu_n, g_te_s_r, koma_h[g_tem_m_koma_n]);
break;
case 2:
printf(AOIRO"\n%d.後手:%d二%s"KIHONIRO, tesuu_n, g_te_s_r, koma_h[g_tem_m_koma_n]);
break;
case 3:
printf(AOIRO"\n%d.後手:%d三%s"KIHONIRO, tesuu_n, g_te_s_r, koma_h[g_tem_m_koma_n]);
break;
case 4:
printf(AOIRO"\n%d.後手:%d四%s"KIHONIRO, tesuu_n, g_te_s_r, koma_h[g_tem_m_koma_n]);
break;
case 5:
printf(AOIRO"\n%d.後手:%d五%s"KIHONIRO, tesuu_n, g_te_s_r, koma_h[g_tem_m_koma_n]);
break;
case 6:
printf(AOIRO"\n%d.後手:%d六%s"KIHONIRO, tesuu_n, g_te_s_r, koma_h[g_tem_m_koma_n]);
break;
case 7:
printf(AOIRO"\n%d.後手:%d七%s"KIHONIRO, tesuu_n, g_te_s_r, koma_h[g_tem_m_koma_n]);
break;
case 8:
printf(AOIRO"\n%d.後手:%d八%s"KIHONIRO, tesuu_n, g_te_s_r, koma_h[g_tem_m_koma_n]);
break;
case 9:
printf(AOIRO"\n%d.後手:%d九%s"KIHONIRO, tesuu_n, g_te_s_r, koma_h[g_tem_m_koma_n]);
break;
default:
break;
}

if (g_te_n == '1') //後手が成るか
printf(AOIRO"成"KIHONIRO);

if (g_motigoma_n > 0)
printf(AOIRO"打"KIHONIRO);
else {
switch (g_te_m_g)
{
case 1:
printf(AOIRO"(%d一)"KIHONIRO, g_te_m_r);
break;
case 2:
printf(AOIRO"(%d二)"KIHONIRO, g_te_m_r);
break;
case 3:
printf(AOIRO"(%d三)"KIHONIRO, g_te_m_r);
break;
case 4:
printf(AOIRO"(%d四)"KIHONIRO, g_te_m_r);
break;
case 5:
printf(AOIRO"(%d五)"KIHONIRO, g_te_m_r);
break;
case 6:
printf(AOIRO"(%d六)"KIHONIRO, g_te_m_r);
break;
case 7:
printf(AOIRO"(%d七)"KIHONIRO, g_te_m_r);
break;
case 8:
printf(AOIRO"(%d八)"KIHONIRO, g_te_m_r);
break;
case 9:
printf(AOIRO"(%d九)"KIHONIRO, g_te_m_r);
break;
default:
break;
}
}
}

printf("\n");

return 0;
}

/* 指し手の入力関数 */
int sasite_nyuuryoku()
{
int sasite = 0; //指し手を一時保管
int buf;

while (1) {
buf = _getche();
switch(buf) {
case '0': //持ち駒使用
sasite = 0;
break;
case '1':
sasite = 1;
break;
case '2':
sasite = 2;
break;
case '3':
sasite = 3;
break;
case '4':
sasite = 4;
break;
case '5':
sasite = 5;
break;
case '6':
sasite = 6;
break;
case '7':
sasite = 7;
break;
case '8':
sasite = 8;
break;
case '9':
sasite = 9;
break;
default:
sasite = -1;
break;
}
if (0 <= sasite && sasite <= 9) //0から9ならループ終了
break;
else
printf("\n0から9の数字を入力してください:");
}

return sasite;
}

/* 持ち駒の表示関数 */
int motigoma_hyouji()
{
printf("\n持ち駒番号:1 2 3 4 5 6 7");
printf("\n持ち駒種類:歩 香 桂 銀 金 角 飛");

printf("\n先手持ち駒:%2d %2d %2d %2d %2d %2d %2d", s_motigoma.fu, s_motigoma.kyo, s_motigoma.kei, s_motigoma.gin, s_motigoma.kin, s_motigoma.kaku, s_motigoma.hi);

printf(AOIRO"\n後手持ち駒:%2d %2d %2d %2d %2d %2d %2d"KIHONIRO, g_motigoma.fu, g_motigoma.kyo, g_motigoma.kei, g_motigoma.gin, g_motigoma.kin, g_motigoma.kaku, g_motigoma.hi);

return 0;
}

/* 持ち駒の入力関数 */
int motigoma_nyuuryoku(struct Motigoma *p)
{
int buf;
int motigoma_n; //持ち駒番号を一時保管

while (1) {
printf("\n元に戻る(0)か持ち駒番号1から7を入力してください:"); //成るか確認

buf = _getche();

switch (buf) {
case '0': //元に戻るが選択された場合
motigoma_n = 0;
return motigoma_n;
case '1': //歩が選択された場合
if (p->fu > 0){
p->fu--; //歩の数を減らす
p->kazu--; //持ち駒の数を減らす
motigoma_n = FU_N;
break;
} else {
printf("\n%sは持ち駒にありません。", koma_h[FU_N]);
motigoma_n = -1;
break;
}
case '2': //香が選択された場合
if (p->kyo > 0){
p->kyo--; //香の数を減らす
p->kazu--; //持ち駒の数を減らす
motigoma_n = KYO_N;
break;
} else {
printf("\n%sは持ち駒にありません。", koma_h[KYO_N]);
motigoma_n = -1;
break;
}
case '3': //桂が選択された場合
if (p->kei > 0){
p->kei--; //桂の数を減らす
p->kazu--; //持ち駒の数を減らす
motigoma_n = KEI_N;
break;
} else {
printf("\n%sは持ち駒にありません。", koma_h[KEI_N]);
motigoma_n = -1;
break;
}
case '4': //銀が選択された場合
if (p->gin > 0){
p->gin--; //銀の数を減らす
p->kazu--; //持ち駒の数を減らす
motigoma_n = GIN_N;
break;
} else {
printf("\n%sは持ち駒にありません。", koma_h[GIN_N]);
motigoma_n = -1;
break;
}
case '5': //金が選択された場合
if (p->kin > 0){
p->kin--; //金の数を減らす
p->kazu--; //持ち駒の数を減らす
motigoma_n = KIN_N;
break;
} else {
printf("\n%sは持ち駒にありません。", koma_h[KIN_N]);
motigoma_n = -1;
break;
}
case '6': //角が選択された場合
if (p->kaku > 0){
p->kaku--; //角の数を減らす
p->kazu--; //持ち駒の数を減らす
motigoma_n = KAKU_N;
break;
} else {
printf("\n%sは持ち駒にありません。", koma_h[KAKU_N]);
motigoma_n = -1;
break;
}
case '7': //飛が選択された場合
if (p->hi > 0){
p->hi--; //飛の数を減らす
p->kazu--; //持ち駒の数を減らす
motigoma_n = HI_N;
break;
} else {
printf("\n%sは持ち駒にありません。", koma_h[HI_N]);
motigoma_n = -1;
break;
}
default:
motigoma_n = -1;
break;
}
if (1 <= motigoma_n && motigoma_n <= 7) //1から7ならループ終了
break;
}

return motigoma_n;

将時画面16022401


後手に関するメッセージの色の変更とバグの修正をしました。


ソース:stime_16022102


/* stime.c */

#define FU "歩" //FUを歩と定義
#define KYO "香" //KYOを香と定義
#define KEI "桂" //KEIを桂と定義
#define GIN "銀" //GINを銀と定義
#define KIN "金" //KINを金と定義
#define KAKU "角" //KAKUを角と定義
#define HI "飛" //HIを飛と定義
#define GYOKU "玉" //GYOKUを玉と定義

#define AOIRO "\x1b[34m" //AOIROを青色のエスケープシーケンスと定義
#define KIHONIRO "\x1b[39m" //AOIROを基本色のエスケープシーケンスと定義

#define G_FU AOIRO"歩"KIHONIRO //G_FUを青色の歩と定義
#define G_KYO AOIRO"香"KIHONIRO //G_KYOを青色の香と定義
#define G_KEI AOIRO"桂"KIHONIRO //G_KEIを青色の桂と定義
#define G_GIN AOIRO"銀"KIHONIRO //G_GINを青色の銀と定義
#define G_KIN AOIRO"金"KIHONIRO //G_KINを青色の金と定義
#define G_KAKU AOIRO"角"KIHONIRO //G_KAKUを青色の角と定義
#define G_HI AOIRO"飛"KIHONIRO //G_HIを青色の飛と定義
#define OU AOIRO"王"KIHONIRO //G_OUを王と定義
#define KUHAKU " " //KUHAKUを" "と定義

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int tesuu_n; //手数カウント

int s_te_m_r; //先手の指し手の移動元(列)
int s_te_m_g; //先手の指し手の移動元(行)
int s_te_s_r; //先手の指し手の移動先(列)
int s_te_s_g; //先手の指し手の移動先(行)
int s_te_n; //先手の成りフラグ

int g_te_m_r; //後手の指し手の移動元(列)
int g_te_m_g; //後手の指し手の移動元(行)
int g_te_s_r; //後手の指し手の移動先(列)
int g_te_s_g; //後手の指し手の移動先(行)
int g_te_n; //後手の成りフラグ

char *s_motigoma[40]; //先手の持ち駒
char *g_motigoma[40]; //後手の持ち駒

int s_motigoma_n; //先手の持ち駒カウント
int g_motigoma_n; //後手の持ち駒カウント

char *s_tem_m_koma = KUHAKU; //先手の指し手の移動元(駒)
char *s_tem_s_koma = KUHAKU; //先手の指し手の移動先(駒)
char *g_tem_m_koma = KUHAKU; //後手の指し手の移動元(駒)
char *g_tem_s_koma = KUHAKU; //後手の指し手の移動先(駒)

/* 盤面の初期設定 */
char *banmen[9][9] = { { G_KYO, G_KEI, G_GIN, G_KIN, OU, G_KIN, G_GIN, G_KEI, G_KYO },
{ KUHAKU, G_KAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, G_HI, KUHAKU },
{ G_FU, G_FU, G_FU, G_FU, G_FU, G_FU, G_FU, G_FU, G_FU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ FU, FU, FU, FU, FU, FU, FU, FU, FU },
{ KUHAKU, HI, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KAKU, KUHAKU },
{ KYO, KEI, GIN, KIN, GYOKU, KIN, GIN, KEI, KYO } };

int banmen_hyouji(); //盤面表示関数
int sente_nyuuryoku(); //先手の指し手の入力関数
int gote_nyuuryoku(); //後手の指し手の入力関数
int sasite_hyouji(); //指し手表示関数
int sasite_nyuuryoku(); //指し手の入力関数
int motigoma_hyouji(); //持ち駒持ち駒表示関数

int main()
{
int i;

tesuu_n = 0; //手数カウント初期化
s_motigoma_n = 0; //先手の持ち駒カウント初期化
g_motigoma_n = 0; //後手の持ち駒カウント初期化

for (i = 0; i < 40; i++){
s_motigoma[i] = 0; //先手持ち駒の初期化
g_motigoma[i] = 0; //後手持ち駒の初期化
}

system("cls"); //画面クリア

while (1){
banmen_hyouji(); //盤面表示関数
if (sente_nyuuryoku() == 1){ //先手の指し手の入力関数
printf("\n詰みました。先手の勝利です。");
break;
}
if (gote_nyuuryoku() == 1){ //後手の指し手の入力関数
printf(AOIRO"\n詰みました。後手の勝利です。"KIHONIRO);
break;
}
system("cls"); //画面クリア
sasite_hyouji(); //指し手表示関数
motigoma_hyouji(); //持ち駒表示関数
}

return 0;
}

int sente_nyuuryoku()
{
while (1)
{
/* 先手の指し手の移動元(列)の入力 */
printf("\n先手の指し手の移動元(列)を入力してください:");

s_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動元(行)の入力 */
printf("\n先手の指し手の移動元(行)を入力してください:");

s_te_m_g = sasite_nyuuryoku(); //指し手を取得

s_tem_m_koma = banmen[s_te_m_g - 1][s_te_m_r - 1]; //先手の指し手の移動元(駒)を保存

if (s_tem_m_koma == FU) //移動元が先手の歩の場合
break;
else if (s_tem_m_koma == KYO) //移動元が先手の香の場合
break;
else if (s_tem_m_koma == KEI) //移動元が先手の桂の場合
break;
else if (s_tem_m_koma == GIN) //移動元が先手の銀の場合
break;
else if (s_tem_m_koma == KIN) //移動元が先手の金の場合
break;
else if (s_tem_m_koma == KAKU) //移動元が先手の角の場合
break;
else if (s_tem_m_koma == HI) //移動元が先手の飛の場合
break;
else if (s_tem_m_koma == GYOKU) //移動元が先手の玉の場合
break;
else
printf("\n先手の駒を入力してください。");
}

while (1)
{
/* 先手の指し手の移動先(列)の入力 */
printf("\n先手の指し手の移動先(列)を入力してください:");

s_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動先(行)の入力 */
printf("\n先手の指し手の移動先(行)を入力してください:");

s_te_s_g = sasite_nyuuryoku(); //指し手を取得

s_tem_s_koma = banmen[s_te_s_g - 1][s_te_s_r - 1]; //先手の指し手の移動先(駒)を保存
if (s_tem_s_koma == OU) //移動先が後手の王の場合
return 1; //詰み(先手の勝利)
else if ((s_te_m_r == s_te_s_r) && (s_te_m_g == s_te_s_g)) //移動元と移動先が同じ場合
printf("\n移動可能な移動先を入力してください。");
else if (s_tem_s_koma == GYOKU) //移動先が先手の玉の場合(味方の駒取得可能特別ルール内の例外)
printf("\n移動可能な移動先を入力してください。");
else
break;
}

/* 先手の移動元か移動先が後手陣地の場合 */
if (s_te_m_g < 4 || s_te_s_g < 4) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
s_te_n = getchar();
if (s_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
s_te_n = 0;
}

banmen[s_te_m_g - 1][s_te_m_r - 1] = KUHAKU; //先手の指し手の移動元に空白を保存

if (s_tem_s_koma != KUHAKU) { //移動先に駒がある場合
if (s_tem_s_koma == G_FU){ //移動先が後手の歩の場合
s_motigoma[s_motigoma_n] = FU; //歩を持ち駒に加える
s_motigoma_n++; //先手の持ち駒カウントを増やす
}
else if (s_tem_s_koma == G_KYO){ //移動先が後手の香の場合
s_motigoma[s_motigoma_n] = KYO; //香を持ち駒に加える
s_motigoma_n++; //先手の持ち駒カウントを増やす
}
else if (s_tem_s_koma == G_KEI){ //移動先が後手の桂の場合
s_motigoma[s_motigoma_n] = KEI; //桂を持ち駒に加える
s_motigoma_n++; //先手の持ち駒カウントを増やす
}
else if (s_tem_s_koma == G_GIN){ //移動先が後手の銀の場合
s_motigoma[s_motigoma_n] = GIN; //銀を持ち駒に加える
s_motigoma_n++; //先手の持ち駒カウントを増やす
}
else if (s_tem_s_koma == G_KIN){ //移動先が後手の金の場合
s_motigoma[s_motigoma_n] = KIN; //金を持ち駒に加える
s_motigoma_n++; //先手の持ち駒カウントを増やす
}
else if (s_tem_s_koma == G_KAKU){ //移動先が後手の角の場合
s_motigoma[s_motigoma_n] = KAKU; //角を持ち駒に加える
s_motigoma_n++; //先手の持ち駒カウントを増やす
}
else if (s_tem_s_koma == G_HI){ //移動先が後手の飛の場合
s_motigoma[s_motigoma_n] = HI; //飛を持ち駒に加える
s_motigoma_n++; //先手の持ち駒カウントを増やす
}
else{ //移動先に先手の駒がある場合(味方の駒取得可能特別ルール)
s_motigoma[s_motigoma_n] = s_tem_s_koma; //移動先の駒を持ち駒に加える
s_motigoma_n++; //先手の持ち駒カウントを増やす
}
}

banmen[s_te_s_g - 1][s_te_s_r - 1] = s_tem_m_koma; //先手の指し手の移動先に移動元の駒を保存

return 0;
}

/* 後手の指し手の入力関数 */
int gote_nyuuryoku()
{
while (1)
{
/* 後手の指し手の移動元(列)の入力 */
printf(AOIRO"\n後手の指し手の移動元(列)を入力してください:"KIHONIRO);

g_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動元(行)の入力 */
printf(AOIRO"\n後手の指し手の移動元(行)を入力してください:"KIHONIRO);

g_te_m_g = sasite_nyuuryoku(); //指し手を取得

g_tem_m_koma = banmen[g_te_m_g - 1][g_te_m_r - 1]; //後手の指し手の移動元(駒)を保存

if (g_tem_m_koma == G_FU) //移動元が後手の歩の場合
break;
else if (g_tem_m_koma == G_KYO) //移動元が後手の香の場合
break;
else if (g_tem_m_koma == G_KEI) //移動元が後手の桂の場合
break;
else if (g_tem_m_koma == G_GIN) //移動元が後手の銀の場合
break;
else if (g_tem_m_koma == G_KIN) //移動元が後手の金の場合
break;
else if (g_tem_m_koma == G_KAKU) //移動元が後手の角の場合
break;
else if (g_tem_m_koma == G_HI) //移動元が後手の飛の場合
break;
else if (g_tem_m_koma == OU) //移動元が後手の王の場合
break;
else
printf(AOIRO"\n後手の駒を入力してください。"KIHONIRO);
}

while (1)
{
/* 後手の指し手の移動先(列)の入力 */
printf(AOIRO"\n後手の指し手の移動先(列)を入力してください:"KIHONIRO);

g_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動先(行)の入力 */
printf(AOIRO"\n後手の指し手の移動先(行)を入力してください:"KIHONIRO);

g_te_s_g = sasite_nyuuryoku(); //指し手を取得

g_tem_s_koma = banmen[g_te_s_g - 1][g_te_s_r - 1]; //後手の指し手の移動先(駒)を保存
if (g_tem_s_koma == GYOKU) //移動先が先手の玉の場合
return 1; //詰み(先手の勝利)
else if ((g_te_m_r == g_te_s_r) && (g_te_m_g == g_te_s_g)) //移動元と移動先が同じ場合
printf(AOIRO"\n移動可能な移動先を入力してください。"KIHONIRO);
else if (g_tem_s_koma == OU) //移動先が後手の王の場合(味方の駒取得可能特別ルール内の例外)
printf(AOIRO"\n移動可能な移動先を入力してください。"KIHONIRO);
else
break;
}

/* 後手の移動元か移動先が先手陣地の場合 */
if (g_te_m_g > 6 || g_te_s_g > 6) {
printf(AOIRO"\n成りますか?(Yes:1, No:0):"KIHONIRO); //成るか確認

while (1){
g_te_n = getchar();
if (g_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
g_te_n = 0;
}

banmen[g_te_m_g - 1][g_te_m_r - 1] = KUHAKU; //後手の指し手の移動元に空白を保存

if (g_tem_s_koma != KUHAKU){ //移動先に駒がある場合
if (g_tem_s_koma == G_FU){ //移動先が後手の歩の場合(味方の駒取得可能特別ルール)
g_motigoma[g_motigoma_n] = FU; //歩を持ち駒に加える
g_motigoma_n++; //後手の持ち駒カウントを増やす
}
else if (g_tem_s_koma == G_KYO){ //移動先が後手の香の場合(味方の駒取得可能特別ルール)
g_motigoma[g_motigoma_n] = KYO; //香を持ち駒に加える
g_motigoma_n++; //後手の持ち駒カウントを増やす
}
else if (g_tem_s_koma == G_KEI){ //移動先が後手の桂の場合(味方の駒取得可能特別ルール)
g_motigoma[g_motigoma_n] = KEI; //桂を持ち駒に加える
g_motigoma_n++; //後手の持ち駒カウントを増やす
}
else if (g_tem_s_koma == G_GIN){ //移動先が後手の銀の場合(味方の駒取得可能特別ルール)
g_motigoma[g_motigoma_n] = GIN; //銀を持ち駒に加える
g_motigoma_n++; //後手の持ち駒カウントを増やす
}
else if (g_tem_s_koma == G_KIN){ //移動先が後手の金の場合(味方の駒取得可能特別ルール)
g_motigoma[g_motigoma_n] = KIN; //金を持ち駒に加える
g_motigoma_n++; //後手の持ち駒カウントを増やす
}
else if (g_tem_s_koma == G_KAKU){ //移動先が後手の角の場合(味方の駒取得可能特別ルール)
g_motigoma[g_motigoma_n] = KAKU; //角を持ち駒に加える
g_motigoma_n++; //後手の持ち駒カウントを増やす
}
else if (g_tem_s_koma == G_HI){ //移動先が後手の飛の場合(味方の駒取得可能特別ルール)
g_motigoma[g_motigoma_n] = HI; //飛を持ち駒に加える
g_motigoma_n++; //後手の持ち駒カウントを増やす
}
else{ //先手の駒の場合
g_motigoma[g_motigoma_n] = g_tem_s_koma; //移動先の駒を持ち駒に加える
g_motigoma_n++; //後手の持ち駒カウントを増やす
}
}

banmen[g_te_s_g - 1][g_te_s_r - 1] = g_tem_m_koma; //後手の指し手の移動先に移動元の駒を保存

return 0;
}

/* 指し手表示関数 */
int sasite_hyouji()
{
tesuu_n++; //手数カウントを増やす

switch (s_te_s_g)
{
case 1:
printf("\n%d.先手:%d一%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 2:
printf("\n%d.先手:%d二%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 3:
printf("\n%d.先手:%d三%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 4:
printf("\n%d.先手:%d四%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 5:
printf("\n%d.先手:%d五%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 6:
printf("\n%d.先手:%d六%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 7:
printf("\n%d.先手:%d七%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 8:
printf("\n%d.先手:%d八%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 9:
printf("\n%d.先手:%d九%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
default:
break;
}

if (s_te_n == '1') //先手が成るか
printf("成");

switch (s_te_m_g)
{
case 1:
printf("(%d一)", s_te_m_r);
break;
case 2:
printf("(%d二)", s_te_m_r);
break;
case 3:
printf("(%d三)", s_te_m_r);
break;
case 4:
printf("(%d四)", s_te_m_r);
break;
case 5:
printf("(%d五)", s_te_m_r);
break;
case 6:
printf("(%d六)", s_te_m_r);
break;
case 7:
printf("(%d七)", s_te_m_r);
break;
case 8:
printf("(%d八)", s_te_m_r);
break;
case 9:
printf("(%d九)", s_te_m_r);
break;
default:
break;
}

tesuu_n++; //手数カウントを増やす

switch (g_te_s_g)
{
case 1:
printf(AOIRO"\n%d.後手:%d一%s"KIHONIRO, tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 2:
printf(AOIRO"\n%d.後手:%d二%s"KIHONIRO, tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 3:
printf(AOIRO"\n%d.後手:%d三%s"KIHONIRO, tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 4:
printf(AOIRO"\n%d.後手:%d四%s"KIHONIRO, tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 5:
printf(AOIRO"\n%d.後手:%d五%s"KIHONIRO, tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 6:
printf(AOIRO"\n%d.後手:%d六%s"KIHONIRO, tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 7:
printf(AOIRO"\n%d.後手:%d七%s"KIHONIRO, tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 8:
printf(AOIRO"\n%d.後手:%d八%s"KIHONIRO, tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 9:
printf(AOIRO"\n%d.後手:%d九%s"KIHONIRO, tesuu_n, g_te_s_r, g_tem_m_koma);
break;
default:
break;
}

if (g_te_n == '1') //後手が成るか
printf(AOIRO"成"KIHONIRO);

switch (g_te_m_g)
{
case 1:
printf(AOIRO"(%d一)"KIHONIRO, g_te_m_r);
break;
case 2:
printf(AOIRO"(%d二)"KIHONIRO, g_te_m_r);
break;
case 3:
printf(AOIRO"(%d三)"KIHONIRO, g_te_m_r);
break;
case 4:
printf(AOIRO"(%d四)"KIHONIRO, g_te_m_r);
break;
case 5:
printf(AOIRO"(%d五)"KIHONIRO, g_te_m_r);
break;
case 6:
printf(AOIRO"(%d六)"KIHONIRO, g_te_m_r);
break;
case 7:
printf(AOIRO"(%d七)"KIHONIRO, g_te_m_r);
break;
case 8:
printf(AOIRO"(%d八)"KIHONIRO, g_te_m_r);
break;
case 9:
printf(AOIRO"(%d九)"KIHONIRO, g_te_m_r);
break;
default:
break;
}

printf("\n");

return 0;
}

int motigoma_hyouji()
{
int i;

printf("\n先手持ち駒:");

for (i = 0; s_motigoma_n > i; i++){
printf("%s", s_motigoma[i]);
}

printf(AOIRO"\n後手持ち駒:"KIHONIRO);

for (i = 0; g_motigoma_n > i; i++){
printf(AOIRO"%s"KIHONIRO, g_motigoma[i]);
}

return 0;
}
将時画面16022102


自分の手番の駒以外選択できないようにしました。


ソース:stime_16022101


/* 先手の指し手の入力関数 */
int sente_nyuuryoku()
{
while (1)
{
/* 先手の指し手の移動元(列)の入力 */
printf("\n先手の指し手の移動元(列)を入力してください:");

s_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動元(行)の入力 */
printf("\n先手の指し手の移動元(行)を入力してください:");

s_te_m_g = sasite_nyuuryoku(); //指し手を取得

s_tem_m_koma = banmen[s_te_m_g - 1][s_te_m_r - 1]; //先手の指し手の移動元(駒)を保存

if (s_tem_m_koma == FU) //移動元が先手の歩の場合
break;
else if (s_tem_m_koma == KYO) //移動元が先手の香の場合
break;
else if (s_tem_m_koma == KEI) //移動元が先手の桂の場合
break;
else if (s_tem_m_koma == GIN) //移動元が先手の銀の場合
break;
else if (s_tem_m_koma == KIN) //移動元が先手の金の場合
break;
else if (s_tem_m_koma == KAKU) //移動元が先手の角の場合
break;
else if (s_tem_m_koma == HI) //移動元が先手の飛の場合
break;
else if (s_tem_m_koma == GYOKU) //移動元が先手の玉の場合
break;
else
printf("\n先手の駒を入力してください。");
}

/* 先手の指し手の移動先(列)の入力 */
printf("\n先手の指し手の移動先(列)を入力してください:");

s_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動先(行)の入力 */
printf("\n先手の指し手の移動先(行)を入力してください:");

s_te_s_g = sasite_nyuuryoku(); //指し手を取得

s_tem_s_koma = banmen[s_te_s_g - 1][s_te_s_r - 1]; //先手の指し手の移動先(駒)を保存
if (s_tem_s_koma == OU) //移動先が後手の王の場合
return 1; //詰み(先手の勝利)

/* 先手の移動元か移動先が後手陣地の場合 */
if (s_te_m_g < 4 || s_te_s_g < 4) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
s_te_n = getchar();
if (s_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
s_te_n = 0;
}

banmen[s_te_m_g - 1][s_te_m_r - 1] = KUHAKU; //先手の指し手の移動元に空白を保存

if (s_tem_s_koma == G_FU) //移動先が後手の歩の場合
s_motigoma[s_motigoma_n] = FU; //歩を持ち駒に加える
else if (s_tem_s_koma == G_KYO) //移動先が後手の香の場合
s_motigoma[s_motigoma_n] = KYO; //香を持ち駒に加える
else if (s_tem_s_koma == G_KEI) //移動先が後手の桂の場合
s_motigoma[s_motigoma_n] = KEI; //桂を持ち駒に加える
else if (s_tem_s_koma == G_GIN) //移動先が後手の銀の場合
s_motigoma[s_motigoma_n] = GIN; //銀を持ち駒に加える
else if (s_tem_s_koma == G_KIN) //移動先が後手の金の場合
s_motigoma[s_motigoma_n] = KIN; //金を持ち駒に加える
else if (s_tem_s_koma == G_KAKU) //移動先が後手の角の場合
s_motigoma[s_motigoma_n] = KAKU; //角を持ち駒に加える
else if (s_tem_s_koma == G_HI) //移動先が後手の飛の場合
s_motigoma[s_motigoma_n] = HI; //飛を持ち駒に加える

s_motigoma_n++; //先手の持ち駒カウントを増やす

banmen[s_te_s_g - 1][s_te_s_r - 1] = s_tem_m_koma; //先手の指し手の移動先に移動元の駒を保存

return 0;
}

/* 後手の指し手の入力関数 */
int gote_nyuuryoku()
{
while (1)
{
/* 後手の指し手の移動元(列)の入力 */
printf("\n後手の指し手の移動元(列)を入力してください:");

g_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動元(行)の入力 */
printf("\n後手の指し手の移動元(行)を入力してください:");

g_te_m_g = sasite_nyuuryoku(); //指し手を取得

g_tem_m_koma = banmen[g_te_m_g - 1][g_te_m_r - 1]; //後手の指し手の移動元(駒)を保存

if (g_tem_m_koma == G_FU) //移動元が後手の歩の場合
break;
else if (g_tem_m_koma == G_KYO) //移動元が後手の香の場合
break;
else if (g_tem_m_koma == G_KEI) //移動元が後手の桂の場合
break;
else if (g_tem_m_koma == G_GIN) //移動元が後手の銀の場合
break;
else if (g_tem_m_koma == G_KIN) //移動元が後手の金の場合
break;
else if (g_tem_m_koma == G_KAKU) //移動元が後手の角の場合
break;
else if (g_tem_m_koma == G_HI) //移動元が後手の飛の場合
break;
else if (g_tem_m_koma == OU) //移動元が後手の王の場合
break;
else
printf("\n後手の駒を入力してください。");
}

/* 後手の指し手の移動先(列)の入力 */
printf("\n後手の指し手の移動先(列)を入力してください:");

g_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動先(行)の入力 */
printf("\n後手の指し手の移動先(行)を入力してください:");

g_te_s_g = sasite_nyuuryoku(); //指し手を取得

g_tem_s_koma = banmen[g_te_s_g - 1][g_te_s_r - 1]; //後手の指し手の移動先(駒)を保存
if (g_tem_s_koma == GYOKU) //移動先が先手の玉の場合
return 1; //詰み(先手の勝利)

/* 後手の移動元か移動先が先手陣地の場合 */
if (g_te_m_g > 6 || g_te_s_g > 6) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
g_te_n = getchar();
if (g_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
g_te_n = 0;
}

banmen[g_te_m_g - 1][g_te_m_r - 1] = KUHAKU; //後手の指し手の移動元に空白を保存

if (g_tem_s_koma != KUHAKU){ //移動先に駒がある場合
g_motigoma[g_motigoma_n] = g_tem_s_koma; //移動先の駒を持ち駒に加える
g_motigoma_n++; //先手の持ち駒カウントを増やす
}

banmen[g_te_s_g - 1][g_te_s_r - 1] = g_tem_m_koma; //後手の指し手の移動先に移動元の駒を保存

return 0;
}

将時画面16022101


相手の王に移動したら、詰みという判定を入れました。


ソース:stime_16022006



int main()
{
int i;

tesuu_n = 0; //手数カウント初期化
s_motigoma_n = 0; //先手の持ち駒カウント初期化
g_motigoma_n = 0; //後手の持ち駒カウント初期化

for (i = 0; i < 40; i++){
s_motigoma[i] = 0; //先手持ち駒の初期化
g_motigoma[i] = 0; //後手持ち駒の初期化
}

system("cls"); //画面クリア

while (1){
banmen_hyouji(); //盤面表示関数
if (sente_nyuuryoku() == 1){ //先手の指し手の入力関数
printf("\n詰みました。先手の勝利です。");
break;
}
if (gote_nyuuryoku() == 1){ //後手の指し手の入力関数
printf("\n詰みました。先手の勝利です。");
break;
}
system("cls"); //画面クリア
sasite_hyouji(); //指し手表示関数
motigoma_hyouji(); //持ち駒表示関数
}

return 0;
}

/* 先手の指し手の入力関数 */
int sente_nyuuryoku()
{
/* 先手の指し手の移動元(列)の入力 */
printf("\n先手の指し手の移動元(列)を入力してください:");

s_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動元(行)の入力 */
printf("\n先手の指し手の移動元(行)を入力してください:");

s_te_m_g = sasite_nyuuryoku(); //指し手を取得

s_tem_m_koma = banmen[s_te_m_g - 1][s_te_m_r - 1]; //先手の指し手の移動元(駒)を保存

/* 先手の指し手の移動先(列)の入力 */
printf("\n先手の指し手の移動先(列)を入力してください:");

s_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動先(行)の入力 */
printf("\n先手の指し手の移動先(行)を入力してください:");

s_te_s_g = sasite_nyuuryoku(); //指し手を取得

s_tem_s_koma = banmen[s_te_s_g - 1][s_te_s_r - 1]; //先手の指し手の移動先(駒)を保存
if (s_tem_s_koma == OU) //移動先が後手の王の場合
return 1; //詰み(先手の勝利)

/* 先手の移動元か移動先が後手陣地の場合 */
if (s_te_m_g < 4 || s_te_s_g < 4) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
s_te_n = getchar();
if (s_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
s_te_n = 0;
}

banmen[s_te_m_g - 1][s_te_m_r - 1] = KUHAKU; //先手の指し手の移動元に空白を保存

if (s_tem_s_koma == G_FU) //移動先が後手の歩の場合
s_motigoma[s_motigoma_n] = FU; //歩を持ち駒に加える
else if (s_tem_s_koma == G_KYO) //移動先が後手の香の場合
s_motigoma[s_motigoma_n] = KYO; //香を持ち駒に加える
else if (s_tem_s_koma == G_KEI) //移動先が後手の桂の場合
s_motigoma[s_motigoma_n] = KEI; //桂を持ち駒に加える
else if (s_tem_s_koma == G_GIN) //移動先が後手の銀の場合
s_motigoma[s_motigoma_n] = GIN; //銀を持ち駒に加える
else if (s_tem_s_koma == G_KIN) //移動先が後手の金の場合
s_motigoma[s_motigoma_n] = KIN; //金を持ち駒に加える
else if (s_tem_s_koma == G_KAKU) //移動先が後手の角の場合
s_motigoma[s_motigoma_n] = KAKU; //角を持ち駒に加える
else if (s_tem_s_koma == G_HI) //移動先が後手の飛の場合
s_motigoma[s_motigoma_n] = HI; //飛を持ち駒に加える

s_motigoma_n++; //先手の持ち駒カウントを増やす

banmen[s_te_s_g - 1][s_te_s_r - 1] = s_tem_m_koma; //先手の指し手の移動先に移動元の駒を保存

return 0;
}

/* 後手の指し手の入力関数 */
int gote_nyuuryoku()
{
/* 後手の指し手の移動元(列)の入力 */
printf("\n後手の指し手の移動元(列)を入力してください:");

g_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動元(行)の入力 */
printf("\n後手の指し手の移動元(行)を入力してください:");

g_te_m_g = sasite_nyuuryoku(); //指し手を取得

g_tem_m_koma = banmen[g_te_m_g - 1][g_te_m_r - 1]; //後手の指し手の移動元(駒)を保存

/* 後手の指し手の移動先(列)の入力 */
printf("\n後手の指し手の移動先(列)を入力してください:");

g_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動先(行)の入力 */
printf("\n後手の指し手の移動先(行)を入力してください:");

g_te_s_g = sasite_nyuuryoku(); //指し手を取得

g_tem_s_koma = banmen[g_te_s_g - 1][g_te_s_r - 1]; //後手の指し手の移動先(駒)を保存
if (g_tem_s_koma == GYOKU) //移動先が先手の玉の場合
return 1; //詰み(先手の勝利)

/* 後手の移動元か移動先が先手陣地の場合 */
if (g_te_m_g > 6 || g_te_s_g > 6) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
g_te_n = getchar();
if (g_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
g_te_n = 0;
}

banmen[g_te_m_g - 1][g_te_m_r - 1] = KUHAKU; //後手の指し手の移動元に空白を保存

if (g_tem_s_koma != KUHAKU){ //移動先に駒がある場合
g_motigoma[g_motigoma_n] = g_tem_s_koma; //移動先の駒を持ち駒に加える
g_motigoma_n++; //先手の持ち駒カウントを増やす
}

banmen[g_te_s_g - 1][g_te_s_r - 1] = g_tem_m_koma; //後手の指し手の移動先に移動元の駒を保存

return 0;
}


将時画面16022006


持ち駒の取得を入れました。


ソース:stime_16022005


/* stime.c */

#define FU "歩" //FUを歩と定義
#define KYO "香" //KYOを香と定義
#define KEI "桂" //KEIを桂と定義
#define GIN "銀" //GINを銀と定義
#define KIN "金" //KINを金と定義
#define KAKU "角" //KAKUを角と定義
#define HI "飛" //HIを飛と定義
#define GYOKU "玉" //GYOKUを玉と定義
#define G_FU "\x1b[34m歩\x1b[39m" //G_FUを青色の歩と定義
#define G_KYO "\x1b[34m香\x1b[39m" //G_KYOを青色の香と定義
#define G_KEI "\x1b[34m桂\x1b[39m" //G_KEIを青色の桂と定義
#define G_GIN "\x1b[34m銀\x1b[39m" //G_GINを青色の銀と定義
#define G_KIN "\x1b[34m金\x1b[39m" //G_KINを青色の金と定義
#define G_KAKU "\x1b[34m角\x1b[39m" //G_KAKUを青色の角と定義
#define G_HI "\x1b[34m飛\x1b[39m" //G_HIを青色の飛と定義
#define OU "\x1b[34m王\x1b[39m" //G_OUを王と定義
#define KUHAKU " " //KUHAKUを" "と定義

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int tesuu_n; //手数カウント

int s_te_m_r; //先手の指し手の移動元(列)
int s_te_m_g; //先手の指し手の移動元(行)
int s_te_s_r; //先手の指し手の移動先(列)
int s_te_s_g; //先手の指し手の移動先(行)
int s_te_n; //先手の成りフラグ

int g_te_m_r; //後手の指し手の移動元(列)
int g_te_m_g; //後手の指し手の移動元(行)
int g_te_s_r; //後手の指し手の移動先(列)
int g_te_s_g; //後手の指し手の移動先(行)
int g_te_n; //後手の成りフラグ

char *s_motigoma[40]; //先手の持ち駒
char *g_motigoma[40]; //後手の持ち駒

int s_motigoma_n; //先手の持ち駒カウント
int g_motigoma_n; //後手の持ち駒カウント

char *s_tem_m_koma = KUHAKU; //先手の指し手の移動元(駒)
char *s_tem_s_koma = KUHAKU; //先手の指し手の移動先(駒)
char *g_tem_m_koma = KUHAKU; //後手の指し手の移動元(駒)
char *g_tem_s_koma = KUHAKU; //後手の指し手の移動先(駒)

/* 盤面の初期設定 */
char *banmen[9][9] = { { G_KYO, G_KEI, G_GIN, G_KIN, OU, G_KIN, G_GIN, G_KEI, G_KYO },
{ KUHAKU, G_KAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, G_HI, KUHAKU },
{ G_FU, G_FU, G_FU, G_FU, G_FU, G_FU, G_FU, G_FU, G_FU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ FU, FU, FU, FU, FU, FU, FU, FU, FU },
{ KUHAKU, HI, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KAKU, KUHAKU },
{ KYO, KEI, GIN, KIN, GYOKU, KIN, GIN, KEI, KYO } };

int banmen_hyouji(); //盤面表示関数
int sente_nyuuryoku(); //先手の指し手の入力関数
int gote_nyuuryoku(); //後手の指し手の入力関数
int sasite_hyouji(); //指し手表示関数
int sasite_nyuuryoku(); //指し手の入力関数
int motigoma_hyouji(); //持ち駒持ち駒表示関数

int main()
{
int i;

tesuu_n = 0; //手数カウント初期化
s_motigoma_n = 0; //先手の持ち駒カウント初期化
g_motigoma_n = 0; //後手の持ち駒カウント初期化

for (i = 0; i < 40; i++){
s_motigoma[i] = 0; //先手持ち駒の初期化
g_motigoma[i] = 0; //後手持ち駒の初期化
}

system("cls"); //画面クリア

while (1){
banmen_hyouji(); //盤面表示関数
sente_nyuuryoku(); //先手の指し手の入力関数
gote_nyuuryoku(); //後手の指し手の入力関数
system("cls"); //画面クリア
sasite_hyouji(); //指し手表示関数
motigoma_hyouji(); //持ち駒表示関数
}

return 0;
}

/* 先手の指し手の入力関数 */
int sente_nyuuryoku()
{
/* 先手の指し手の移動元(列)の入力 */
printf("\n先手の指し手の移動元(列)を入力してください:");

s_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動元(行)の入力 */
printf("\n先手の指し手の移動元(行)を入力してください:");

s_te_m_g = sasite_nyuuryoku(); //指し手を取得

s_tem_m_koma = banmen[s_te_m_g - 1][s_te_m_r - 1]; //先手の指し手の移動元(駒)を保存

/* 先手の指し手の移動先(列)の入力 */
printf("\n先手の指し手の移動先(列)を入力してください:");

s_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動先(行)の入力 */
printf("\n先手の指し手の移動先(行)を入力してください:");

s_te_s_g = sasite_nyuuryoku(); //指し手を取得

s_tem_s_koma = banmen[s_te_s_g - 1][s_te_s_r - 1]; //先手の指し手の移動先(駒)を保存

/* 先手の移動元か移動先が後手陣地の場合 */
if (s_te_m_g < 4 || s_te_s_g < 4) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
s_te_n = getchar();
if (s_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
s_te_n = 0;
}

banmen[s_te_m_g - 1][s_te_m_r - 1] = KUHAKU; //先手の指し手の移動元に空白を保存

if (banmen[s_te_s_g - 1][s_te_s_r - 1] != KUHAKU){ //移動先に駒がある場合
s_motigoma[s_motigoma_n] = banmen[s_te_s_g - 1][s_te_s_r - 1]; //移動先の駒を持ち駒に加える
s_motigoma_n++; //先手の持ち駒カウントを増やす
}

banmen[s_te_s_g - 1][s_te_s_r - 1] = s_tem_m_koma; //先手の指し手の移動先に移動元の駒を保存

return 0;
}

/* 後手の指し手の入力関数 */
int gote_nyuuryoku()
{
/* 後手の指し手の移動元(列)の入力 */
printf("\n後手の指し手の移動元(列)を入力してください:");

g_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動元(行)の入力 */
printf("\n後手の指し手の移動元(行)を入力してください:");

g_te_m_g = sasite_nyuuryoku(); //指し手を取得

g_tem_m_koma = banmen[g_te_m_g - 1][g_te_m_r - 1]; //後手の指し手の移動元(駒)を保存

/* 後手の指し手の移動先(列)の入力 */
printf("\n後手の指し手の移動先(列)を入力してください:");

g_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動先(行)の入力 */
printf("\n後手の指し手の移動先(行)を入力してください:");

g_te_s_g = sasite_nyuuryoku(); //指し手を取得

g_tem_s_koma = banmen[g_te_s_g - 1][g_te_s_r - 1]; //後手の指し手の移動先(駒)を保存

/* 後手の移動元か移動先が先手陣地の場合 */
if (g_te_m_g > 6 || g_te_s_g > 6) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
g_te_n = getchar();
if (g_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
g_te_n = 0;
}

banmen[g_te_m_g - 1][g_te_m_r - 1] = KUHAKU; //後手の指し手の移動元に空白を保存

if (banmen[g_te_s_g - 1][g_te_s_r - 1] != KUHAKU){ //移動先に駒がある場合
g_motigoma[g_motigoma_n] = banmen[g_te_s_g - 1][g_te_s_r - 1]; //移動先の駒を持ち駒に加える
g_motigoma_n++; //先手の持ち駒カウントを増やす
}

banmen[g_te_s_g - 1][g_te_s_r - 1] = g_tem_m_koma; //後手の指し手の移動先に移動元の駒を保存

return 0;
}


int motigoma_hyouji()
{
int i;

printf("\n先手持ち駒:");

for (i = 0; s_motigoma_n > i; i++){
printf("%s", s_motigoma[i]);
}

printf("\n後手持ち駒:");

for (i = 0; g_motigoma_n > i; i++){
printf("%s", g_motigoma[i]);
}

return 0;
}


将時画面16022005


テキストで後手の駒の回転表示のやり方が不明なため、色を変更して対応しました。

まだ、初期表示だけです。


ソース:stime_16022004


#define FU "歩" //FUを歩と定義
#define KYO "香" //KYOを香と定義
#define KEI "桂" //KEIを桂と定義
#define GIN "銀" //GINを銀と定義
#define KIN "金" //KINを金と定義
#define KAKU "角" //KAKUを角と定義
#define HI "飛" //HIを飛と定義
#define GYOKU "玉" //GYOKUを玉と定義
#define G_FU "\x1b[34m歩\x1b[39m" //G_FUを青色の歩と定義
#define G_KYO "\x1b[34m香\x1b[39m" //G_KYOを青色の香と定義
#define G_KEI "\x1b[34m桂\x1b[39m" //G_KEIを青色の桂と定義
#define G_GIN "\x1b[34m銀\x1b[39m" //G_GINを青色の銀と定義
#define G_KIN "\x1b[34m金\x1b[39m" //G_KINを青色の金と定義
#define G_KAKU "\x1b[34m角\x1b[39m" //G_KAKUを青色の角と定義
#define G_HI "\x1b[34m飛\x1b[39m" //G_HIを青色の飛と定義
#define OU "\x1b[34m王\x1b[39m" //G_OUを王と定義
#define KUHAKU " " //KUHAKUを" "と定義

/* 盤面の初期設定 */
char *banmen[9][9] = { { G_KYO, G_KEI, G_GIN, G_KIN, OU, G_KIN, G_GIN, G_KEI, G_KYO },
{ KUHAKU, G_KAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, G_HI, KUHAKU },
{ G_FU, G_FU, G_FU, G_FU, G_FU, G_FU, G_FU, G_FU, G_FU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ FU, FU, FU, FU, FU, FU, FU, FU, FU },
{ KUHAKU, HI, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KAKU, KUHAKU },
{ KYO, KEI, GIN, KIN, GYOKU, KIN, GIN, KEI, KYO } };

将時画面16022004


画面表示のバグ修正と駒移動処理を追加しました。


ソース:stime_16022003


/* 盤面の初期設定 */
char *banmen[9][9] = { { KYO, KEI,GIN,KIN,OU,KIN,GIN,KEI,KYO },
{ KUHAKU, KAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, HI, KUHAKU },
{ FU, FU, FU, FU, FU, FU, FU, FU, FU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ FU, FU, FU, FU, FU, FU, FU, FU, FU },
{ KUHAKU, HI, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KAKU, KUHAKU },
{ KYO, KEI, GIN, KIN, GYOKU, KIN, GIN, KEI, KYO } };

/* 盤面表示関数 */
int banmen_hyouji()
{
printf("\n");
printf(" 9 8 7 6 5 4 3 2 1 \n");
printf("┌─┬─┬─┬─┬─┬─┬─┬─┬─┐\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│一\n", banmen[0][8], banmen[0][7], banmen[0][6], banmen[0][5], banmen[0][4], banmen[0][3], banmen[0][2], banmen[0][1], banmen[0][0]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│二\n", banmen[1][8], banmen[1][7], banmen[1][6], banmen[1][5], banmen[1][4], banmen[1][3], banmen[1][2], banmen[1][1], banmen[1][0]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│三\n", banmen[2][8], banmen[2][7], banmen[2][6], banmen[2][5], banmen[2][4], banmen[2][3], banmen[2][2], banmen[2][1], banmen[2][0]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│四\n", banmen[3][8], banmen[3][7], banmen[3][6], banmen[3][5], banmen[3][4], banmen[3][3], banmen[3][2], banmen[3][1], banmen[3][0]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│五\n", banmen[4][8], banmen[4][7], banmen[4][6], banmen[4][5], banmen[4][4], banmen[4][3], banmen[4][2], banmen[4][1], banmen[4][0]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│六\n", banmen[5][8], banmen[5][7], banmen[5][6], banmen[5][5], banmen[5][4], banmen[5][3], banmen[5][2], banmen[5][1], banmen[5][0]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│七\n", banmen[6][8], banmen[6][7], banmen[6][6], banmen[6][5], banmen[6][4], banmen[6][3], banmen[6][2], banmen[6][1], banmen[6][0]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│八\n", banmen[7][8], banmen[7][7], banmen[7][6], banmen[7][5], banmen[7][4], banmen[7][3], banmen[7][2], banmen[7][1], banmen[7][0]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│九\n", banmen[8][8], banmen[8][7], banmen[8][6], banmen[8][5], banmen[8][4], banmen[8][3], banmen[8][2], banmen[8][1], banmen[8][0]);
printf("└─┴─┴─┴─┴─┴─┴─┴─┴─┘\n");

return 0;
}

/* 先手の指し手の入力関数 */
int sente_nyuuryoku()
{
/* 先手の指し手の移動元(列)の入力 */
printf("\n先手の指し手の移動元(列)を入力してください:");

s_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動元(行)の入力 */
printf("\n先手の指し手の移動元(行)を入力してください:");

s_te_m_g = sasite_nyuuryoku(); //指し手を取得

s_tem_m_koma = banmen[s_te_m_g - 1][s_te_m_r - 1]; //先手の指し手の移動元(駒)を保存

/* 先手の指し手の移動先(列)の入力 */
printf("\n先手の指し手の移動先(列)を入力してください:");

s_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動先(行)の入力 */
printf("\n先手の指し手の移動先(行)を入力してください:");

s_te_s_g = sasite_nyuuryoku(); //指し手を取得

s_tem_s_koma = banmen[s_te_s_g - 1][s_te_s_r - 1]; //先手の指し手の移動先(駒)を保存

/* 先手の移動元か移動先が後手陣地の場合 */
if (s_te_m_g < 4 || s_te_s_g < 4) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
s_te_n = getchar();
if (s_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
s_te_n = 0;
}

banmen[s_te_m_g - 1][s_te_m_r - 1] = KUHAKU; //先手の指し手の移動元に空白を保存
banmen[s_te_s_g - 1][s_te_s_r - 1] = s_tem_m_koma; //先手の指し手の移動先に移動元の駒を保存

return 0;
}

/* 後手の指し手の入力関数 */
int gote_nyuuryoku()
{
/* 後手の指し手の移動元(列)の入力 */
printf("\n後手の指し手の移動元(列)を入力してください:");

g_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動元(行)の入力 */
printf("\n後手の指し手の移動元(行)を入力してください:");

g_te_m_g = sasite_nyuuryoku(); //指し手を取得

g_tem_m_koma = banmen[g_te_m_g - 1][g_te_m_r - 1]; //後手の指し手の移動元(駒)を保存

/* 後手の指し手の移動先(列)の入力 */
printf("\n後手の指し手の移動先(列)を入力してください:");

g_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動先(行)の入力 */
printf("\n後手の指し手の移動先(行)を入力してください:");

g_te_s_g = sasite_nyuuryoku(); //指し手を取得

g_tem_s_koma = banmen[g_te_s_g - 1][g_te_s_r - 1]; //後手の指し手の移動先(駒)を保存

/* 後手の移動元か移動先が先手陣地の場合 */
if (g_te_m_g > 6 || g_te_s_g > 6) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
g_te_n = getchar();
if (g_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
g_te_n = 0;
}

banmen[g_te_m_g - 1][g_te_m_r - 1] = KUHAKU; //後手の指し手の移動元に空白を保存
banmen[g_te_s_g - 1][g_te_s_r - 1] = g_tem_m_koma; //後手の指し手の移動先に移動元の駒を保存

return 0;
}


将時画面16022003


入力関数と表示関数を修正しました。


ソース:stime_16022002


/* stime.c */

#define FU "歩" //FUを歩と定義
#define KYO "香" //KYOを香と定義
#define KEI "桂" //KEIを桂と定義
#define GIN "銀" //GINを銀と定義
#define KIN "金" //KINを金と定義
#define KAKU "角" //KAKUを角と定義
#define HI "飛" //HIを飛と定義
#define OU "王" //OUを王と定義
#define GYOKU "玉" //GYOKUを玉と定義
#define KUHAKU " " //KUHAKUを" "と定義

#include <stdio.h>
#include <conio.h>

int tesuu_n; //手数カウント

int s_te_m_r; //先手の指し手の移動元(列)
int s_te_m_g; //先手の指し手の移動元(行)
int s_te_s_r; //先手の指し手の移動先(列)
int s_te_s_g; //先手の指し手の移動先(行)
int s_te_n; //先手の成りフラグ

int g_te_m_r; //後手の指し手の移動元(列)
int g_te_m_g; //後手の指し手の移動元(行)
int g_te_s_r; //後手の指し手の移動先(列)
int g_te_s_g; //後手の指し手の移動先(行)
int g_te_n; //後手の成りフラグ

char *s_tem_m_koma = KUHAKU; //先手の指し手の移動元(駒)
char *s_tem_s_koma = KUHAKU; //先手の指し手の移動先(駒)
char *g_tem_m_koma = KUHAKU; //後手の指し手の移動元(駒)
char *g_tem_s_koma = KUHAKU; //後手の指し手の移動先(駒)

/* 盤面の初期設定 */
char *banmen[9][9] = { { KYO, KEI,GIN,KIN,OU,KIN,GIN,KEI,KYO },
{ KUHAKU, HI, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KAKU, KUHAKU },
{ FU, FU, FU, FU, FU, FU, FU, FU, FU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU },
{ FU, FU, FU, FU, FU, FU, FU, FU, FU },
{ KUHAKU, HI, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KUHAKU, KAKU, KUHAKU },
{ KYO, KEI, GIN, KIN, GYOKU, KIN, GIN, KEI, KYO } };

int banmen_hyouji(); //盤面表示関数
int sente_nyuuryoku(); //先手の指し手の入力関数
int gote_nyuuryoku(); //後手の指し手の入力関数
int sasite_hyouji(); //指し手表示関数
int sasite_nyuuryoku(); //指し手の入力関数

int main()
{
tesuu_n = 0; //手数カウント初期化

while (1){
banmen_hyouji(); //盤面表示関数
sente_nyuuryoku(); //先手の指し手の入力関数
gote_nyuuryoku(); //後手の指し手の入力関数
sasite_hyouji(); //指し手表示関数
}

return 0;
}

/* 盤面表示関数 */
int banmen_hyouji()
{
printf("\n");
printf(" 9 8 7 6 5 4 3 2 1 \n");
printf("┌─┬─┬─┬─┬─┬─┬─┬─┬─┐\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│一\n", banmen[0][0], banmen[0][1], banmen[0][2], banmen[0][3], banmen[0][4], banmen[0][5], banmen[0][6], banmen[0][7], banmen[0][8]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│二\n", banmen[1][0], banmen[1][1], banmen[1][2], banmen[1][3], banmen[1][4], banmen[1][5], banmen[1][6], banmen[1][7], banmen[1][8]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│三\n", banmen[2][0], banmen[2][1], banmen[2][2], banmen[2][3], banmen[2][4], banmen[2][5], banmen[2][6], banmen[2][7], banmen[2][8]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│四\n", banmen[3][0], banmen[3][1], banmen[3][2], banmen[3][3], banmen[3][4], banmen[3][5], banmen[3][6], banmen[3][7], banmen[3][8]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│五\n", banmen[4][0], banmen[4][1], banmen[4][2], banmen[4][3], banmen[4][4], banmen[4][5], banmen[4][6], banmen[4][7], banmen[4][8]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│六\n", banmen[5][0], banmen[5][1], banmen[5][2], banmen[5][3], banmen[5][4], banmen[5][5], banmen[5][6], banmen[5][7], banmen[5][8]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│七\n", banmen[6][0], banmen[6][1], banmen[6][2], banmen[6][3], banmen[6][4], banmen[6][5], banmen[6][6], banmen[6][7], banmen[6][8]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│八\n", banmen[7][0], banmen[7][1], banmen[7][2], banmen[7][3], banmen[7][4], banmen[7][5], banmen[7][6], banmen[7][7], banmen[7][8]);
printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┤\n");
printf("│%s│%s│%s│%s│%s│%s│%s│%s│%s│九\n", banmen[8][0], banmen[8][1], banmen[8][2], banmen[8][3], banmen[8][4], banmen[8][5], banmen[8][6], banmen[8][7], banmen[8][8]);
printf("└─┴─┴─┴─┴─┴─┴─┴─┴─┘\n");

return 0;
}

/* 先手の指し手の入力関数 */
int sente_nyuuryoku()
{
/* 先手の指し手の移動元(列)の入力 */
printf("\n先手の指し手の移動元(列)を入力してください:");

s_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動元(行)の入力 */
printf("\n先手の指し手の移動元(行)を入力してください:");

s_te_m_g = sasite_nyuuryoku(); //指し手を取得

s_tem_m_koma = banmen[s_te_m_g - 1][s_te_m_r - 1]; //先手の指し手の移動元(駒)を保存

/* 先手の指し手の移動先(列)の入力 */
printf("\n先手の指し手の移動先(列)を入力してください:");

s_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動先(行)の入力 */
printf("\n先手の指し手の移動先(行)を入力してください:");

s_te_s_g = sasite_nyuuryoku(); //指し手を取得

s_tem_s_koma = banmen[s_te_s_g - 1][s_te_s_r - 1]; //先手の指し手の移動先(駒)を保存

/* 先手の移動元か移動先が後手陣地の場合 */
if (s_te_m_g < 4 || s_te_s_g < 4) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
s_te_n = getchar();
if (s_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
s_te_n = 0;
}

return 0;
}

/* 後手の指し手の入力関数 */
int gote_nyuuryoku()
{
/* 後手の指し手の移動元(列)の入力 */
printf("\n後手の指し手の移動元(列)を入力してください:");

g_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動元(行)の入力 */
printf("\n後手の指し手の移動元(行)を入力してください:");

g_te_m_g = sasite_nyuuryoku(); //指し手を取得

g_tem_m_koma = banmen[g_te_m_g - 1][g_te_m_r - 1]; //後手の指し手の移動元(駒)を保存

/* 後手の指し手の移動先(列)の入力 */
printf("\n後手の指し手の移動先(列)を入力してください:");

g_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動先(行)の入力 */
printf("\n後手の指し手の移動先(行)を入力してください:");

g_te_s_g = sasite_nyuuryoku(); //指し手を取得

g_tem_s_koma = banmen[g_te_s_g - 1][g_te_s_r - 1]; //後手の指し手の移動先(駒)を保存

/* 後手の移動元か移動先が先手陣地の場合 */
if (g_te_m_g > 6 || g_te_s_g > 6) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
g_te_n = getchar();
if (g_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
g_te_n = 0;
}

return 0;
}

/* 指し手表示関数 */
int sasite_hyouji()
{
tesuu_n++; //手数カウントを増やす

switch (s_te_s_g)
{
case 1:
printf("\n%d.先手:%d一%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 2:
printf("\n%d.先手:%d二%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 3:
printf("\n%d.先手:%d三%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 4:
printf("\n%d.先手:%d四%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 5:
printf("\n%d.先手:%d五%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 6:
printf("\n%d.先手:%d六%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 7:
printf("\n%d.先手:%d七%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 8:
printf("\n%d.先手:%d八%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
case 9:
printf("\n%d.先手:%d九%s", tesuu_n, s_te_s_r, s_tem_m_koma);
break;
default:
break;
}

if (s_te_n == '1') //先手が成るか
printf("成");

switch (s_te_m_g)
{
case 1:
printf("(%d一)", s_te_m_r);
break;
case 2:
printf("(%d二)", s_te_m_r);
break;
case 3:
printf("(%d三)", s_te_m_r);
break;
case 4:
printf("(%d四)", s_te_m_r);
break;
case 5:
printf("(%d五)", s_te_m_r);
break;
case 6:
printf("(%d六)", s_te_m_r);
break;
case 7:
printf("(%d七)", s_te_m_r);
break;
case 8:
printf("(%d八)", s_te_m_r);
break;
case 9:
printf("(%d九)", s_te_m_r);
break;
default:
break;
}

tesuu_n++; //手数カウントを増やす

switch (g_te_s_g)
{
case 1:
printf("\n%d.後手:%d一%s", tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 2:
printf("\n%d.後手:%d二%s", tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 3:
printf("\n%d.後手:%d三%s", tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 4:
printf("\n%d.後手:%d四%s", tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 5:
printf("\n%d.後手:%d五%s", tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 6:
printf("\n%d.後手:%d六%s", tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 7:
printf("\n%d.後手:%d七%s", tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 8:
printf("\n%d.後手:%d八%s", tesuu_n, g_te_s_r, g_tem_m_koma);
break;
case 9:
printf("\n%d.後手:%d九%s", tesuu_n, g_te_s_r, g_tem_m_koma);
break;
default:
break;
}

if (g_te_n == '1') //後手が成るか
printf("成");

switch (g_te_m_g)
{
case 1:
printf("(%d一)", g_te_m_r);
break;
case 2:
printf("(%d二)", g_te_m_r);
break;
case 3:
printf("(%d三)", g_te_m_r);
break;
case 4:
printf("(%d四)", g_te_m_r);
break;
case 5:
printf("(%d五)", g_te_m_r);
break;
case 6:
printf("(%d六)", g_te_m_r);
break;
case 7:
printf("(%d七)", g_te_m_r);
break;
case 8:
printf("(%d八)", g_te_m_r);
break;
case 9:
printf("(%d九)", g_te_m_r);
break;
default:
break;
}

printf("\n");

return 0;
}

/* 指し手の入力関数 */
int sasite_nyuuryoku()
{
int sasite = 0; //指し手を一時保管
int buf;

while (1) {
buf = _getche();
switch(buf) {
case '1':
sasite = 1;
break;
case '2':
sasite = 2;
break;
case '3':
sasite = 3;
break;
case '4':
sasite = 4;
break;
case '5':
sasite = 5;
break;
case '6':
sasite = 6;
break;
case '7':
sasite = 7;
break;
case '8':
sasite = 8;
break;
case '9':
sasite = 9;
break;
default:
sasite = 0;
break;
}
if (1 <= sasite && sasite <= 9) //1から9ならループ終了
break;
else
printf("\n1から9の数字を入力してください:");
}

return sasite;
}


将時画面16022002


指し手の入力を整数値で取得するように変更。


ソース:stime_16022001


/* 先手の指し手の入力関数 */
int sente_nyuuryoku()
{
/* 先手の指し手の移動元(列)の入力 */
printf("\n先手の指し手の移動元(列)を入力してください:");

s_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動元(行)の入力 */
printf("\n先手の指し手の移動元(行)を入力してください:");

s_te_m_g = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動先(列)の入力 */
printf("\n先手の指し手の移動先(列)を入力してください:");

s_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 先手の指し手の移動先(行)の入力 */
printf("\n先手の指し手の移動先(行)を入力してください:");

s_te_s_g = sasite_nyuuryoku(); //指し手を取得

/* 先手の移動元か移動先が後手陣地の場合 */
if (s_te_m_g < 4 || s_te_s_g < 4) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
s_te_n = getchar();
if (s_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
s_te_n = 0;
}

return 0;
}

/* 後手の指し手の入力関数 */
int gote_nyuuryoku()
{
/* 後手の指し手の移動元(列)の入力 */
printf("\n後手の指し手の移動元(列)を入力してください:");

g_te_m_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動元(行)の入力 */
printf("\n後手の指し手の移動元(行)を入力してください:");

g_te_m_g = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動先(列)の入力 */
printf("\n後手の指し手の移動先(列)を入力してください:");

g_te_s_r = sasite_nyuuryoku(); //指し手を取得

/* 後手の指し手の移動先(行)の入力 */
printf("\n後手の指し手の移動先(行)を入力してください:");

g_te_s_g = sasite_nyuuryoku(); //指し手を取得

/* 後手の移動元か移動先が先手陣地の場合 */
if (g_te_m_g > 6 || g_te_s_g > 6) {
printf("\n成りますか?(Yes:1, No:0):"); //成るか確認

while (1){
g_te_n = getchar();
if (g_te_n != '\n') //エンター以外が入力されたら
break; //whileループを抜ける
}
}
else {
g_te_n = 0;
}

return 0;
}

/* 指し手表示関数 */
int sasite_hyouji()
{
printf("\n先手:%d%d→%d%d", s_te_m_r, s_te_m_g, s_te_s_r, s_te_s_g);
/* 先手が成るか */
if (s_te_n == '1'){
printf("成り");
}
else {
printf("成らず");
}

printf("\n後手:%d%d→%d%d", g_te_m_r, g_te_m_g, g_te_s_r, g_te_s_g);
/* 後手が成るか */
if (g_te_n == '1'){
printf("成り");
}
else {
printf("成らず");
}

printf("\n");

return 0;
}

/* 指し手の入力関数 */
int sasite_nyuuryoku()
{
int sasite; //指し手を一時保管

scanf_s("%d", &sasite);

return sasite;
}


将時画面16022001