close

//此為單人版井字遊戲
#include
#include
#include
using namespace std;

void draw_prompt_map(char map[3][3]);//畫出提示圖,告訴使用者遊戲玩法

bool judge_repeat(char map[3][3],int location,int sign);//判斷是否有重複畫記號

void draw_map(char map[3][3]);//畫出遊戲中的井字圖

bool judge_line(char map[3][3],int* sign);//判斷各種連線狀況

void clear_map(char map[3][3]);//將陣列中的字元全部指定成空白字元,以便重新遊戲

int main()
{
char map[3][3];
char ch;
int sign,location;
do{
cout<<"*******************歡迎光臨井字遊戲******************\n"< cout<<"輸入1,可以使用o來畫記號。"< cout<<"輸入2,可以使用x來畫記號。"< cin>>sign;
if(sign==1 || sign ==2) break;
}while(sign!=1 && sign!=2);//預防使用輸入1,2以外的數字

draw_prompt_map(map);
do{

clear_map(map);//將陣列中的字元全部指定成空白字元

do{
cout<<"請選擇您要畫記號的位置?"< cin>>location;
if(sign==1 && !judge_repeat(map,location,sign))
{
draw_map(map);
}
else if(sign==2 && !judge_repeat(map,location,sign))
draw_map(map);

} while(!judge_line(map,&sign));
cout<<"恭喜你!!你贏了囉^_^!!!"< cout<<"要繼續玩嗎??(y)繼續 or (n)結束)"< cin>>ch;
system("cls");//清除螢幕
}while(ch=='y' || ch=='Y');

system("pause");
}

//畫出提示圖,告訴使用者遊戲玩法
void draw_prompt_map(char map[3][3])
{
int num = 1;
cout<<"\n格子中的數字代表輸入代號!"< for(int row=0; row<3; row++)
{
for(int column=0; column<3; column++,num++)
{
//int的整數值加上48之後,等於char的同等整數(由ascii表得知)
map[row][column] = num+48;
cout<<" "< if(column<=1)cout<<"|";
map[row][column] = ' ';
}
cout< if(row<=1)cout<<"--------------------";
cout< }
}
//判斷是否有重複畫記號
bool judge_repeat(char map[3][3],int location,int sign)
{
int row,column;
do{
row = location/3 ;//將輸入的數字換成表格 列 座標
column = location % 3;//將輸入的數字換成表格 行 座標
if(map[row][column]== ' ')
{
map[row][column] =( sign == 1 ? 'O':'X');//畫上記號
return false;//代表沒有重複
}
else
{
cout<<"該位置可能不存在或是已經被畫上記號了!!"< cout<<"請重新輸入位置!!!"< cin>>location;
}
}while(1);//一直檢驗,直到記號位置不重複,自然由上方的return 指令跳出

}
//畫出遊戲中的井字圖
void draw_map(char map[3][3])
{
int row,column;

for(row=0; row<3; row++)
{
for(column=0; column<3; column++)
{
cout<<" "< if(column<=1)cout<<"|";
}
cout< if(row<=1)cout<<"--------------------";
cout< }
}

//判斷各種連線狀況
bool judge_line(char map[3][3],int* sign)
{
int counter=0,row,column;
char user_sign = (*sign==1?'O':'X');
for(row=0 ;row<3; row++)//判斷每行是否有連線
{
for(column=0; column<3 ; column++)
{
if(map[row][column]==user_sign)
counter++;
if(counter==3)/*連線成功*/
return true;
}
counter = 0;
}
for(column=0; column<3 ; column++) //判斷每列是否有連線
{
for(row=0 ;row<3; row++)
{
if(map[row][column]==user_sign)
counter++;
if(counter==3)/*連線成功*/
return true;
}
counter = 0;
}

counter=0;
for(row=0 ;row<3; row++)//判斷右下方向對角線是否有連線
{
if(map[row][row]==user_sign)
{
counter++;
if(counter==3)/*連線成功*/
return true;
}
}
//判斷右上方向對角線是否有連線
if(map[0][2]==map[1][1] && map[1][1]==map[2][0] && map[2][0]==user_sign)
{
return true;/*連線成功*/
}

return false;
}

//將陣列中的字元全部指定成空白字元
void clear_map(char map[3][3])
{
for(int row=0; row<3; row++)
{
for(int column=0; column<3; column++)
{
map[row][column]=' ';
}
}
}

arrow
arrow
    全站熱搜

    jethro0119 發表在 痞客邦 留言(0) 人氣()