c_snake_game

第 4 课:数据类型与变量 📦

变量是存储数据的容器。本课将介绍 C 语言中的基本数据类型和如何使用变量。


4.1 什么是变量?

想象变量是一个带标签的盒子

┌─────────────┐
│   score     │  ← 变量名(标签)
│     100     │  ← 存储的值
└─────────────┘
int score = 100;  // 创建一个名为 score 的盒子,放入值 100

4.2 基本数据类型

C 语言有几种基本的数据类型:

整数类型

类型 大小 范围 用途
int 4 字节 -21 亿 ~ +21 亿 一般整数
short 2 字节 -32768 ~ +32767 较小整数
long 8 字节 更大范围 大整数
unsigned int 4 字节 0 ~ 42 亿 非负整数
int age = 25;
short small_number = 100;
long big_number = 1000000000;
unsigned int score = 100;  // 分数不能为负数

浮点类型(小数)

类型 大小 精度 用途
float 4 字节 6-7 位 一般小数
double 8 字节 15-16 位 高精度小数
float price = 19.99f;
double pi = 3.1415926535;

字符类型

char grade = 'A';      // 单个字符用单引号
char snake_symbol = '🐍';  // 实际上存储的是编码

布尔类型

#include <stdbool.h>

bool is_game_over = false;
bool has_won = true;

4.3 变量声明与初始化

// 声明变量
int score;

// 初始化变量
score = 100;

// 声明并初始化
int lives = 3;

// 声明多个变量
int x = 0, y = 0, width = 80, height = 24;

4.4 在贪吃蛇中的应用

看看我们的游戏中如何使用这些类型:

// 蛇的位置(整数坐标)
int snake_x = 10;
int snake_y = 5;

// 游戏状态
int score = 0;
int high_score = 1000;
int level = 1;

// 布尔状态
bool is_game_over = false;
bool is_paused = false;

// 方向(可以用枚举或整数)
int direction = 0;  // 0=上,1=下,2=左,3=右

// 字符显示
char snake_head = 'O';
char snake_body = '#';
char food_symbol = '*';

4.5 格式化输出

使用 printf 输出不同类型的变量:

#include <stdio.h>

int main(void) {
    int score = 100;
    float speed = 3.14f;
    char symbol = '*';
    bool active = true;
    
    printf("分数:%d\n", score);      // %d 用于整数
    printf("速度:%.2f\n", speed);    // %.2f 用于小数,保留 2 位
    printf("符号:%c\n", symbol);     // %c 用于字符
    printf("激活:%s\n", active ? "是" : "否");  // 三元运算符
    
    return 0;
}

常用格式说明符

说明符 类型 示例
%d int printf("%d", 42);42
%f float/double printf("%.2f", 3.14);3.14
%c char printf("%c", 'A');A
%s 字符串 printf("%s", "hello");hello
%p 指针 printf("%p", ptr);0x7fff...

4.6 常量

有些值不应该改变,使用常量:

// 方法 1:#define 预处理器宏
#define MAX_SCORE 1000
#define PI 3.14159

// 方法 2:const 关键字
const int MAX_LIVES = 3;
const float GRAVITY = 9.8f;

// 在贪吃蛇中
#define SCREEN_WIDTH 80
#define SCREEN_HEIGHT 24
#define INITIAL_SPEED 100

4.7 类型转换

int a = 10;
float b = 3.0f;

// 隐式转换(自动)
float result = a / b;  // 10 / 3.0 = 3.333...

// 显式转换(强制)
int c = (int)3.99;     // c = 3(截断小数部分)

// 注意整数除法
int x = 10 / 3;        // x = 3,不是 3.333!
float y = 10.0 / 3;    // y = 3.333...

4.8 实战练习

练习 1:计算蛇的长度

#include <stdio.h>

int main(void) {
    int initial_length = 3;
    int food_eaten = 5;
    int growth_per_food = 1;
    
    // 计算当前长度
    int current_length = initial_length + (food_eaten * growth_per_food);
    
    printf("蛇的初始长度:%d\n", initial_length);
    printf("吃掉的食物:%d\n", food_eaten);
    printf("当前长度:%d\n", current_length);
    
    return 0;
}

练习 2:游戏统计

#include <stdio.h>

int main(void) {
    // 定义游戏统计数据
    int games_played = 10;
    int games_won = 7;
    float win_rate = 70.5f;
    int high_score = 1500;
    char player_name = 'A';  // 玩家等级
    
    // 输出统计信息
    printf("=== 游戏统计 ===\n");
    printf("游戏次数:%d\n", games_played);
    printf("获胜次数:%d\n", games_won);
    printf("胜率:%.1f%%\n", win_rate);
    printf("最高分:%d\n", high_score);
    printf("玩家等级:%c\n", player_name);
    
    return 0;
}

4.9 常见错误

错误 1:未初始化变量

int score;
printf("%d\n", score);  // ❌ 未定义的值

错误 2:类型不匹配

int x = 10;
x = 3.14;  // ❌ 小数赋给整数,会丢失精度

错误 3:整数除法陷阱

int a = 5;
int b = 2;
float result = a / b;  // ❌ result = 2.0,不是 2.5!
float correct = (float)a / b;  // ✅ result = 2.5

✅ 本课检查清单


📝 作业

  1. 创建一个程序,定义以下变量并输出:
    • 蛇的 X、Y 坐标
    • 当前分数
    • 游戏等级
    • 是否暂停
  2. 计算并输出:
    • 如果每吃一个食物得 10 分,吃了 7 个食物后总分是多少?
    • 如果等级每 50 分提升一级,当前等级是多少?

下一课:函数