您的位置:首页 > 编程语言 > C语言/C++

C语言简单实现三子棋小游戏

2019-07-29 23:21 465 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_44695386/article/details/97694331

游戏规则:
三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。游戏是在一个3*3的棋盘里面下棋的。只要有三个一样的连成一条线,就表示有一方胜出;如果下完了9个格子还没有玩家胜出,游戏为平局。

实现思路:
1.初始化棋盘数组
2.绘制棋盘
3.玩家下棋
4.电脑下棋
5.判断输赢

创建头文件game.h

#ifndef   __GAME__H_
#define  __GAME__H_
#define ROW 3
#include<stdio.h>
#include<stdlib.h>
void InitBoard(char board[][ROW],int row,int col,char set);//初始化棋盘为字符set
void ShowBoard(char board[][ROW],int row,int col);//打印棋盘
void PlayerMove(char board[][ROW],int row,int col);//玩家下棋
char IsWin(char board[][ROW],int row,int col);//判断输赢
void ComputerMove(char board[][ROW],int row,int col);//电脑下棋
#endif

game.c函数的实现(函数功能)

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//重置棋盘
void InitBoard(char board[][ROW],int row,int col,char set)
{
int i = 0;
int j = 0;
for(i = 0;i < row;i++)
{
for(j = 0;j < row;j++)
{
board[i][j] = set;
}
}
}
//打印棋盘
void ShowBoard(char board[][ROW],int row,int col)
{
int i = 0;
int j = 0;
for(i = 0;i < row;i++)
{
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],int row,int col)
{
int x =0 ;
int y = 0;
while(1)//8,9
{
printf("玩家移动\n");
printf("请输入1-3的坐标:\n");
scanf("%d%d",&x,&y);
//在棋盘范围内则进行判断是否被占用,若被占用则重新输入,若没被占用则置为'x'
if(x >= 1 && x <= 3 && y >=1 && y <= 3)
{
if(board[x-1][y-1] == ' ')
{
board[x-1][y-1] = 'x';
break;
}
else
{
printf("位置已经被占用,请重新输入\n");
}
}
else
{
printf("坐标不合法\n");
}
//2、坐标不合法
}
}
//判断棋盘是否下满,static修饰,只能在该.c文件中使用
static int IsFull(char board[][ROW],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;//棋盘已满
}
//判断输赢
char IsWin(char board[][ROW],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];
}
//列相同
if(board[0][i] == board[1][i] && board[1][i] == board[2][i]
&&board[0][i] != ' ')
{
return board[0][i];
}
//主对角线相同
if(board[0][0] == board[1][1] && board[1][1] == board[2][2]
&& board[0][0] != ' ')
{
return board[0][0];
}
//副对角线相同
if(board[0][2] == board[1][1] && board[1][1] == board[2][0]
&& board[0][2] != ' ')
{
return board[0][2];
}

if(IsFull(board,ROW,ROW))
{
return 'Q';//平局
}
}
return ' ';//谁也没有赢
}

void ComputerMove(char board[][ROW],int row,int col)
{
int x = 0;
int y = 0;
printf("电脑移动\n");
while(1)
{
x = rand() % ROW;//[0-3)随机值
y = rand() % ROW;//[0-3)随机值
if(board[x][y] == ' ')
{
board[x][y] = 'O';//判断该座标是否被占用,没有则置0
break;
}
}
}

test.c主体功能的实现

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"//引入game.c文件,其中已经引入了程序所需要用到的头文件,所以不用再次重复引入,只要引入game.c即可
//打印游戏菜单
void menu()
{
printf("********************\n");
printf("***欢迎来到三子棋***\n");
printf("*******0.exit*******\n");
printf("*******1.play*******\n");
printf("********************\n");
}
void game()
{
char ret = 0;
char board[ROW][ROW]= {0};//先将3*3的棋盘初始化为全0
InitBoard(board,ROW,ROW,' ');//将棋盘置为空格
ShowBoard(board,ROW,ROW);//打印棋盘

while(1)//只要有一方胜出,结束循环
{
PlayerMove(board,ROW,ROW);//玩家先下棋
ret = IsWin(board,ROW,ROW);//判断输赢
if(ret != ' ')//可能平局,可能一方胜出
{
break;
}
ShowBoard(board,ROW,ROW);//展示棋盘

ComputerMove(board,ROW,ROW);//电脑出棋
ret = IsWin(board,ROW,ROW);//判断输赢
if(ret != ' ')//可能平局,可能一方胜出
{
break;
}
ShowBoard(board,ROW,ROW);
}
if(ret == 'x')//判断ret
{
printf("玩家胜出\n");
}
if(ret == ' O')
{
printf("电脑胜出\n");
}
if(ret == 'Q')
{
printf("平局\n");
}
}
int main()
{
int input = 0;//用来存储用户输入的操作,从而确定玩家开始游戏还是退出
do
{
menu();//打印菜单
printf("请输入您的选择:-》");
scanf("%d",&input);
switch(input)
{
case 1:
printf("游戏开始\n");
game();
break;
case 0:
printf("游戏退出\n");
break;
default:
printf("请输入正确的操作\n");
break;
}
}while(input);
return 0;
}

运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: