C语言实现三子棋游戏
相信大家都玩过三子棋游戏,三子棋是一款非常简单且有趣的游戏。下面,我就来带领大家如何用C语言实现简单的三子棋游戏
首先,我们主函数只需要放一句简单的test函数,然后我们在该函数里面编写接下来的代码
#include "game.h"
int main()
{
test();
return 0;
}
test函数里面,首先,随机数我们用时间戳来进行实现,也就是srand和time两个函数。接着打印我们简易的菜单menu。然后会让你输入:如果输入1则会进入game函数开始游戏;如果输入0则退出游戏结束循环;输入其它的则会提示“选择错误,请重新选择”。
void test()
{
int input=0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择\n");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
}while(input);
}
菜单完成了,我们接下来开始实现棋盘的打印了。我们在game函数里面先定义好我们的棋盘,用数组来存放我们输入的“棋子”
//数组-存放走出的棋盘信息
char board[ROW][COL]={0};
再初始化棋盘
//初始化棋盘
InitBoard(board,ROW,COL);
然后打印出来看看
//打印棋盘
DisplayBoard(board,ROW,COL);
棋盘无误后,我们就可以开始下棋了。首先是玩家下一步,然后判断一下是否赢;没赢的话,就电脑下一步棋,然后判断电脑是否赢。玩家下的棋是用 * 来代替,而电脑下的棋是用 # 来代替。当ret返回一个符号时,如果不是e的话则跳出循环判断输赢,此时如果返回的是 *则玩家赢,如果返回的是#则电脑赢,否则就是棋盘满了平局。
void game()
{
int ret=0;
//数组-存放走出的棋盘信息
char board[ROW][COL]={0};
//初始化棋盘
InitBoard(board,ROW,COL);
//打印棋盘
DisplayBoard(board,ROW,COL);
//下棋
while(1)
{
//玩家下棋
Playermove(board,ROW,COL);
DisplayBoard(board,ROW,COL);
//判断玩家是否赢
ret=Iswin(board,ROW,COL);
if(ret!='e')
{
break;
}
//电脑下棋
Computermove(board,ROW,COL);
DisplayBoard(board,ROW,COL);
//判断电脑是否赢
ret=Iswin(board,ROW,COL);
if(ret!='e')
{
break;
}
}
if(ret=='*')
{
printf("玩家赢\n");
}
else if(ret=='#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
而具体怎样实现,我写在了另一个文件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]=' ';
}
}
}
接着是实现打印棋盘
//打印棋盘
void DisplayBoard(char board[ROW][COL],int row,int col)
{
int i=0;
for(i=0;i<row;i++)
{
//打印一行的数据
int j=0;
for(j=0;j<col;j++)
{
printf(" %c ",board[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");
}
}
}
然后是玩家下棋
//玩家下棋
void Playermove(char board[ROW][COL],int row,int col)
{
int x=0;
int y=0;
printf("玩家走:\n");
while(1)
{
printf("请输入要下的坐标\n");
scanf("%d %d",&x,&y);
//判断x,y坐标合法性
if(x>=1&&x<=row&&y>=1&&y<=col)
{
if(board[x-1][y-1]==' ')
{
board[x-1][y-1]='*';
break;
}
else
{
printf("该坐标被占用\n");
}
}
else
{
printf("坐标非法,请重新输入:\n");
}
}
}
玩家下完后,就是电脑下棋
//电脑下棋
void Computermove(char board[ROW][COL],int row,int col)
{
int x=0;
int y=0;
printf("电脑走:\n");
while(1)
{
x=rand()%row;
y=rand()%col;
if(board[x][y]==' ')
{
board[x][y]='#';
break;
}
}
}
接着是判断下棋的输赢
char Iswin(char board[ROW][COL],int row,int col)
{
int i=0;
//横三行判断
for(i=0;i<row;i++)
{
if(board[i][0]==board[i][1] && board[i][1]==board[i][2] && board[i][1]!=' ')
{
return board[i][1];
}
}
//竖三列判断
for(i=0;i<col;i++)
{
if(board[0][i]==board[1][i] && board[1][i]==board[2][i] && board[1][i]!=' ')
{
return board[1][i];
}
}
//两个对角线判断
if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[1][1]!=' ')
{
return board[1][1];
}
if(board[0][2]==board[1][1] && board[1][1]==board[2][0] && board[1][1]!=' ')
{
return board[1][1];
}
//判断是否平局
if(1==Isfull(board,ROW,COL))
{
return 'o';
}
return 'e';
}
判断棋盘是否满了
//返回1表示棋盘满了
//返回0,表示棋盘没满
int Isfull(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++)
{
if(board[i][j]==' ')
{
return 0;//没满
}
}
}
return 1;//满了
}
此时呢,我们的main.c文件和game.c文件代码都写完了,我们可以看到都引用了“game.h”头文件。我们还差最后一步在game.h定义一些函数和变量即可。
#define GAME_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
//声明
void InitBoard(char board[ROW][COL],int row,int col);
void DisplayBoard(char board[ROW][COL],int row,int col);
void Playermove(char board[ROW][COL],int row,int col);
void Computermove(char board[ROW][COL],int row,int col);
//告诉我们游戏四种状态
//玩家赢--'*'
//电脑赢--'#'
//平局--'o'
//继续--'e'
char Iswin(char board[ROW][COL],int row,int col);
int Isfull(char board[ROW][COL],int row,int col);
最后总结一下,我们需要三个文件,一个是自带的main,c文件,另一个是我们自己新建的一个game.c文件,还有一个是新建的头文件game.h。我们只需要在这三个文件里分别敲代码即可实现。