1. 程式人生 > >三子棋改進版——增加與人對決!!

三子棋改進版——增加與人對決!!

三子棋

函式分為三部分

1.test.c檔案 2.game.h檔案 3.game.c檔案

改進思想:1.增加了人與人對決的man_game( )函式從而增加了一點小功能,使得玩家的選擇變得更加廣泛。

2.men_game函式與game函式功能完全相同;只是分別呼叫了game.h 中不同的函式從而實現了自己的功能。

一: 函式主體test.c檔案

#include"game.h"

遊戲選單

void menu()
{
	printf("******************\n");
	printf("******0.exit******\n");
	printf("******1.paly******\n");
	printf("*****2.人與人*****\n");
	printf("******************\n");
}

玩家與電腦的對決

void game()
{
	char ret=0;
	char board[ROW][COL]={0};
	InitBoard(board,ROW,COL);
	DispiayBoard(board,ROW,COL);
	while(1)
	{
		Player1(board,ROW,COL);
		ret = Is_Win(board,ROW,COL);
		if(ret!= ' ')
			break;
	    DispiayBoard(board,ROW,COL);
		
		Computer(board,ROW,COL);
		ret = Is_Win(board,ROW,COL);
		if(ret!= ' ')
			break;
		DispiayBoard(board,ROW,COL);
		ret = Is_Win(board,ROW,COL);
		
	}
	if(ret=='X')
	{
			printf("玩家勝利:>\n");
	DispiayBoard(board,ROW,COL);
	}
	else if(ret=='0')
	{
			printf("電腦勝利:>\n");
	DispiayBoard(board,ROW,COL);
	}
		else if(ret =='F')
			printf("平局:>\n");
}

玩家與玩家的對決

void men_game( )
{
	char ret=0;
	char board[ROW][COL]={0};
	InitBoard(board,ROW,COL);
	DispiayBoard(board,ROW,COL);
	while(1)
	{
		Player1(board,ROW,COL);
		ret = Is_Win(board,ROW,COL);
		if(ret!= ' ')
			break;
	    DispiayBoard(board,ROW,COL);
		
		Player2(board,ROW,COL);
		ret = Is_Win(board,ROW,COL);
		if(ret!= ' ')
			break;
		DispiayBoard(board,ROW,COL);
		ret = Is_Win(board,ROW,COL);
		
	}
	if(ret=='X')
	{
			printf("玩家1勝利:>\n");
	DispiayBoard(board,ROW,COL);
	}
	else if(ret=='0')
	{
			printf("玩家2勝利:>\n");
	DispiayBoard(board,ROW,COL);
	}
		else if(ret =='F')
			printf("平局:>\n");

}

主函式


int main()
{
	int input=0;
	srand((unsigned int)time(NULL));
	do
	{
	menu( );
	//menu2( );
		printf("請選擇:");
		scanf("%d",&input);
		switch(input)
		{
		case 1:
				game( );
				break;
		case 0:
			printf("退出遊戲\n");
				break;
		case 2:
			men_game( );
			break;
		default:
				break;
		}

	}while(input);
    return 0;
}

二:自定義的函式標頭檔案game.h

#ifndef __GAME_H__
#define __GAME_H__

#include<stdio.h>
#include<memory.h>
#include<stdlib.h>
#include<time.h>

#define ROW 3
#define COL 3


void InitBoard(char arr[ROW][COL],int row,int col);
void DispiayBoard(char arr[ROW][COL],int row,int col);
void Player1(char arr[ROW][COL],int row,int col);
void Player2(char arr[ROW][COL],int row,int col);
void Computer(char arr[ROW][COL],int row,int col);
char Is_Win(char arr[ROW][COL],int row,int col);
int Full(char arr[ROW][COL],int row,int col);

#endif  //__GAME_H__

三:自定義的遊戲原始碼game.c

#include"game.h"

1.初始化棋盤

void InitBoard(char arr[ROW][COL],int row,int col)
{
    memset( &arr[0][0],' ',row*col*sizeof(arr[0][0]));

}

2.列印棋盤

void DispiayBoard(char arr[ROW][COL],int row,int col)
{
	int i=0;
	printf("****************\n");
	for(i=0;i < row;i++)
	{
		int j=0;
		for(j=0; j<col;j++)
		{
			printf(" %c ",arr[i][j]);
			if(j<col-1)
			{
				printf("|");
			}
			
		}
		printf("\n");
		
		if(i<row-1)
		{
			for(j=0; j<col; j++ )
			{
				printf("---");
			    if(j<col-1)
				{
					printf("|");
				}
			     
		     }
		}
		printf("\n");
		
	}
	printf("****************\n");
}

3.玩家1走

void Player1(char arr[ROW][COL],int row,int col)
{
	int x=0;
	int y=0;
	
	while(1)
	{
		printf("玩家走\n");
		printf("請輸入玩家走要落子的座標:>");
	    scanf("%d%d",&x,&y);
	   if (x>=1 && x<=row && y>=1 && y<=col )
	   {
		   if( arr[x-1][y-1] ==' ')
		    {
			   arr[x-1][y-1]='X';
			   break;
		    }
		   else
		   { 
			 printf("輸入的座標被佔用,請重新輸入!\n"); 
		   }
	    }
	 else
	   {
		 printf("輸入的座標非法,請重新輸入!\n");
	   }
	}
	
}

4.玩家2走

void Player2(char arr[ROW][COL],int row,int col)
{
    
	int x=0;
	int y=0;
	
	while(1)
	{
		printf("玩家2走\n");
		printf("請輸入玩家走要落子的座標:>");
	    scanf("%d%d",&x,&y);
	   if (x>=1 && x<=row && y>=1 && y<=col )
	   {
		   if( arr[x-1][y-1] ==' ')
		    {
			   arr[x-1][y-1]='0';
			   break;
		    }
		   else
		   { 
			 printf("輸入的座標被佔用,請重新輸入!\n"); 
		   }
	    }
	 else
	   {
		 printf("輸入的座標非法,請重新輸入!\n");
	   }
	}
	
}


5.電腦走

void Computer(char arr[ROW][COL],int row,int col)
{
	int x=0;
	int y=0;
	printf("電腦走:> \n");
	while(1)
	{
		int i=0;
		int j=0;
		x=rand()%row;
	    y=rand()%col;
		
		if( arr[x][y]==' ')
		{
	    {
		    arr[x][y]='0';
			
		}
		break;
		}	
	
	}

}

6.判斷輸贏與平局函式

//判斷勝利
char Is_Win(char arr[ROW][COL],int row,int col)

{
	int i=0;
	for(i=0;i<row;i++)
	{
		if(arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][2]!=' ')
		{
			return arr[i][0] ;
		}
	}
	for(i=0;i<col;i++)
	{
        if(arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[2][i]!=' ')
	    return arr[0][i];
	}
	if(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2]!=' ')
	{
		return arr[0][0];
	}
		if(arr[0][2]==arr[1][1] && arr[1][1]==arr[2][0]&&arr[2][0]!=' ')
		{
			return arr[1][1];
		}
		if(Full(arr,row,col)==1)   //棋盤已滿的且未判斷出輸贏則為平局
		{
			return 'F';
		}
		return ' ';
}



7.判斷棋盤是否已滿

int Full(char arr[ROW][COL],int row,int col)
{
     int i=0,j=0;
	 for(i=0;i<row;i++)
	 {
		 for(j=0;j<col;j++)
		 {
			 if(arr[i][j] ==' ')
				 return 0;
			 
		 } 
	 
	 }
	 return 1;
	 
}

改進之處特點並不是特別突出,只是根據自己的能力做了細微變動使得函式有了一點不同之處。若有其他高見還請到評論區留言。