C语言实现《五子棋》
《五子棋》要考虑到棋盘的大小,对灵活性的考虑,所以在头文件里用到了
#define ROW 3
#define COL 3
这里的数字3可以改变成其他值(这里以3为例玩五子棋),例如:改变为10:图示如下:
此刻 #define ROW/COL 均为10
#define ROW 10
#define COL 10
又因为两个源文件均用到了头文件,所以在头文件里放入
这两个头文件就行了,共用。
- 定义一个头文件<game.h>
#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);
// 玩家赢 -----返回*
// 电脑赢 -----返回#
// 平局 -- ---返回Q
// 继续 ---- -返回C
char CheckWin(char board[ROW][COL], int row, int col);
- 定义第一个源文件<test.c>
#include "game.h"
void menu()
{
printf("***********************\n");
printf("***** 1. play *****\n");
printf("***** 0. exit *****\n");
printf("***********************\n");
}
void game()
{
char ret = 0;
char board[ROW][COL] = {0}; //定义棋盘 是二维数组 利用row col防止写死
// 初始化棋盘---空格(函数)
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
while(1)
{
//玩家走
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = CheckWin(board, ROW, COL);//检测是平局还是两方哪一家赢了,会停止游戏
if(ret != 'C')
{
break;
}
//电脑走
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = CheckWin(board, ROW, COL);
if(ret != 'C')
{
break; //先让游戏停止
}
}
if(ret == '*') //游戏停止后的判断
{
printf("玩家赢\n");
}
else if(ret == '#')
{
printf("电脑赢\n");
}
else if(ret == 'Q')
{
printf("平局\n");
}
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL)); //用来设置随机数的生成起点
do
{
menu();
printf("请输入您的选择:》");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏成功!\n");
break;
default:
printf("输入错误,请重试:\n");
break;
}
}while(input);
}
int main()
{
//测试游戏
test();
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] = ' ';
}
}
}
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for(i=0; i<row; i++)
{
//1.数据
// printf(" %c | %c | %c \n", board[i][0],board[i][1],board[i][2]); 写一个适用的
int j = 0;
for(j=0; j<col; j++)
{
printf(" %c ", board[i][j]);
if(j < col-1)
printf("|");
}
printf("\n");
//2.分割的行
if(i < row-1)
{
//printf("---|---|---\n");
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("请输入要走的坐标:");
scanf("%d%d", &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; //x~[0,1,2]
y = rand()%col;
if(board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
static int isFull(char board[ROW][COL], int row, int col)//isFull函数没必要给别人看到,所以static
{
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;
}
char CheckWin(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][0] != ' ')
{
return board[i][0];
}
}
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(isFull(board, row, col) == 1) //定义一个判断棋满且平局的函数
{
return 'Q'; //平局
}
//没人赢 没平局 那就继续
return 'C';
}
文件定义图示:
看下最后的运行结果:
这是第一种情况::玩家赢,下边看让电脑赢
这是第二种情况,玩家赢,看下平局(前边过程省略)
游戏玩累了,想退出游戏,如下:
- 好啦 期待小伙伴有更好的建议,因为里边有一块代码(如下图),写的很死不够灵活,期待指点(*❦ω❦) (*❦ω❦)