把C语言的知识融合起来做一个练手的小游戏项目,将自己掌握到的数据结构、数组、函数、宏定义等知识综合利用,增加对语法的熟练程度。

操作系统: windows 10 x64

编译IDE : VS2015

  // 实现一个能在屏幕上自由移动的坦克.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include <windows.h>
#include <conio.h> //方向宏定义
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3 //全局数组,画地图用
int g_map[40][40] = { 0 }; //坦克数据结构
typedef struct _TANKINFO
{
unsigned int nNosX; //坦克X坐标
unsigned int nNosY; //坦克Y坐标
unsigned int nLevel; //坦克等级
unsigned int nMaxHP; //坦克最大血值
unsigned int nCurlHP; //坦克当前血值
unsigned int nOldSpeed; //坦克原始速度
unsigned int nSpeed; //坦克当前速度
unsigned int nDirection; //坦克方向
unsigned int nGodirection; //坦克想要改变的方向
unsigned int nKill; //坦克杀敌数
unsigned int nDie; //坦克死亡数
unsigned int wColor; //坦克颜色
unsigned int nIndex; //坦克在数组中的数值
unsigned int nBulletType; //初始坦克的子弹类型
bool bSubSpeed; //是否被减速
char* szForm; //坦克组成的样子
char* szBuff; //状态
}TANKINFO,*PTANKINFO; TANKINFO tank; //坦克样式结构,上下左右方向
int tankstyle[4][3][3] =
{
//方向向上的坦克
{
{0,1,0},
{1,1,1},
{1,0,1} }, //方向向下的坦克
{
{1,0,1},
{1,1,1},
{0,1,0}
}, //方向向左的坦克
{
{0,1,1},
{1,1,0},
{0,1,1}
}, //方向向右的坦克
{
{1,1,0},
{0,1,1},
{1,1,0}
}
}; //血量绘画
char *m_blood[10] = {" ①","②","③","④","⑤","⑥","⑦","⑧","⑨","⑩" }; //按键接收
char KeyBoardMonitor()
{
char ch;
if (_kbhit())
{
ch = _getch();
}
else
{
return 0;
}
return ch;
} //画图函数
void writeChar(int High, int Wide, char * pszChar, WORD wArr)
{
//设置光标属性
CONSOLE_CURSOR_INFO cci;
cci.dwSize = 1; // 光标百分比厚度(1~100)
cci.bVisible = FALSE; //是否显示光标
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
//设置坐标
COORD loc;
loc.X = Wide * 2; //X的值是Wide的2倍;
loc.Y = High;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wArr);
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), loc);
printf(pszChar); //打印时需要注意有些特殊字符是占2个字节
} //清除坦克
void clsTank()
{
for (unsigned int y = tank.nNosY - 1,i=0; y <= tank.nNosY + 1; y++,i++)
{
for (unsigned int x = tank.nNosX-1,j=0;x<= tank.nNosX+1;x++,j++)
{
//用坦克的方向对照坦克模型数组,把坦克在界面上画出来
writeChar(y, x, " ",FOREGROUND_GREEN); }
}
} //绘画坦克
void DrawTank()
{
for (unsigned int y = tank.nNosY - 1, i = 0; y <= tank.nNosY + 1; y++, i++)
{
for (unsigned int x = tank.nNosX - 1, j = 0; x <= tank.nNosX + 1; x++, j++)
{
//用坦克的方向对照坦克模型数组,把坦克在界面上画出来
writeChar(y, x, tankstyle[tank.nDirection][i][j] == 1 ? "█" : " ", FOREGROUND_RED); }
}
} //坦克撞墙检测
bool allowMove()
{
if ((tank.nNosX <= 1)
||
(tank.nNosX >= 38) //画图边界判断
||
(tank.nNosY <= 2)
||
(tank.nNosY >= 38)
)
{
return false;
}
return true;
} //移动坦克
void moveTank()
{ clsTank(); //碰撞检查
if (allowMove() == false)
{
MessageBoxA(0, "撞墙啦!", "扑街", 0);
clsTank();
DrawTank();
} if (tank.nDirection != tank.nGodirection)
{
tank.nDirection = tank.nGodirection; //根据键盘获取到的键盘赋值到现有的方向
}
else
{ switch (tank.nGodirection)
{
case UP:
{
tank.nNosY--;
break;
} case DOWN:
{
tank.nNosY++;
break;
} case LEFT:
{
tank.nNosX--;
break;
} case RIGHT:
{
tank.nNosX++;
break;
}
}
} DrawTank(); } //画出地图
void DrawMap()
{
//遇到四周,那么写入1
for (int row = 0; row < 40; row++)
{
for (int col = 0; col < 40; col++)
{
if ((row == 0)
||
(row == 39)
||
(col == 0)
||
(col == 39)
)
{
g_map[row][col] = 1;
}
else
{
g_map[row][col] = 0; }
}
}
//输出所有的地图
for (int row = 0; row < 40; row++)
{
for (int col = 0; col < 40; col++)
{
if (g_map[row][col] == 1)
{
printf("■");
}
else
{
printf(" ");
}
}
printf("\n");
} } int main()
{
//给坦克赋值
tank.nNosX = 10;
tank.nNosY = 10; //画出地图
DrawMap();
//画出坦克
DrawTank(); char ch;
while(true)
{
ch = KeyBoardMonitor();
if (ch == 0)
{
continue;
}
if (ch == VK_ESCAPE)
{
break;
}
switch (ch)
{
case 'w':
{
tank.nGodirection = UP;
}
break;
case 's':
{
tank.nGodirection = DOWN;
}
break;
case 'a':
{
tank.nGodirection = LEFT;
}
break;
case 'd':
{
tank.nGodirection = RIGHT;
}
break;
}
moveTank();
} return 0;
}

运行效果

C语言练手游戏-控制台输出一个会移动的坦克的更多相关文章

  1. C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  2. C语言练手自己编写学生成绩管理系统

    #include<stdio.h> #include<stdlib.h> /*定义学生结构体*/ struct Student { ]; ]; float Mark1; flo ...

  3. python3 练手实例6 做一个简单日历

    import calendar year = int(input('请输入要查询的年份:')) month = int (input('请输入要查询的月数:')) print (calendar.mo ...

  4. python3 练手实例5 做一个简单电子时钟

    import time,sys,os while(1): t = time.strftime('%Y-%m-%d\n%H:%M:%S',time.localtime(time.time())) pri ...

  5. 推荐:一个适合于Python新手的入门练手项目

    随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...

  6. WEBGL学习笔记(七):实践练手1-飞行类小游戏之游戏控制

    接上一节,游戏控制首先要解决的就是碰撞检测了 这里用到了学习笔记(三)射线检测的内容了 以鸟为射线原点,向前.上.下分别发射3个射线,射线的长度较短大概为10~30. 根据上一节场景的建设,我把y轴设 ...

  7. Cocos2d—X游戏开发之VS2010 控制台输出中文,模拟器中文乱码问题解决

    首先,先解决第一个问题,我们使用VS2010开发的时候,调试的时候,中文打印出来都是乱码,这个问题很纠结. 如下图: CCLOG("cclog: 测试使用标签的自动换行和个别字体大写&quo ...

  8. 练手项目:利用pygame库编写射击游戏

    本项目使用pygame模块编写了射击游戏,目的在于训练自己的Python基本功.了解中小型程序框架以及学习代码重构等.游戏具有一定的可玩性,感兴趣的可以试一下. 项目说明:出自<Python编程 ...

  9. Xamarin入门,开发一个简单的练手APP

    之前周末用Xamarin练手做了个简单APP,没有啥逻辑基本就是个界面架子,MVVM的简单使用,还有Binding,Command的简单使用,还有一个稍微复杂点两个界面交互处理(子页面新增后关闭,父页 ...

随机推荐

  1. MT【12】三点坐标求面积

    $L_1,L_2$是O发出的两条射线,C是一个常数,一条动直线$l$分别与$L_1,L_2$交于A,B两点.$S_{\Delta ABC}=C$,求A,B的中点D的轨迹方程.(2012北大自主招生) ...

  2. MT【10】和三次有关的一个因式分解

    解答: 评:1此处因式分解也可以看成关于$a$的函数$f(a)$利用多项式有理根的有关知识得到 2.此处我们可以得到关于$\Delta ABC$的余弦的一个不等式$cosA+cosB+cosC> ...

  3. emWin 之 WM_SetCallback 创建回调函数

    @2018-7-11 [小记] emWin 通过函数 WM_SetCallback ( )  自定义回调函数 > 下段代码就是通过 MESSAGEBOX 控件的 OK 按键实现删除信息框的对话框 ...

  4. bzoj5280/luogu4376 MilkingOrder (二分答案+拓扑序)

    二分答案建图,然后判环,就可以了. 字典序输出的话,只要做拓扑序的时候用优先队列来维护就可以了. (其实判环也可以用拓扑序...) #include<cstdio> #include< ...

  5. 【模板】第 K 大数

    题目:给定一个序列,求其第 K 大的数是多少. 时间复杂度\(O(n)\) 代码如下: #include <bits/stdc++.h> using namespace std; cons ...

  6. apigateway-kong(六)认证

    到上游服务(API或微服务)的流量通常由各种Kong认证插件的应用程序和配置来控制.由于Kong的服务实体(Service Entity)代表自己的上游服务的1对1映射,最简单的方案是在选择的服务上配 ...

  7. spring-data-jpa与mybatis的对比

    Spring Data JPA 与 MyBatis对比 Spring Data JPA是Spring Data的子模块.使用Spring Data,使得基于“repositories”概念的JPA实现 ...

  8. k8s 常用命令汇集

    通过yaml文件创建: kubectl create -f xxx.yaml (不建议使用,无法更新,必须先delete) kubectl apply -f xxx.yaml (创建+更新,可以重复使 ...

  9. 9、Python-文件操作

    打开关闭文件 # 打开一个已经存在的文件,或者创建一个新文件 f = open('test.txt', 'w') # 关闭这个文件 f.close() 访问模式 说明 r 以只读方式打开文件.文件的指 ...

  10. idea常用的插件

    ignore 插件 可以自动生成.ignore文件   非常的实用 gitee 插件 搜所gitee安装即可  码云的插件 maven helper 插件 idea 中解决maven 包冲突的问题 a ...