黄金矿工代码 c语言
黄金矿工是一款经典的游戏,它的核心玩法是将金块从地下挖掘出来,并将其卖出获得金钱。下面是黄金矿工的C语言代码,使用中文注释,代码量约为1000字。 1. 头文件
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
2. 宏定义
#define MAX_GOLD 15 // 最大金块数
#define LINE_LEN 80 // 画面宽度
#define LINE_CNT 24 // 画面高度
#define GOLD_WORTH_MIN 1 // 金块价值下限
#define GOLD_WORTH_MAX 9 // 金块价值上限
#define GOLD_SIZE_MIN 2 // 金块大小下限
#define GOLD_SIZE_MAX 9 // 金块大小上限
#define MACHINE_LEFT (LINE_LEN - 3) // 机器位置 #define MACHINE_BOTTOM (LINE_CNT - 2)
3. 数据结构定义
typedef struct {
int x; // 金块x坐标
int y; // 金块y坐标
int worth; // 金块价值
int size; // 金块大小
int is_caught; // 是否已捕获
} Gold;
void gotoxy(int x, int y); // 移动光标
void draw_machine(); // 绘制机器
void create_gold(Gold golds[], int num_golds); // 创建金块
void draw_gold(Gold gold); // 绘制金块
void draw_all_golds(Gold golds[], int num_golds); // 绘制所有金块
void move_machine(int* machine_x, int* machine_y); // 移动机器
int check_caught(Gold* gold, int machine_x, int machine_y); // 检查金块是否被捕获
int check_finished(Gold golds[], int num_golds); // 检查游戏是否结束
while (1) { // 游戏主循环
gotoxy(1, 1);
printf("得分:%d\t生命:%d\t关卡:%d\n", score, life, level);
if (num_golds == 0) { // 如果没有金块,创建新金块
num_golds = level + rand() % 3;
create_gold(golds, num_golds);
}
for (int i = 0; i < num_golds; i++) { // 检查每个金块是否被捕获
if (!golds[i].is_caught) { // 如果这个金块还没被捕获
if (check_caught(&golds[i], machine_x, machine_y)) { // 检查是否捕获成功
golds[i].is_caught = 1;
score += golds[i].worth; // 更新得分
}
}
}
Sleep(50); // 暂停50毫秒
system("cls"); // 清屏
}
return 0;
}
6. gotoxy函数
void gotoxy(int x, int y) {
COORD coord = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
这个函数用来移动光标,从而实现在控制台上输出指定位置的字符。 7. draw_machine函数
void draw_machine() {
gotoxy(MACHINE_LEFT, MACHINE_BOTTOM);
printf(" 一 "); // 机头
gotoxy(MACHINE_LEFT, MACHINE_BOTTOM - 1);
printf("|口|"); // 机器的臂
}
这个函数用来绘制机器,包括机头和臂。
这个函数用来创建金块,需要指定需要创建的数量。
9. draw_gold函数
void draw_gold(Gold gold) {
gotoxy(gold.x, gold.y);
printf("%c", '0' + gold.size); // 金块大小用数字0-9表示
}
这个函数用来绘制一个金块,金块大小用数字0-9表示。
这个函数用来绘制所有的金块,只有未被捕获的金块才会被绘制。
void move_machine(int* machine_x, int* machine_y) {
char ch = '\0';
if (_kbhit()) { // 如果有按键,读取按键
ch = _getch();
if (ch == 'a' && *machine_x > 1) { // 向左移动
(*machine_x)--;
}
else if (ch == 'd' && *machine_x < LINE_LEN - 2) { // 向右移动
(*machine_x)++;
}
else if (ch == 'w' && *machine_y > 1) { // 向上移动
(*machine_y)--;
}
else if (ch == 's' && *machine_y < MACHINE_BOTTOM - 1) { // 向下移动
(*machine_y)++;
}
}
gotoxy(*machine_x, *machine_y);
printf("@"); // 显示机器
}
这个函数用来移动机器,根据按键读取操作,并更新机器位置。
12. check_caught函数
这个函数用来检查金块是否被机器捕获,如果捕获成功返回1,否则返回0。
这个函数用来检查游戏是否结束,返回值为0表示游戏继续,1表示游戏结束,2表示生命减一,重新开始,3表示本关结束,进入下一关。