在ARM版上开发的贪吃蛇

本文主要为贪吃蛇部分代码的实现,开发板的按键以及触屏中断等,本文不做重点讲解

前一阵子学习了mini2440板的开发,并开发了一个简单贪吃蛇的游戏

游戏功能清单:1.游戏开始

2.游戏难度设置(简单,普通,困难)

3.游戏结束

4.蛇的正常运行路线(触碰障碍物或者蛇本身随即游戏结束,不能反方向行动)

5.通过内设时钟,产生随机种子,从而产生随机分布的“食物”

以下为代码解析部分:

#include "snake_game.h"

#include "adcts.h"

#include "lcd.h"

#include "graphicslib.h"

#include "timer.h"

#define N 300

extern int click_x; //触屏触碰的点的x轴

extern int click_y; //y轴

int iHard = 0;  // 0 初级 1 普通 2 困难

int goDir = 4;//1--上 2 下 3 左 4 右

int choice_do = 1;//选择使能 0 游戏开始,除“结束游戏”以外功能不可使用 1 功能选择开启 2 正在进行难度设置

struct Food

{

int x;                    /*食物的横坐标*/

int y;                    /*食物的纵坐标*/

int yes;                  /*判断是否要出现食物的变量*/

};                        /*食物的结构体*/

struct Snake

{

int x[N];

int y[N];

int node;                 /*蛇的节数*/

int life;                 /* 蛇的生命,0活着,1死亡*/

};

struct Snake sn_t = {0};

struct Food fd_t = {0};

/**

游戏界面初始化

**/

void game_init()

{

xrect(5, 5, 240 - 5 * 2, 320 - 5 * 2, RGB(0,0,0),RGB(0,0,0),2);

xrect(0, 240, 240, 5, RGB(255,255,255),RGB(255,255,255),2);

//xline(0, 240, 240, 240, RGB(255,255,255));

lcd_printWord(" 难度 ",10,250,RGB(0,0,0),RGB(255,255,255));

lcd_printWord(" 结束 ",10,290,RGB(0,0,0),RGB(255,255,255));

lcd_printWord(" 开始 ",40,270,RGB(0,0,0),RGB(255,255,255));

lcd_printWord(" 初级 ",10,210,RGB(0,0,0),RGB(255,255,255));

//xcircle(180,260,15,RGB(255,255,255),RGB(0,255,0),1);//上

xrect(170,250,22,22,RGB(255,255,255),RGB(0,255,0),1);

lcd_printWord("↑",173,253,RGB(255,255,255),RGB(0,0,0));

//printWord("↓←→",180,255,RGB(0,0,0),RGB(255,255,255));

//xcircle(180,295,15,RGB(255,255,255),RGB(0,255,0),1);
//下

xrect(170,285,22,22,RGB(255,255,255),RGB(0,255,0),1);

lcd_printWord("↓",173,288,RGB(255,255,255),RGB(0,0,0));

//xcircle(150,280,15,RGB(255,255,255),RGB(0,255,0),1);//左

xrect(140,270,22,22,RGB(255,255,255),RGB(0,255,0),1);

lcd_printWord("←",143,273,RGB(255,255,255),RGB(0,0,0));

//xcircle(210,280,15,RGB(255,255,255),RGB(0,255,0),1);//右

xrect(200,270,22,22,RGB(255,255,255),RGB(0,255,0),1);

lcd_printWord("→",203,273,RGB(255,255,255),RGB(0,0,0));

//choice_do = 1;

//game_choice_handler();

}

/**

游戏界面清除

**/

void game_clear()

{

xrect(5,5,(240-5-5),(240-5),RGB(0,0,0),RGB(0,0,0),2);

}

/************************************************************************/

/* 设置游戏的点,isRight表示填充是否有效

*/

/************************************************************************/

void game_setPoint(int x,int y,int isRight)

{

if (isRight != 0)

{

xrect(x,y,5,5,RGB(255,255,255),RGB(255,255,255),2);

}

else if (isRight == 0)

{

xrect(x,y,5,5,RGB(0,0,0),RGB(0,0,0),2);

}

}

int i;

int x;

int y;

/**

游戏结束

**/

void game_over()

{

lcd_printWord(" Game over!!! ",60,120,RGB(0,0,0),RGB(255,255,255));

choice_do = 1;

sn_t.life = 0;

sn_t.x[sn_t.node] = 30;

sn_t.y[sn_t.node] = 100;

}

/**

游戏产生食物

**/

void game_create_food()

{

int iRight = 0;

if (fd_t.yes == 1)

{

fd_t.x = rand()%22 * 10 + 5;

fd_t.y = rand()%23 * 10 + 5;

loop: while (!iRight)

{

for (i = sn_t.node;i > 0;i--)

{

if (fd_t.x == sn_t.x[i] && fd_t.y == sn_t.y[i])

{

fd_t.x = rand()%22 * 10 + 5;

fd_t.y = rand()%23 * 10 + 5;

goto loop;

}

}

iRight = 1;

}

game_setPoint(fd_t.x,fd_t.y,1);

fd_t.yes = 0;

}

}

/**

蛇捕获食物

**/

void game_eat_food()

{

if (sn_t.x[sn_t.node - 1] == fd_t.x && sn_t.y[sn_t.node - 1] == fd_t.y)

{

sn_t.node++;

fd_t.yes = 1;

for (i = sn_t.node;i > 0;i-- )

{

sn_t.x[i] = sn_t.x[i - 1];

sn_t.y[i] = sn_t.y[i - 1];

}

}

}

/**

蛇移动的主要程序

**/

void game_move_handler()

{

if (sn_t.life == 1)

{

//xrect(worm_x,worm_y,5,5,RGB(255,255,255),RGB(255,255,255),2);

game_create_food();

//lcd_SetColor(RGB(255,0,0));

//xrect(x,y,ilong,5,RGB(255,255,255),RGB(255,255,255),2);

if (goDir == 1)//上

{

sn_t.x[sn_t.node] = sn_t.x[sn_t.node - 1];

sn_t.y[sn_t.node] = sn_t.y[sn_t.node - 1] - 5;

}

if (goDir == 2)//下

{

sn_t.x[sn_t.node] = sn_t.x[sn_t.node - 1];

sn_t.y[sn_t.node] = sn_t.y[sn_t.node - 1] + 5;

}

if (goDir == 3)//左

{

sn_t.x[sn_t.node] = sn_t.x[sn_t.node - 1] - 5;

sn_t.y[sn_t.node] = sn_t.y[sn_t.node - 1];

}

if (goDir == 4)//右

{

sn_t.x[(sn_t.node)] = sn_t.x[(sn_t.node - 1)] + 5;

sn_t.y[(sn_t.node)] = sn_t.y[(sn_t.node - 1)];

}

game_setPoint(sn_t.x[0],sn_t.y[0],0);

for (i = 0;i < sn_t.node;i++)

{

sn_t.x[i] = sn_t.x[i + 1];

sn_t.y[i] = sn_t.y[i + 1];

game_setPoint(sn_t.x[i],sn_t.y[i],1);

}

}

game_eat_food();

//while()

//触碰自身,游戏结束

for (i = 0;i < (sn_t.node-1);i++)

{

if (sn_t.x[i] == sn_t.x[sn_t.node] && sn_t.y[sn_t.node] == sn_t.y[i])

{

game_over();

}

}

//触碰障碍物,游戏结束

if(sn_t.x[sn_t.node] == 0 || sn_t.x[sn_t.node] == 240 || sn_t.y[sn_t.node] == 0 || sn_t.y[sn_t.node] == 240)

{

game_over();

}

}

/**

游戏开始,一些系数的初始化

**/

void game_start()

{

sn_t.life = 1;

sn_t.node = 5;

sn_t.x[4] = 30;

sn_t.y[4] = 100;

fd_t.yes = 1;

goDir = 4;

//srand((int)time(0));

game_clear();

for (i = 4;i >= 0;i--)

{

game_setPoint(sn_t.x[i],sn_t.y[i],1);

sn_t.x[i - 1] = sn_t.x[i] - 5;

sn_t.y[i -1 ] = sn_t.y[i];

}

timer_create(timer0,249,Mux4,1,(10000 - iHard * 4000),game_move_handler);

timer_start(timer0);

}

/**

游戏设置界面

**/

void game_setHard()

{

choice_do = 2;

game_clear();

lcd_printWord(" 初级 ",100,40,RGB(0,0,0),RGB(255,255,255));

lcd_printWord(" 普通 ",100,80,RGB(0,0,0),RGB(255,255,255));

lcd_printWord(" 困难 ",100,120,RGB(0,0,0),RGB(255,255,255));

}

/**

点击触屏后进入的时钟函数

**/

void game_choice_handler()

{

if (choice_do == 2)

{

if (click_x >= 100 && click_x <= (100 + 48) && click_y >= 40 && click_y <= (40 + 16))

{

iHard = 0;

sn_t.iSpeed = 10000;

lcd_printWord(" 初级 ",10,210,RGB(0,0,0),RGB(255,255,255));

}

if (click_x >= 100 && click_x <= (100 + 48) && click_y >= 80 && click_y <= (80 + 16))

{

iHard = 1;

sn_t.iSpeed = 6000;

lcd_printWord(" 普通 ",10,210,RGB(0,0,0),RGB(255,255,255));

}

if (click_x >= 100 && click_x <= (100 + 48) && click_y >= 120 && click_y <= (120 + 16))

{

iHard = 2;

sn_t.iSpeed = 3000;

lcd_printWord(" 困难 ",10,210,RGB(0,0,0),RGB(255,255,255));

}

//game_clear();

//choice_do = 1;

}

if ((choice_do == 1 || choice_do == 2) && click_x >= 40 && click_x <= (40 + 48) && click_y >= 270 && click_y <= (270 + 16))

{

choice_do = 3;

game_start();

}

//lcd_printWord(" 结束 ",10,290,RGB(0,0,0),RGB(255,255,255));

if (choice_do == 0 && click_x >= 10 && click_x <= (10 + 48) && click_y >= 290 && click_y <= (290 + 16))

{

choice_do = 0;

game_over();

}

//lcd_printWord(" 难度 ",10,250,RGB(0,0,0),RGB(255,255,255));

if (choice_do == 1 && click_x >= 10 && click_x <= (10 + 48) && click_y >= 250 && click_y <= (250 + 16))

{

choice_do = 0;

game_setHard();

}

else if (choice_do == 0)

{

/************************************************************************/

/* //xcircle(180,260,15,RGB(255,255,255),RGB(0,255,0),1);//上

xrect(170,250,22,22,RGB(255,255,255),RGB(0,255,0),1);

lcd_printWord("↑",173,253,RGB(255,255,255),RGB(0,0,0));

//printWord("↓←→",180,255,RGB(0,0,0),RGB(255,255,255));

//xcircle(180,295,15,RGB(255,255,255),RGB(0,255,0),1);
//下

xrect(170,285,22,22,RGB(255,255,255),RGB(0,255,0),1);

lcd_printWord("↓",173,288,RGB(255,255,255),RGB(0,0,0));                                                                     */

/************************************************************************/

if (click_x >= 170 && click_x <= (170 + 22) && goDir != 1 && goDir != 2)

{

if (click_y >= 250 && click_y <= (250 + 22))

{

goDir = 1;

}

else if (click_y >= 280 && click_y <= (280 + 22))

{

goDir = 2;

}

}

/************************************************************************/

/* //xcircle(150,280,15,RGB(255,255,255),RGB(0,255,0),1);//左

xrect(140,270,22,22,RGB(255,255,255),RGB(0,255,0),1);

lcd_printWord("←",143,273,RGB(255,255,255),RGB(0,0,0));

//xcircle(210,280,15,RGB(255,255,255),RGB(0,255,0),1);//右

xrect(200,270,22,22,RGB(255,255,255),RGB(0,255,0),1);

lcd_printWord("→",203,273,RGB(255,255,255),RGB(0,0,0));                                                                     */

/************************************************************************/

if (click_y >= 270 && click_y <= (270 + 22) && goDir != 3 && goDir != 4)

{

if (click_x >= 140 && click_x <= (140 + 22))//140

{

goDir = 3;

}

else if (click_x >= 200 && click_x <= (200 + 22))//200

{

goDir = 4;

}

}

}

}

时间: 2025-01-03 09:43:55

在ARM版上开发的贪吃蛇的相关文章

C语言小游戏开发之贪吃蛇

寒假期间一时兴起,想着用C语言能开发出贪吃蛇小游戏应该是一件不错的事!但C语言学习过程中从来都是字符界面的编程,如何能有"图形化"的效果呢?于是小编就在度娘, 谷歌等网站搜索了一番,发现了一些有用的Win32 API函数,于是小编的心一下子激动了起来,有了这些API函数也许能够实现哟!开始吧! 编程之前小编的构思是这样的,贪吃蛇小游戏应该实现的有: 1.贪吃蛇在不进行控制的条件下应该能够自主前进. 2.玩家可以通过WASD键来控制贪吃蛇的前进方向. 3.运行过程中若贪吃蛇撞击到墙壁或自

Qt小游戏开发:贪吃蛇

周末没事,手写小游戏继续~ 预览 步骤 1 定义数据结构 逻辑与界面分离,游戏场景是个二维数组区域,贪吃蛇是若干个连续的坐标点集合,用动态链表维护,果实是一个随机坐标点. const int BLOCK_SIZE=25; //单个方块单元的边长 const int MARGIN=5; //场景边距 const int AREA_ROW=15; //场景行数 const int AREA_COL=15; //场景列数 QPoint foodPoint; //果实出现坐标 QList<QPoint>

Python入门学习:一步步教你怎么用Python写贪吃蛇游戏

前几天,有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Python(蛇)玩Snake(贪吃蛇),再合适不过了. 这里通过一个Python入门学习的例子跟大家详细讲解一下! 先通过下面这个效果图来感受下吧! 1 环境 操作系统:Windows Python版本:3.7.3 2 需求分析 我们先来回顾下贪吃蛇中的游戏元素及游戏规则. 首先呢,需要有贪吃蛇.有食物:需要能控制贪吃蛇来上下移动获取食物:贪吃蛇在吃取食物后,自身长度增加,同时食物消

贪吃蛇 游戏

结队作业  结队人 郑丁鹏(负责 (二)流程图和(四)游戏测试 ) 我负责 (二)游戏需求分析 与(三)游戏代码 贪吃蛇游戏程序设计 一.基本内容描述 运用java技术开发出贪吃蛇游戏,这个程序是用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块.移动时必须从蛇头开始,也就是蛇尾不能改作蛇头.当游戏者按了方向键后,蛇头朝着指定的方向移动,一步移动一节身体.图形的实现是从蛇头的新位置开始画出蛇.用户可以用上下左右键控制蛇头的方向,用空格键暂停或继续,非常简单! 可以实现如下功能: 贪吃蛇游

贪吃蛇游戏程序设计

一.基本内容描述 运用java技术开发出贪吃蛇游戏,这个程序是用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块.移动时必须从蛇头开始,也就是蛇尾不能改作蛇头.当游戏者按了方向键后,蛇头朝着指定的方向移动,一步移动一节身体.图形的实现是从蛇头的新位置开始画出蛇.用户可以用上下左右键控制蛇头的方向,用空格键暂停或继续,非常简单! 可以实现如下功能: 贪吃蛇游戏是大家很常见的小游戏,在生活工作之余大家可以玩它,已达到放松各种压力的目的. 游戏可以进行升级,也就是增加吃食物的难度,以便使大家更

.net core在Linux ARM板上运行

最近接了个临时任务,给别的项目组的机器人平台上开发个小程序,那机器人上跑的是ARM平台,ubuntu的系统. 本来打算用C++写的,由于最近用.net core较多,鉴于其在linux平台良好的兼容性,加上貌似.net core是能在arm平台上开发的.想到如果能在arm板上跑.net 程序,则无论是开发还是调试的效率都将大大提升. 抱着试一试的心情,打开了MS的.net core安装网站,发现其并没有提供arm平台的在线安装方式.本来以为凉了的,不过还是找到了其二进制的安装包?.NET Cor

Android快乐贪吃蛇游戏实战项目开发教程-01项目概述

一.项目简介贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏.我已经将做好的案例上传到了应用宝,大家可以下载下来把玩一下.为了和其它的贪吃蛇区别开来,我取名叫“快乐贪吃蛇”.应用宝链接:http://sj.qq.com/myapp/detail.htm?apkName=net.chengyujia.happysnake这里上两张截图先睹为快,哈哈.怎么玩大家应该都知道,不过我还是要多提一下.通过屏幕上的方向键控制蛇的前进方向.蛇每吃到一个食物身体会

游戏开发(一)——控制台 贪吃蛇

贪吃蛇游戏设计中主要需要注意的几点: 1:坐标的定义:定义为左上角为(0,0),向右为x正方向,向下为y正方向 2:蛇的设计, 蛇身:m_body,这里用的是链表(是之前写好的双链表),一个节点就是蛇身的一节 每节蛇身的属性包括x,y坐标:column_x,row_y,x表示在地图上的第几列,y表示在地图上的第几行 蛇有一个属性叫朝向,也就是当前在往上.下.左.右的哪个方向移动:m_forward 蛇的动作有:Turn,转向.转向有个判断,就是不能向相反的方向转,比如本来向上运动,按向下键,是无

Java版贪吃蛇小游戏的实现

使用的IDE eclipse JDK版本 1.6 辅助类 Coordinate.java package com.nn.util; /** *坐标点 */ public class Coordinate { public int x; public int y; public Coordinate(int newX, int newY) { x = newX; y = newY; } public boolean equals(Coordinate other) { if (x == other