今天和人吃晚饭突然想起来

之前西佳佳老师说小学期会要求两星期撸一个小游戏

有人已经撸完一个俄罗斯方块了...

菜逼我决定从最简单的贪吃蛇玩起...

我是直接参考的这个博客

算是相当简单而且很Low的实现了

在我看来

开始和结束界面不是重点

自己随意设计一下吧

然后贪吃蛇的活动问题

由定时清屏再输出字符矩阵来解决

果实位置当然由随机数获得

定时问题直接用ctime函数来计算

这里的开始界面也用到了

清屏再输出的方式进行了倒计时

对蛇身的记录可以使用双端队列deque

操作不是很多也可以手写

获取键盘读入的问题

可以用键盘扫描码来解决

上下左右分别为72 80 75 77

_kbhit()函数判断是否有键盘输入

默认除“上下左右”以外的输入直接导致游戏结束

另一个可行的方案就是使用WASD来控制方向

就不必使用键盘扫描码了

然后代码里虽然同时使用了getch 和 _getch

但其实这似乎只是不同库里的功能一样的函数...

最后放上相当简陋的代码(我好懒就没写注释)

 #include<ctime>
#include<cstdio>
#include<conio.h>
#include<cstdlib> #define map(pos) map[pos.x][pos.y] char map[][]; struct point {
int x, y; void _rand() {
x = rand() % + ;
y = rand() % + ;
} bool operator == (const point &a) const {
return x == a.x && y == a.y;
} }; int head, tail;
point snake[], food, next;
int dir, grade, length, uptime; inline void find_food() {
do {
food._rand();
}while(map(food) != ' ');
map(food) = '*';
} inline void update() {
system("cls");
puts("");
for(int i = ;i < ;i ++) {
putchar('\t');
for(int j = ;j < ;j ++)
putchar(map[i][j]), putchar(' ');
if(i == ) printf("\t等级为:%d", grade);
if(i == ) printf("\t长度为:%d", length);
if(i == ) printf("\t自动前进时间");
if(i == ) printf("\t间隔为:%d ms", uptime);
puts("");
}
} inline bool GO() {
bool timeover = ;
double start = (double) clock() / CLOCKS_PER_SEC;
while((timeover = (double) clock() / CLOCKS_PER_SEC <= start + uptime / 1000.0) && !_CRTIMP::_kbhit());
if(timeover) {
_getch();
dir = _getch();
}
next = snake[head];
switch (dir) {
case :next.x -= ;break;
case :next.x += ;break;
case :next.y -= ;break;
case :next.y += ;break;
default:
puts("\tGame over!");
return ;
}
if(!next.x || next.x == || !next.y || next.y == ) {
puts("\tGame over!");
return ;
}
if(map(next) != ' ' && !(next == food)) {
puts("\tGame over!");
return ;
}
if(length == ) {
puts("\tGood game!");
return ;
}
return ;
} int main() {
srand();
for(int i = ;i <= ;i ++)
for(int j = ;j <= ;j ++)
map[i][j] = ' ';
for(int i = ;i < ;i ++)
map[i][] = map[][i] = map[][i] = map[i][] = '!';
map[][] = map[][] = 'o', map[][] = '@';
snake[] = (point){, };
snake[] = (point){, };
snake[] = (point){, };
head = , tail = , grade = , length = , uptime = ;
find_food(), dir = ; puts("\n\n\n\t\t\t即将开始玩蛇!");
double start;
for(int i = ;i >= ;i --) {
start = (double)clock() / CLOCKS_PER_SEC;
while((double)clock() / CLOCKS_PER_SEC <= start + );
if(i > ) {
system("cls");
printf("\n\n\n\t\t\t进入倒计时:%d\n", i);
}
else {
update();
}
} while() {
if(GO()) {
if(next == food) {
length ++;
if(length % == ) {
grade ++;
if(uptime >= ) uptime -= ;
}
map(next) = '@';
map(snake[head]) = 'o';
head = (head + ) % ;
snake[head] = next;
find_food(), update();
}
else {
map(snake[tail]) = ' ';
tail = (tail + ) % ;
map(next) = '@';
map(snake[head]) = 'o';
head = (head + ) % ;
snake[head] = next;
update();
}
}
else break;
}
getch();
return ;
}

没有使用图形

开始界面还能接受

结束界面没有再来一局的提示

也没有最终分数的显示

有待改进

另外想写一个自动玩这个游戏的程序

不考虑最短路径的话

在nm不全为奇数的情况下是有必胜策略的

而这是比较好实现的

但还要考虑一下怎么把它自己玩的过程展现出来?

直接把游戏代码嵌入进去?那岂不是很蠢?

而考虑同等分数下的最少按键次数或最少移动次数呢?

似乎可以尝试用机器学习的方法来搞一搞?

都忘记到底是深度学习还是强化学习了...

但这似乎可能又与随机出来的果实位置有关?

机器学习的话,可以直接尝试让它自己学着玩这个游戏?

......

看上去比上一个想法更有实现的意义?

先到此为止

play snake on windows的更多相关文章

  1. C++控制台贪吃蛇代码

    游戏截图: 以下是3个代码文件: Snake_Class.h文件: #ifndef SNAKE #define SNAKE #include<windows.h> #include< ...

  2. windows下搭建svn服务端、客户端

    1.安装SVN服务器subversion以及客户端TortoiseSVN,在网上下载windows版的subversion,TortoiseSVN并安装,比如我的服务端安装在了D:\Program F ...

  3. Windows程序设计 贪吃蛇c

    看Windows程序有段时间了,终于动手写东西.贪吃蛇算是一个开始吧,下面的贪吃蛇很简单,也有很多地方需要修改,还有情况没有考虑QAQ 但这不是我的目的了... 思路很简单:建个链表储存蛇身节点即可. ...

  4. 教你pomeloclient包libpomelo增加cocos2d-x 3.0工程(Windows、Android、IOS平台)

    Windows平台 操作系统:Windows7(64-bit) VS版本号:2013 Cocos2d-x版本号:3.0 project路径:E:\cocos2d-prj\ 1.从github下载lib ...

  5. Windows API教程文件系统

    本篇文章主要介绍了"Windows API教程文件系统",主要涉及到Windows API教程文件系统方面的内容,对于Windows API教程文件系统感兴趣的同学可以参考一下. ...

  6. play snake on linux

    在写完超Low的windows上的贪吃蛇后 被人吐槽了几个方面: 1.界面真的Low,开始,结束,游戏中,都太简陋了... 2.每次都清屏在输出字符矩阵的解决方案...太晃眼了 3.一个BUG,为了解 ...

  7. Windows server 2012 添加中文语言包(英文转为中文)(离线)

    Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...

  8. Windows Server 2012 NIC Teaming介绍及注意事项

    Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...

  9. C# 注册 Windows 热键

    闲扯: 前几日,一个朋友问我如何实现按 F1 键实现粘贴(Ctrl+V)功能,百度了一个方法,发给他,他看不懂(已经是 Boss 的曾经的码农),我就做了个Demo给他参考.今日得空,将 Demo 整 ...

随机推荐

  1. Faas 典型场景——应用负载有显著的波峰波谷,典型用例-基于事件的数据处理

    Serverless适用的两大场景 场景一:应用负载有显著的波峰波谷 Serverless化与否的评判标准并不是公司规模的大小,而是其业务背后的具体技术问题,比如业务波峰波谷明显,如何实现削峰填谷.一 ...

  2. 【POJ 3190】 Stall Reservations

    [题目链接] http://poj.org/problem?id=3190 [算法] 将这些牛按开始吃草的时间排序 维护一个数组S,Si表示畜栏i进去的最后一头牛结束吃草的时间,对于每头牛,找任意一个 ...

  3. 设计模式 |备忘录模式(memento)

    定义: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 结构:(书中图,侵删) Originator:需要备份的类(写在便签上 ...

  4. RHEL6.5安装QT5.4,设置环境变量

    qt5.4.run在[/home/share]目录下 vim ~/.bashrcexport PATH=/opt/oracle/Qt5.4.1/Tools/QtCreator/bin:/opt/ora ...

  5. day24 03 多继承

    day24 03 多继承 正常的代码中  单继承==减少了代码的重复 继承表达的是一种 子类是父类的关系 1.简单的多继承关系 A,B,C,D四个类,其中D类继承A,B,C三个父类,因此也叫多继承,子 ...

  6. 1CSS简介

    -------------------------------------------------------------------------------------------------- - ...

  7. layer实现在前台删除前确认弹出框,并回调后台删除事件

    最近遇到一些问题,用layer提示消息框,比如删除时,提示消息确定后 return false时,则不管用了,因为layer不支持阻塞,下面就解决一下这个问题:(本文使用Xcode,如要学习,请复下面 ...

  8. [原创]Toolbar setNavigationIcon无效

    最近在做一个Toolbar,setNavigationIcon()这个方法一直无效,说什么的都有,什么getSupportActionBar().setNavigationIcon()的,说设置sty ...

  9. 微信小程序 "request:fail 发生了 SSL 错误无法建立与该服务器的安全连接。"

    android机子可以真机预览,ios机子报这个错误 检测域名 苹果ATS检测 https://cloud.tencent.com/product/ssl#userDefined10 以上都通过 ht ...

  10. CSS——float

    float:就是在于布局,首先要介绍的是文档流(标准流),之后是浮动布局. 文档流:元素自上而下,自左而右,块元素独占一行,行内元素在一行上显示,碰到父集元素的边框换行. 浮动布局: 1.float: ...