五子棋遊戲
編寫語言:C語言
運行環境:ubuntu
設計知識:函數,數組
本人親設。
基本思路很簡單,代碼基本上在判斷是否勝利函數長了點,共160+吧,希望可以幫助到你,有疑問或者好的思路可以發郵件,[email protected]或者留言
後期應該會出圖形化版本,以及玩家與電腦對戰版本
/*
*遊戲名:五子棋遊戲
*製作者:大熊
*/
#include <stdio.h>
#include <stdlib.h>
void print(const int arr[15][15]);//打印棋盤0=+ ;1=X ;2=O ;
int chess_right(const int arr[15][15], int x, int y);//判斷是否越界,重複
int victory(const int arr[15][15], int x, int y);//判斷贏的條件
void print(const int arr[15][15])//打印棋盤
{
int i = 0, j = 0;
printf("0 1 2 3 4 5 6 7 8 9 A B C D E F\n");
for(i = 0; i < 15; i++)
{
printf("%X ", i + 1);
for(j = 0; j < 15; j++)
{
if(arr[i][j] == 0)
printf("+ ");
else if(arr[i][j] == 1)
printf("X ");
else
printf("O ");
}
printf("\n");
}
}
int chess_right(const int arr[15][15], int x, int y)//判斷棋子是否正常
{
if(x < 0 || y < 0 || x > 15 || y > 15 || arr[x][y] != 0)
{
printf("error! please play chess again!\n");
return 0;
}
else
return 1;
}
int victory(const int arr[15][15], int x, int y)//是否勝利,return 1 yes,0 no
{
int i = 1;
int sum = 1;//sum記錄棋子數
//橫向記錄棋子
for(i = 1; ; i++)
{
if(arr[x][y-i] == arr[x][y] && (y-i) >= 0)//向左
sum++;
else
break;
}
for(i = 1; ; i++)
{
if(arr[x][y+i] == arr[x][y] && (y+i) < 16)//向右
sum++;
else
break;
}
if(sum >= 5)
return 1;
//縱向記錄棋子
sum = 1;//重新棋子數置1
for(i = 1; ; i++)
{
if(arr[x-i][y] == arr[x][y] && (x-i) >= 0)//向上
sum++;
else
break;
}
for(i = 1; ; i++)
{
if(arr[x+i][y] == arr[x][y] && (x+i) < 16)//向下
sum++;
else
break;
}
if(sum >= 5)
return 1;
//左上-右下方向記錄棋子
sum = 1;//重新棋子數置1
for(i = 1; ; i++)
{
if(arr[x-i][y-i] == arr[x][y] && (x-i) >= 0 && (y-i) >= 0)//左上
sum++;
else
break;
}
for(i = 1; ; i++)
{
if(arr[x+i][y+i] == arr[x][y] && (x+i) < 16 && (y+i) < 16)//右下
sum++;
else
break;
}
if(sum >= 5)
return 1;
//右上-左下方向
sum = 1;//重新棋子數置1
for(i = 1; ; i++)
{
if(arr[x-i][y+i] == arr[x][y] && (x-i) >= 0 && (y+i) < 16)//左下
sum++;
else
break;
}
for(i = 1; ; i++)
{
if(arr[x+i][y-i] == arr[x][y] && (x+i) < 16 && (y-i) >= 0)//右上
sum++;
else
break;
}
if(sum >= 5)
return 1;
return 0;
}
int main()
{
//x-1,y-1爲數組座標
int n = 0, x = 0, y = 0, tmp = 1;
int arr[15][15] = {0};
system("clear");
print(arr);
for(n = 0; n < 225; n++)
{
if(n % 2 == 0)
printf("player 1 : ");
else
printf("player 2 : ");
scanf("%d,%d", &x, &y);
tmp = chess_right(arr, x-1, y-1);//下的棋子是否越界,重複,1正確,0錯誤
if(tmp == 0)//錯誤
n--;
else if(n % 2 == 0)
{
arr[x-1][y-1] = 1;//棋手1
system("clear");//清屏
print(arr);//更新棋盤
}
else
{
arr[x-1][y-1] = 2;//棋手2
system("clear");//清屏
print(arr);//更新棋盤
}
if(tmp == 1 && victory(arr, x-1, y-1) == 1)//判斷棋子是否合理且是否勝利
{
printf("palyer %d victory!\n", n % 2 + 1);
break;
}
}
if(n == 225)
printf("和棋!\n");
return 0;
}