用c语言实现和平精英的完整代码

时间:2021-12-10 23:43:10

前言:《有趣的和平精英—啊不,三子棋小游戏》

三子棋简介

三子棋, 是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形 对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时 候会出现和棋的情况。

游戏规则

如果两个人都掌握了技巧,那么一般来说就是平棋。一般来说,第二步下在中间最有利(因为第一步不能够下在中间),下在角上次之,下在边上再次之。那么当我们使用c语言时候,该怎么操作呢?如下所示

第一部分!游戏大致框架概览

在敲这个代码之前,我们要先在脑海中形成大致的脉络,不要不加思考就开始敲代码嗷~
这个时候,脑袋里应该有这样滴想法~~

用c语言实现和平精英的完整代码

test.c部分

游戏菜单

首先呢,我们要先构思出一个游戏菜单,就像这样!

代码展示

?
1
2
3
4
5
6
7
8
9
10
#define _crt_secure_no_warnings
#include "game.h"
 
void menu()
{
    printf("******************************\n");
    printf("******    1. play        *****\n");
    printf("******    0. exit        *****\n");
    printf("******************************\n");
}

如图

用c语言实现和平精英的完整代码

初始化棋盘

在这里,我们要想的是,如何才能在计算机上面形成一个能被它识别的棋盘呢?
用c语言实现和平精英的完整代码
这个时候我们就可以联想到二维数组

如图所示

?
1
2
3
4
5
6
7
8
9
void game()
{
    //存储数据 - 二维数组
    char board[row][col];
    //初始化棋盘 - 初始化空格
    initboard(board, row, col);
 
    //打印一下棋盘 - 本质是打印数组的内容
    displayboard(board, row, col);

游戏过程大致推演 在这里呢,我们需要运用while,if,do while,switch
等基本语句

先是玩家下棋,判断玩家是否赢得游戏,然后就轮到电脑,判断电脑是否赢得游戏,接着判断是否平局,可惜因为代码的原因,我们这个游戏很难实现平局emmmmmmm,欢迎大家在评论区提出自己的想法啊。。。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
char ret = 0;//接受游戏状态
    while (1)
    {
        //玩家下棋
        playermove(board, row, col);
        displayboard(board, row, col);
        //判断玩家是否赢得游戏
        ret = iswin(board, row, col);
        if (ret != 'c')
            break;
        //电脑下棋
        computermove(board, row, col);
        displayboard(board, row, col);
        //判断电脑是否赢得游戏
        ret = iswin(board, row, col);
        if (ret != 'c')
            break;
    }
    if (ret == '*')
    {
        printf("玩家赢了\n");
    }
    else if (ret == '#')
    {
        printf("电脑赢了\n");
    }
    else
    {
        printf("平局\n");
    }
    displayboard(board, row, col);
}
 
int main()
{
    int input = 0;
    srand((unsigned int)time(null));
 
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误,重新选择\n");
            break;
        }
    } while (input);
 
    return 0;
}

game.h部分

头文件的包含并定义符号

@这里是为我们游戏的实现铺路!如果没有它们,计算机不会知道我们前面的函数代表什么意思,比如我们的自定义函数


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma once
 
//头文件的包含
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
 
//符号的定义
#define row 3
#define col 3
 
//函数的声明
 
//初始化棋盘的
void initboard(char board[row][col], int row, int col);
 
//打印棋盘的函数
void displayboard(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);

接着判断它是否输赢

?
1
2
3
4
5
6
7
8
//
//1. 玩家赢了 - *
//2. 电脑赢了 - #
//3. 平局 - q
//4. 游戏继续 - c
 
//判断游戏是否有输赢
char iswin(char board[row][col], int row, int col);

激动人心的 game.c部分

全部代码展示

如下图

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#define _crt_secure_no_warnings 1
 
#include "game.h"
 
 
 
void initboard(char board[row][col], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            board[i][j] = ' ';
        }
    }
}
 
 
 
 
void displayboard(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++)
        {
            printf(" %c ", board[i][j]);
            if(j<col-1)
                printf("|");
        }
        printf("\n");
        if (i < row - 1)
        {
            int j = 0;
            for (j = 0; j < col; j++)
            {
                printf("---");
                if(j<col-1)
                    printf("|");
            }
            printf("\n");
        }
    }
}
 
 
void playermove(char board[][col], int row, int col)
{
    int x = 0;
    int y = 0;
 
    printf("玩家走:>\n");
 
    while (1)
    {
        printf("请输入下棋的坐标:>");
        scanf("%d %d", &x, &y);
        //判断坐标合法性
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            //下棋
            //坐标是否被占用
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = '*';
                break;
            }
            else
            {
                printf("坐标被占用, 请重新输入\n");
            }
        }
        else
        {
            printf("坐标非法, 请重新输入\n");
        }
    }
}
 
void computermove(char board[row][col], int row, int col)
{
    printf("电脑走:>\n");
 
    while (1)
    {
        int x = rand() % row;
        int y = rand() % col;
 
        //判断占用
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}
 
 
int isfull(char board[row][col], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (board[i][j] == ' ')
            {
                return 0;//棋盘没满
            }
        }
    }
 
    return 1;//棋盘满了
}
char iswin(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];
    }
 
    //判断平局
    //如果棋盘满了返回1, 不满返回0
    int ret = isfull(board, row, col);
    if (ret == 1)
    {
        return 'q';
    }
 
    //继续
    return 'c';
}

结局

用c语言实现和平精英的完整代码


全部代码展示

 test.c

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#define _crt_secure_no_warnings 1
 
#include "game.h"
 
void menu()
{
    printf("******************************\n");
    printf("******    1. play        *****\n");
    printf("******    0. exit        *****\n");
    printf("******************************\n");
}
 
void game()
{
    //存储数据 - 二维数组
    char board[row][col];
    //初始化棋盘 - 初始化空格
    initboard(board, row, col);
 
    //打印一下棋盘 - 本质是打印数组的内容
    displayboard(board, row, col);
    char ret = 0;//接受游戏状态
    while (1)
    {
        //玩家下棋
        playermove(board, row, col);
        displayboard(board, row, col);
        //判断玩家是否赢得游戏
        ret = iswin(board, row, col);
        if (ret != 'c')
            break;
        //电脑下棋
        computermove(board, row, col);
        displayboard(board, row, col);
        //判断电脑是否赢得游戏
        ret = iswin(board, row, col);
        if (ret != 'c')
            break;
    }
    if (ret == '*')
    {
        printf("玩家赢了\n");
    }
    else if(ret == '#')
    {
        printf("电脑赢了\n");
    }
    else
    {
        printf("平局\n");
    }
    displayboard(board, row, col);
}
 
int main()
{
    int input = 0;
    srand((unsigned int)time(null));
 
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误,重新选择\n");
            break;
        }
    } while (input);
 
    return 0;
}

game.c

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#define _crt_secure_no_warnings 1
 
#include "game.h"
 
 
 
void initboard(char board[row][col], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            board[i][j] = ' ';
        }
    }
}
 
//void displayboard(char board[row][col], 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<row-1)
//          printf("---|---|---\n");
//  }
//}
//
 
 
void displayboard(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++)
        {
            printf(" %c ", board[i][j]);
            if(j<col-1)
                printf("|");
        }
        printf("\n");
        if (i < row - 1)
        {
            int j = 0;
            for (j = 0; j < col; j++)
            {
                printf("---");
                if(j<col-1)
                    printf("|");
            }
            printf("\n");
        }
    }
}
 
 
void playermove(char board[][col], int row, int col)
{
    int x = 0;
    int y = 0;
 
    printf("玩家走:>\n");
 
    while (1)
    {
        printf("请输入下棋的坐标:>");
        scanf("%d %d", &x, &y);
        //判断坐标合法性
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            //下棋
            //坐标是否被占用
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = '*';
                break;
            }
            else
            {
                printf("坐标被占用, 请重新输入\n");
            }
        }
        else
        {
            printf("坐标非法, 请重新输入\n");
        }
    }
}
 
void computermove(char board[row][col], int row, int col)
{
    printf("电脑走:>\n");
 
    while (1)
    {
        int x = rand() % row;
        int y = rand() % col;
 
        //判断占用
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}
 
 
int isfull(char board[row][col], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (board[i][j] == ' ')
            {
                return 0;//棋盘没满
            }
        }
    }
 
    return 1;//棋盘满了
}
char iswin(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];
    }
 
    //判断平局
    //如果棋盘满了返回1, 不满返回0
    int ret = isfull(board, row, col);
    if (ret == 1)
    {
        return 'q';
    }
 
    //继续
    return 'c';
}

game.h

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#pragma once
 
//头文件的包含
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
 
//符号的定义
#define row 3
#define col 3
 
//函数的声明
 
//初始化棋盘的
void initboard(char board[row][col], int row, int col);
 
//打印棋盘的函数
void displayboard(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);
 
//
//1. 玩家赢了 - *
//2. 电脑赢了 - #
//3. 平局 - q
//4. 游戏继续 - c
 
//判断游戏是否有输赢
char iswin(char board[row][col], int row, int col);

把他们组合到一起,就能玩游戏啦

用c语言实现和平精英的完整代码

总结

其实这个代码本身所用到的函数等并不复杂,还是需要我们灵活的去运用他们,如此往复,我们的编程能力就会有所提高。下面附上博主的gitee地址呀,欢迎来访。
https://gitee.com/coder-xiyuan/test/tree/master/c/c

到此这篇关于用c语言实现和平精英的文章就介绍到这了,更多相关c语言和平精英内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_55507028/article/details/116128504