服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 利用C语言实现经典游戏斗兽棋

利用C语言实现经典游戏斗兽棋

2022-10-24 12:36考拉爱睡觉鸭~ C/C++

《斗兽棋》是一款棋类游戏,整个游戏画面是分为两块区域,中间有河流分割两块区域,有桥梁可以让彼此的动物过河,要取得胜利,必须占领那一边动物的巢穴获胜利。本文将用C语言实现这一游戏,需要的可以参考一下

效果图

利用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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
#include<stdio.h>
#include<easyx.h>
#include<stdlib.h>
#include<time.h>
 
#define IMAGE_NUM_ANIMAL 8  //动物图片数量
/* 动物类型枚举 从弱到强*/
enum AnimalType
{
    AT_None,        //没有
    AT_Mouse,       //老鼠
    AT_Cat,         //猫
    AT_Dog,         //狗
    AT_Wolf,        //狼
    AT_Leopard,     //豹子
    AT_Tiger,       //老虎
    AT_Lion,        //狮子
    AT_Elephant,    //大象
    AT_Max
};
enum BothType
{
    BT_Red,
    BT_Blue
};
 
IMAGE img_animals[17];
IMAGE imgs[2];          //背景 前面间距28 水平间距42 上面间距65 垂直间距43
void loadResource()
{
    loadimage(img_animals + 0, "./res/Road.png");
    loadimage(img_animals + 1, "./res/BMouse.png");
    loadimage(img_animals + 2, "./res/BCat.png");
    loadimage(img_animals + 3, "./res/BDog.png");
    loadimage(img_animals + 4, "./res/BWolf.png");
    loadimage(img_animals + 5, "./res/BLeopard.png");
    loadimage(img_animals + 6, "./res/BTiger.png");
    loadimage(img_animals + 7, "./res/BLion.png");
    loadimage(img_animals + 8, "./res/BElephant.png");
 
    loadimage(img_animals + 9, "./res/RMouse.png");
    loadimage(img_animals + 10, "./res/RCat.png");
    loadimage(img_animals + 11, "./res/RDog.png");
    loadimage(img_animals + 12, "./res/RWolf.png");
    loadimage(img_animals + 13, "./res/RLeopard.png");
    loadimage(img_animals + 14, "./res/RTiger.png");
    loadimage(img_animals + 15, "./res/RLion.png");
    loadimage(img_animals + 16, "./res/RElephant.png");
 
    loadimage(imgs + 0, "./res/BackGround.png");
    loadimage(imgs + 1, "./res/Card.png");
}
IMAGE* getAnimalImage(int type)
{
    //如果格子已经加密了
    if (type > 20)
    {
        return imgs + 1;
    }
    if (type >= 0 && type < AT_Max)
    {
        return img_animals + type;
    }
    else if (type > 8 && type < 2 * AT_Max - 1)
    {
        return img_animals + type;
    }
    return NULL;
}
 
 
struct Card
{
    int row;
    int col;
    int animalType;     //动物类型
    //int bothType;     //双方类型 红 蓝
};
#define CardW()     img_animals[0].getwidth()
#define CardH()     img_animals[0].getheight()
#define CardX(col) (28 + col * (CardW() + 42))  //28 左边的间隔  42 横向中间的间隔
#define CardY(row) (65 + row * (CardH() + 43))  //65 上边的间隔  43 横向中间的间隔
 
void card_init(Card* card, int row, int col, int aniType)
{
    card->row = row;
    card->col = col;
    card->animalType = aniType;
}
 
void card_draw(Card* card)
{
    putimage(CardX(card->col), CardY(card->row), getAnimalImage(card->animalType));
}
//获取
int card_type(Card* card)
{
    if (card->animalType <= 8)
    {
        return BT_Blue;
    }
    else if (card->animalType > 8 && card->animalType < AT_Max * 2 - 1)
    {
        return BT_Red;
    }
}
 
//两张牌类型是否相同
bool card_sameType(Card* card1, Card* card2)
{
    return card_type(card1) == card_type(card2);
}
//消费者是否能吃食物
bool card_eat(Card* food, Card* consumer)
{
    //先把大于8的,也转成小于八的,方便比较
    int ftype = food->animalType;
    int ctype = consumer->animalType;
    ftype = ftype > 8 ? food->animalType - 8 : ftype;
    ctype = ctype > 8 ? consumer->animalType - 8 : ctype;
 
    if (!card_sameType(food, consumer) &&           //不是同一方
        ftype <= ctype ||    /*大吃小*/ (ftype == AT_Elephant && ctype == AT_Mouse)//老鼠吃大象
        )
    {
        return true;
    }
    return false;
}
 
Card cards[4][4];
int curBothType = BT_Blue;  //当前行棋方
enum State
{
    Begin,
    End
};
int press = Begin;//第一次点击还是第二次点击
struct Index
{
    int row;
    int col;
}beg = { -1,-1 }, end = { -1,-1 };
 
void init()
{
    srand(time(NULL));
 
    for (int i = 0; i < 4; i++)
    {
        for (int k = 0; k < 4; k++)
        {
            card_init(cards[i] + k, i, k, i * 4 + k + 1);
        }
    }
    //打乱数组
    for (int i = 0; i < 4; i++)
    {
        for (int k = 0; k < 4; k++)
        {
            int r = rand() % 4;
            int c = rand() % 4;
            Card t = cards[r][c];
            cards[r][c] = cards[i][k];
            cards[i][k] = t;
 
        }
 
    }
    //加密数组
    for (int i = 0; i < 4; i++)
    {
        for (int k = 0; k < 4; k++)
        {
            cards[i][k].animalType += 20;
            printf("%d ", cards[i][k].animalType);
        }
        putchar('\n');
    }
}
 
void draw()
{
    //绘制背景
    putimage(0, 0, imgs + 0);
 
    for (int i = 0; i < 4; i++)
    {
        for (int k = 0; k < 4; k++)
        {
            IMAGE* t = getAnimalImage(cards[i][k].animalType);
            putimage(CardX(k), CardY(i), t);
        }
    }
    if (beg.row != -1)
    {
        setlinestyle(PS_SOLID, 3);
        setlinecolor(RED);
        int x = CardX(beg.col);
        int y = CardY(beg.row);
        int w = CardW();
        int h = CardH();
        rectangle(x, y, x + w, y + h);
    }
}
 
//65 264 28 65 90 108
bool isIn(int x, int y, int left, int top, int w, int h)
{
    if (x > left && x < left + w && y > top && y < top + h)
    {
        return true;
    }
    return false;
}
 
void onMouseLbuttonDown(ExMessage* msg)
{
    for (int i = 0; i < 4; i++)
    {
        for (int k = 0; k < 4; k++)
        {
            //判断是否在卡牌上点击
            if (isIn(msg->x, msg->y, CardX(k), CardY(i), CardW(), CardH()))
            {
                //如果没有翻开,则翻开
                if (cards[i][k].animalType > 20)
                {
                    cards[i][k].animalType -= 20;
                }
                //如果翻开了,可以移动或者吃
                else
                {
                    //如果点击的是同一方的牌,直接改变begin
                    //if (card_type(&cards[i][k]) == curBothType)
                    //{
                    //  press = Begin;
                    //}
                    //点击不同的牌在move函数里进行判断
 
                    //移动或者吃,需要知道两次点击的牌
                    if (press == Begin)
                    {
                        beg = { i,k };
                        press = End;
                        printf("begin(%d %d) %d\n", i, k, curBothType);
                    }
                    else if (press == End)
                    {
                        end = { i ,k };
                        press = Begin;
                        printf("end(%d %d) %d\n", i, k, curBothType);
                    }
 
                }
            }
        }
    }
}
 
void move()
{
    //beg end不为-1 并且不是同一个位置
    if ((beg.row != -1 && end.row != -1) && !(beg.row == end.row && beg.col == end.col))
    {
        //在同一列或者同一行
        if ((abs(beg.row - end.row) == 1 && beg.col == end.col) || (abs(beg.col - end.col) == 1 && beg.row == end.row))
        {
            //吃
            bool ok = card_eat(&cards[end.row][end.col], &cards[beg.row][beg.col]);
            //移动
            if (ok || cards[end.row][end.col].animalType == AT_None)
            {
                cards[end.row][end.col] = cards[beg.row][beg.col];
                cards[beg.row][beg.col].animalType = AT_None;
                beg = end = { -1,-1 };
                //切换棋手
                curBothType = (curBothType + 1) % 2;
            }
        }
    }
}
 
int main()
{
    initgraph(540, 677/*, EW_SHOWCONSOLE*/);
    loadResource();
 
    init();
    while (true)
    {
        BeginBatchDraw();
        draw();
        EndBatchDraw();
 
        ExMessage msg;
        while (peekmessage(&msg, EM_MOUSE))
        {
            if (msg.message == WM_LBUTTONDOWN)
            {
                onMouseLbuttonDown(&msg);
            }
        }
 
        move();
    }
 
    getchar();
    return 0;
}

以上就是利用C语言实现经典游戏斗兽棋的详细内容,更多关于C语言斗兽棋的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/weixin_60569662/article/details/123538360

延伸 · 阅读

精彩推荐