您的位置:首页 > 其它

三子棋游戏

2018-04-08 18:11 183 查看
思路:[align=left]1.先展示一个菜单,让玩家选择,选择1后进入游戏[/align][align=left]2.进入游戏后,对创建好的二维数组进行初始化,然后展现棋盘[/align][align=left]3.玩家开始玩游戏,玩过一次之后,展现棋盘,进行判断,判断输赢,判断棋盘是否为满,之后电脑开始下棋,同理,对电脑也进行判断,这是一个循环。[/align][align=left]
[/align][align=left]总共需要三个文件:[/align][align=left]1.sanziqi.h[/align][align=left]包含所需函数的声明[/align][align=left]2.game.c包含函数的定义[/align][align=left]3.test.c包含函数的实现[/align]
//sanziqi.h
#ifndef __SANZIQI_H__   //条件指示符#ifndef 的最主要目的是防止头文件的重复包含和编译

#define __SANZIQI_H__

#define ROW 3
#define COL 3

//初始化棋盘
void Init_BOard(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,
4000
int col);
//电脑走棋
void ComputerMove(char board[ROW][COL], int row, int col);
//判断输赢
int CheckWin(char board[ROW][COL], int row, int col);
//判断棋盘是否为满
int CheckNull(char board[ROW][COL], int row, int col);

#endif // !__SANZIQI_H__

//game.c
#include"sanziqi.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;
int j = 0;
for (i = 0; i < col; i++)
{
printf("%c | %c | %c\n",board[i][0],board[i][1],board[i][2]);
if (i !=2)
{
printf("---------\n");
}
}

}

//玩家走棋——包含两种判断:1.在棋盘上.2.下的位置是空。是一个循环
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x;
int y;
while (1)
{
printf("请输入坐标:\n");
scanf("%d,%d", &x, &y);
if (((1 <= x) && (x <= row)) && ((1 <= y) && (y <= col)))
{
if (board[x - 1][y - 1] == ' ')      //玩家的输入习惯从0开始,所以需要减1
{
board[x - 1][y - 1] = 'O';
break;
}
else
{
printf("输入的位置已有棋子,请重新输入\n");
}
}
else
{
printf("输入错误,请重新输入\n");
}
}
}

//电脑走棋,是随机的,需要产生随机数
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x;
int y;
printf("电脑走棋\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = 'X';
break;
}
}
}

//判断输赢--在一条线上就赢了,分为四种情况,然后判断是否平局
int 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][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 (CheckNull(board,ROW, COL))
{
return 'q';
}
return ' ';
}

//判断棋盘是否为满
int CheckNull(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;          //表示棋盘已下满
}

//test.c

#include <stdio.h>
#include<time.h>
#include"sanziqi.h"

void menu()
{
printf("*************************\n");
printf("*****1.play   0.exit*****\n");
printf("*************************\n");
}
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 = CheckWin(board, ROW, COL);
if (ret != ' ')
{
break;
}

ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = CheckWin(board, ROW, COL);
if (ret != ' ')
{
break;
}
}
if (ret == 'X')
{
printf("电脑赢!再接再厉!\n");
}
if (ret == 'O')
{
printf("恭喜你,你赢了!\n");
}
if (ret == 'q')
{
printf("平局!\n");
}
}

int main()
{
int choice;
srand((unsigned int) time(NULL));
menu();

//用while循环实现游戏
do
{
printf("请输入选择->:\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入有误,请重新输入\n");
break;
}
} while (choice);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: