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

用c语言实现简单三子棋游戏

2017-10-19 17:28 916 查看
首先,把全部代码罗列如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"time.h"
#define ROWS 3
#define COLS 3

//菜单函数
void menu()
{
printf("******************************\n");
printf("*****欢迎进入三子棋游戏区*****\n");
printf("****    1:开始进入游戏    ****\n");
printf("****    0:结束本次游戏    ****\n");
printf("******************************\n");
printf("请输入0或1进行游戏:-->  ");
}

//对棋盘进行初始化
void init_board(char board[ROWS][COLS], int row, int col)
{
memset(board, ' ', row*col*sizeof(char));
}
//memset是以字节为单位,初始化内存块
//当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值
//在这里也可以用for循环来进行棋盘初始化,具体代码如下:
/*{
int x = 0;
int y = 0;
for (x = 0; x < 3; x++)
{
for (y = 0; y < 3; y++)
{
board[x][y] = ' ';
}
}
}
*/

//实现棋盘函数
//主要是打印出三子棋盘上的九方格图形
void display_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
for (i = 0; i<row; i++)
{
printf(" %c | %c | %c \n",
board[i][0], board[i][1], board[i][2]);//控制只输入三列
if (i != 2)//控制只输入两行
printf("---|---|---\n");
}
}

//打印人进行的棋盘函数
void player_move(char board[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入棋子对应坐标:->   ");
scanf("%d,%d", &x,&y);
x--;
y--;//因为下标是从0开始的,所以各自减去1

4000
if (((x >= 0) && (x <= 2)) && ((y >= 0) && (y <= 2)))
{
if (board[x][y] == ' ')
{
board[x][y] = 'X';
break;
}
else
{
printf("输入的下标有误,请重新输入!");
}
}
else
{
printf("输入的下标有误,请重新输入!");
}
}
}

//打印电脑所进行的棋盘游戏函数
void computer_move(char board[ROWS][COLS], int row, int col)
{
while (1)
{
//rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长
//因此在一定范围内,可以看成是随机的
//比如是用rand()函数产生1-100以内的随机整数:int num=rand()%100
int x = rand() % 3;
int y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '0';
break;
}
}
}

//对棋盘进行判满运算
int chess_full(char board[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
for (x = 0; x < row; x++)
{
for (y = 0; y < col; y++)
{
if (board[x][y] == ' ')
return 0;
}
}
return 1;//表示棋盘已满
}

//判断输赢函数
//主要是三行和三列,以及两个交叉实现三子排成一排
char check_win(char board[ROWS][COLS], 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 (chess_full(board, row, col))
{
return 's';//表示棋盘已满
}
return ' ';
}

//通过在主函数中调用game()函数来具体实现各个函数的相关功能
void game()
{
int ret = 0;
char board[ROWS][COLS] = { 0 };
init_board(board, ROWS, COLS);
display_board(board, ROWS, COLS);//函数的嵌套调用
while (1)
{
printf("player moves:\n");
player_move(board, row, col);
display_board(board, row, col);
ret = check_win(board, row, col);
if (ret != ' ')
break;
printf("computer moves:\n");
computer_move(board, row, col);
display_board(board, row, col);
check_win(board, row, col);
if (ret != ' ')
break;
}
if (ret == 'X')
{
printf("Congratulatons! player wins!\n");
}
else if (ret == '0')
{
printf("Undortunately! player loses!\n");
}
else
{
printf("It's a tie,please play again!\n");
}
}

//通过运用enum常亮,来实现枚举声明,并附上相应的默认值0,1
 enum  Option
{
EXIT,//0
PLAY //1
};

//主函数
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
//time函数可以获取当前的系统时间(但是获取的是秒数,是从1970年1月1日零时零分零秒到目前为止所经过的时间)
do
{
menu();
printf("please choose:-->  ");
scanf("%d", &input);//srand函数是随机数发生器的初始化函数
//为了让每一次程序的调用都产生不同的值,常常使用系统时间来初始化
switch (input)
{
case PLAY:
game();
break;
case EXIT:
break;
default:
printf("default!please choose again!\n");
break;
}
} while (input);
system("pause\n");
return 0;
}

此次程序的成功运行,主要是通过对八个自定义函数,以及对一个enum常量结构体的调用来实现的,以下是对整个程序过程的深入分析:

1.menu函数:在这里,主要是对游戏开始界面的设置。整体来说比较简单,主要是运用了几个printf()函数来具体实现的;

2.init_board函数:此函数主要是进行棋盘的初始化操作。在这里用到了memset()函数,主要是对棋盘的初始化,即对每个方格进行置空,当然,在这里也可以通过两个for循环语句来实现函数初始化;

3.display_board函数:主要用于实现对棋盘井字形框架的打印,在这里要特别注意(i!=2)判断语句,因为在这里主要是打印两行,所以控制两行输出即可;

4.player_move函数:此函数是由玩家来进行完成的,输入任意坐标时,要特别注意坐标的越界问题,在这里通过一个if语句来加以限制;

5.computer_move函数:主要是针对电脑进行游戏的设置,这里通过调用rand()函数来实现1-3之间随机数的抽取;

6.chess_full函数:主要是用来判断棋盘是否已经满格;

7.check_win函数:主要用于判断是否有一方已经赢得了比赛,即对是否出现了三行,三列,或者两个交叉列排成一排进行判断,如果都没有出现,则进行判断是否棋盘已满;

8.game函数:通过对函数的嵌套调用,以此来实现各函数的功能,从而来进行游戏;

9:enum:通过运用enum来定义结构体常量;

10.最后,通过主函数来实现程序的运行,在这里运用到了srand()函数和time()函数,具体用法在此不再累述,请自行查阅,同时也用到switch控制语句来进行判断选择;


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