贪吃蛇
2015-12-26 15:49
120 查看
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #define SNAKE_HEAD 'H' //对所用到的字符的标识 #define SNAKE_BODY 'X' #define BLANK_CELL ' ' #define SNAKE_FOOD '$' #define WALL_CELL '*' int snake_X[100] = {5, 4, 3, 2, 1}; //表示蛇的坐标 int snake_Y[100] = {1, 1, 1, 1, 1}; int food_X, food_Y; //食物的坐标 int length = 5; //蛇身长度 char maze[12][12] = { //定义字符矩阵,初始状态 "***********", "*XXXXH *", "* *", "* *", "* *", "* *", "* *", "* *", "* *", "* *", "***********", }; void output(void) { //输出字符矩阵 for (int i = 0; i <= 11; i++) { for (int j = 0; j <= 11; j++) { printf("%c", maze[i][j]); } printf("\n"); } } void Food_() { //随机产生食物 srand((unsigned)(time(NULL))); do { food_X = rand() % 9; food_Y = rand() % 9; } while (maze[food_Y][food_X] != ' '); maze[food_Y][food_X] = '$'; } void snake_Move() { //蛇移动的实现 maze[snake_Y[length - 1]][snake_X[length - 1]] = ' '; for (int i = length - 1; i > 0; i--) { snake_X[i] = snake_X[i - 1]; snake_Y[i] = snake_Y[i - 1]; maze[snake_Y[i]][snake_X[i]] = 'X'; } } int Gameover(void) { //作为游戏结束的判断 if (snake_X[0] == 10 || snake_Y[0] == 10 || snake_X[0] == 0 || snake_Y[0] == 0) { return 0; } for (int j = 1; j < length; j++) { if (snake_X[0] == snake_X[j] && snake_Y[0] == snake_Y[j]) { return 0; } } return 1; } int main() { char shuru; int judge; Food_(); output(); while(1) { scanf(" %c", &shuru); //用户输入方向键 snake_Move(); if (shuru == 'a') { //按键‘a ’表示向左走一步 snake_X[0] -= 1; maze[snake_Y[0]][snake_X[0]] = 'H'; } if (shuru == 'd') { //按键‘d ’表示向右走一步 snake_X[0] += 1; maze[snake_Y[0]][snake_X[0]] = 'H'; } if (shuru == 'w' ){ //按键‘w ’表示向上走一步 snake_Y[0] -= 1; maze[snake_Y[0]][snake_X[0]] = 'H'; } if (shuru == 's') { //按键‘a ’表示向下走一步 snake_Y[0] += 1; maze[snake_Y[0]][snake_X[0]] = 'H'; } if (snake_X[0] == food_X && snake_Y[0] == food_Y) { //实现吃完一个食物后蛇长一截 Food_(); length++; snake_X[length - 1] = snake_X[length - 2]; snake_Y[length - 1] = snake_Y[length - 2]; maze[snake_Y[length - 1]][snake_X[length - 1]] = 'X'; } judge = Gameover(); if (judge == 0){ printf("Game over!\n"); //游戏结束的实现 return 0; } else { system("cls"); //清屏 output(); } } return 0; system("pause"); }
这道题我是看着那个博客打的,用数组实现不难理解,体会到原来可以用数组这么玩,hhhhh
由这个还是可以学到很多东西
①字符矩阵的实现char,原来还可以这样弄,要是我可能会傻傻的用for,注意“”和,的使用
②输出矩阵直接用for
③产生食物用了随机数:srand初始化随机种子,rand产生随机数,eg:
:#include <stdlib.h> #include <stdio.h> #include <time.h> /*用到了time函数,所以要有这个头文件*/ #define MAX 10 int main( void) { int number[MAX] = {0}; int i; srand((unsigned) time(NULL)); /*播种子*/ for(i = 0; i < MAX; i++) { number[i] = rand() % 100; /*产生100以内的随机整数*/ printf("%d ", number[i]); } printf("\n"); return 0; }
④游戏结束那里,我一直纠结要是return0后又会return1怎么破,结果发现return0后就返回了,不会再执行后面的了
⑤scanf那里我一开始是这样的:
getch(); //用来吸收那个回车
scanf(“%c”, &shuru);
但是TA说不可使用 getch(), kbhit()之类 windows 扩展包(你可以简单地理解为不准使用getch() kbhit()以及禁止#include <windows.h>,#include <conio.h>,#include <dos.h>),然后又纠结了半天,然后发现他的是如上实现的,%c前加个空格,记住这样可以吸收回车键
⑥后面的走步处理,看了之后理解一下还是可以理解的
⑦清屏处理,其作用是清楚屏幕先前的显示内容
#include <stdio.h> #include <stdlib.h> //其必须包含头文件 #include <stdlib.h> int main() { int i; for(i =0;i<5;i++) printf("%d******************\n",i); getchar(); system("cls"); return 0; }
相关文章推荐
- php打印HTML
- Servlet异常处理
- [PTA] Week 11 4-16 Shortest Path [3] (25分)
- 欢迎使用CSDN-markdown编辑器
- Robotium 学习
- 访问时加载和项目启动时加载r
- ssh正向和反向隧道建立,及socks4/5代理
- 欢迎使用CSDN-markdown编辑器
- Ibaties 插入数据时,时间字段为空
- Google Analytics多渠道实现
- android 监听网络连接状态的改变
- centos6.5软件安装:RPM,SRPM与yum功能
- gstack - stack trace of a running process
- 《Programming Hive》读书笔记(一)Hadoop和hive环境搭建
- linux实战案例(1)
- android system.exit(0)后会重启
- 第七课 分支结构体验
- C++实现的小型图书管理系统
- Xcode添加代码片段
- 调试-计时函数