【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)
全系列Index:
- 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一)
- 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二)
- 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(三)
- 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)
由于用system("cls")重绘会有较大的闪烁,我google了网上GOTOXY的实现来完成帧的重绘。
全部程序的源代码:
- /*
- Powered by wmydx
- Snake verson 2.0
- 2013.10.19
- verson 1.0的遗留问题已经解决:标记蛇头的访问顺序,谁小跟谁
- 注意:用户摁键过快会产生BUG,已解决
- */
- #include <stdio.h>
- #include <conio.h>
- #include <windows.h>
- #include <time.h>
- #define ROW 40
- #define COL 20
- struct SnakeTail
- {
- int x;
- int y;
- };
- struct SnakeHead
- {
- int x;
- int y;
- int dis;
- };
- struct Food
- {
- int x;
- int y;
- };
- struct Map
- {
- char a;
- unsigned long long num;
- };
- struct Point
- {
- int x;
- int y;
- int flag;
- };
- SnakeTail myTail;
- SnakeHead myHead;
- Food myFood;
- unsigned long long count = ;
- Map map[COL][ROW];
- int gameSpeed = ;
- int winPoint = ;
- int isDead = ;
- int isPoint = ;
- //以下是网上找来的GOTOXY实现
- void GoToXY(int x, int y)
- {
- COORD pos = {x,y};
- HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄
- SetConsoleCursorPosition(hOut, pos);
- }
- void WhereXY(int *x, int *y)
- {
- HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄
- CONSOLE_SCREEN_BUFFER_INFO bInfo;
- GetConsoleScreenBufferInfo( hOut, &bInfo );
- COORD pos = bInfo.dwCursorPosition;
- *x = pos.X;
- *y = pos.Y;
- }
- //以上时网上找来的GOTOXY实现
- void plantFood()
- {
- int tmpx,tmpy;
- srand((int)time());
- tmpx = rand() % COL;
- tmpy = rand() % ROW;
- while(((tmpx <= && tmpx >= COL - ) || (tmpy <= && tmpy >= ROW - )) || map[tmpx][tmpy].a == '*')
- {
- tmpx = rand() % COL;
- tmpy = rand() % ROW;
- }
- myFood.x = tmpx;
- myFood.y = tmpy;
- map[myFood.x][myFood.y].a = '$';
- }
- void initialization() //初始化游戏
- {
- int col = ;
- for(int i = ;i < COL;i++)
- for(int j = ;j < ROW;j++)
- {
- map[i][j].a = ' ';
- map[i][j].num = ;
- }
- for(int i = ;i <= ;i++)
- {
- map[col][i].a = '*';
- map[col][i].num = count ++;
- }
- myTail.x = ;
- myTail.y = ;
- myHead.x = ;
- myHead.y = ;
- myHead.dis = ;
- plantFood();
- }
- void print()
- {
- printf(" ");
- for(int i = ;i < ROW;i++)
- printf("-");
- printf("\n");
- for(int i = ;i < COL;i++)
- {
- printf(" ");
- for(int j = ;j < ROW;j++)
- {
- if(j == )printf("|");
- printf("%c",map[i][j].a);
- }
- printf("|\n");
- }
- printf(" ");
- for(int i = ;i < ROW;i++)
- printf("-");
- }
- int ifDie(int x,int y)
- {
- if(x < || y < || x >= COL || y >= ROW || map[x][y].a == '*')return ;
- else return ;
- }
- int ifGetPoint()
- {
- if(map[myHead.x][myHead.y].a == '$')
- {
- plantFood();
- return ;
- }
- else return ;
- }
- void deleteTail()
- {
- Point a[];
- Point temp;
- int test = ;
- unsigned long long min = 0xFFFFFFFF;
- for(int i = ;i < ;i++)
- a[i].flag = ;
- if(map[myTail.x + ][myTail.y].a == '*')
- {
- a[].flag = ;
- a[].x = myTail.x + ;
- a[].y = myTail.y;
- }
- if(map[myTail.x - ][myTail.y].a == '*')
- {
- a[].flag = ;
- a[].x = myTail.x - ;
- a[].y = myTail.y;
- }
- if(map[myTail.x][myTail.y + ].a == '*')
- {
- a[].flag = ;
- a[].x = myTail.x;
- a[].y = myTail.y + ;
- }
- if(map[myTail.x][myTail.y - ].a == '*')
- {
- a[].flag = ;
- a[].x = myTail.x;
- a[].y = myTail.y - ;
- }
- for(int i = ;i < ;i++)
- {
- if(a[i].flag == )
- {
- test ++;
- if(map[a[i].x][a[i].y].num < min)
- {
- min = map[a[i].x][a[i].y].num;
- temp = a[i];
- }
- }
- }
- map[myTail.x][myTail.y].a = ' ';
- map[myTail.x][myTail.y].num = ;
- myTail.x = temp.x;
- myTail.y = temp.y;
- }
- void snakeMove()
- {
- switch(myHead.dis)
- {
- case : myHead.x --;
- if(ifGetPoint())
- {
- winPoint ++;
- isPoint = ;
- }
- if(!ifDie(myHead.x,myHead.y))
- {
- map[myHead.x][myHead.y].a = '*';
- map[myHead.x][myHead.y].num = count ++;
- }
- else
- {
- isDead = ;
- }
- break;
- case : myHead.x ++;
- if(ifGetPoint())
- {
- winPoint ++;
- isPoint = ;
- }
- if(!ifDie(myHead.x,myHead.y))
- {
- map[myHead.x][myHead.y].a = '*';
- map[myHead.x][myHead.y].num = count ++;
- }
- else
- {
- isDead = ;
- }
- break;
- case : myHead.y --;
- if(ifGetPoint())
- {
- winPoint ++;
- isPoint = ;
- }
- if(!ifDie(myHead.x,myHead.y))
- {
- map[myHead.x][myHead.y].a = '*';
- map[myHead.x][myHead.y].num = count ++;
- }
- else
- {
- isDead = ;
- }
- break;
- case : myHead.y ++;
- if(ifGetPoint())
- {
- winPoint ++;
- isPoint = ;
- }
- if(!ifDie(myHead.x,myHead.y))
- {
- map[myHead.x][myHead.y].a = '*';
- map[myHead.x][myHead.y].num = count ++;
- }
- else
- {
- isDead = ;
- }
- break;
- }
- if(isPoint == )
- {
- deleteTail();
- }
- else isPoint = ;
- }
- void changeSnake(char ch)
- {
- if(ch == '.')return;
- switch(ch)
- {
- case 'w' : if(myHead.dis != )myHead.dis = ;
- break;
- case 'a' : if(myHead.dis != )myHead.dis = ;
- break;
- case 's' : if(myHead.dis != )myHead.dis = ;
- break;
- case 'd' : if(myHead.dis != )myHead.dis = ;
- break;
- default : ;//printf("ERROR!"); BUG检测代码
- }
- }
- int main(void)
- {
- char control = '.';
- initialization();
- int end = ;
- while()
- {
- while(kbhit() == )
- {
- changeSnake(control); //这个函数要放入循环体!否则摁键过快,前次操作未进入循环体,后次操作又改变dis了
- control = '.';
- print();
- snakeMove();
- if(isDead == )
- {
- end = ;
- break;
- }
- Sleep(gameSpeed);
- GoToXY(,);
- }
- if(end)break;
- control = getch();
- }
- printf("\n YOUR SCORE IS %d \n",winPoint);
- system("pause");
- return ;
- }
【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)的更多相关文章
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- C语言一维数组、二维数组、结构体的初始化
C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...
- 晓莲说-何不原创:java 实现二维数组冒泡排序
新手从业路-为自己回顾知识的同时,也希望和大家分享经验: 话不多说,上代码 public class 冒泡排序 { /** * @param admin * @2017.12.4 ...
- php根据二维数组中的某一元素相等,另一个元素相加
二维数组:$taskData Array ( [0] => Array ( [area] => 1 [winsFlag] => 7 [count] => 3 ) [1] =&g ...
- 【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸
多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...
- 数组属性的习题、Arrays工具、二维数组
一.数组的练习 1.声明一个char类型的数组, 从键盘录入6个字符: [1]遍历输出 [2]排序 [3]把char数组转化成一个逆序的数组. import java.util.Scanner; pu ...
- 常用的Arrays类和二维数组以及二分法的介绍
---恢复内容开始--- 1.Array类 Array中包含了许多数组的常用操作,较为常见的有: (1)快速输出 import java.util.Arrays; public class Test{ ...
- Java数组之二维数组
Java中除了一维数组外,还有二维数组,三维数组等多维数组.本文以介绍二维数组来了解多维数组. 1.二维数组的基础 二维数组的定义:二维数组就是数组的数组,数组里的元素也是数组. 二维数组表示行列二维 ...
- java se系列(四) 函数、数组、排序算法、二分法、二维数组
1 函数 1.1 数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表 ...
随机推荐
- [Word使用笔记]分类简介
什么Vistual Studio , Eclipse , Xcode , 都弱爆了,Word比他们难多了 - -! 此分类用于记录Word的一些使用
- 【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示
尽管以下的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,可是基本思想是这种. 例如以下图.在sdcard卡上有4张图片, 打开app,则会吧sd ...
- hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)
http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序.问funny函数调用了多少次. 我们定义数组为所求 ...
- java多线程12设计模式
1.Single Threaded Execution Pattern(单线程运行模式) 2.Immutable Pattern(一成不变的模式) 3.Guarded Suspension Patte ...
- Photoshop理论:另外一种角度看图层混合模式
源地址:http://www.missyuan.com/thread-687724-1-4.html 1.我将一个色阶看成是一个由亮部和暗部组成的这么一个元素,亮部是我们看的见的,暗部是影响亮部的,有 ...
- 基于HOG特征的Adaboost行人检测
原地址:http://blog.csdn.net/van_ruin/article/details/9166591 .方向梯度直方图(Histogramof Oriented Gradient, HO ...
- Android 开源项目源码解析(第二期)
Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...
- ZOJ 3635 Cinema in Akiba(线段树)
Cinema in Akiba (CIA) is a small but very popular cinema in Akihabara. Every night the cinema is ful ...
- poj 2586 Y2K Accounting Bug(贪心算法,水题一枚)
#include <iostream> using namespace std; /*248K 32MS*/ int main() { int s,d; while(cin>> ...
- oracle undo 复杂度--oracle核心技术读书笔记四
一. 概述 undo 保存的是旧数据.比方,你改动了一条记录将A列abc改动为def,那么undo里面保存的就是abc.目的有两个:1. 假设你的事务没有提交,可是已经将A列改动,那么别人读取这条数据 ...