C语言版召唤神龙

C语言版召唤神龙

听说最近很火的一个小游戏,看了下,其实代码逻辑挺简单的,所以用C实现了一个,有点类似贪吃蛇,还有之前的球球大作战。
游戏中,总共有蝌蚪(!),青蛙(蛙),乌龟(龟),龙(龙),四种怪,玩家可以通过上下左右键控制自己的角色移动,触碰到其他怪,如果等级一样或者小则可以吃掉,吃掉同样两个则可以进化,进化到最高级龙王则游戏结束,玩家也可以按q来结束游戏

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
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define MAX_level 5
#define MAX_map 40 //游戏棋盘大小
//游戏有1蝌蚪,2青蛙,3乌龟,4龙 只能吃比自己小或同等级的 吃到两个同等级的升级一次 每2秒会随机生成与一个新的怪
struct User //玩家对象
{
int x,y; //坐标
int level; //等级
int carry[MAX_level]; //携带量
int flag; //1左,2上,3右,4下

};
int map[MAX_map][MAX_map]; //游戏棋盘 0表示墙 1蝌蚪,2青蛙,3乌龟,4龙 5龙王--游戏结束
User init(){
int i,j;
//初始化棋盘
for (i = 0; i < MAX_map; ++i)
{
for (j = 0; j < MAX_map; ++j)
{
if(i==0||j==0||i==MAX_map-1||j==MAX_map-1)
map[i][j] = 0; //0表示墙
else
map[i][j] = -1; //空位置
}
}
User o;
o.x = int(rand()%(MAX_map/2)+MAX_map/4);
o.y = int(rand()%(MAX_map/2)+MAX_map/4);
o.level = 1;
for(i=0;i<MAX_level;i++){
o.carry[i] = 0;
}
o.carry[0] = 0;
o.flag = rand()%4+1;
map[o.x][o.y] = 1;
return o;
}
void add_obj(){
int t = 0;
while(t<10){//防止生成的位置已经有目标,所以允许循环十次生成
int x = rand()%(MAX_map-1)+1; //生成坐标
int y = rand()%(MAX_map-1)+1;
if(map[x][y]==-1){//当前位置没有怪
int level = rand()%4+1;
map[x][y] = level;
break;
}
t++;
}
}
User up_level(User o, int level){ //回调函数,升级
if(level == o.level){ //当前携带的和自己同等级则升级
o.level+=1;
o.carry[level] = 0;
}else if(o.carry[level]==1){ //比自己等级小 且这个等级之前已经携带过,则携带的升级
o.carry[level] = 0;
o = up_level(o, level+1);
}else{ //之前没携带,则携带量+1
o.carry[level] = 1;
}
return o;
}
bool move_kill(User &o){
map[o.x][o.y] = -1;//把原来位置滞空
//移动
if(o.flag == 1){
o.y -= 1;
}else if(o.flag == 2){
o.x -= 1;
}else if(o.flag == 3){
o.y += 1;
}else if(o.flag == 4){
o.x += 1;
}
int f = map[o.x][o.y];//当前位置状态
//判断当前位置状态
if(f == -1){//当前位置啥都没有
map[o.x][o.y] = o.level;
return true;
}
if(f == 0||f>o.level)//撞墙 碰到比自己等级大的 游戏结束
return false;

o = up_level(o,f);
if(o.level == MAX_level) // 升级到龙王游戏结束
return false;
return true;
}
void menu(){
system("cls");//清空之前的输出
printf("-----------------召唤神龙------------------\n");
for (int i = 0; i < MAX_map; ++i)
{
for (int j = 0; j < MAX_map; ++j)
{
switch(map[i][j]){
case 0:printf("#");break;
case 1:printf("!");break;
case 2:printf("蛙");break;
case 3:printf("龟");break;
case 4:printf("龙");break;
default:printf(" ");break;
}
}
printf("\n");
}
}

int main()
{
bool f = true;//判断游戏是否结束 变成龙结束,撞墙结束,吃到比自己等级大的结束 按q也可以结束游戏
int time = 500;
User o = init();
menu();//显示游戏界面
int t = 0;
while(f){
if(_kbhit()){//如果有按键盘,则返回为真
char c = _getch();//获取按键
if(c == 'q'){ //游戏结束
break;
}
if(c == -32){
continue;
}else if(c == 75){
o.flag = 1;
}else if(c == 72){
o.flag = 2;
}else if(c == 77){
o.flag = 3;
}else if(c == 80){
o.flag = 4;
}
}
if(t>4){ //两秒增加一个对象
add_obj();
t = 0;
}
Sleep(time); //等待半秒
f = move_kill(o);
menu();
t++;
}
if(o.level==MAX_level)
printf("-----------------游戏结束 胜利------------------\n");
else
printf("-----------------游戏结束 失败------------------\n");
return 0;
}


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!