使用C語言編寫簡單的五子棋玩家對戰遊戲

五子棋遊戲

編寫語言: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;
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章