练习---C语言五子棋

一共4个文件,在Linux下编译运行。

game.c 游戏要调用的函数

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 #include <time.h>
  5 #include "game.h"
  6 
  7 void init_board(char arr[ROW][COL])
  8 {
  9     for (int i = 0; i < ROW; i++)
 10     {
 11         for (int j = 0; j < COL; j++)
 12         {
 13             arr[i][j] = ' ';
 14         }
 15     }
 16 }
 17 
 18 //    |   |
 19 // ---|---|---
 20 //    |   |
 21 // ---|---|---
 22 //    |   |
 23 
 24 void print_board(char arr[ROW][COL])
 25 {
 26     // 行打印
 27     for (int i = 0; i < ROW; i++)
 28     {
 29         for (int h = 0; h < COL; h++)
 30         {
 31             printf(" %c ", arr[i][h]);
 32             if (h < COL - 1)
 33             {
 34                 printf("|");
 35             }
 36         }
 37 
 38         printf("\n");
 39         if (i < ROW - 1)
 40         {
 41             for (int k = 0; k < COL; k++)
 42             {
 43                 printf("---");
 44                 if (k < COL - 1)
 45                 {
 46                     printf("|");
 47                 }
 48             }
 49             printf("\n");
 50         }
 51     }
 52 }
 53 
 54 int player_moce(char arr[ROW][COL], int x, int y)
 55 {
 56     if ((x < 1 && x > COL) || (y < 1 && y > ROW))
 57     {
 58         return 1;
 59     }
 60     if (arr[x - 1][y - 1] == ' ')
 61     {
 62         arr[x - 1][y - 1] = 'T';
 63         return 0;
 64     }
 65     else
 66     {
 67         printf("此处已下棋\n");
 68         return 1;
 69     }
 70 }
 71 void robot_move(char arr[ROW][COL])
 72 {
 73     srand((unsigned)time(NULL));
 74     while (1)
 75     {
 76         int x, y;
 77         x = rand() % ROW;
 78         y = rand() % COL;
 79         if (arr[x][y] == ' ')
 80         {
 81             arr[x][y] = 'R';
 82             break;
 83         }
 84     }
 85 }
 86 
 87 char is_win(char arr[ROW][COL])
 88 {
 89     // 谁赢返回谁的棋子
 90     int rt;
 91     //
 92     for (int i = 0; i < ROW; i++)
 93     {
 94         rt = 0;
 95         for (int j = 0; j < COL - 1; j++)
 96         {
 97             if (arr[i][j] == arr[i][j + 1] && arr[i][j] != ' ')
 98             {
 99                 rt++;
100                 printf("行%d\n", rt);
101                 if (rt == NPIECE - 1)
102                 {
103                     return arr[i][j];
104                 }
105             }
106             else
107             {
108                 break;
109             }
110         }
111     }
112     //
113 
114     for (int i = 0; i < COL; i++)
115     {
116         rt = 0;
117         for (int j = 0; j < ROW - 1; j++)
118         {
119             if (arr[j][i] == arr[j + 1][i] && arr[j][i] != ' ')
120             {
121                 rt++;
122                 printf("列%d\n", rt);
123                 if (rt == NPIECE - 1)
124                 {
125                     return arr[j][i];
126                 }
127             }
128             else
129             {
130                 break;
131             }
132         }
133     }
134     // 左向右斜
135     for (int i = 0; i < ROW - 1; i++)
136     {
137         int tmp = i;
138         rt = 0;
139         for (int j = 0; j < COL - 1; j++)
140         {
141             if (arr[i][j] == arr[i + 1][j + 1] && arr[i][j] != ' ')
142             {
143                 rt++;
144                 if (rt == NPIECE - 1)
145                 {
146                     printf("斜%d\n", rt);
147                     printf("斜--%c\n", arr[i][j]);
148                     return arr[i][j];
149                 }
150                 i++;
151             }
152             else
153             {
154                 break;
155             }
156         }
157         i = tmp;
158     }
159     // 右向左斜
160     for (int i = 0; i < ROW - 1; i++)
161     {
162         int tmp = i;
163         rt = 0;
164         for (int j = COL - 1; j > 0; j--)
165         {
166             if (arr[i][j] == arr[i + 1][j - 1] && arr[i][j] != ' ')
167             {
168                 rt++;
169                 printf("右向左斜%d\n", rt);
170                 if (rt == NPIECE - 1)
171                 {
172                     printf("斜%d\n", rt);
173                     printf("右向左斜--%c\n", arr[i][j]);
174                     return arr[i][j];
175                 }
176                 i++;
177             }
178             else
179             {
180                 break;
181             }
182         }
183         i = tmp;
184     }
185 
186     // 还有空位则继续
187     return 'c';
188 }

头文件 game.h

 1 #if !defined(GAME_H)
 2 #define GAME_H
 3 // 定义棋盘长宽
 4 #define ROW 20
 5 #define COL 20
 6 
 7 // 几子胜
 8 #define NPIECE 5
 9 
10 void print_board(char arr[ROW][COL]);
11 void init_board(char arr[ROW][COL]);
12 int player_moce(char arr[ROW][COL], int x, int y);
13 void robot_move(char arr[ROW][COL]);
14 char is_win(char arr[ROW][COL]);
15 
16 #endif // GAME_H

主文件 text1.c

#include <stdio.h>
#include "game.h"

void mune()
{
    printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
    printf("@@@@@@@@@@@@@ 1.play  0.exit  @@@@@@@@@@@@\n");
    printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
}

void game()
{
    int x, y, rt;
    char er;
    char arr[ROW][COL];
    // 初始化棋盘
    init_board(arr);
    print_board(arr);
    while (1)
    {
        do
        {
            // // player走棋
            printf("输入走棋的坐标:\n");
            scanf("%d %d", &x, &y);
            rt = player_moce(arr, x, y);
            if (rt == 1)
            {
                printf("超出棋盘范围!重新输入\n");
            }

        } while (rt);
        print_board(arr);
        // // 判断输赢
        er = is_win(arr);
        if (er != 'c')
        {
            break;
        }

        printf("电脑走棋\n");
        // // 电脑走棋
        robot_move(arr);
        print_board(arr);
        // // 判断输赢
        er = is_win(arr);
        if (er != 'c')
        {
            break;
        }
    }
    if (er == 'R')
    {
        printf("电脑赢\n");
    }
    else if (er == 'T')
    {
        printf("玩家赢\n");
    }
    else
    {
        printf("平局\n");
    }
    
}

void main()
{
    int a;
    do
    {
        mune();
        scanf("%d", &a);
        switch (a)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏!\n");
            break;
        default:
            printf("输入错误\n");
            break;
        }
    } while (a);
}

makefile

text1:text1.o game.o 
    gcc text1.o game.o -o text1
text1.o:text1.c game.h game.c
    gcc -c text1.c -o text1.o
game.o:game.c game.h
    gcc -c game.c -o game.o

 

posted @ 2023-02-05 12:19  潇汀  阅读(0)  评论(0编辑  收藏  举报