全系列Index:

  1. 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一)
  2. 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二)
  3. 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(三)
  4. 【原创】只学到二维数组和结构体,不用链表也能写一个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贪食蛇?(四)的更多相关文章

  1. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  2. C语言一维数组、二维数组、结构体的初始化

    C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...

  3. 晓莲说-何不原创:java 实现二维数组冒泡排序

    新手从业路-为自己回顾知识的同时,也希望和大家分享经验: 话不多说,上代码 public class 冒泡排序 { /**     * @param admin     * @2017.12.4   ...

  4. php根据二维数组中的某一元素相等,另一个元素相加

    二维数组:$taskData Array ( [0] => Array ( [area] => 1 [winsFlag] => 7 [count] => 3 ) [1] =&g ...

  5. 【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸

    多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...

  6. 数组属性的习题、Arrays工具、二维数组

    一.数组的练习 1.声明一个char类型的数组, 从键盘录入6个字符: [1]遍历输出 [2]排序 [3]把char数组转化成一个逆序的数组. import java.util.Scanner; pu ...

  7. 常用的Arrays类和二维数组以及二分法的介绍

    ---恢复内容开始--- 1.Array类 Array中包含了许多数组的常用操作,较为常见的有: (1)快速输出 import java.util.Arrays; public class Test{ ...

  8. Java数组之二维数组

    Java中除了一维数组外,还有二维数组,三维数组等多维数组.本文以介绍二维数组来了解多维数组. 1.二维数组的基础 二维数组的定义:二维数组就是数组的数组,数组里的元素也是数组. 二维数组表示行列二维 ...

  9. java se系列(四) 函数、数组、排序算法、二分法、二维数组

    1 函数 1.1  数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表 ...

随机推荐

  1. 如何开发auto complete 智能提示功能

    目录(?)[+] 如何开发auto complete 智能提示功能 最近网上好像流传用redis实现,其实智能提示和用什么存储关系不大 07年,我过一个类似的项目 我有几千个名字,随着用户在输入框中不 ...

  2. Maven聚合

    <project xmlns="http://maven.apache.org/POM/4.0.0"  xmlns:xsi="http://www.w3.org/2 ...

  3. EJBCA 在windows上的安装

    为了做EJBCA的封装測试,在我自己电脑上装了个,可是在国内的开发上面的介绍实在是太少.有的也仅仅是些傻瓜式的安装介绍,这是介绍在Windows上安装的过程,(后面介绍下 linux 红帽上的),有些 ...

  4. MinGW MinGW-w64 TDM-GCC等工具链之间的差别与联系

    不当之处,尽请指正. 同样点: 一. 他们都是用于编译生成Windows应用程序的工具链. 二. 他们都是基于gcc的. 不同之处(仅仅说大的): 一.项目之间的关系 1. MinGW应该是最先诞生的 ...

  5. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  6. CF 518D(概率dp)

    传送门:Ilya and Escalator 题意:有n个人排队进车厢,每秒只能进一个人,而且第1个人进了后面的人才能进,第一个人每秒进入车厢的概率为p,不进的概率为1-p,求t秒后进入车厢总人数的数 ...

  7. [置顶] think in java interview-高级开发人员面试宝典(七)

    上两周研发任务太紧了,所以担搁了一下,我们继续我们的面试之旅. 下面是一个基于图书系统的15道SQL问答,供大家参考 问题描述:本题用到下面三个关系表:CARD     借书卡.   CNO 卡号,N ...

  8. 为什么使用 React? Edit on GitHub

    为什么使用 React? React 是一个 Facebook 和 Instagram 用来创建用户界面的 JavaScript 库.很人多认为 React 是 MVC 中的 V(视图). 我们创造 ...

  9. java--基于socket的网络传输开发

    继http://blog.csdn.net/gaopeng0071/article/details/10959845此文章内容展开的研究. socket传输是基于tcp的网络传输协议进行的传输,tcp ...

  10. Codeforces 164 E Compatible Numbers

    主题链接~~> 做题情绪:好题,做拉的比赛的时候想了非常久,想到枚举变幻某一位的 0 为 1 .可是每一个数都这样枚举岂不超时的节奏,当时没想到事实上从大到小枚举一次就 ok 了. 解题思路: ...