2013年10月23日 星期三 10时30分39秒
变量的地址必须是变量自身大小的整数倍,double类型的变量大小按照4计算,这个规则叫做数据对齐
数据对齐会导致结构体变量内部子变量之间有空隙
结构体变量的大小必须是其中最大子变量大小的整数倍(double类型变量按照4计算大小),这个规则叫做数据补齐
数据补齐会造成结构体最后出现一些浪费的字节
声明结构体的时候占地越小的变量越应该声明在前边,占地越大的变量越应该声明在后边,这样可以最大限度的减少空间的浪费
---------------------------------------------------------
枚举类型可以用来把多个相关的概念转换成数字(enum)
使用枚举类型实现转换时转换好的数字是由计算机决定的,计算机给每个概念规定一个对应的整数。
联合可以让多个变量占据同一块内存空间
联合类型使用关键字union声明
数据大小端指变量在内存中存储时各字节的顺序
低数位的数字放在低地址中叫小端,反之叫大端
我们的计算机采用小端方式存储变量
简化版的贪吃蛇:
1.无限大的地图
2.地图上每个格子用两个整数表示它的位置
3.一条蛇占三个位置
4.每次由用户使用数字指定移动方向
5.不能走回头路
6.蛇的位置每次发生变化以后都要把位置在屏幕上打印出来
---------------------------------------------------------
/*
贪吃蛇练习
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
typedef struct {
int x, y;
} pt;
typedef struct {
pt body[3];
} snake;
enum {UP, DOWN, LEFT, RIGHT};
void print(const snake *p_snake) {
int num = 0;
for (num = 0;num <= 2;num++) {
printf("(%d,%d) ", p_snake->body[num].x, p_snake->body[num].y);
}
printf("\n");
}
void place(snake *p_snake) {
p_snake->body[0].x = rand() % 100 + 1;
p_snake->body[0].y = rand() % 100 + 1;
p_snake->body[1] = p_snake->body[0];
p_snake->body[1].x++;
p_snake->body[2] = p_snake->body[1];
p_snake->body[2].x++;
}
bool move(snake *p_snake) {
int direction = 0;
pt tmp = {};
printf("请输入移动方向(%d表示上,%d表示下,%d表示左,%d表示右):", UP, DOWN, LEFT, RIGHT);
scanf("%d", &direction);
tmp = p_snake->body[0];
if (direction == UP) {
tmp.y--;
}
else if (direction == DOWN) {
tmp.y++;
}
else if (direction == LEFT) {
tmp.x--;
}
else if (direction == RIGHT) {
tmp.x++;
}
if (tmp.x == p_snake->body[1].x &&
tmp.y == p_snake->body[1].y) {
return false;
}
p_snake->body[2] = p_snake->body[1];
p_snake->body[1] = p_snake->body[0];
p_snake->body[0] = tmp;
return true;
}
int main() {
snake s;
srand(time(0));
place(&s);
print(&s);
while (1) {
if (move(&s)) {
print(&s);
}
}
return 0;
}
-------------------------改进版-----------------------------
/*
贪吃蛇练习
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
typedef struct {
int x, y;
} pt;
typedef struct {
pt body[3];
int head_pos;
} snake;
enum {UP, DOWN, LEFT, RIGHT};
void print(const snake *p_snake) {
int num = 0;
for (num = p_snake->head_pos;num <= p_snake->head_pos + 2;num++) {
printf("(%d,%d) ", p_snake->body[num % 3].x, p_snake->body[num % 3].y);
}
printf("\n");
}
void place(snake *p_snake) {
p_snake->body[0].x = rand() % 100 + 1;
p_snake->body[0].y = rand() % 100 + 1;
p_snake->body[1] = p_snake->body[0];
p_snake->body[1].x++;
p_snake->body[2] = p_snake->body[1];
p_snake->body[2].x++;
p_snake->head_pos = 0;
}
bool move(snake *p_snake) {
int direction = 0, mid = 0;
pt tmp = {};
printf("请输入移动方向(%d表示上,%d表示下,%d表示左,%d表示右):", UP, DOWN, LEFT, RIGHT);
scanf("%d", &direction);
tmp = p_snake->body[p_snake->head_pos];
if (direction == UP) {
tmp.y--;
}
else if (direction == DOWN) {
tmp.y++;
}
else if (direction == LEFT) {
tmp.x--;
}
else if (direction == RIGHT) {
tmp.x++;
}
mid = p_snake->head_pos == 2 ? 0 : p_snake->head_pos + 1;
if (tmp.x == p_snake->body[mid].x &&
tmp.y == p_snake->body[mid].y) {
return false;
}
p_snake->head_pos = p_snake->head_pos ? p_snake->head_pos - 1 : 2;
p_snake->body[p_snake->head_pos] = tmp;
return true;
}
int main() {
snake s;
srand(time(0));
place(&s);
print(&s);
while (1) {
if (move(&s)) {
print(&s);
}
}
return 0;
}