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

来源:互联网 发布:基金开户数据 编辑:程序博客网 时间:2024/05/21 19:51
首先,把全部代码罗列如下:
#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开始的,所以各自减去1if (((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()%100int 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控制语句来进行判断选择;

 
原创粉丝点击