|
電腦遊戲製作開發設計論壇 任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
阿蛇 稍嫌羞澀的路人
註冊時間: 2012-04-15 文章: 1 來自: 台灣 53.00 果凍幣
|
發表於: 2012-4-19, AM 12:11 星期四 文章主題: [C++]自製:五子棋(雙打) 15x15 |
|
|
小弟初次發文, 請大家多多觀照
小疑問:上傳的檔名似乎沒有辦法跟原本電腦檔案的名稱一樣
原始碼分享
代碼: |
/*
名稱:五子棋(雙打) 15x15
作者:阿蛇
完成日期:2012年4月19日
目前版本:1.0
*/
#include<iostream>
#include<string>
using namespace std;
short board[17][17];
bool endtry;
void default_board();//初始化棋盤15x15
void show_board();//顯示棋盤15x15
void put_chess(short,short,short);//下棋+判斷有無棋子
bool winner(short i,short j,short whosturn);//勝負 win = 1 勝利
void multiplayer();//兩個玩家, 黑棋先下
int main()//※ 主程式 ※
{
cout <<"遊戲名稱:五子棋(雙打)"<< endl
<<" 作者:阿蛇"<< endl
<<" 版本:1.0"<< endl
<< endl;
string choose;
system("pause");
do{
default_board();
multiplayer();
cout <<"輸入 y 再玩一次?:";
getline(cin,choose);
}while(choose == "y" || choose == "Y");
return 0;
}
/*
進度:
20120417棋盤初始化完
20120418可以下棋了, 重開局時有bug:多餘顯示「下棋的範圍超出格子外!」
20120419修正
*/
void default_board()//初始化棋盤15x15
{
for(int i=0 ;i<=16 ;i++){
for(int j=0 ;j<=16 ;j++){
if(i==0 && j==0){
board[i][j] = 0;
}else if(i==16 || j==16){
board[i][j] = 0;
}else if(i==0){
board[i][j] = j+30;
}else if(j==0){
board[i][j] = i+10;
}else if(i==1 && j==1){
board[i][j] = -7;
}else if(i==1 && j==15){
board[i][j] = -9;
}else if(i==15 && j==1){
board[i][j] = -1;
}else if(i==15 && j==15){
board[i][j] = -3;
}else if(i==1){
board[i][j] = -8;
}else if(j==1){
board[i][j] = -4;
}else if(j==15){
board[i][j] = -6;
}else if(i==15){
board[i][j] = -2;
}else{
board[i][j] = -5;
}
}
}
}
void show_board()//顯示棋盤15x15
{
for(int i=0 ;i<=16 ;i++){
for(int j=0 ;j<=16 ;j++){
switch(board[i][j]){
case -1:
cout << "└";
break;
case -2:
cout << "┴";
break;
case -3:
cout << "┘";
break;
case -4:
cout << "├";
break;
case -5:
cout << "┼";
break;
case -6:
cout << "┤";
break;
case -7:
cout << "┌";
break;
case -8:
cout << "┬";
break;
case -9:
cout << "┐";
break;
case 0:
cout << " ";
break;
case 1:
cout << "○";
break;
case 2:
cout << "●";
break;
/*case 3:
cout << "☆";
break;
case 4:
cout << "★";
break;*/
case 11:
cout << "1";
break;
case 12:
cout << "2";
break;
case 13:
cout << "3";
break;
case 14:
cout << "4";
break;
case 15:
cout << "5";
break;
case 16:
cout << "6";
break;
case 17:
cout << "7";
break;
case 18:
cout << "8";
break;
case 19:
cout << "9";
break;
case 20:
cout << "10";
break;
case 21:
cout << "11";
break;
case 22:
cout << "12";
break;
case 23:
cout << "13";
break;
case 24:
cout << "14";
break;
case 25:
cout << "15";
break;
case 31:
cout << "A";
break;
case 32:
cout << "B";
break;
case 33:
cout << "C";
break;
case 34:
cout << "D";
break;
case 35:
cout << "E";
break;
case 36:
cout << "F";
break;
case 37:
cout << "G";
break;
case 38:
cout << "H";
break;
case 39:
cout << "I";
break;
case 40:
cout << "J";
break;
case 41:
cout << "K";
break;
case 42:
cout << "L";
break;
case 43:
cout << "M";
break;
case 44:
cout << "N";
break;
case 45:
cout << "O";
break;
}
}
cout << endl;
}
}
void put_chess(short i,short j,short whosturn){//下棋+判斷有無棋子
if(i == 0 || i >= 16 || j == 0 || j >= 16){
cout <<"下棋的範圍超出格子外!"<< endl;
endtry = 0;
system("pause");
}else if(board[i][j] == 1 || board[i][j] == 2){
cout <<"此位置已經有棋子了!"<< endl;
endtry = 0;
system("pause");
}else{
board[i][j] = whosturn;
}
}
bool winner(short i,short j,short whosturn){//勝負 win = 1 勝利
short count,tempi,tempj;
bool win = 0;
//←→
count = 1;
tempi = i;
while(board[--tempi][j] == whosturn){count++;}
tempi = i;
while(board[++tempi][j] == whosturn){count++;}
if(count >= 5){win = 1; goto winner_check_end;}
//↑↓
count = 1;
tempj = j;
while(board[i][--tempj] == whosturn){count++;}
tempj = j;
while(board[i][++tempj] == whosturn){count++;}
if(count >= 5){win = 1; goto winner_check_end;}
//↖↘
count = 1;
tempi = i,tempj = j;
while(board[--tempi][--tempj] == whosturn){count++;}
tempi = i,tempj = j;
while(board[++tempi][++tempj] == whosturn){count++;}
if(count >= 5){win = 1; goto winner_check_end;}
//↙↗
count = 1;
tempi = i,tempj = j;
while(board[++tempi][--tempj] == whosturn){count++;}
tempi = i,tempj = j;
while(board[--tempi][++tempj] == whosturn){count++;}
if(count >= 5){win = 1; goto winner_check_end;}
winner_check_end:
return win;
}
void multiplayer(){//兩個玩家, 黑棋先下
string keyin;
short whosturn = 1,I,J;
system("cls");
show_board();
nextstep:
I = 0;
J = 0;
endtry = 1;
system("cls");
show_board();
if(whosturn == 1){
cout <<"○換黑子下:";
}else{
cout <<"●換白子下:";
}
getline(cin,keyin);
for(int n=0 ;n<keyin.length() ;n++){//處理字串keyin
if(keyin[n]>='a' && keyin[n]<='o'){
J = keyin[n] - 'a' + 1;
}else if(keyin[n]>='A' && keyin[n]<='O'){
J = keyin[n] - 'A' + 1;
}else if(keyin[n]>='0' && keyin[n]<='9'){
I = I*10 + keyin[n] - '0';
}else if(keyin[n] == ' '){
continue;
}else{
cout <<"輸入了不合法的字元!"<< endl;
system("pause");
goto nextstep;
}
}
put_chess(I,J,whosturn);
if(endtry == 0){goto nextstep;}
endtry = winner(I,J,whosturn);
whosturn = (whosturn == 1? 2:1);
if(endtry == 0){goto nextstep;}
else{
whosturn = (whosturn == 1? 2:1);
system("cls");
show_board();
if(whosturn == 1){cout <<"黑棋贏了!"<< endl;}else{cout <<"白棋贏了!"<< endl;}
}
}
|
描述: |
|
下載 |
檔名: |
X 阿蛇五子棋.zip |
附件大小: |
122.14 KB |
下載次數: |
共 1570 次 |
|
|
回頂端 |
|
|
彌幽 偶而上來逛逛的過客
註冊時間: 2012-06-13 文章: 5 來自: 台灣 60.12 果凍幣
|
發表於: 2012-6-18, PM 9:56 星期一 文章主題: |
|
|
大大有沒有想過改成圍棋或者黑白棋?
有辦法和電腦下棋嗎?
我是C++的新手,所以看到就想問問
|
|
回頂端 |
|
|
阿德 稍嫌羞澀的路人
註冊時間: 2013-04-11 文章: 1 來自: 台灣 5.38 果凍幣
|
發表於: 2013-4-11, PM 8:56 星期四 文章主題: |
|
|
幹!好酷 又公開原始碼!! 讚^_^
_________________ 沒有最強,只有更強! |
|
回頂端 |
|
|
Dogeatyub 稍嫌羞澀的路人
註冊時間: 2015-09-17 文章: 2
10.71 果凍幣
|
發表於: 2015-9-17, PM 1:24 星期四 文章主題: |
|
|
I feel it's really great.
|
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 可以 在這個版面附加檔案 您 可以 在這個版面下載檔案
|
|