> 文档中心 > 三子棋游戏

三子棋游戏


头文件game.h

//game.h#include#include #include#define ROW 3#define COL 3//初始化棋盘void init_board(char board[ROW][COL],int row,int col);//打印棋盘void print_board(char board[ROW][COL],int row,int col);//玩家下棋void player_move(char board[ROW][COL], int row, int col);//电脑下棋void computer_move(char board[ROW][COL], int row, int col);//判断输赢char is_win(char board[ROW][COL], int row, int col);

game.c

//game.c#include "game.h"//初始化棋盘,每格都为空格' 'void init_board(char board[ROW][COL],int row,int col){    for(int i = 0; i < row; i++)    { for(int j = 0; j < col; j++) {     board[i][j] = ' '; }    }}//打印棋盘/*   |   |---|---|------|---|---   |   |*/void print_board(char board[ROW][COL],int row,int col){    for(int i = 0; i < row; i++)    { for(int j = 0; j < col; j++) {     printf(" %c ",board[i][j]);     if(j < col-1)  printf("|"); } printf("\n"); if(i < row-1) {     for(int j = 0; j < col; j++)     {  printf("---");  if(j < col-1)  {      printf("|");  }     } } printf("\n");    }}//玩家下棋//第一行第一列坐标就为(1,1)//而不是数组下标(0.0)void player_move(char board[ROW][COL], int row, int col){    int x = 0,y = 0;    printf("玩家下棋:>\n");    while(1)    { scanf("%d%d",&x,&y); if(x>=1 && x<=col && y>=1 && y<=row) {     if(board[x-1][y-1] == ' ')//对应数组下标     {  board[x-1][y-1] = '*';  break;     }     else  printf("坐标已被占用,请重新输入"); } else {     printf("坐标非法请重新输入\n"); }    }    }//电脑下棋,需要用到随机数用rand()来实现,而rand()又需要srand()来设置初始值//srand()调用一次即可,不宜频繁调用,我把srand()放在了main()函数里    //srand():Initialize random number generator    //srand()里面的seed不同时,rand()会产生不同的随机值,利用时间戳在一直变化作为srand的seed来产生不同随机值    //如果不设置srand(),rand()产生的随机值是不变的    void computer_move(char board[ROW][COL], int row, int col){    int x = 0;    int y = 0;    printf("电脑下棋:>\n");    while(1)    { x = rand()%row; //0~row-1 y = rand()%col; //0~col-1 if(board[x][y] == ' ') {     board[x][y] = '#';     break; }    }}//判断棋盘是否已满static int if_full(char board[ROW][COL], int row, int col){    int i = 0;    for (i = 0; i < row; i++)    { int j = 0; for (j = 0; j < col; j++) {     if (board[i][j] == ' ')     {  return 0;//没满     } }    }    return 1;//满了}//判断输赢char is_win(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 (if_full(board, row, col) == 1)    { return 'Q';    } //继续    return 'C';}////玩家赢 - '*'//电脑赢 - '#'//平局   - 'Q'//继续   - 'C'//

main.c

////  main.c//  三子棋////  Created by Atsuki on 2022/1/24.//#include "game.h"void menu(void){    printf("\n");    printf("*1.Play\n");    printf("*0.Exit*\n");    printf("\n");}void game(void){    char ret = 0;    char board[ROW][COL] = {0};    init_board(board, ROW, COL);    print_board(board, ROW, COL); while(1)    {    //玩家下棋 player_move(board, ROW, COL); print_board(board, ROW, COL);      //判断输赢 ret = is_win(board, ROW, COL); if( ret != 'C') {     break; }  //电脑下棋 computer_move(board, ROW, COL); print_board(board, ROW, COL);  判断输赢 ret = is_win(board, ROW, COL); if( ret != 'C') {     break; }    }    if (ret == '*')    { printf("玩家赢了\n");    }    else if (ret == '#')    { printf("电脑赢了\n");    }    else    { printf("平局\n");    }    }void test(void){    int choice = 0; do{ menu();  scanf("%d",&choice); switch (choice) {     case 0:  printf("退出游戏\n");  break;     case 1:  printf("开始游戏\n");    game();    break;default:  printf("请输入0或1\n");  break;      }    }while(choice);}int main(){     //time()的返回f类型为time_t,srand()的参数数据类型为unsigned int    //这里使用强制转换严谨一点    srand((unsigned int)time(NULL));    test();    return 0;}

组装电脑配置清单网