用C語言實現簡單的三子棋小遊戲

   三子棋問題即在3 * 3的二維數組上下棋,只要有棋子在行、列或對角線連成一線即取得勝利。

可實現玩家與電腦對弈。

說明 :

   (1)本遊戲玩家輸入的是棋盤的座標。

   (2)“X”代表玩家,“0”代表電腦。

   (3)電腦下棋採用的是隨機數給出,大大增加了遊戲的隨機性。

#include<stdio.h>
#include<stdlib.h>
#include<time.h> 
char arr[3][3] = { 0 };  //直接定義外部變量所有的函數可以直接使用
int size = 9;             //棋盤大小固定  每下一個子都會使可以下子的容量-1
void chessboard()       //打印棋盤
{
	int i = 0,j = 0;
	printf("   |   |   \n");
	for (i = 0; i < 3; i++)
	{
    printf("_%c_|_%c_|_%c_\n", arr[i][0], arr[i][1], arr[i][2]);//棋盤對應位置下棋
	  if (i < 2)
	 printf("   |   |   \n");
	}
}
void player()          //玩家下棋
{
	int m = 0, n = 0;
	printf("player(X):"); //輸入的是對應的座標    
	scanf("%d%d", &m,&n); //玩家輸入的座標必須在範圍內並且不能是被下過的地方
	if (m<1 || m>3 || n<1 || n>3 || arr[m - 1][n - 1] != ' ')
	{
		printf("this place can not play!\n"); //如果不符合要求則繼續調用這個函數
		player();
	}
	else
	{
		arr[m - 1][n - 1] = 'X';   //將棋子放入相應的內容 棋盤容量-1
		size--;
	}
}

void computer()          //電腦下棋
{
	printf("computer(0):\n");
	int m = 0, n = 0;
	srand(time(NULL));  //電腦的座標是隨機產生的   以時間爲種子
	m = rand() % 3;     //對3取餘產生0-2的隨機數賦給數組下標
	n = rand() % 3;
	while (arr[m][n] != ' ') //如果產生的座標不符合要求則循環產生      (效率比較低)
	{
		m = rand() % 3;
		n = rand() % 3;
	}
	arr[m][n] = '0';        //操作後容量-1
	size--;
}

int winner()    //判斷獲勝者
{              
	if ((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == 'X') ||
	    (arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == 'X') ||
	    (arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == 'X') ||
	    (arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == 'X') ||
	    (arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == 'X') ||
	    (arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == 'X') ||
	    (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == 'X') ||
	    (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == 'X'))
	     return 1;      //玩家獲勝
    else  if((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == '0') ||
	     (arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == '0') ||
	     (arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == '0') ||
	     (arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == '0') ||
	     (arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == '0') ||
	     (arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == '0') ||
	     (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == '0') ||
	     (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == '0'))
	     return 0;     //電腦獲勝
   else if (size == 0)
	     return -1;   //平局
}

int main()
{
	int i = 0, j = 0;    //將數組初始化爲空格
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			arr[i][j] = ' ';
		}
	}
	while (1)        //循環對弈直到一方獲勝或者平局
	{
		chessboard();          //循環每次開始都打印棋盤
		if (winner() == -1 || winner() == 0 || winner() == 1)
		{
			break;
		}
		player();       
	        computer();
	}
	if (winner() == 1)
	{
		printf("player win!\n");
	}
	else if (winner() == 0)
	{
		printf("computer win!\n");
	}
	else
	{
		printf("no one win!\n");
	}
	system("pause");
	return 0;
}

本遊戲還有好多不足的地方,希望大家多提意見,我也會繼續改進的,希望會提高它的效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章