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

C语言实现简单的三子棋

2018-02-05 17:33 375 查看
三子棋游戏主要是利用二维数组进行操作,不断修改数组的值来进行游戏,主要由以下几个内容组成:

1.初始化数组,将数组都初始化为空格;

2.打印游戏界面,游戏界面不但要打印数组,还需要用横线竖线将每个元素隔开显示,即显示成表格状;

3.玩家走棋,先让玩家输入要走的坐标,判断玩家输入的坐标可以走后修改数组指定坐标的内容为X;

4.电脑走棋,电脑要随机走,先产生随机一个坐标,坐标不可走继续随机产生,直到产生一个可以走的坐标后,修改数组指定坐标的内容为0;

5.判断输赢,要判断输赢就要遍历整个数组,是否存在横向三颗棋相同、纵向三颗棋相同或斜向三颗棋相同,如果有则返回数组该坐标上的内容,若都没有再遍历数组查看是否存在空格可以走,有则返回'C'继续游戏,没有则返回'P'表示平局(改变判断输赢函数即可将该游戏改成任意子棋游戏,下面附上了五子棋的函数);

6.跑游戏,让游戏有序进行,玩家和电脑轮流走,每走一步判断一次游戏输赢。

头文件 game.h 用来声明各个功能函数,内容如下:

#ifndef __GAME_H__
#define __GAME_H__

#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <stdlib.h>

#define ROW 3
#define COL 3

enum OPTION
{
EXIT,
PLAY
};

void InitBoard(char board[ROW][COL], int row, int col); //初始化游戏面板,即给数组赋值
void DispalyBoard(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); //电脑走
char CheckWin(char board[ROW][COL], int row, int col); //判断玩家赢,电脑赢,平局还是继续游戏
void RunGame(char board[ROW][COL], char win); //用来跑游戏,进行判断控制游戏进程,并能及时给出游戏结果

#endif // !__GAME_H__源文件game.c用来存放各个函数的实现,内容如下:
#include "game.h"
//初始化游戏面板,即给数组赋值
void InitBoard(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0;i < row;i++)
for (j = 0;j < col;j++)
board[i][j] = ' ';
}
//显示游戏界面
void DispalyBoard(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0;i < row-1;i++)
{
for (j = 0;j < col-1;j++)
{
printf(" %c ", board[i][j]);
printf("|");
}
printf(" %c ", board[i][j]);
printf("\n");
for (j = 0;j < col-1;j++)
{
printf("---|");
}
printf("---");
printf("\n");
}
for (j = 0;j < col - 1;j++)
{
printf(" %c ", board[i][j]);
printf("|");
}
printf(" %c ", board[i][j]);
printf("\n");
}
//玩家走
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x, y;
printf("请输入坐标:>");
scanf_s("%d %d", &x, &y);
if (x >= 1 && x <= row&&y >= 1 && y <= col&&board[x - 1][y - 1] == ' ')
board[x-1][y-1] = 'X';
else
{
printf("输入坐标错误!\n");
PlayerMove(board, ROW, COL);
}
}
//电脑走
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x, y;
srand(time(0));
x = rand() % row;
y = rand() % col;
while (board[x][y] != ' ')
{
x = rand() % row;
y = rand() % col;
}
board[x][y] = '0';
}
//判断玩家赢,电脑赢,平局还是继续游戏
char CheckWin(char board[ROW][COL], int row, int col) //返回值为X表示赢的是玩家,返回值为0表示赢的是电脑
{
int i, j;
for (i = 0;i < row;i++)
for (j = 0;j < col - 2;j++)
if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2] && board[i][j] != ' ')
return board[i][j];
for (i = 0;i < row - 2;i++)
for (j = 0;j < col;j++)
if (board[i][j] == board[i + 1][j] && board[i + 1][j] == board[i + 2][j] && board[i][j] != ' ')
return board[i][j];
for (i = 0;i < row - 2;i++)
for (j = 0;j < col - 2;j++)
{
if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2] && board[i][j] != ' ')
return board[i][j];
else if (board[i + 2][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i][j + 2] && board[i + 2][j] != ' ')
return board[i + 2][j];
}
for (i = 0;i < row;i++)
for (j = 0;j <= col;j++)
if (board[i][j] == ' ')
return 'C'; //这里的C是continue,返回C是还存在空格可以下,游戏继续
return 'P'; //这里的P是peace,返回P表示平局
}

//五子棋判输赢函数
//char CheckWin(char board[ROW][COL], int row, int col) //返回值为X表示赢的是玩家,返回值为0表示赢的是电脑
//{
// int i, j;
// for (i = 0;i < row ;i++)
// for (j = 0;j < col - 4;j++)
// if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2] && board[i][j + 2] == board[i][j + 3] && board[i][j + 3] == board[i][j + 4] && board[i][j] != ' ')
// return board[i][j];
// for (i = 0;i < row - 4;i++)
// for (j = 0;j < col;j++)
// if (board[i][j] == board[i + 1][j] && board[i + 1][j] == board[i + 2][j] && board[i + 2][j] == board[i + 3][j] && board[i + 3][j] == board[i + 4][j] && board[i][j] != ' ')
// return board[i][j];
// for (i = 0;i < row - 4;i++)
// for (j = 0;j < col - 4;j++)
// {
// if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2]&& board[i + 2][j + 2] == board[i + 3][j + 3] && board[i + 3][j + 3] == board[i + 4][j + 4] && board[i][j]!=' ')
// return board[i][j];
// else if (board[i + 4][j] == board[i + 3][j + 1] && board[i + 3][j + 1] == board[i + 2][j + 2] && board[i + 2][j + 2] == board[i + 1][j + 3] && board[i + 1][j + 3] == board[i][j + 4] && board[i + 4][j]!=' ')
// return board[i + 4][j];
// }
// for (i = 0;i < row;i++)
// for (j = 0;j <= col;j++)
// if (board[i][j] == ' ')
// return 'C'; //这里的C是continue,返回C是还存在空格可以下,游戏继续
// return 'P'; //这里的P是peace,返回P表示平局
//}

//用来跑游戏,进行判断控制游戏进程,并能及时给出游戏结果
void RunGame(char board[ROW][COL], char win)
{
while (win == 'C')
{
PlayerMove(board, ROW, COL);
win = CheckWin(board, ROW, COL);
if (win == 'X')
{
DispalyBoard(board, ROW, COL);
printf("玩家赢!\n");
break;
}
else if (win == 'P')
{
DispalyBoard(board, ROW, COL);
printf("平局!\n");
break;
}
else if (win == 'C')
ComputerMove(board, ROW, COL);
win = CheckWin(board, ROW, COL);
if (win == '0')
{
DispalyBoard(board, ROW, COL);
printf("电脑赢!\n");
break;
}
else if (win == 'P')
{
DispalyBoard(board, ROW, COL);
printf("平局!\n");
break;
}
DispalyBoard(board, ROW, COL);
}
}源文件test.c来存放主函数进行游戏测试,内容如下:
#include "game.h"
//显示游戏菜单
void menu()
{
printf("*********************************\n");
printf("***** 1.PLAY 0.EXIT *****\n");
printf("*********************************\n");

}
//游戏函数
void game()
{
char win='C';
char board[ROW][COL];
InitBoard(board, ROW, COL);
DispalyBoard(board, ROW, COL);
RunGame(board, win);
}
//测试函数
void test()
{
int input = 1;
do
{
menu();
printf("请输入选择:>");
scanf_s("%d", &input);
switch (input)
{
case PLAY:
game();
case EXIT:
break;
de
4000
fault:
printf("选择错误!\n");
}
} while (input);
}
//主函数
int main()
{
test();
return 0;
}游戏结果如下:















改变判输赢函数,并改变棋盘行ROW和列COL,将游戏改成简单五子棋游戏,效果如下:






注:该程序是在VS2015上完成的,将scanf写成了scanf_s,正常情况下写scanf即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: