项目介绍
超级玛丽游戏是一款经典的横版卷轴平台游戏,玩家控制玛丽在不同的关卡中跳跃、避免障碍、击败敌人并收集金币。本项目将使用C语言实现一个简化版的超级玛丽游戏,主要包括以下功能:
- 玛丽的横向移动与跳跃。
- 简单的障碍物(如管道、敌人等)。
- 简单的关卡设计和得分系统。
本项目的目标是模拟一个类似超级玛丽的游戏环境,在控制台中通过字符来表示不同的游戏元素。
项目实现思路
-
游戏界面设计 游戏的每一帧将展示一个字符画的场景,玩家将控制玛丽的角色。游戏场景包括地面、平台、障碍物、敌人等。
-
输入控制 玩家通过键盘输入控制玛丽的左右移动和跳跃。跳跃的实现需要通过改变玛丽的位置来模拟。
-
游戏循环 游戏将进入一个主循环,在每一帧中:
- 更新游戏状态(玛丽的位置、敌人位置、平台位置等)。
- 检测玩家的输入。
- 渲染游戏画面。
- 判断游戏是否结束(如玩家掉下去)。
-
碰撞检测 检测玛丽是否与敌人、平台发生碰撞,是否跳跃至空中等。
-
得分与关卡 玩家通过避开敌人和收集物品来得分。关卡的设计可以逐渐增加难度,如增加更多的障碍物和敌人。
实现代码
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
// 游戏场景的大小
#define SCREEN_WIDTH 50
#define SCREEN_HEIGHT 20
// 游戏角色
#define MARIO 'M'
#define GROUND '-'
#define ENEMY 'E'
#define EMPTY ' '
// 游戏状态
char screen[SCREEN_HEIGHT][SCREEN_WIDTH];
int marioX = 5, marioY = 15; // 玛丽的初始位置
int enemyX = 30, enemyY = 15; // 敌人的初始位置
int score = 0;
int isJumping = 0; // 跳跃状态
int jumpHeight = 5; // 最大跳跃高度
int gravity = 1; // 重力
// 清空屏幕
void clearScreen() {
system("cls");
}
// 绘制屏幕
void drawScreen() {
clearScreen();
for (int y = 0; y < SCREEN_HEIGHT; y++) {
for (int x = 0; x < SCREEN_WIDTH; x++) {
// 检查玛丽是否在当前位置
if (x == marioX && y == marioY) {
screen[y][x] = MARIO;
}
// 检查敌人是否在当前位置
else if (x == enemyX && y == enemyY) {
screen[y][x] = ENEMY;
}
// 检查地面
else if (y == SCREEN_HEIGHT - 1) {
screen[y][x] = GROUND;
}
// 其他位置为空
else {
screen[y][x] = EMPTY;
}
printf("%c", screen[y][x]);
}
printf("\n");
}
printf("Score: %d\n", score);
}
// 移动玛丽
void moveMario(int dx) {
if (marioX + dx >= 0 && marioX + dx < SCREEN_WIDTH) {
marioX += dx;
}
}
// 跳跃
void jumpMario() {
if (!isJumping) {
isJumping = 1;
int initialY = marioY;
// 跳跃的过程
for (int i = 0; i < jumpHeight; i++) {
if (marioY > 0) {
marioY--;
drawScreen();
Sleep(100);
}
}
// 重力作用,跳跃回落
for (int i = 0; i < jumpHeight; i++) {
if (marioY < initialY) {
marioY++;
drawScreen();
Sleep(100);
}
}
isJumping = 0;
}
}
// 检测碰撞
void checkCollisions() {
if (marioX == enemyX && marioY == enemyY) {
printf("Game Over! You were hit by an enemy!\n");
exit(0);
}
}
// 游戏主循环
void gameLoop() {
while (1) {
drawScreen();
if (_kbhit()) {
char ch = _getch();
if (ch == 'a') { // 向左移动
moveMario(-1);
} else if (ch == 'd') { // 向右移动
moveMario(1);
} else if (ch == 'w') { // 跳跃
jumpMario();
}
}
checkCollisions();
// 简单的敌人移动逻辑
enemyX--;
if (enemyX < 0) {
enemyX = SCREEN_WIDTH - 1;
score++; // 每次敌人回到屏幕时得分
}
Sleep(100); // 控制游戏速度
}
}
// 程序入口
int main() {
printf("Welcome to the Super Mario game!\n");
printf("Use 'a' to move left, 'd' to move right, and 'w' to jump.\n");
printf("Press any key to start...\n");
_getch(); // 等待玩家按键开始
gameLoop();
return 0;
}
代码解读
-
全局变量
screen
:一个二维字符数组,表示游戏场景的每一帧。marioX
,marioY
:表示玛丽的位置。enemyX
,enemyY
:表示敌人的位置。score
:游戏得分。isJumping
:指示玛丽是否正在跳跃。jumpHeight
:玛丽跳跃的最大高度。gravity
:重力值,用于控制跳跃过程。
-
clearScreen
- 使用
system("cls")
清空控制台屏幕。每一帧绘制之前先清空屏幕。
- 使用
-
drawScreen
- 绘制当前的游戏场景,显示玛丽、敌人和地面。
- 每个位置的字符由
screen
数组中的内容决定。
-
moveMario
- 控制玛丽的横向移动,
dx
表示水平移动的增量。通过_kbhit
和_getch
检测用户输入,使用'a'
和'd'
键分别让玛丽向左和向右移动。
- 控制玛丽的横向移动,
-
jumpMario
- 实现跳跃功能。玛丽跳跃的过程通过逐步减少
marioY
来模拟向上跳跃,之后通过逐步增加marioY
来模拟重力作用下的下落。
- 实现跳跃功能。玛丽跳跃的过程通过逐步减少
-
checkCollisions
- 检查玛丽是否与敌人发生碰撞。如果发生碰撞,游戏结束并输出“Game Over”。
-
gameLoop
- 游戏的主循环,负责更新游戏状态、处理用户输入、检查碰撞以及绘制画面。
项目总结
本项目实现了一个简化版的超级玛丽游戏,其中包括了玛丽的横向移动、跳跃、敌人、得分以及碰撞检测等基础功能。尽管该游戏只是一个控制台版的简单模拟,但它展现了如何使用C语言来实现基本的图形和游戏逻辑。通过键盘输入控制玛丽的动作,游戏的运行依赖于一个不断更新的主循环,并且每个游戏动作都通过字符图形进行呈现。
未来的扩展
- 增加更多的敌人:可以增加不同类型的敌人,甚至设计敌人AI,使敌人有不同的移动模式。
- 关卡设计:通过增加不同的障碍物和平台,设计多关卡的游戏流程。
- 图形化界面:将字符画转换为图形界面,使用图像库(如SDL、OpenGL)来实现更丰富的图形效果。
- 音效和背景音乐:通过集成音效库,为游戏加入音效和背景音乐,使游戏体验更加丰富。