首页 > 其他分享 >c语言实现简单的飞机小游戏

c语言实现简单的飞机小游戏

时间:2023-03-08 20:13:19浏览次数:39  
标签:getch 障碍物 飞机 语言 int move 小游戏 printf

在今天浏览csdn的过程中,看到了一个用c语言做的简单的飞机小游戏,感觉非常有意思,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
int x=15;
int y=5;
int i,n;
int bill=0;
char move;

int a=10; //障碍物的横坐标
int live=1; //障碍物存活状态

while(1) //意思是死循环
{
system("cls"); //清屏函数

if(live==1)
{
for(i=0;i<a;i++)
printf(" "); //输出障碍物左侧空格

printf("*");
}
if(bill==0)
{
for(i=0;i<y;i++)
printf("\n");
}
else {
for(i=0;i<y;i++){
for(n=0;n<(x+2);n++) //x+2的原因是飞机头左侧空格有x+2个
printf(" "); //这个+2是为了和身体对称而手动输出的
printf("|\n");

}
if(x+2==a) //意思是,如果射线横坐标+2等于障碍物坐标,那么障碍物被赋值为0,也就消失了
live=0; //+2是因为要配合机身对准机头
}
bill=0;

for(n=0;n<x;n++)
printf(" "); //输出飞机左侧的空格
printf(" *\n"); //输出飞机头部

for(n=0;n<x;n++)
printf(" "); //输出飞机身体部分左侧的空格
printf("*---*\n"); //因为飞机头部输出后有回车,所以飞机身体已经在下一行

for(n=0;n<x;n++)
printf(" "); //输出飞机尾巴部分左侧的空格
printf(" +-+ \n");

move=getch(); //注意getch函数的使用
if(move=='a') //注意是==不是=
x--; //就是x-1的意思,实现让飞机左移
if(move=='d')
x++;
if(move=='w')
y--;
if(move=='s')
y++;
if(move==' ')
bill=1;
} //这些代码都在while(1)内
return 0;
}

运行结果如图:

 

 可以发现,在这个程序中是存在一些错误的。而错误的来源我通过查相关资料得知是函数名的错误使用,在vs中getch函数的函数名是_getch,而在dev c++中getch函数的函数名就是getch。因为我使用的是vs。所以我们将代码中的getch修改为_getch,再次运行,运行结果如图:

 

 我们发现代码可以运行成功,并且可以实现所描述的飞机的移动和激光的发射,以及障碍物的摧毁功能。但是,我们发现,他的飞机的打印是通过for循环来在前面打空格,在在对应的位置打印*来实现的。这里我们可以使用结构体来定义一个光标对象,并在结构体中运用对应函数来实现光标的跳转操作。从而不用在使用for循环打空格,可以直接在想要的的位置打印飞机。障碍物的打印同样可以用这种方法来实现。

同时,在操作的过程中我们可以发现,当输入法输入的是中文的时候我们并不能通过WASD来实现飞机的移动,情况如图:

 

 

因此我在他的基础上加入了通过上下左右键来实现飞机的移动,这样使用上下左右来控制飞机的移动就不会出现因为输入法输入的是中文而不能移动飞机的情况了。同时,在他的代码中,障碍物的位置是固定的,不能移动,很容易就能通关游戏,毫无趣味性。因此,我通过随机数让障碍物的位置是随时移动的,以此来增加游戏的趣味性。以上就是我对他的小游戏进行的修改。最后,完整的代码如下:

#include <stdio.h>
#include<windows.h>
#include <stdlib.h>
#include <conio.h>
#define ROW 22 //游戏区行数
#define COL 42 //游戏区列数

void CursorJump(int x, int y)
{
COORD pos; //定义光标位置的结构体变量
pos.X = x; //横坐标
pos.Y = y; //纵坐标
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄
SetConsoleCursorPosition(handle, pos); //设置光标位置
}

int main()
{
int x = 15;
int y = 5;
int i, n;
int bill = 0;
char move;


int live = 1; //障碍物存活状态

while (1) //意思是死循环
{
system("cls"); //清屏函数

int a, b;
a = rand() % ROW;
b = rand() % COL;

if (live == 1)
{
CursorJump(2 * b, a); //光标跳转到生成的随机位置处
printf("*");
}
if (bill == 0)
{
for (i = 0; i < y; i++)
printf("\n");
}
else {
for (i = 0; i < y; i++) {
CursorJump(x + 2, i);
printf("|");

}
if (x + 2 == a) //意思是,如果射线横坐标+2等于障碍物坐标,那么障碍物被赋值为0,也就消失了
live = 0; //+2是因为要配合机身对准机头
}
bill = 0;

CursorJump(x, y);
printf(" *"); //输出飞机头部

CursorJump(x, y + 1);
printf("*---*"); //因为飞机头部输出后有回车,所以飞机身体已经在下一行

CursorJump(x, y + 2);
printf(" +-+ ");

move = _getch(); //注意getch函数的使用
if (move == 'a' || move == '←') //注意是==不是=
x--; //就是x-1的意思,实现让飞机左移
if (move == 'd' || move == '→')
x++;
if (move == 'w' || move == '↑')
y--;
if (move == 's' || move == '↓')
y++;
if (move == ' ')
bill = 1;
} //这些代码都在while(1)内
return 0;
}

运行结果如图:

 

标签:getch,障碍物,飞机,语言,int,move,小游戏,printf
From: https://www.cnblogs.com/bajiu89/p/17195926.html

相关文章

  • 猜数字小游戏
    这是python课上写的一个小游戏,其实就是一个猜数字的游戏这是while循环的形式 这是for循环 try...except是用来判断输入的是不是数字,如果不是就会提示并重新接收,下面就......
  • go语言练习-简易学生管理系统
    需求:写一个简易的学生管理系统,能满足对学生的查询、增加、删除、修改操作一、函数方式实现1packagemain23import(4"bufio"5"fmt"6......
  • 学习C语言第三弹:函数(1)
    函数是什么?数学中我们常见到函数的概念。维基百科中对函数的定义:子程序。   ·在计算机科学中,子程序(英语:Subroutine,procedure,function,routine,method,subprogram,callab......
  • 嵌入式C语言九大数据结构操作方式详解
          数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织......
  • Linux & 标准C语言学习 <DAY9_1>
    //补08_2函数  2、函数传参:    1.函数中定义的变量属于该函数,出了该函数就不能再被别的函数直接使用    2.实参与形参之间是以赋值的方式进行......
  • 实验1 C语言开发环境使用和数据类型、运算符、表达式
    //打印一个字符小人#include<stdio.h>intmain(){printf("o\n");printf("<H>\n");printf("II\n");return0;}#include<stdio.h>......
  • 9.3.1能动的语言2
    我们不从所有可以想象到的可能来探讨语言机器,而是延续本书前面章节的主要论点,从明显可看出的趋势来探讨。这里的探讨仍是理论性的,不会进入工程、技术的领域,所得到的结论也......
  • Java到底是编译型语言还是解释型语言?
    Java编程语言是由Sun微系统公司在20世纪90年代早期开发的。尽管Java主要用于基于internet的应用程序,但它是一种简单、高效、通用的语言。Java最初是为运行在多个平台上的......
  • Go语言: 如何让 request.Body 可以多次读取
    起因:困惑使用了go的http服务后,发现request.Body居然只能读取一次,第二次读取数据为nil.比如我在gin的服务器中,先加入了accessLog,需要进行parseForm()但是后续......
  • 实验1 C语言开发环境使用和编程初体验
    实验任务1程序源码//打印一个字符小人#include<stdio.h>intmain(){printf("O\n");printf("<H>\n");printf("II\n");printf("O\n");printf("<H>\n");......