·功能介绍
·这是我们要实现的游戏功能:
·代码实现以及解释
一、主函数的实现以及扫雷的构思框架(test.c)
int main()
{
int input=0;
do
{
menu();
printf("请选择");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
break;
}
}
while(input);
return 0;
}
·首先使我们的主函数,一个菜单函数menu();一个游戏函数game();,通过switch让玩家进行选择。下面我们分别展示menu();和game();两个函数。
void menu()
{
printf("**********************************************\n");
printf("******************1.开始游戏******************\n");
printf("******************0.退出游戏******************\n");
printf("**********************************************\n");
}
·简单的一个界面用于展示。
void game()
{
char board[ROW][COL]={0};
char ret=0;
InitBoard(board,ROW,COL);
DisplayBoard(board,ROW,COL);
while(1)
{
PlayMove(board,ROW,COL);
DisplayBoard(board,ROW,COL);
ComputerMove(board,ROW,COL);
ret=IsWin(board,ROW,COL);
if(ret==1)
break;
DisplayBoard(board,ROW,COL);
}
if(ret==0)
{
printf("平局");
}
}
·InitBoard();这个函数用于初始化我们的棋盘,将3x3的格子都设定为' '.
·DisplayBoard();用于展示我们的棋盘给用户。
·PlayMove();用于玩家行动输入相应的坐标来下棋。
·ComputerMove();电脑自动生成坐标下棋。
·IsWin();这个函数用于判断是否有获胜的一方。
二、三子棋功能的实现(game.c)
void InitBoard(char board[ROW][COL],int row, int col)
{
int i=0;
int j=0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
board[i][j]=' ';
}
}
}
·这是我们的初始化函数,将行和列都设定为空字符。
int DisplayBoard(char board [ROW][COL],int row, int col)
{
int i=0;
for(i=0; i<3; i++)
{
printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
if(i!=2)
printf("---|---|---\n");
}
return 1;
}
·这边我们打印了棋盘,其中加上了|和——用于棋盘的美观。
int PlayMove(char board[ROW][COL],int row, int col)
{
int x,y;
scanf("%d%d",&x,&y);
if(x>4||y>4||x<1||y<1)
{
printf("请重新输入");
return 0;
}
if(board[x-1][y-1] != ' ')
{
printf("请重新输入\n");
return 0;
}
board[x-1][y-1]='X';
}
·这边是玩家行动的函数。注意:我们判断的时候是1-4而不是0-3这是为什么呢?因为我们将这个棋盘存在一个二维数组里面,而玩家并非知道[0][0],所以我们的坐标只能为1-3.同样的,我们下面在输入坐标的时候,x和y分别减一得到真实的坐标。
·这里我们把玩家输入的坐标设定为X。
int ComputerMove(char board[ROW][COL],int row, int col)
{
int i=0;
int j=0;
if(i = rand() % 3, j = rand() % 3, board[i][j] == ' ')
{
board[i][j] = 'Y';
}
else
ComputerMove(board, row,col);
·电脑行动我们依然使用了rand来产生一个随机值,为了避免重复下棋,在if判断中加上了board[i][j] == ' '这一个条件。
·我们把电脑的坐标设定为Y。
int IsWin(char board[ROW][COL],int row, int col)
{
int i = 0;
if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]))
{
if (board[1][1] == 'X')
{
printf("玩家赢了\n");
return 1;
}
if (board[1][1] == 'Y')
{
printf("对方赢了\n");
return 1;
}
}
if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]))
{
if (board[1][1] == 'X')
{
printf("玩家赢了\n");
return 1;
}
if (board[1][1] == 'Y')
{
printf("对方赢了\n");
return 1;
}
}
for (i = 0;i < 3;i++)
{
if ((board[i][1] == board[i][0]) && (board[i][1] == board[i][2]))
{
if (board[i][1] == 'X')
{
printf("玩家赢了\n");
return 1;
}
if (board[i][1] == 'Y')
{
printf("对方赢了\n");
return 1;
}
}
}
for (i = 0;i < 3;i++)
{
if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]))
{
if (board[0][i] == 'X')
{
printf("玩家赢了\n");
return 1;
}
if (board[0][i] == 'Y')
{
printf("对方赢了\n");
return 1;
}
}
}
return 0;
}
·这是一个判断输赢的函数,判断行列斜三个地方的字符是否全部为X或者全部为Y,返回一个int。
int IsFull(char board[ROW][COL], int row, int col)
{
int i=0;
int j=0;
for(i=0; i<=2; i++)
{
for(j=0; j<=2; j++)
{
if(board[i][j]==' ')
return 0;
}
}
return 1;
}
·当然我们也会想到如果没有人赢怎么办,那么平局的判定标准就是棋盘是否下满?这边使我们一个判断棋盘状态的函数,如果返回为1,那么游戏就会重新开始了。
三、头文件的引用(game.h)
#include<stdio.h>
#include <stdio.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL],int row, int col);//初始化
int DisplayBoard(char board [ROW][COL],int row, int col);//打印棋盘
int PlayMove(char board[ROW][COL],int row, int col);//玩家走
int ComputerMove(char board[ROW][COL],int row, int col);//电脑走
int IsWin(char board[ROW][COL],int row, int col);//判断输赢
int IsFull(char board[ROW][COL], int row, int col);//判断棋盘状态
·头文件的引用以及函数的声明。
·我们将棋盘设定为ROW和COL,在头文件中可以直接改变棋盘的大小
·代码展示
test.c
#include"game.h"
void menu()
{
printf("**********************************************\n");
printf("******************1.开始游戏******************\n");
printf("******************0.退出游戏******************\n");
printf("**********************************************\n");
}
void game()
{
char board[ROW][COL]={0};
char ret=0;
InitBoard(board,ROW,COL);
DisplayBoard(board,ROW,COL);
while(1)
{
PlayMove(board,ROW,COL);
DisplayBoard(board,ROW,COL);
ComputerMove(board,ROW,COL);
ret=IsWin(board,ROW,COL);
if(ret==1)
break;
DisplayBoard(board,ROW,COL);
}
if(ret==0)
{
printf("平局");
}
}
int main()
{
int input=0;
do
{
menu();
printf("请选择");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
break;
}
}
while(input);
return 0;
}
game.c
#include"game.h"
void InitBoard(char board[ROW][COL],int row, int col)
{
int i=0;
int j=0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
board[i][j]=' ';
}
}
}
int DisplayBoard(char board [ROW][COL],int row, int col)
{
int i=0;
for(i=0; i<3; i++)
{
printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
if(i!=2)
printf("---|---|---\n");
}
return 1;
}
int PlayMove(char board[ROW][COL],int row, int col)
{
int x,y;
scanf("%d%d",&x,&y);
if(x>4||y>4||x<1||y<1)
{
printf("请重新输入");
return 0;
}
if(board[x-1][y-1] != ' ')
{
printf("请重新输入\n");
return 0;
}
board[x-1][y-1]='X';
}
int ComputerMove(char board[ROW][COL],int row, int col)
{
int i=0;
int j=0;
if(i = rand() % 3, j = rand() % 3, board[i][j] == ' ')
{
board[i][j] = 'Y';
}
else
ComputerMove(board, row,col);
}
int IsWin(char board[ROW][COL],int row, int col)
{
int i = 0;
if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]))
{
if (board[1][1] == 'X')
{
printf("玩家赢了\n");
return 1;
}
if (board[1][1] == 'Y')
{
printf("对方赢了\n");
return 1;
}
}
if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]))
{
if (board[1][1] == 'X')
{
printf("玩家赢了\n");
return 1;
}
if (board[1][1] == 'Y')
{
printf("对方赢了\n");
return 1;
}
}
for (i = 0;i < 3;i++)
{
if ((board[i][1] == board[i][0]) && (board[i][1] == board[i][2]))
{
if (board[i][1] == 'X')
{
printf("玩家赢了\n");
return 1;
}
if (board[i][1] == 'Y')
{
printf("对方赢了\n");
return 1;
}
}
}
for (i = 0;i < 3;i++)
{
if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]))
{
if (board[0][i] == 'X')
{
printf("玩家赢了\n");
return 1;
}
if (board[0][i] == 'Y')
{
printf("对方赢了\n");
return 1;
}
}
}
return 0;
}
int IsFull(char board[ROW][COL], int row, int col)
{
int i=0;
int j=0;
for(i=0; i<=2; i++)
{
for(j=0; j<=2; j++)
{
if(board[i][j]==' ')
return 0;
}
}
return 1;
}
game.h
#include<stdio.h>
#include <stdio.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL],int row, int col);//初始化
int DisplayBoard(char board [ROW][COL],int row, int col);//打印棋盘
int PlayMove(char board[ROW][COL],int row, int col);//玩家走
int ComputerMove(char board[ROW][COL],int row, int col);//电脑走
int IsWin(char board[ROW][COL],int row, int col);//判断输赢
int IsFull(char board[ROW][COL], int row, int col);//判断棋盘状态