zoukankan      html  css  js  c++  java
  • 贪吃蛇1.0&&贪吃蛇2.0

      1 //
      2 //main.c
      3 //snake
      4 //
      5 //Created by Yubei Xiao on 12-12-16
      6 //Copyright (c) 2015年 Sun Yat-sen University.All rights reserved.
      7 //
      8 
      9 #include<stdio.h>
     10 #include<stdlib.h>
     11 #include<time.h>
     12 
     13 #define SNAKE_MAX_LENGTH 20
     14 #define SNAKE_HEAD 'H'
     15 #define SNAKE_BODY 'X'
     16 #define BLANK_CELL ' '
     17 #define WALL_CELL '*'
     18 
     19 //snake stepping: dy = -1(up),1(down); dx = -1(left),1(right),0(no move)
     20 void snakeMove(int, int);
     21 //put a food randomized on a blank cell
     22 void put_money(void);
     23 //our cells of the grid
     24 void output(void);
     25 //outs when gameover
     26 void gameover(void);
     27 //蛇是否碰到墙或者自身
     28 int pd();
     29 
     30 char map[12][13] =//这里稍作了修改,因为12*12的字符矩阵每一行还要有''必须要13长度才行 
     31      {"************",
     32      "*XXXXH     *",
     33      "*          *",
     34      "*          *",
     35      "*          *",
     36      "*          *",
     37      "*          *",
     38      "*          *",
     39      "*          *",
     40      "*          *",
     41      "*          *",
     42      "************"};
     43      
     44 // define vars for snake, notice name of vars in C
     45 int snakeY[SNAKE_MAX_LENGTH] = {1, 2, 3, 4, 5};//蛇身和蛇头的坐标
     46 int snakeX[SNAKE_MAX_LENGTH] = {1, 1, 1, 1, 1};//这里稍作了修改,因为原本的X和Y反了
     47 int snakeLength = 5;
     48 
     49 int main() {
     50     while (pd()){//WHILE not 游戏结束 DO
     51         output();//输出字符矩阵
     52         char ch;
     53         scanf("%c", &ch);// ch=等待输入
     54         char t = getchar();//将输入的回车符清掉 
     55         if (t != '
    ') {
     56             printf("Please input the right angle!
    ");
     57             while (t != '
    ') {
     58                 t = getchar();
     59             }
     60             continue;
     61         }//因为游戏中可能玩家输入错误,如:AA,避免这种错误的出现导致程序混乱 
     62         switch (ch) {// CASE ch DO
     63             case 'A':// ‘A’:左前进一步,break
     64                 snakeMove(0, -1);
     65                 break;
     66             case 'D' :// ‘D’:右前进一步,break
     67                 snakeMove(0, 1);
     68                 break;
     69             case 'W':// ‘W’:上前进一步,break
     70                 snakeMove(-1, 0);
     71                 break;
     72             case 'S':// ‘S’:下前进一步,break
     73                 snakeMove(1, 0);
     74                 break;
     75             default:// END CASE
     76                 printf("Please input the right angle!
    ");//避免玩家输入错误,如:X 
     77         }
     78     }//END WHILE
     79     gameover();//输出 Game Over!!! 
     80 }
     81 
     82 int pd() {//whether snake head on wall & body 
     83     int i;
     84     if (snakeX[snakeLength - 1] > 0 && snakeX[snakeLength - 1] < 11 
     85     && snakeY[snakeLength - 1] > 0 && snakeY[snakeLength - 1] < 11) {
     86         for (i = 0; i < snakeLength - 1; i++) {
     87             if ((snakeX[snakeLength - 1] == snakeX[i]) && (snakeY[snakeLength - 1] == snakeY[i])) {
     88                 return 0;//snake head on body
     89             }
     90         }
     91         return 1;//snake head on blank
     92     } else return 0;//snake head on wall
     93 }
     94 void snakeMove(int i, int j) {
     95     int dx = i, dy = j, k;
     96     map[snakeX[0]][snakeY[0]] = BLANK_CELL;//蛇前进了 
     97     for (k = 0; k <= snakeLength - 2; k++) {
     98         snakeX[k] = snakeX[k + 1];
     99         snakeY[k] = snakeY[k + 1];
    100         map[snakeX[k]][snakeY[k]] = SNAKE_BODY;
    101     }//蛇前进的坐标变化 
    102     snakeX[snakeLength - 1] += dx;
    103     snakeY[snakeLength - 1] += dy;//蛇头的坐标变化 
    104     map[snakeX[snakeLength - 1]][snakeY[snakeLength - 1]] = SNAKE_HEAD;
    105 }   
    106 void output(void) {//输出矩阵 
    107     int i, j;
    108     for (i = 0; i <= 11; i++) {
    109         for (j = 0; j <= 11; j++) {
    110             printf("%c", map[i][j]);
    111         }
    112         printf("
    ");
    113     }
    114 }
    115 void gameover(void) {//游戏输了的结束语 S
    116     printf("Game Over!!!
    ");
    117 }

    贪吃蛇task1 readme txt
    实验环境:Dev C++
    程序运行方式:
    在游戏最开始会输出初始矩阵
    ①通过WASD键盘键操控贪吃蛇进行上左下右移动;
    ②每一次输入W/A/S/D后需要回车,确保输入完毕;
    ③速度太快输入错误不要紧,例如输入了“AA”,程序不会进行错误执行,会给你温馨的报错提示
    “Please input the right angle!”同时再回输出原先(输入错误之前的即没有改变)的矩阵,方便进行下一步行走;
    ④同时输入成其他字符不要紧,同样也会报错;
    ⑤输入之后,程序会判断输入字符从而进行坐标变化以及map矩阵变化,之后输出矩阵,等待你输入下一个方向;
    ⑥如果你的操作使得蛇撞墙或者撞到了自己,那么系统会提示GAME OVER同时游戏结束。

    将原先的程序头(pdf上面的)修改了的部分:
    ①map二位数组的第二个维度开小了,因为还会有''的存在,所以应该是13;
    ②snakeX和snakeY数组反了,已经改正。

      1 //
      2 //main.c
      3 //snake
      4 //
      5 //Created by Yubei Xiao on 12-12-16
      6 //Copyright (c) 2015年 Sun Yat-sen University.All rights reserved.
      7 //
      8 
      9 #include<stdio.h>
     10 #include<stdlib.h>
     11 #include<time.h>
     12 
     13 #define SNAKE_MAX_LENGTH 150//稍微了修改,因为这个长度要加到100才能够让蛇可以不断的吃食物长长,直到占满为止 
     14 #define SNAKE_HEAD 'H'
     15 #define SNAKE_BODY 'X'
     16 #define BLANK_CELL ' '
     17 #define WALL_CELL '*'
     18 
     19 //snake stepping: dy = -1(up),1(down); dx = -1(left),1(right),0(no move)
     20 void snakeMove(int, int);
     21 //put a food randomized on a blank cell
     22 void put_money(void);
     23 //our cells of the grid
     24 void output(void);
     25 //outs when gameover
     26 void gameover(void);
     27 //蛇是否碰到墙或者自身  
     28 int pd();
     29 //eat the food
     30 void eat_money(int i, int j);
     31 //are player win 
     32 int Are_you_win(void);
     33 
     34 char map[12][13] =//这里稍作了修改,因为12*12的字符矩阵每一行还要有''必须要13长度才行 
     35      {"************",
     36      "*XXXXH     *",
     37      "*          *",
     38      "*          *",
     39      "*          *",
     40      "*          *",
     41      "*          *",
     42      "*          *",
     43      "*          *",
     44      "*          *",
     45      "*          *",
     46      "************"};
     47      
     48 // define vars for snake, notice name of vars in C
     49 int snakeY[SNAKE_MAX_LENGTH] = {1, 2, 3, 4, 5};//蛇身和蛇头的坐标
     50 int snakeX[SNAKE_MAX_LENGTH] = {1, 1, 1, 1, 1};//这里稍作了修改,因为原本的X和Y反了 
     51 int snakeLength = 5;
     52 
     53 int main() {
     54     output();//输出初始字符矩阵
     55     int counter = 0;
     56     while (pd()){//WHILE not 游戏结束 DO
     57         counter++;//计数器,使得放食物不要太频繁,运行5次放一次食物 
     58         if ((counter % 5) == 1) put_money();//放置食物 
     59         system("cls");//每一次清屏只剩下当前局面的矩阵 
     60         output();//输出字符矩阵
     61         if (Are_you_win()) return 0;//如果赢了则退出 
     62         char ch;
     63         scanf("%c", &ch);// ch=等待输入
     64         char t = getchar();//将输入的回车符清掉 
     65         if (t != '
    ') {
     66             printf("Please input the right angle!
    ");
     67             while (t != '
    ') {
     68                 t = getchar();
     69             }
     70             continue;
     71         }//因为游戏中可能玩家输入错误,如:AA,避免这种错误的出现导致程序混乱 
     72         switch (ch) {// CASE ch DO
     73             case 'A':// ‘A’:左前进一步,break
     74                 snakeMove(0, -1);
     75                 break;
     76             case 'D' :// ‘D’:右前进一步,break
     77                 snakeMove(0, 1);
     78                 break;
     79             case 'W':// ‘W’:上前进一步,break
     80                 snakeMove(-1, 0);
     81                 break;
     82             case 'S':// ‘S’:下前进一步,break
     83                 snakeMove(1, 0);
     84                 break;
     85             default:// END CASE
     86                 printf("Please input the right angle!
    ");//避免玩家输入错误,如:X 
     87         }
     88     }//END WHILE
     89     gameover();//输出 Game Over!!! 
     90 }
     91 
     92 int Are_you_win(void) {//判断玩家是否赢 
     93     int i, j;
     94     for (i = 1; i <= 10; i++) {
     95         for (j = 1; j <= 10; j++) {
     96             if (map[i][j] != 'X'||map[i][j] != 'H') {
     97                 return 0;//如果玩家有一个格子未占满则没有赢 
     98             }
     99         }
    100     }
    101     printf("You are winner!!!");//如果玩家的贪吃蛇将所有的格子均占满则赢 
    102     return 1;
    103 }
    104 void put_money(void) {
    105     srand((unsigned)time(NULL));//随机函数的种子 
    106     int i = 0;
    107     int j = 0;
    108     int tot = 0;//用来计数,因为如果格子满了,那么就没有格子可以放食物了,那么下面循环会陷入死循环,避免这种情况发生 
    109     while (map[i][j] != ' '&&tot <= 100) {//随机生成食物的坐标 
    110         i = rand()%11 + 1;
    111         j = rand()%11 + 1;
    112         tot++;
    113     }
    114     if (map[i][j] == ' ') map[i][j] = '$';//用'$'来表示食物 
    115 }
    116 int pd() {//whether snake head on wall & body 
    117     int i;
    118     if (snakeX[snakeLength - 1] > 0 && snakeX[snakeLength - 1] < 11 
    119     && snakeY[snakeLength - 1] > 0 && snakeY[snakeLength - 1] < 11) {
    120         for (i = 0; i < snakeLength - 1; i++) {
    121             if ((snakeX[snakeLength - 1] == snakeX[i]) && (snakeY[snakeLength - 1] == snakeY[i])) {
    122                 return 0;//snake head on body
    123             }
    124         }
    125         return 1;//snake head on blank
    126     } else return 0;//snake head on wall
    127 }
    128 void eat_money(int i, int j) {//蛇吃食物模块 
    129     int dx = i, dy = j, k;
    130     map[snakeX[0]][snakeY[0]] = SNAKE_BODY;//蛇的最后一个坐标还是不变因为长长了 
    131     snakeLength++;//长度加一 
    132     map[snakeX[snakeLength - 2]][snakeY[snakeLength - 2]] = SNAKE_BODY;//原本是头的现在变成了身体 
    133     snakeX[snakeLength - 1] = snakeX[snakeLength - 2] + dx;
    134     snakeY[snakeLength - 1] = snakeY[snakeLength - 2] + dy;//计算头坐标 
    135     map[snakeX[snakeLength - 1]][snakeY[snakeLength - 1]] = SNAKE_HEAD;//头坐标的map置为头 
    136 }
    137 void snakeMove(int i, int j) {
    138     if (map[snakeX[snakeLength - 1] + i][snakeY[snakeLength - 1] + j] == '$') {//碰到了食物 
    139         eat_money(i, j);
    140         return;
    141     }
    142     int dx = i, dy = j, k;
    143     map[snakeX[0]][snakeY[0]] = BLANK_CELL;//蛇前进了 
    144     for (k = 0; k <= snakeLength - 2; k++) {
    145         snakeX[k] = snakeX[k + 1];
    146         snakeY[k] = snakeY[k + 1];
    147         map[snakeX[k]][snakeY[k]] = SNAKE_BODY;
    148     }//蛇前进的坐标变化 
    149     snakeX[snakeLength - 1] += dx;
    150     snakeY[snakeLength - 1] += dy;//蛇头的坐标变化 
    151     map[snakeX[snakeLength - 1]][snakeY[snakeLength - 1]] = SNAKE_HEAD;
    152 }
    153 void output(void) {//输出矩阵 
    154     int i, j;
    155     for (i = 0; i <= 11; i++) {
    156         for (j = 0; j <= 11; j++) {
    157             printf("%c", map[i][j]);
    158         }
    159         printf("
    ");
    160     }
    161 }
    162 void gameover(void) {//游戏输了的结束语 
    163     printf("Game Over!!!
    ");
    164 }

    贪吃蛇task2 readme txt
    实验环境:Dev C++
    程序运行方式:
    (由于屏幕会出现很多幕矩阵,所以我使用了system("cls")进行每一次输出矩阵之前清一次屏,方便查看,
    这个可以不要)
    在游戏最开始会输出初始矩阵
    ①通过WASD键盘键操控贪吃蛇进行上左下右移动;
    ②每一次输入W/A/S/D后需要回车,确保输入完毕;
    ③速度太快输入错误不要紧,例如输入了“AA”,程序不会进行错误执行,会给你温馨的报错提示
    “Please input the right angle!”同时再回输出原先(输入错误之前的即没有改变)的矩阵,方便进行下一步行走;
    ④同时输入成其他字符不要紧,同样也会报错;
    ⑤输入之后,程序会判断输入字符从而进行坐标变化以及map矩阵变化,之后输出矩阵,等待你输入下一个方向;
    ⑥如果你的操作使得蛇撞墙或者撞到了自己,那么系统会提示GAME OVER同时游戏结束。
    ⑦加入了随机生成食物,第一次会出现一次食物,然后每隔5次操作出现一次,避免出现频率国语频繁;
    ⑧每当吃到食物蛇会长长一截,从尾巴后面;
    ⑨只要当玩家将所有的矩阵格占满才能够赢(很难赢~)赢了程序会输出“You are winner!!!”

    将原先的程序头(pdf上面的)修改了的部分:
    ①map二位数组的第二个维度开小了,因为还会有''的存在,所以应该是13;
    ②snakeX和snakeY数组反了,已经改正。
    ③因为蛇可以吃食物,最大长度增加到100,所以发现在开始的
    #define SNAKE_MAX_LENGTH 150//稍微了修改,因为这个长度要加到100才能够让蛇可以不断的吃食物长长,直到占满为止

    版权声明:欢迎转载本人博客的内容,只需注明作者和主博客文章地址的链接,另有约定者除外。

    //
    //
    //Created by Yubei Xiao on 12-12-16
    //Copyright (c) 2015年 Sun Yat-sen University.All rights reserved.
    //

  • 相关阅读:
    SharePoint 2010开发实例精选——网站属性管理
    点4下还是点1下?使用jQuery启动一个SharePoint工作流
    SharePoint:扩展DVWP 第1部分:布局增强 – 在默认值模板和编辑模板中重新排列栏
    SharePoint2010整合Silverlight 4应用——Bing地图控件
    SharePoint 2010中的客户端AJAX应用——对话框显示详细信息页
    递归上传文件和文件夹至SharePoint
    配置SharePoint Server 2010爬网大小写敏感的知识库
    SharePoint 2010开发实例精选——可排序的搜索核心结果
    SharePoint 2010中的客户端AJAX应用——保存数据至SharePoint
    复制或移动SharePoint网站(续)——各种方式的调用
  • 原文地址:https://www.cnblogs.com/iamxiaoyubei/p/5074387.html
Copyright © 2011-2022 走看看