编译环境:windows 7 64位

编译工具:codeblocks 13.12

备注:未使用graphics.h

声明:个人原创,未经允许,禁止转载!!!

数据结构:双向链表

1.程序未使用graphis.h中的 函数,所以采用先清屏,再打印的方式显示图形,大约每秒刷新一次;

2.除蛇头元素外,其它元素的状态(行进方向)均重复前一元素;

3.蛇的图形元素为笑脸,可在源码中更改symbol参数选用不同元素。

游戏截图1                                                                                                                         游戏截图2

/*********************************
*time: 2016.09.17 22:50
*version:1.0
*********************************/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h> #define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3 #define HIGH 35
#define WIDTH 80 //必须为偶数 int temp[HIGH][WIDTH];//像素数组,用于打印图形(蛇、食物、空格) int STATE = LEFT;//初始状态为向左走 int FOODPOS = ; //WIDTH*HIGH/2+WIDTH/2-WIDTH*HIGH/4;//食物的初始位置 #define INIT_LEN 1 //初始蛇的长度
int init_pos[INIT_LEN] = {HIGH/*WIDTH+WIDTH/};//蛇的初始位置
int SCORE = ;//得分 //蛇的结构体
struct Item{
int pos;//位置
int state;//状态:上下左右
struct Item *per, *next;
}; struct Item *head, *tail, *iTemp; char symbol = ;//元素符号 //获取元素的位置
int getPos(int pos, int state){
if(state == UP)
pos -= WIDTH;
else if(state == DOWN)
pos += WIDTH;
else if(state == LEFT)
pos -= ;
else if(state == RIGHT)
pos += ;
else
{
printf("\n状态state出错!");
exit(-);
}
return pos;
} //更新蛇的位置与状态
void change(){
while(){
print();
iTemp = tail;
while(iTemp != head){
iTemp->state = iTemp->per->state;//当前元素的状态等于其前驱的状态
iTemp->pos = getPos(iTemp->pos,iTemp->state);//更新位置信息
iTemp = iTemp->per;
}
head->state = STATE;
head->pos = getPos(head->pos, head->state);
}
} //打印图形
void print(){
int h, w;
for(h = ; h < HIGH-; h++)//初始化像素数组
for(w = ; w < WIDTH-; w++)
temp[h][w] = ;
for(w = ; w < WIDTH; w += ){//置第0行和最后一行为2
temp[][w] = ;
temp[HIGH-][w] = ;
}
for(h = ; h < HIGH; h++){//置第0列和最后一列为2
temp[h][] = ;
temp[h][WIDTH-] = ;
} iTemp = head->next;
while(iTemp){
h = iTemp->pos / WIDTH;
w = iTemp->pos % WIDTH;
temp[h][w] = ;
iTemp = iTemp->next;
} h = head->pos / WIDTH;
w = head->pos % WIDTH;
int i;
if(temp[h][w] == || temp[h][w] == ){//撞到墙或自己,游戏结束head->pos < 0 || head->pos > HIGH*WIDTH
for(i = ; i < (WIDTH-)/; i++)
printf(" ");
printf("游戏结束:%d分", SCORE);
getchar();
exit();
}
else
temp[h][w] = ; temp[FOODPOS/WIDTH][FOODPOS%WIDTH] = ;
if(head->pos == FOODPOS){
//吃食物
struct Item *new = (struct Item*)malloc(sizeof(struct Item));
new->next = head;
head->per = new;
//head = new;
new->per = NULL;
new->pos = getPos(head->pos, head->state);
new->state = head->state;
head = new;
SCORE += ; //产生新食物
while(temp[FOODPOS/WIDTH][FOODPOS%WIDTH] == || temp[FOODPOS/WIDTH][FOODPOS%WIDTH] == || FOODPOS % ==){
FOODPOS = rand() % (HIGH * WIDTH);
}
temp[FOODPOS/WIDTH][FOODPOS%WIDTH] = ;
} //清屏并打印图形
system("cls");
for(h = ; h < HIGH; h++)
for(w = ; w < WIDTH; w++){
if(temp[h][w] == )
printf(" ");
else if(temp[h][w] == )
printf("%c", symbol);
else if(temp[h][w] == )
printf("*");
else{
printf("\t\t\t\t\t error!");
exit(-);
}
}
} //初始化结构体
void init(){
int i; head = (struct Item*)malloc(sizeof(struct Item));
head->per = NULL;
iTemp = head;
iTemp->pos = init_pos[];
iTemp->state = LEFT; for(i = ; i < INIT_LEN; i++){
iTemp->next = (struct Item*)malloc(sizeof(struct Item));
iTemp->next->per = iTemp;
iTemp = iTemp->next;
iTemp->pos = init_pos[i];
iTemp->state = LEFT;
} iTemp->next = NULL;
tail = iTemp;
} DWORD WINAPI Thread1(LPVOID pM){
while(){
change();
}
return ;
} DWORD WINAPI Thread2(LPVOID pM){
char c;
while(){
c = _getch();//控制蛇的行进方向
if(c == 'a' && STATE != RIGHT)
STATE = LEFT;
else if(c == 'd' && STATE != LEFT)
STATE = RIGHT;
else if(c == 'w' && STATE != DOWN)
STATE = UP;
else if(c == 's' && STATE != UP)
STATE = DOWN;
else
continue;
}
return ;
} int main(void) {
system("mode con cols=80 lines=40");//设置窗口大小
system("color 8f");//设置窗口颜色
init(); HANDLE handle1 = CreateThread(NULL, , Thread1, NULL, , NULL);//线程1
HANDLE handle2 = CreateThread(NULL, , Thread2, NULL, , NULL);//线程2 WaitForSingleObject(handle1, INFINITE);
WaitForSingleObject(handle2, INFINITE);
return ;
}

c语言版贪吃蛇小游戏的更多相关文章

  1. 用GUI实现java版贪吃蛇小游戏

    项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...

  2. 贪吃蛇小游戏-----C语言实现

    1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...

  3. C++ 简单的控制台贪吃蛇小游戏

    由于比较懒,所以不怎么写,觉得这样不应该.我应该对自己学的做出整理,不管是高端低端,写出来是自己的. // 贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "std ...

  4. JS高级---案例:贪吃蛇小游戏

    案例:贪吃蛇小游戏 可以玩的小游戏,略复杂,过了2遍,先pass吧 先创建构造函数,再给原型添加方法.分别创建食物,小蛇和游戏对象. 食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键 ...

  5. Java GUI学习,贪吃蛇小游戏

    JAVA GUI练习 贪吃蛇小游戏 前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方 ...

  6. Java 用java GUI写一个贪吃蛇小游戏

    目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...

  7. JavaScript版—贪吃蛇小组件

    最近在学习JavaScript,利用2周的时间看完了<JavaScript高级编程>,了解了Js是一门面向原型编程的语言,没有像C#语言中的class,也没有私有.公有.保护等访问限制的级 ...

  8. html5面向对象做一个贪吃蛇小游戏

    canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...

  9. 一个控制台贪吃蛇小游戏(wsad控制移动)

    /******************************************** * 程序名称:MR.DUAN 的贪吃蛇游戏(链表法) * 作 者:WindAutumn <flutti ...

随机推荐

  1. G711格式语音采集/编码/转码/解码/播放

    2019-05-01 语音g711格式和AMR格式类似,应用很简单,很多人已经整理过了,收录于此,以备不时之需,用别人现成的足矣,我们的时间应该用来干更有意义的事. 1.PCM to G711 Fas ...

  2. U盘装CentOS6.4

    1.打开UltraISO,依次点击“文件”>“打开”,选择“CentOS-6.4-i386-bin-DVD1.iso”文件. 2.“启动”>“写入硬盘映像”,在“硬盘驱动器选择u盘”,写入 ...

  3. HTTP 之缓存

    这是一篇知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中.为了简要起见,某些实现方面的细节被简化或省略了.如果你更关心细节实现则完全不必耐心看完本文,后面参考 ...

  4. 数据库MySQL基本介绍安装使用及文件导入导出

    1.数据库(data base) 1.1 简述 把文件存储在一台电脑上(服务器),其他电脑用户可以通过账号密码登陆,通过网络去访问这台电脑上的文件,但是由于每个人的数据是不同的,所以你只能通过自己的账 ...

  5. Java开发.gitignore文件包含.iml,.log的看法

    有一个开源项目https://github.com/github/gitignore 主要用来规范所有开发项目的.gitignore文件的编写,基本涵盖了所有的开发语言.开发环境等.今日我向JetBr ...

  6. Linux 安装Oracle11g完整安装图文教程另附基本操作 (分享)

    一.修改操作系统核心参数 在Root用户下执行以下步骤: 1)修改用户的SHELL的限制,修改/etc/security/limits.conf文件 输入命令:vi /etc/security/lim ...

  7. 1189: [HNOI2007]紧急疏散evacuate

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3831  Solved: 1119[Submit][Status][Discuss] Descript ...

  8. java高并发之CountDownLatch,CyclicBarrier和join

    晚上打车回家,在车上看到一篇文章<22岁大学生获谷歌天价Offer,年薪千万!>,讲的是印度一个22岁大学生多次参加ACM大赛,开源多个项目,以非常牛逼的履历通过了谷歌的AI测试,斩获谷歌 ...

  9. MySQL自增锁等待问题解决

    有网友再群里问:在做基准测试时候,批量插入数据时,有很多自增锁等待,我告诉他解决办法: 1.innodb_autoinc_lock_mode=2 2.innodb_autoextend_increme ...

  10. 项目配置中 提示access denied的问题 解决方案

    项目配置中 提示access denied的问题,一般原因是你的服务器或虚拟主机的pathinfo没开.... 具体解决办法如下 在PHP安装文件夹下找到php.ini.在文件中搜索cgi.fix_p ...