1. 程式人生 > >【C/C++】二維陣列之簡易三子棋

【C/C++】二維陣列之簡易三子棋

一、三子棋

五子棋,五個棋子不論是橫著,豎著,斜著,只要能連成一條直線,就贏了

三子棋(簡易版)也是如此。

二、思路分析

①棋的型別

棋類的C語言實現方法主要看棋的型別

一種是像象棋那種,需要選擇棋子,進行的是棋子移動的棋

另一種,就是像三子棋,五子棋一樣。放置棋子的棋

②要點

(1)陣列

棋盤可以用一個二維陣列來表示

並用0表示某一點無棋子的情況

用1代表黑棋

用2代表白棋

(2)下棋的函式

要有兩個函式來控制下棋

下棋的時候注意有棋子的地方不能下了

(3)判斷輸贏

程式需要知道哪個時候判斷某一方贏了

然後停止程式

程式裡可以用while迴圈實現

裡面放置判斷輸贏函式的返回值

三、程式碼具體實現

程式碼塊:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#define N 3
//列印函式
void print(int chess[][N])
{	
	int i = 0;
	int j = 0;
	system("cls");
	printf("=====================好玩的三子棋=======================\n");
	for(i = 0 ;i<N ;i++ )
	{
		printf("\n			");
		for(j = 0; j<N ;j++)
		{	
			if(chess[i][j] == 1)
				printf("X  ");
			else if(chess[i][j] == 0)
				printf("_  ");
			else 
				printf("0  ");
		}
		printf("\n");
	}
	printf("\n");
	printf("========================================================\n");
}
//玩家下棋
void player(int chess[][N])
{
	int x = 0;
	int y = 0;
	do
	{
		printf("請輸入需要下棋的座標:>");
		scanf("%d %d",&x,&y);
		if(chess[x][y] != 0)
			printf("輸入有誤,請重新輸入!\n");	
	}while(chess[x][y] != 0);
	chess[x][y] = 1;
}
//電腦下棋
void computer(int chess[][N])
{
	int x = 0;
	int y = 0;
	do
	{	
		srand((unsigned)time(NULL));
		x = rand()%3;
		y = rand()%3;	
	}while(chess[x][y] != 0);
	chess[x][y] = 2;
}
//判斷獲勝
//返回1,玩家獲勝
//返回2,電腦獲勝
//返回-1,平局 
int check_winner(int chess [][N])
{	
	int flag = 0;
	int x = 0;
	int y = 0;
	if((chess[0][0]==chess[0][1])&&(chess[0][1] == chess[0][2]))
	{
		if(chess[0][0] == 1)
			return 1;
		else if(chess[0][0] == 2) 
			return 2;
	}
	if((chess[1][0]==chess[1][1])&&(chess[1][1])==chess[1][2])
	{
		if(chess[1][0] == 1)
			return 1;
		else if(chess[1][0] == 2)
			return 2;
	}
	if((chess[2][0]==chess[2][1])&&(chess[2][1])==chess[2][2])
	{
		if(chess[2][0] == 1)
			return 1;
		else if(chess[2][0] == 2)
			return 2;		
	}
	if((chess[0][0]==chess[1][0])&&(chess[1][0])==chess[2][0])
	{
		if(chess[0][0] == 1)
			return 1;
		else if(chess[0][0] == 2)
			return 2;		
	} 
	if((chess[0][1]==chess[1][1])&&(chess[1][1])==chess[2][1])
	{
		if(chess[0][1] == 1)
			return 1;
		else if(chess[0][1] == 2)
			return 2;		
	}
	if((chess[0][2]==chess[1][2])&&(chess[1][2])==chess[2][2])
	{
		if(chess[0][2] == 1)
			return 1;
		else if(chess[0][2] == 2)
			return 2;		
	}
	if((chess[0][0]==chess[1][1])&&(chess[1][1])==chess[2][2])
	{
		if(chess[0][0] == 1)
			return 1;
		else if(chess[0][0] == 2)
			return 2;				
	}
	if((chess[0][2]==chess[1][1])&&(chess[1][1])==chess[2][0])
	{
		if(chess[0][2] == 1)
			return 1;
		else if(chess[0][2] == 2)
			return 2;				
	}
	
	for(x=0 ; x<N; x++)
	{
		for(y=0; y<N; y++)
		{
			if(chess[x][y] == 0)
				return 0;
		}
	}
	return -1;
}
int grade(int chess[][3])
{
	int x = 0;
	int y = 0;
	int sum_grade = 0;
	for(x=0 ; x<N; x++)
	{
		for(y=0; y<N; y++)
		{
			if(chess[x][y] == 0)
				sum_grade++;
		}
	}
	return sum_grade;
} 
void play()
{
	int chess[3][3] = {0};
	int winner = 0;
	print(chess);
	while(check_winner(chess) == 0)
	{	
		player(chess);
		print(chess);
		if(check_winner(chess) != 0)
			break;
		computer(chess);
		print(chess);
		Sleep(1000);	
	} 
	winner = check_winner(chess);
	if(winner == 1)
	{
		printf("恭喜,您勝了!\n");
		if(grade(chess)>1&&grade(chess)<4)
			printf("您的總分為 91\n稱號:>小霸王\n");
		else if(grade(chess)>3)
			printf("您的總分為 99\n稱號:>天之驕子\n");
		else
			printf("您的總分為 86\n稱號:>棋逢對手\n");
	}	
	else if(winner == 2)
	{
		printf("很遺憾,您輸了。\n");
		printf("您的分數為 59\n稱號:>炮灰\n"); 
	}	
	else 
	{
		printf("厲害,和電腦打平手了!\n");
		printf("您的分數為 61\n稱號:>旗鼓相當\n"); 
	}	
}
int main()
{		
	int have_fun = 1;
	do
	{
		play();
		printf("\n輸入1繼續遊戲:>");
		scanf("%d",&have_fun);
	}while(have_fun == 1);
	return 0;
}

執行結果:

四、小結

二維陣列引數傳遞,至少要確定維數

擴充套件閱讀: