Day16_枚举、联合及贪吃蛇



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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值