C语言练手游戏-控制台输出一个会移动的坦克
把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语言练手游戏-控制台输出一个会移动的坦克的更多相关文章
- C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- C语言练手自己编写学生成绩管理系统
#include<stdio.h> #include<stdlib.h> /*定义学生结构体*/ struct Student { ]; ]; float Mark1; flo ...
- python3 练手实例6 做一个简单日历
import calendar year = int(input('请输入要查询的年份:')) month = int (input('请输入要查询的月数:')) print (calendar.mo ...
- python3 练手实例5 做一个简单电子时钟
import time,sys,os while(1): t = time.strftime('%Y-%m-%d\n%H:%M:%S',time.localtime(time.time())) pri ...
- 推荐:一个适合于Python新手的入门练手项目
随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...
- WEBGL学习笔记(七):实践练手1-飞行类小游戏之游戏控制
接上一节,游戏控制首先要解决的就是碰撞检测了 这里用到了学习笔记(三)射线检测的内容了 以鸟为射线原点,向前.上.下分别发射3个射线,射线的长度较短大概为10~30. 根据上一节场景的建设,我把y轴设 ...
- Cocos2d—X游戏开发之VS2010 控制台输出中文,模拟器中文乱码问题解决
首先,先解决第一个问题,我们使用VS2010开发的时候,调试的时候,中文打印出来都是乱码,这个问题很纠结. 如下图: CCLOG("cclog: 测试使用标签的自动换行和个别字体大写&quo ...
- 练手项目:利用pygame库编写射击游戏
本项目使用pygame模块编写了射击游戏,目的在于训练自己的Python基本功.了解中小型程序框架以及学习代码重构等.游戏具有一定的可玩性,感兴趣的可以试一下. 项目说明:出自<Python编程 ...
- Xamarin入门,开发一个简单的练手APP
之前周末用Xamarin练手做了个简单APP,没有啥逻辑基本就是个界面架子,MVVM的简单使用,还有Binding,Command的简单使用,还有一个稍微复杂点两个界面交互处理(子页面新增后关闭,父页 ...
随机推荐
- 自学工业控制网络之路2.2-PROFINET
返回 自学工业控制网络之路 自学工业控制网络之路2.2-PROFINET PROFINET由PROFIBUS国际组织(PROFIBUS International,PI)推出,是新一代基于工业以太网技 ...
- 自学Python5.2-类和对象概念
自学Python之路 自学Python5.2-类和对象概念 面向对象编程的2个非常重要的概念:类和对象 对象是面向对象编程的核心: 在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出 ...
- [luogu3801]红色的幻想乡
题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在 ...
- 【转】cJSON 源码阅读笔记
前言 cjson 的代码只有 1000+ 行, 而且只是简单的几个函数的调用. 而且 cjson 还有很多不完善的地方, 推荐大家看完之后自己实现一个 封装好的功能完善的 cjson 程序. json ...
- 洛谷 P3313 [SDOI2014]旅行 解题报告
P3313 [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教 ...
- apk的安装删除
1,签名: java -jar signapk.jar platform.x509.pem platform.pk8 DownloadProvider.apk DownloadProvider-sig ...
- 【ATcoder】Xor Sum 2
题目大意:给定一个 N 个点的序列,求有多少个区间满足\(\oplus_{i=l}^ra[i]=\sum\limits_{i=l}^ra[i]\). 题解: 小结论:\(a\oplus b=a+b\r ...
- Java:判断当前操作系统界面采用的主题是windows经典样式还是xp样式
想起两三年前,发现写Java界面的时候,如果将当前界面的layout设为null,由于windows的不同主题界面下,标题栏的高度不一致,导致当前界面表现也不一致. 当时就想找到一个办法先判断当前用户 ...
- 误删除 linux 系统文件了?这个方法教你解决
转载于互联网并适当的修改 误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题.方法总比问题多~ 说在前面的话 针对日常维护操作,难免会出现文件误 ...
- set_index() pandas
set_index DataFrame可以通过set_index方法,可以设置单索引和复合索引. DataFrame.set_index(keys, drop=True, append=False, ...