一、使用结构体编写通讯录的一部分内容
int main()
{
struct Txl a[10] = {0};
int count = 0;
int length = 0;
int i,t = 0;
while(1)
{
printf("------------------\n");
printf("1、请输入ID和联系人\n");
printf("2、查看ID和联系人\n");
printf("3、删除ID和联系人\n");
printf("------------------\n");
scanf("%d",&count);
switch(count) //根据输入的count决定不同的功能
{
case 1: //写入信息
printf("请输入ID\n");
scanf("%d",&a[length].id);
printf("请输入联系人\n");
scanf("%s",a[length].name);
length++;
break;
case 2: //读取信息
for(i = 0; i < length; i++)
{
printf("ID:%d\t",a[i].id);
printf("联系人:%s\n",a[i].name);
}
break;
case 3: //删除信息
printf("删除第几个\n");
scanf("%d",&t);
for(i = t ; i < length ; i++)
{
a[i-1].id = a[i].id;
strcpy(a[i-1].name,a[i].name);
}
length--;
break;
default: //无效的按键
printf("无效选择\n");
break;
}
}
}
二、贪吃蛇小程序
由于一些小的问题卡住了,听了通学的解释后明天的问题在哪,并且解决了问题.
程序比较长,分几个小部分
1、一些初始化和定义
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <signal.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#define KEYCODE_U 0x41 // 向上按键
#define KEYCODE_D 0x42 // 向下按键
#define KEYCODE_L 0x44 // 向左按键
#define KEYCODE_R 0x43 // 向右按键
#define SIZE 17 //地图大小
int kfd = 0;
struct termios cooked, raw;
char dir = KEYCODE_U; // 当前蛇的移动方向
// 获取键盘响应:上、下、左、右键
void* get_dir(void *a)
{
while(1)
{
char c;
tcgetattr(kfd, &cooked); // 得到 termios 结构体保存,然后重新配置终端
memcpy(&raw, &cooked, sizeof(struct termios));
raw.c_lflag &=~ (ICANON | ECHO);
raw.c_cc[VEOL] = 1;
raw.c_cc[VEOF] = 2;
tcsetattr(kfd, TCSANOW, &raw);
if(read(kfd, &c, 1) < 0)
{
perror("read():");
exit(-1);
}
tcsetattr(kfd, TCSANOW, &cooked);//在程序结束时在恢复原来的配置
dir = c;
}
}
unsigned char map[SIZE][SIZE] = {0}; // 游戏地图
unsigned char snake[50] = {133}; // 初始化蛇坐标,游戏开始的时候蛇在(8,5)这个位置
unsigned char food = 67; // 食物的坐标,游戏开始的时候在(4,3)这个位置
int len = 1; // 保存蛇的当前长度
2、将 数字 转化为坐标系
// 将 数字 转化为坐标系
void num_to_xy(unsigned char num, unsigned char *x, unsigned char *y)
{
*x = num/16;
*y = num%16;
}
3、更新地图数据
// 更新地图数据
void update_map()
{
int i,j,k;
unsigned char x,y;
unsigned char xfood,yfood;
for(i = 0;i < SIZE;i++) //地图的数据
{
num_to_xy(food,&xfood,&yfood);
for(j = 0;j < SIZE;j++)
{
if(i == SIZE-1 || i == 0 || j == SIZE-1 || j == 0)
map[i][j] = '#';
else if(i == yfood && j == xfood)
map[yfood][xfood] = '$';
else
map[i][j] = ' ';
}
}
for(k = 0; k < len ; k++) //蛇的数据
{
num_to_xy(snake[k],&x,&y);
for(i = 0; i < SIZE; i++)
{
for(j = 0;j < SIZE ;j++)
{
if(i == y && j == x)
{
map[i][j] = '*';
}
}
}
}
}
4、打印地图
// 打印地图
void print_map()
{
int i,j;
for(i = 0;i < SIZE;i++)
{
for(j = 0;j < SIZE;j++)
{
printf("%c",map[i][j]);
}
printf("\n");
}
}
5、生成食物
// 生成食物
void generate_food()
{
unsigned char x,y; // 转换成坐标
int i;
srand((unsigned) time(NULL));
food = rand()%288;
num_to_xy(food, &x, &y);
while(x == 0 || x == SIZE || y == 0 || y == SIZE) //生成一个新的食物并且判断食物生成的位置是否是边框
{
food = rand()%288;
num_to_xy(food, &x, &y);
}
for(i = 0;i < len;i++) //生成一个新的食物并且判断食物生成的位置是否是蛇的位置
{
if(food == snake[i])
{
food = rand()%288;
num_to_xy(food, &x, &y);
i = 0;
}
}
}
6、移动蛇
// 移动蛇
void move_snake()
{
unsigned char x,y;
num_to_xy(snake[0], &x, &y); // 获取蛇头的坐标
int i;
// 判断移动方向
switch (dir)
{
case KEYCODE_U: // 向上移动
y--;
break;
case KEYCODE_D: // 向下移动
y++;
break;
case KEYCODE_L: // 向左移动
x--;
break;
case KEYCODE_R: // 向右移动
x++;
break;
}
int end = snake[len-1]; //记录移动前的蛇的最后一位数据
for(i = len-1;i > 0;i--) //移动蛇是将数组从最后第二位开始往后覆盖
{
snake[i] = snake[i-1];
}
snake[0] = 16 * x + y; //蛇头的位置
if(food == snake[0]) //判断蛇头有没有吃到食物
{
len++;
snake[len-1] = end;
generate_food(); //吃到食物就要调用食物生成的函数
}
}
7、判断蛇是否应该存活,如果返回值是0代表应该存活,1代表不应该存活
// 判断蛇是否应该存活,如果返回值是0代表应该存活,1代表不应该存活
int isalive()
{
int i,eat_self = 0; //给蛇判断有没有碰到自己
unsigned char x,y;
num_to_xy(snake[0], &x, &y); // 获取蛇头的坐标
for(i = 1; i < len; i++) //判断蛇的头是否碰到蛇的数组中的一个数
{
if(snake[0] == snake[i])
eat_self = 1;
}
return x == 0 || y == 0 || x == SIZE-1 || y == SIZE-1 || eat_self ?1:0; //判断有没有碰到边框
}
8.主函数
int main()
{
// 开启一个线程用于获取键盘的上下左右键响应
pthread_t tid1;
pthread_create(&tid1, NULL, get_dir, NULL);
while(1)
{
// 更新地图数据
update_map();
// 打印地图
system("clear");
print_map();
usleep(500000/(len/5+1));
// 移动蛇
move_snake();
if (isalive() == 1)
{
break;
}
}
tcsetattr(kfd, TCSANOW, &cooked);//在程序结束时在恢复原来的配置
printf ("Game Over!\n");
return 0;
}
注意:这个程序当蛇超过3节就不能逆向跑了。