将在一个3乘3的棋盘上进行三子棋游戏
一.头文件
#ifndef _GAME_H_
#define _GAME_H_
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
void Print(char board[ROW][COL], int row, int col);//打印棋盘
void InitBoard(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);//电脑走
int JudgeWiner(char board[ROW][COL], int row, int col);//判断输赢
int FullBoard(char board[ROW][COL], int row, int col);//判断平局或继续
#endif //_GAME_H_
二.主函数
如果想在一个棋盘上实现游戏可以使用system("cls")进行清屏
#include "game.h"
void menu()
{
printf("*************************\n");
printf("******* 1.play ******\n");
printf("******* 0.exit ******\n");
printf("*************************\n");
}
void game()
{
char ret = '0';
int row = ROW;
int col = COL;
char board[ROW][COL];
InitBoard(board, row, col);//初始化棋盘
Print(board, row, col);//打印棋盘
do
{
PlayerMove(board, row ,col);//玩家走
system("cls");//清屏
Print(board, row, col);
ret = JudgeWiner(board, row, col);
if(ret !='x')//根据返回值判断是否继续
{
break;
}
ComputerMove(board, row, col);//电脑走
system("cls");
Print(board, row, col);//再次打印
ret = JudgeWiner(board, row, col);
if(ret!='x')
{
break;
}
}while(1);
ret = JudgeWiner(board, row, col);//根据返回值判断谁胜利
if(ret == '+')
{
printf("恭喜你获胜了\n");
}
else if(ret == '-')
{
printf("很遗憾,电脑获胜\n");
}
else if(ret == 'p')
{
printf("平局\n");
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//让每次产生的随机数都不一样
do
{
menu();
printf("请选择:\n");
scanf("%d", &input);
switch(input)
{
case 0:
printf("游戏结束\n");
break;
case 1:
game();
break;
default:
printf("选择错误,请重新选择:\n");
break;
}
}while(input);
return 0;
}
三。game.c
1.首先我们需要先打印一个3乘3的棋盘出来
运用我们的数组知识
’
void Print(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)
{
printf(" %c | %c | %c \n",board[i][0], board[i][1], board[i][2]);
if(i<row-1)
{
printf("---|---|---\n");
}
}
}
2.需要将棋盘初始化,让我们可以在棋盘上落子
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] = ' ';//将我们的棋盘初始化为“ ”
}
}
}
3.玩家落子
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家走\n");
do
{
printf("请输入坐标:\n");
scanf("%d%d", &x, &y);//数入横纵坐标
if(x>=1 && x<=row && y>=1 && y<=col)//判断当前位置是否有子
{
if(board[x-1][y-1] == ' ')//坐标是1-3,但是数组下标是0-2所以想,x,y减1访问数组
{
board[x-1][y-1] = '+';//用+号代表玩家落子
break;
}
else
{
printf("当前位置已有棋,请重新输入\n");//当前位置要有子提示重新输入坐标
}
}
else
{
printf("输入错误,请重新输入:\n");//如果输入坐标超出棋盘范围则提醒数入错误
}
}while(1);
}
3.电脑落子
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走\n");
do
{
x = rand() %3;//产生0-2的随机数
y = rand() %3;//产生0-2的随机数
if(board[x][y] == ' ')//判断当前位置是否有子
{
board[x][y] = '-';//用-号代表电脑落子
break;
}
}while(1);
}
4.判断棋盘是否满了
int FullBoard(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;//没满返回0
}
}
}
return 1;//满了返回1
}
5.判断是否胜利
int JudgeWiner(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)//判断是否三点连成一条线,如果是则胜利
{
if(board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
else if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
else if (board[0][0] == board[1][1]&&board[1][1] == board[2][2]&&board[1][1]!=' ')
{
return board[1][1];
}
else if (board[0][2] == board[1][1]&&board[1][1] == board[2][0] &&board[1][1]!= ' ')
{
return board[1][1];
}
}
if(FullBoard(board, row , col) == 0)//如果棋盘未满继续游戏
{
return 'x';
}
else if(FullBoard(board, row , col) == 1)//如果棋盘满了且无人胜利则为平局
{
return 'p';
}
return 0;
}