三子棋改進版——增加與人對決!!
阿新 • • 發佈:2018-12-18
三子棋
函式分為三部分
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;
}