五子棋游戏
编写语言:C语言
运行环境:ubuntu
设计知识:函数,数组
本人亲设。
基本思路很简单,代码基本上在判断是否胜利函数长了点,共160+吧,希望可以帮助到你,有疑问或者好的思路可以发邮件,1916737159@qq.com或者留言
后期应该会出图形化版本,以及玩家与电脑对战版本
/*
*游戏名:五子棋游戏
*制作者:大熊
*/
#include
#include
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;
}