贪吃蛇
2015-12-28 19:50
369 查看
基础版
(原谅一只小辣鸡目前只做到这里,还没有实现自动跑起// main.c // snake // by hling so #include<stdio.h> #include<stdlib.h> #include<time.h> #include <windows.h> #define SNAKE_MAX_LENGTH 20 #define SANKE_HEAD 'H' #define SNAKE_BODY 'X' #define BLANK_CELL ' ' #define SNAKE_FOOD '$' #define WALL_CELL '*' //snake stepping: dy = -1(up), 1(down); dx = -1(left),1(right),0(o=no move) void snakeMove(int, int); //put a food randomized on a blank cell void put_money(void); //out cells of the grid void output(void); //outs when gameover void gameover(void); //move void move(void); char map[12][12] = {"************", // 初始状态 "* *", // 直接打表 "* *", "* *", "* *", "* *", "* *", "* *", "* *", "* *", "* *", "************"}; //define vars for snake, notice name of vars in C int snakeX[SNAKE_MAX_LENGTH] = {1, 2, 3, 4, 5}; int snakeY[SNAKE_MAX_LENGTH] = {1, 1, 1, 1, 1}; int snakeLength = 5; int gamelife = 1; char s[2]; int inputflag = 1; //无效输入的标记 int moneyx, moneyy; //钱币坐标 int moneycount = 0; //钱币数量 int main() { srand(time(NULL)); put_money(); output(); while(gamelife == 1) { printf("please input w/W for up,a/A for left,d/D for right,s/S for down\n"); scanf("%s", s); move(); if (inputflag == 0) { inputflag = 1; continue; } system("cls"); put_money(); output(); if(gamelife == 0) gameover(); } return 0; } void output(void) { gamel 4000 ife = 0; //如果这次的行走不合法,将终止游戏 int i, j, k, snakeflag = 0, pos; // snakeflag为1表明该点为蛇 for (i = 0; i < 12; i++) { for (j = 0; j < 12; j++) { //判断是否为蛇所在位置,是则输出蛇,否则输出地图 for (k = 0; k < snakeLength; k++) { if (j == snakeX[k] && i == snakeY[k]) { snakeflag = 1; // 蛇的一部分,标记 break; } } if (snakeflag == 1) { //是蛇所以打印蛇 if (k == snakeLength - 1) { if(i == 0 || i == 11 || j == 0 || j == 11) { printf("H"); gamelife = 0; // 蛇撞墙, 游戏结束 } else { // 蛇头没有撞墙 printf("H"); gamelife = 1; //有蛇头输出,说明蛇头没有碰到身体,游戏可以继续 } } else { printf("X"); // 蛇身 } } else { if (i == moneyy && j == moneyx) // 钱币所在位置 printf("$"); else printf("%c", map[i][j]); } snakeflag = 0; } printf("\n"); } } void snakeMove(int movex, int movey) { int i; if((snakeX[snakeLength - 1] + movex) == moneyx && (snakeY[snakeLength - 1] + movey) == moneyy && snakeLength <SNAKE_MAX_LENGTH) { // 如果吃了钱币并且蛇还没到最长 snakeLength++; // 蛇的长度加一 snakeX[snakeLength - 1] = moneyx; snakeY[snakeLength - 1] = moneyy; moneycount = 0; } else { // 否则, 蛇只移动. for(i = 0; i < snakeLength - 1; i++) { snakeX[i] = snakeX[i + 1]; snakeY[i] = snakeY[i + 1]; } snakeX[snakeLength - 1] = snakeX[snakeLength - 2] + movex; snakeY[snakeLength - 1] = snakeY[snakeLength - 2] + movey; } } void gameover(void) { printf("--------------\nSORRY!GAMEOVER\n--------------\n"); } void move(void) { if (s[0] == 'w' || s[0] == 'W') { // 如果蛇本来向下走, 输入w无效 if (snakeX[snakeLength - 1] == snakeX[snakeLength - 2] && snakeY[snakeLength - 1] == snakeY[snakeLength - 2] + 1); // 否则,蛇向上走一格 else snakeMove(0, -1); } else if (s[0] == 's' || s[0] == 'S') { // 如果蛇本来向上走, 输入s无效 if (snakeX[snakeLength - 1] == snakeX[snakeLength - 2] && snakeY[snakeLength - 1] == snakeY[snakeLength - 2] - 1); // 否则,蛇向下走一格 else snakeMove(0, 1); } else if (s[0] == 'a' || s[0] == 'A') { // 如果蛇本来向上右, 输入a无效 if (snakeX[snakeLength - 1] == snakeX[snakeLength - 2] + 1&& snakeY[snakeLength - 1] == snakeY[snakeLength - 2] ); // 否则,蛇向左走一格 else snakeMove(-1, 0); } else if (s[0] == 'd' || s[0] == 'D') { // 如果蛇本来向左走, 输入d无效 if (snakeX[snakeLength - 1] == snakeX[snakeLength - 2] - 1&& snakeY[snakeLength - 1] == snakeY[snakeLength - 2] ); // 否则,蛇向右走一格 else snakeMove(1, 0); } else { inputflag = 0; // 如果输入不是wsad,则提示正确输入 } } void put_money(void) { int flag = 1; // 钱币刚好落在蛇身上或墙上的标志 if (moneycount == 0) { // 如果没有钱币就加一个 while (flag == 1) { int tempx = rand() % 11; int tempy = rand() % 11; flag = 0; int i; // 查看钱币是否落在蛇身上或是否在墙上 for (i = 0; i < snakeLength; i++) { if ((tempx == snakeX[i] && tempy == snakeY[i]) || tempx == 0 || tempy == 0) { flag = 1; break; } } if (flag == 0) { moneycount = 1; moneyx = tempx; moneyy = tempy; } } } }
相关文章推荐
- 第一篇 Windows环境下通过Eclipse创建的第一个安卓应用程序(图文详细步骤)
- JS触发事件大全
- Ubuntu 安装
- JAVA多线程与并发学习总结
- 这七种数据分析领域中最为人称道的降维方法
- 了解数据库
- LeetCode 1. Two Sum 解题报告
- 图片3D翻转效果
- Java垃圾回收机制
- Socket---基于IO复用实现异步非阻塞通信 Python群聊工具
- Socket---基于IO复用实现异步非阻塞通信
- codevs 天梯 白银级
- 课程设计
- 【OpenJudge1814】 恼人的青蛙 暴力+剪枝优化
- redis集群常用命令
- Java垃圾回收机制算法
- android-Recreating an Activity
- NDK开发,没有你想象的那么难
- java 开源资源
- 初学 数据库