C语言实现打砖块小游戏

本文实例为大家分享了C语言实现打砖块游戏的具体代码,供大家参考,具体内容如下

本节我们将沿用 上一节 所提到的函数式游戏框架来写一个弹球打砖块的游戏。

基本量、边框绘制

我们首先定义好可能需要的变量,比如小球坐标以及速度、游戏界面高度和宽度等等,然后再根据之前提到的弹跳小球重构代码,剩下的内容再分步添置即可。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <cwindow.h>

// 全局变量
int width,high;        //游戏界面尺寸
int ball_x,ball_y;        //小球坐标
int ball_vx,ball_vy;        //小球速度

void gotoxy(int x, int y)    //移动光标便于清屏重画
{
    HANDLE handle = GetStdHandle(STD_UOTPUT_HANDLE);
    CROOD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}

void startup()        //数据初始化
{
    high = 15;
    width = 20;
    ball_x = 0;
    ball_y = width/2;
    ball_vx = 1;
    ball_vy = 1;
}

void show()        //显示界面
{
    gotoxy(0,0);    //光标移动到原点便于重画
    int i,j;
    for(i=0; i<high; i++)
    {
        for(j=0; j<width; j++)
        {
            if((i==ball_x)&&(j==ball_y))
                printf("O"); //输出小球
            else if(j == width)    //到达右边界
                printf("|"); //输出边界
            else if(i == high)  //到达下边界
                printf("-"); //输出边界
            else
                printf(" "); //非小球坐标输出空格
        }
        printf("\n");
    }
}

void updateWithoutInput()    //与输入无关更新
{
    ball_x = ball_x + ball_vx;
    ball_y = ball_y + ball_vy;
    // 判断是否到达边界
    if((ball_x == 0)||(ball_x == high - 1))
        ball_vx = - ball_vx;
    if((ball_y == 0)||(ball_y == width - 1))
        ball_vy = - ball_vy;
    //延时刷新
    sleep(50); 
}

void updateWithInput()    //与输入有关更新
{}     //当前没有

int main()
{
    startup();    //最开始初始化一次
    while(1)    //游戏循环体
    {
        show(); //先展示画面
        //然后是数据更新
        updateWithoutInput();
        updateWithInput();
    }
    return 0;
}

在判断小球到达边界的部分,我们在第二条件中执行了一操作,目的是为了避免出现小球和边界重合的情况。

移动挡板

接下来我们要在游戏中显示一个中心坐标为 ( position_x ,position_y ) 且半径为 ridus 的挡板。用 left 和 right 表示其左边和右边位置。

首先定义相关变量:

int position_x,position_y;
int ridus;
int left,right;

然后数据初始化:

position_x = high; //挡板在最底下
position_y = width/2;
ridus = 5;
left = position_y - ridus;
right = position_y + ridus;

最后在输出中添加输出挡板的部分:

if ...
else if ((i == high)&&(j >= left)&&(j <= right))
    printf("*");
else ...

既然已经画好了挡板,那么要能让它移动才行。

很明显,按照一般游戏思路来,我们不能在移动中改变 x 坐标,也就是说挡板只能左右移动,左移 y 坐标减一,右移则加一。

所以到此我们就要写 updateWithInput 函数部分了。

void updateWithInput()
{
    char input;
    if(kbhit())
    {
        input = getch();
        if(input == 'a')
        {
            position_y --;
            left = position_y - ridus;
            right = position_y + ridus;
        }
        if(input == 'd')
        {
            position_y ++;
            left = position_y - ridus;
            right = position_y + ridus;
        }
    }
}

反弹小球

反弹小球部分思路就比较清晰一些,简单来说就是判断当小球 x 坐标到达最底部时,其 y 坐标是不是在挡板所规定的范围内,如果是,则改变小球速度;如果不是,游戏结束。

我们还可以定义一个 ball_number 来记录小球反弹的次数。

int ball_number;
//初始化
ball_number = 0;

随后来写我们的 updateWithoutInput 部分:

void updateWithoutInput()
{
    if(ball_x == high - 1)
    {
        if((ball_y >= left)&&(ball_y <= right))    //被挡住
        {
            ball_number ++;
            printf("\a");    //响铃
        }else{
            printf("游戏结束,因为你没接住控制命运的小球\n");
            system("pause");
            exit(0);
        }
    }
    // 以后内容同前
}

消除砖块

我们使用字母O来表示小球了,那么用什么来表示砖块呢?

这个时候就是看你的英语有没有好好学,我们知道 Brick 是指砖块,所以我们使用字母B来表示砖块,毕竟B本身就像个砖块(并没有)。

需要定义的量:

  • 砖块位置
  • 得分(击中砖块加一)
int brick_x, brick_y;
int score;
//初始化
brick_x = 0;
brick_y = width/2 + 1;
score = 0;

至于输出和判定击中,我就不再多赘述了,基本思路还是和之前一样,输出部分加一句 else if 就可以了,而击中判定在 updateWithoutInput 里。

小结

上代码!!!!!!

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <cwindow.h>

// 全局变量
int width,high;        //游戏界面尺寸
int ball_x,ball_y;        //小球坐标
int ball_vx,ball_vy;        //小球速度
int position_x,position_y;
int ridus;
int left,right;
int ball_number;
int brick_x, brick_y;
int score;

void gotoxy(int x, int y)    //移动光标便于清屏重画
{
    HANDLE handle = GetStdHandle(STD_UOTPUT_HANDLE);
    CROOD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}

void startup()        //数据初始化
{
    high = 15;
    width = 20;
    ball_x = 0;
    ball_y = width/2;
    ball_vx = 1;
    ball_vy = 1;
    position_x = high; //挡板在最底下
    position_y = width/2;
    ridus = 5;
    left = position_y - ridus;
    right = position_y + ridus;
    ball_number = 0;
    brick_x = 0;
    brick_y = width/2 + 1;
    score = 0;
}

void show()        //显示界面
{
    gotoxy(0,0);    //光标移动到原点便于重画
    int i,j;
    for(i=0; i<high; i++)
    {
        for(j=0; j<width; j++)
        {
            if((i == ball_x)&&(j == ball_y))
                printf("O"); //输出小球
            else if((i == brick_x)&&(j == brick_y))
                printf("B"); //输出砖块    
            else if(j == width)    //到达右边界
                printf("|"); //输出边界
            else if ((i == high)&&(j >= left)&&(j <= right))
                printf("*"); //输出挡板
            else if(i == high)  //到达下边界
                printf("-"); //输出边界
            else
                printf(" "); //非小球坐标输出空格
        }
        printf("\n");
    }
    printf("反弹小球:%d\n",ball_number);
    printf("得分:%d\n",score);
}

void updateWithoutInput()    //与输入无关更新
{
    if(ball_x == high - 1)
    {
        if((ball_y >= left)&&(ball_y <= right))    //被挡住
        {
            ball_number ++;
            printf("\a");    //响铃
        }else{    // 没挡住
            printf("游戏结束,因为你没接住控制命运的小球\n");
            system("pause");
            exit(0);
        }
    }
    ball_x = ball_x + ball_vx;
    ball_y = ball_y + ball_vy;
    // 判断是否到达边界
    if((ball_x == 0)||(ball_x == high - 1))
        ball_vx = - ball_vx;
    if((ball_y == 0)||(ball_y == width - 1))
        ball_vy = - ball_vy;
    // 判定击中
    if((ball_x == brick_x)&&(ball_y == brick_y))
    {
        score ++;
        brick_y = rand() % width; //砖块刷新
    }    
    //延时刷新
    sleep(50); 
}

void updateWithInput()    //与输入有关更新
{
    char input;
    if(kbhit())
    {
        input = getch();
        if(input == 'a') //挡板左移
        {
            position_y --;
            left = position_y - ridus;
            right = position_y + ridus;
        }
        if(input == 'd') //挡板右移
        {
            position_y ++;
            left = position_y - ridus;
            right = position_y + ridus;
        }
    }
} 

int main()
{
    startup();    //最开始初始化一次
    while(1)    //游戏循环体
    {
        show(); //先展示画面
        //然后是数据更新
        updateWithoutInput();
        updateWithInput();
    }
    return 0;
}

这里就是全部代码了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言 小游戏打砖块实现流程详解

    始祖是美国英宝格公司(en:Atari Games,ja:アタリ (ゲーム))于1976年推出的街机游戏"Breakout"(en:Breakout),由该公司在1972年发行的"PONG"(en:PONG,ja:ポン (ゲーム),世界上第一款电子游戏,类似台球)改良而来.相较于其前作,一个人就可以玩与变化丰富这两项特点让Breakout相当卖座,使各家公司竞相模仿. 因为规则简单与游戏性,现在许多移动电话都有内建打砖块游戏,也有许多因特网小游戏版本,目前在网上可以

  • C语言数组实现打砖块游戏

    本文实例为大家分享了C语言数组实现打砖块游戏的具体代码,供大家参考,具体内容如下 这次我们使用数组来改进打砖块游戏. 反弹的球 首先我们实现一个可以在荧幕上反弹的小球.使用二维数组 int canvas[High][Width] ( 和js的canvas没有一毛钱关系)来储存画布上的所有元素,值为0时输出空格,值为1时输出小球. 设小球坐标为(ball_x, ball_y),则有canvas[ball_x][ball_y] = 1 ,且暂时将其他元素的值设为0. 每次更新小球位置时将原位置元素设

  • C语言实现打砖块游戏

    本文实例为大家分享了C语言实现打砖块游戏的具体代码,供大家参考,具体内容如下 代码: #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<Windows.h> int score; int ball_row, ball_col; int ball_vv, ball_vh; int area_height, area_width; int baffle_col, baffle_row,

  • C语言控制台打砖块小游戏

    本文为大家分享了C语言控制台小游戏,打砖块,供大家参考,具体内容如下 这个问题是我在领扣上面看到的一道困难问题,原题是这样的: #include "stdafx.h" #include<stdio.h> int a[10][10] = { { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 },                    { 0, 0, 1, 1, 1, 1, 0, 1, 1, 0 },                   { 0, 0, 0, 0,

  • C语言实现打砖块小游戏

    本文实例为大家分享了C语言实现打砖块游戏的具体代码,供大家参考,具体内容如下 本节我们将沿用 上一节 所提到的函数式游戏框架来写一个弹球打砖块的游戏. 基本量.边框绘制 我们首先定义好可能需要的变量,比如小球坐标以及速度.游戏界面高度和宽度等等,然后再根据之前提到的弹跳小球重构代码,剩下的内容再分步添置即可. #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <cwindow.h&

  • go语言实现猜数字小游戏的方法

    本文实例讲述了go语言实现猜数字小游戏的方法.分享给大家供大家参考.具体分析如下: 随机生成一个数字,输入一个数字看是否匹对,匹配则结速,反之提示是大了还是小了 复制代码 代码如下: package main import (     "bufio"     "fmt"     "math/rand"     "os"     "strconv"     "time" ) var (  

  • jQuery网页版打砖块小游戏源码分享

    这是一款基于jQuery实现网页版打砖块小游戏源码,满满的童年回忆. 为大家分享的jQuery实现网页版打砖块小游戏源码如下 效果演示 源码下载 <!DOCTYPE html> <html lang="en" > <head> <meta charset="gb2312" /> <title>jQuery网页版打砖块小游戏源码</title> <link href="css/ma

  • Java编程经典小游戏设计-打砖块小游戏源码

    [程序中使用的数据结构和符号说明] HitBrick类 GreenBallThread控制小球路线 xUp,yUp,bouncing定义变量存储16位数值形式 x,y小球坐标 xDx,yDy坐标增量 MAX_X,MAX_Y坐标最大值 renew初始化 label标签 Rx,Ry横板坐标 Brick[]砖块 ball小球 HitBrick()定义小球横板及砖块位置坐标 keyPressd(keyEent)定义小球启动键(按空格键启动) keyReleased(keyEvent)接收键盘事件侦听器接

  • Python实现打砖块小游戏代码实例

    这次用Python实现的是一个接球打砖块的小游戏,需要导入pygame模块,有以下两条经验总结: 1.多父类的继承2.碰撞检测的数学模型 知识点稍后再说,我们先看看游戏的效果和实现: 一.游戏效果 二.游戏代码 #导入模块 import pygame from pygame.locals import * import sys,random,time,math class GameWindow(object): '''创建游戏窗口类''' def __init__(self,*args,**kw

  • C语言实现Flappy Bird小游戏

    本文实例为大家分享了C语言实现Flappy Bird小游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> #include<Windows.h> /********函数变量声明********/ #define PR_Box printf("■") #define PR_Gold printf(

  • C语言实现打飞机小游戏

    本文实例为大家分享了C语言实现打飞机小游戏的具体代码,供大家参考,具体内容如下 编译环境:vs2019 需求: 在同一个平面内,控制大炮发射的三个方向,空格发射炮弹,敌军和友军飞机会一直随机在天上飞过,击中天上飞行的敌军飞机加一分,击中友军飞机减一分 思路: 先初始化程序,再画出说明和地图,接着进入无限循环,循环中分别实现飞机不停地在天上飞.通过awd空格键控制游戏内容.符合游戏条件时加分三个主要步骤. 做法: 首先要实现飞机的动画效果,本质是要在控制台上输出三条x轴上输出一个字符串,并要让这三

  • C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 一.程序实现的原理: 1.构造蛇身:定义一个坐标数组,存放的是蛇的每一节蛇身所在的坐标位置.这样就将移动蛇身的操作转换为移动数组的操作,将吃食物增加蛇身体长度的操作转换为在数组后面追加元素的操作. 2.移动效果:每次移动时,将每一节蛇身(蛇头除外)依次往前移动一节,然后擦去蛇的最后一节,最后确定蛇头的方向,再绘制一个蛇头.这样就会显示一个移动效果. 3.身体增加效果:每次移动时候,判断蛇头是否碰到了食物,如果碰到了食

  • java实现打砖块小游戏

    本文实例为大家分享了java实现打砖块小游戏的具体代码,供大家参考,具体内容如下 源码共包含两个文件 文件1:play_zhuankuai.java import java.awt.*; import javax.swing.JPanel; @SuppressWarnings("serial") public class play_zhuankuai extends JPanel implements Runnable{ boolean exit=false; boolean end=

随机推荐