C0nw4y's L!f3 G4me 代码实现
这是我转载的博客,关于这个游戏的介绍。估计没人能get到这个游戏的blingbling的地方吧。还是蛮惊叹的。
因为这里网络实在惨淡,闲来无事实现了下这个游戏,UI尽量美化了,可惜python配置不知道出了什么毛病,结果只能暂时用C实现一下了,起始页面通过方向键控制移动,空格键种下/拔起种子,回车键游戏开始,生命开始演化,我的博客那个logo gliter,动起来以后还是蛮漂亮的。
#include <iostream>
#include <cstdio>
#include <windows.h>
#include <conio.h>
#include <ctime>
#include <cstring>
#define CELLCOLOR 4
#define DEATHCOLOR 1
using namespace std;
const char UP= 72;
const char DOWN= 80;
const char LEFT= 75;
const char RIGHT= 77;
const char MOVE= ' ';
const char LIVE= '0';
const char DEATH= '*';
const int WIDTH= 30;
const int LENGTH= 56;
int board[WIDTH][LENGTH];
struct cell
{
int x, y;
cell(){};
cell(int xx, int yy) : x(xx), y(yy) {}
}player;
void SetChessColor(int i, int j);
void GoToxy(int x, int y);
void Lif3_G4me(void);
int AffineX(int x);
int AffineY(int y);
void FormGame();
void Animation();
void Update();
bool InBoard(int x, int y);
void Operation(int x, int y);
bool LifeExist();
void DrawFrame();
int main()
{
SetConsoleTitle("C0nway's G4me 0f L!fe!!!!");
system("color f5");
Lif3_G4me();
return 0;
}
void SetCellColor(int i, int j)
{
HANDLE c3ll;
c3ll= GetStdHandle(STD_OUTPUT_HANDLE);
if (board[i][j])
SetConsoleTextAttribute(c3ll, DEATHCOLOR+15*0x10);
else
SetConsoleTextAttribute(c3ll, CELLCOLOR+15*0x10);
}
void GoToxy(int x, int y)
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X=y;
pos.Y=x;
SetConsoleCursorPosition(handle, pos);
}
void Lif3_G4me()
{
DrawFrame();
GoToxy(AffineX(1), AffineY(1));
FormGame();
Animation();
}
int AffineX(int x)
{
return x+10;
}
int AffineY(int y)
{
return y*2+5;
}
void FormGame()
{
memset(board, 0, sizeof(board));
player= cell(1, 1);
int nxtx, nxty;
char opr;
while ('\r'!= (opr= getch())){
if (UP== opr){
nxtx= player.x-1;
nxty= player.y;
Operation(nxtx, nxty);
}
else if (DOWN== opr){
nxtx= player.x+1;
nxty= player.y;
Operation(nxtx, nxty);
}
else if (LEFT== opr){
nxtx= player.x;
nxty= player.y-1;
Operation(nxtx, nxty);
}
else if (RIGHT== opr){
nxtx= player.x;
nxty= player.y+1;
Operation(nxtx, nxty);
}
else if (MOVE== opr){
char cl;
board[player.x][player.y]^= 1;
cl= board[player.x][player.y] ? LIVE : DEATH;
SetCellColor(player.x, player.y);
putchar(cl);
GoToxy(AffineX(player.x), AffineY(player.y));
}
else {
continue;
}
}
}
void Animation()
{
while (LifeExist()){
Update();
DrawFrame();
Sleep(23);
}
}
void Update()
{
int neibr, tboard[WIDTH][LENGTH];
for (int i= 1; i< WIDTH-1; ++i){
for (int j= 1; j< LENGTH-1; ++j){
neibr= 0;
for (int k= -1; k< 2; ++k){
for (int l= -1; l< 2; ++l){
neibr+= board[i+k][j+l];
}
}
neibr-= board[i][j];
if (board[i][j]){
tboard[i][j]= neibr<2 || neibr >3 ? 0 : 1;
}
else {
tboard[i][j]= 3== neibr ? 1 : 0;
}
}
}
for (int i= 1; i< WIDTH-1; ++i){
for (int j= 1; j< LENGTH-1; ++j){
board[i][j]= tboard[i][j];
}
}
}
bool InBoard(int x, int y)
{
return x> 0 && x< WIDTH-1 && y> 0 && y< LENGTH-1;
}
void Operation(int x, int y)
{
if(InBoard(x, y)){
player.x= x;
player.y= y;
GoToxy(AffineX(player.x), AffineY(player.y));
}
}
bool LifeExist()
{
for (int i= 0; i< WIDTH; ++i){
for (int j= 0; j< LENGTH; ++j){
if (board[i][j]){
return true;
}
}
}
return false;
}
void DrawFrame()
{
char cl;
for (int i= 0; i< WIDTH; ++i){
for (int j= 0; j< LENGTH; ++j){
GoToxy(AffineX(i), AffineY(j));
SetCellColor(i, j);
cl= board[i][j] ? LIVE : DEATH;
putchar(cl);
GoToxy(AffineX(i), AffineY(j));
}
}
}
除夕快乐;-)
C0nw4y's L!f3 G4me 代码实现的更多相关文章
- 阿拉伯数字1与英语字母l造成的代码bug
<img src="./images/demo3/1a.png" /> <img src="./images/demo3/la.png" /& ...
- 使用wc -l 来统计代码行数
Linux使用wc来统计行数真的好用 如在当前路径下统计一共多少行代码 $ find ./ -name *.c |xargs wc -l #包括了空行 ##-l :lines 如果不包括空行 ¥fin ...
- Adobe Dreamweaver代码编辑
Adobe Dreamweaver 同义词 DW(Adobe Dreamweaver的缩写)一般指Adobe Dreamweaver Adobe Dreamweaver,简称“DW”,中文名称 &qu ...
- IDEA 代码格式化,快捷键
一键格式化代碼: Ctrl+Alt+L 全局搜索替换:ctrl+shift+r 强大的搜索功能,shift+shift (无论您想要搜啥都能找到) ctrl+shift+R==搜索类 CTRL+N ...
- 佛祖保佑永无BUG代码注释
// // _oo0oo_ // o8888888o // 88" . "88 // (| -_- |) // 0\ = /0 // ___/`---'\___ // .' \\| ...
- 佛祖保佑 永无bug 代码注释
// // _oo0oo_ // o8888888o // 88" . "88 // (| -_- |) // 0\ = /0 // ___/`---'\___ // .' \\| ...
- Mysql:常用代码
C/S: Client Server B/S: Brower Server Php主要实现B/S .net IIS Jave TomCat LAMP:L Mysql:常用代码 Create table ...
- 使用 cloc 统计代码行数
可能大家都知道用 `wc -l` 命令进行代码行数统计,但是它会将代码中的注释.空行所占用的文本行都统计在内.如果想查看一个 tar 包或一个项目目录中“实际”的代码行数并且不愿意自己去写一个脚本来做 ...
- ThinkPHP函数详解:L方法
L方法用于启用多语言的情况下,设置和获取当前的语言定义.调用格式:L('语言变量'[,'语言值'])设置语言变量除了使用语言包定义语言变量之外,我们可以用L方法动态设置语言变量,例如: L('LANG ...
随机推荐
- luoguP4313 文理分科
luoguP4313 文理分科 复习完之后做了道典型题目. 这道题条件有点多 我们逐个分析 如果没有\(sameart\)或者\(samescience\)的限制,就是一个裸的最大权闭合子图的问题了 ...
- GapMinder气泡图:在线互动图表数据平台
GapMinder:在线互动图表数据平台是一个将国际统计数据转换成活动的.交互的和有趣的图表,以在线统计数据为基础的互动图表集的完美世界.目的是通过增进对可以自由访问的公共统计数据的使用和理解,以促进 ...
- CUP计算资源争抢通过IIS启用处理器关联解决
由于业务的复杂性,我们在客户环境部署的时候,采用的是预装好在一台机器然后再把机器安装到客户环境,所以为了简单方便,我们把所有的服务都安装到一台机器上面了. 在正常的使用过程中是没有任何问题的.但是当有 ...
- C++虚继承初识
struct Employee { ... }; struct Manager : Employee { ... }; struct Worker : Employee { ... }; struct ...
- Eclipse 代码快捷键模板(一)
话不多说,自行google. 设置快捷键,打开eclipse,依次打开:Window -> Preferences -> General -> Key. 设置代码快捷键,打卡ecli ...
- 掌握这些,ArrayList就不用担心了!
关于ArrayList的学习 ArrayList属于Java基础知识,面试中会经常问到,所以作为一个Java从业者,它是你不得不掌握的一个知识点.
- 如何在Linux上创建,列出和删除Docker容器
本篇文章介绍的内容是关于在Linux机器上创建,列出和删除docker容器,下面我们来看具体的内容. 1.启动Docker容器 使用下面的命令启动新的Docker容器.这将启动一个新的容器,并为你提供 ...
- $AT2163\ Median\ Pyramid\ Easy$ 构造
正解:构造 解题报告: 传送门$QwQ$ 考虑如果有两个相邻格子是相同数字那么它们以上这两列就都会是这列数字(显然$QwQ$? 所以考虑只要构造出第$n-1$行的中心和中心右侧($or$左侧一样的$Q ...
- selenium自动化测试入门 定位frame和iframe中的元素对象
< frame> <iframe> 标签,浏览器会在标签中打开一个特定的页面窗口(框架),它在本窗口中嵌套进入一个网页,当用selenium定位页面元素的时候会遇到定位不到fr ...
- 你确定你了解什么是linux系统?
1.什么是linux发行版 就Linux的本质来说,它只是操作系统的核心,负责控制硬件.管理文件系统.程序进程等,并不给用户提供各种工具和应用软件.所谓工欲善其事,被必先利其器,一套在优秀的操作系统核 ...