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的简单使用,还有一个稍微复杂点两个界面交互处理(子页面新增后关闭,父页 ...
随机推荐
- python的多线程到底有没有用?
在群里经常听到这样的争执,有人是虚心请教问题,有人就大放厥词因为这个说python辣鸡.而争论的核心无非就是,python的多线程在同一时刻只会有一条线程跑在CPU里面,其他线程都在睡觉.这是真的吗? ...
- BZOJ 5249: [2018多省省队联测]IIIDX(贪心 + 线段树)
题意 这一天,\(\mathrm{Konano}\) 接到了一个任务,他需要给正在制作中的游戏 \(\mathrm{<IIIDX>}\) 安排曲目 的解锁顺序.游戏内共有\(n\) 首曲目 ...
- 自学Zabbix之路15.4 Zabbix数据库表结构简单解析-Expressions表、Media表、 Events表
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.4 Zabbix数据库表结构简单解析-Expressions表.Medi ...
- 【BZOJ1818】[CQOI2010]内部白点(树状数组,扫描线)
[BZOJ1818][CQOI2010]内部白点(树状数组,扫描线) 题面 BZOJ 题解 不难发现\(-1\)就是在搞笑的. 那么对于每一行,我们显然可以处理出来最左和最右的点,那么等价于我们在横着 ...
- [2019/03/17#杭师大ACM]赛后总结(被吊锤记)
前言 和扬子曰大佬和慕容宝宝大佬一组,我压力巨大,而且掌机,累死我了,敲了一个下午的代码,他们两个人因为比我巨就欺负我QwQ. 依旧被二中学军爆锤,我真的好菜,慕容宝宝或者是扬子曰大佬来掌机一定成绩比 ...
- Haproxy Mysql cluster 高可用Mysql集群
-----client-----------haproxy---------mysql1----------mysql2------192.168.1.250 192.168.1.1 192.168. ...
- luogu1169 棋盘制作 (单调栈)
先预处理出来从每个位置 以0开始 往右交替最多能放多少格 然后就相当于对每一列做HISTOGRA #include<bits/stdc++.h> #define pa pair<in ...
- [bzoj4709][柠檬]
bzoj4709 思路 首先,最优秀的分法一定是每段两端都是这一段中最多的那个,否则可以把不是的那个踢出去单独成段肯定会更优秀.然后就成了将这个序列分段,保证每段两端元素相同的最大收益和. 用a[i] ...
- springboot集成mybatis-generator时候遇到的问题
今天在集成mybatis自动生成内容的时候,出现了几个问题,解决了一个小时才搞完,都怪之前没有好好研究研究: 1.mysql-connector-java新驱动带来的问题? 当用比较新的sql驱动的时 ...
- 13 款高逼格且实用的 Linux 运维必备工具
转载于民工哥技术之路 1. 查看进程占用带宽情况 - Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽. 下载:http://sourceforge.ne ...