成りルーチンの追加とバグ修正を行いました。
とりあえず、人間対人間用の将棋盤が完成しました。
駒の動きやルールがないけど、お互いにルールを守れば指せるかな。
ソース: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;
}









