#include "stdafx.h"是win32程序系统生成的

创建项目时选择win32程序项目

除了下面代码外,无其他改动

#include "stdafx.h"

#include

#include //图形库界面 自己安装的库文件

#include

#include

#include

#include

#include

#define WIDTH 1024 //屏幕的宽

#define HEIGHT 576 //屏幕高

#define MAPW (WIDTH*4)

#define MAPH (HEIGHT*4)

#define AINUM 200 //AI数量

#define FNUM 2000//食物数量

#define DISTANCE(x1,y1,x2,y2) (sqrt((float)(x1-x2)*(float)(x1-x2)+(float)(y1-y2)*(float)(y1-y2))) //两点之间的距离公式

/*

结构体 自身去创建的一个类型

结构体成员 你所创建的类型里面所包含的属性

*/

/*画毒圈 会持续掉血的地图*/

struct FOOD

{

bool eat; //是否被吃

COLORREF color; //颜色

int x, y;//坐标

char type;//食物的类型(即形状)

};

struct BALL //小球结构

{

bool life; //生命

COLORREF color;//颜色

int x, y; //坐标

float r; //半径

};

FOOD food[FNUM]; //结构体数组 元素类型是所创建结构体的类型

BALL mover = { 1, RGB(0, 0, 0), 0, 0, 0 };

BALL ai[AINUM] = { 1, RGB(0, 0, 0), 0, 0, 0 };

DWORD *pBuffer; //显存指针

//int lx = -20, ly = MAPH + 20, rx = MAPW + 20, ry = -20;

int relx = -20, rely = MAPH + 20, rerx = MAPW + 20, rery = -20;

float asp = 1;

float Time = 0;

int eaten = 0; //玩家吃AI的数量

int ai_eaten = 0; //AI吃AI的数量

/*

一款游戏最基本的要求是什么?

1.界面

2.数据初始化

3.更改其中的数据

4.判断数据是否达到一个临界点

5.退出游戏

*/

void start();

void setall();

void move(BALL* ball); //如果实参传入的是地址 形参必定是一个指针变量

void draw();

void AI();

int _tmain(int argc, _TCHAR* argv[])

{

initgraph(WIDTH, HEIGHT);

//游戏的初始化

start();

setall(); //初始化所有数据

BeginBatchDraw();

while (true)

{

move(&mover);

draw();

AI();

FlushBatchDraw();

Sleep(10);

}

return 0;

}

//AI的位置是否固定 食物的位置又是否固定 随机出现在任何一个位置的

void setall()

{

srand((unsigned int)time(NULL)); //随机函数种子

mover.color = RGB(rand() % 256, rand() % 256, rand() % 256); //rand()%256 随机取值 0-255

mover.life = 1;

mover.x = int(WIDTH*0.5); //将玩家固定在屏幕中心处

mover.y = int(HEIGHT*0.5);

mover.r = 20;

for (int i = 0; i < AINUM; i++)

{

ai[i].color = RGB(rand() % 256, rand() % 256, rand() % 256); //rand()%256 随机取值 0-255

ai[i].life= 1;

ai[i].x = rand() % (MAPW - int(ai[i].r + 0.5)) + int(ai[i].r + 0.5); //AI产生的位置不会出现一个越界

ai[i].y = rand() % (MAPH - int(ai[i].r + 0.5)) + int(ai[i].r + 0.5);

ai[i].r = float(rand()%10+10);

}

for (int i = 0; i < FNUM; i++)

{

food[i].eat = 1;

food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);

food[i].x = rand() % MAPW;

food[i].y = rand() % MAPH;

food[i].type = rand() % 10 + 1;

}

//指针

pBuffer = GetImageBuffer(NULL); //获取显存指针

setbkcolor(WHITE);

cleardevice();

settextcolor(LIGHTRED);

setbkmode(TRANSPARENT);

settextstyle(16, 0, "宋体");

}

void start()

{

setbkcolor(WHITE);

cleardevice();

settextcolor(RED); //函数 设置文字颜色

setbkmode(TRANSPARENT); //设置窗口透明

settextstyle(128, 0, "宋体"); //字符集问题

outtextxy(100, 40, "球球大作战");

settextstyle(32, 0, "宋体");

outtextxy(384, 500, "按任意键开始游戏");

getch();

}

void move(BALL* ball)

{

if (ball->r <= 0) ball->life = false; //false 0 true 1

if (ball->life == false)

{

HWND hwnd = GetHWnd(); //获取窗口句柄

MessageBox(hwnd, "你已经死亡", "游戏结束", MB_OK | MB_ICONEXCLAMATION);

closegraph();

exit(0);

}

if (ball->x > (MAPW - ball->r) || ball->x - ball->r < 0 || ball->y - ball->r<0 || ball->y>(MAPH - ball->r))

ball->r -= 0.1f;

//玩家吃AI

for (int i = 0; i < AINUM; i++)

{

if (ball->r >= ai[i].r)

{

if (ai[i].life == 0) continue;

if (DISTANCE(ball->x, ball->y, ai[i].x, ai[i].y) < (4 / 5.0*(ball->r + ai[i].r)))

{

ai[i].life = 0; //吃掉AI

ball->r += (ai[i].r*ai[i].r / 2) / ball->r;

eaten++;

}

}

}

//食物被吃

for (int n = 0; n < FNUM; n++)

{

if (food[n].eat == 0) continue;

if (DISTANCE((float)ball->x, (float)ball->y, (float)food[n].x, (float)food[n].y) < ball->r)

{

ball->r += 4 / ball->r;

food[n].eat = 0;

}

}

static int mx = 0, my = 0; //记录偏移量

if (GetAsyncKeyState(65) & 0x8000) { ball->x -= 3, mx += 3; } //获取键盘的值

if (GetAsyncKeyState(87) & 0x8000) { ball->y -= 3, my += 3; }

if (GetAsyncKeyState(83) & 0x8000) { ball->y += 3, my-= 3; }

if (GetAsyncKeyState(68) & 0x8000) { ball->x += 3, mx -= 3; }

/*awsd*/

setorigin(mx, my); //坐标修正

}

void draw()

{

clearcliprgn();

setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 20);

setlinecolor(RGB(0, 100, 0));

//左竖 上横 下横 右竖

line(relx, rely, relx, rery);

line(relx, rely, rerx, rely);

line(relx, rery, rerx, rery);

line(rerx, rery, rerx, rely);

setfillcolor(GREEN);

if (mover.x - 0.5*WIDTH / asp < relx) floodfill(relx - 11, mover.y, RGB(0, 100, 0));

if (mover.x + 0.5*WIDTH / asp > rerx) floodfill(rerx + 11, mover.y, RGB(0, 100, 0));

if (mover.y - 0.5*HEIGHT / asp < rery) floodfill(mover.x, rery-11, RGB(0, 100, 0));

if (mover.y + 0.5*HEIGHT / asp > rely) floodfill(mover.x, rely + 11, RGB(0, 100, 0));

setlinecolor(WHITE);

setlinestyle(PS_NULL);

for (int i = 0; i < FNUM; i++)

{

if (food[i].eat == 0) continue;

setfillcolor(food[i].color);

switch (food[i].type) //食物的形状

{

case 1:solidellipse(food[i].x, food[i].y, food[i].x + 2, food[i].y + 4);break;

case 2:solidellipse(food[i].x, food[i].y, food[i].x + 4, food[i].y + 2);break;

case 3:solidrectangle(food[i].x, food[i].y, food[i].x + 4, food[i].y + 2);break;

case 4:solidrectangle(food[i].x, food[i].y, food[i].x + 2, food[i].y + 4);break;

case 5:solidroundrect(food[i].x, food[i].y, food[i].x + 2, food[i].y + 4, 2, 2);break;

case 6:solidroundrect(food[i].x, food[i].y, food[i].x + 4, food[i].y + 2, 2, 2);break;

case 7:solidroundrect(food[i].x, food[i].y, food[i].x + 4, food[i].y + 2, 4, 2);break;

case 8:solidroundrect(food[i].x, food[i].y, food[i].x + 4, food[i].y + 2, 2, 4);break;

case 9:solidroundrect(food[i].x, food[i].y, food[i].x + 4, food[i].y + 2, 1, 1);break;

case 10:fillcircle(food[i].x, food[i].y, 4);break;

}

}

//画出AI

for (int i = 0; i < AINUM; i++)

{

if (ai[i].life == 0) continue;

setfillcolor(ai[i].color);

fillcircle(ai[i].x, ai[i].y, int(ai[i].r + 0.5)); //四舍五入

}

//画玩家

setfillcolor(mover.color);

fillcircle(mover.x, mover.y, int(mover.r + 0.5));

IMAGE map(150, 100); //小地图

SetWorkingImage(&map);

setbkcolor(RGB(120, 165, 209));

cleardevice();

//相当于我们重新创建了一个图形界面

for (int i = 0; i < AINUM; i++)

{

if (ai[i].life == 0) continue;

setfillcolor(ai[i].color);

fillcircle(ai[i].x * 150 / WIDTH / 4, ai[i].y * 100 / HEIGHT / 4, int(ai[i].r / 28 + 0.5));

}

//画玩家

setfillcolor(mover.color);

fillcircle(mover.x * 150 / WIDTH / 4, mover.y * 100 / HEIGHT / 4, int(mover.r / 28 + 0.5));

SetWorkingImage(); //恢复之前的绘图界面

putimage(mover.x + int(0.5*WIDTH) - 150, mover.y - int(0.5*HEIGHT), 150, 100, &map, 0, 0);

}

void AI()

{

for (int i = 0; i < AINUM; i++)

{

//ai吃玩家

if (ai[i].r>mover.r)

{

if (DISTANCE(mover.x, mover.y, ai[i].x, ai[i].y) < 2 / 3.0*ai[i].r + mover.r)

{

ai[i].r += (mover.r*mover.r) / ai[i].r;

mover.life = 0;

mover.r = 0;

}

}

//AI吃AI

for (int j = 0; j < AINUM;j++)

{

if (ai[i].r>ai[j].r)

{

if (ai[j].life == 0) continue;

if (DISTANCE(ai[i].x, ai[i].y, ai[j].x, ai[j].y) < 4 / 5.0*ai[i].r + ai[j].r)

{

ai[i].r += (ai[j].r*ai[j].r) / ai[i].r;

ai[j].life = 0;

ai_eaten++;

}

}

}

double min_DISTANCE = 100000;

int min = -1;

//AI靠近AI

for (int k = 0; k < AINUM; k++)

{

if (ai[i].r>ai[k].r&&ai[k].life == 1)

{

if (DISTANCE(ai[i].x, ai[k].x, ai[i].y, ai[k].y) < min_DISTANCE)

{

min_DISTANCE = DISTANCE(ai[i].x, ai[k].x, ai[i].y, ai[k].y);

min = k;

}

}

}

if ((min != -1) && (rand() % 2 == 1))

{

if (rand() % 2)

{

if (ai[i].x < ai[min].x) ai[i].x += 2;

else ai[i].x-=2;

}

else

{

if (ai[i].y < ai[min].y) ai[i].y += 2;

else ai[i].y -= 2;

}

}

for (int n = 0; n < FNUM; n++)

{

if (food[n].eat == 0) continue;

if (DISTANCE(ai[i].x, ai[i].y, food[n].x, food[n].y) < ai[i].r)

{

ai[i].r += 4 / ai[i].r;

food[n].eat = 0;

}

}

}

}

java球球大作战小游戏代码_windows游戏编程:球球大作战(吃鸡版)源码相关推荐

  1. 年赚百万游戏主播,玩转Python后:几行代码轻松“吃鸡” 附源码

    大吉大利,准备吃鸡! 你是否玩儿了好几个月的吃鸡,依旧是落地成盒? 是否常常不得知自己如何被打.莫名其妙的挂了? 还没有吃过鸡/(ㄒoㄒ)/~~总是不明不白的就被别的玩家杀了 !!!∑(゚Д゚ノ)ノ能 ...

  2. 年赚百万游戏主播!玩转Python后:几行代码轻松“吃鸡” 附源码

    大吉大利,准备吃鸡! 你是否玩儿了好几个月的吃鸡,依旧是落地成盒? 是否常常不得知自己如何被打.莫名其妙的挂了? 还没有吃过鸡/(ㄒoㄒ)/~~总是不明不白的就被别的玩家杀了 !!!∑(゚Д゚ノ)ノ能 ...

  3. 基于java的ssm和微信小程序实现物业缴费系统的设计与实现【附项目源码+论文说明】

    基于java的ssm和微信小程序实现物业缴费系统的设计与实现 摘要 本论文主要论述了如何使用JAVA语言开发一个基于微信小程序的物业缴费系统的设计与实现,本系统将严格按照软件开发流程进行各个阶段的工作 ...

  4. HTML网页设计期末课程大作业~旅游住宿酒店的HTML网页设计(14页) ~学生网页设计作业源码 旅游网页代码 学生网页设计与制作期末作业下载 DW旅游网页作业代码下载

    旅游住宿酒店的HTML网页设计14页 ~ 学生网页设计与制作期末作业下载~ 大学生网页设计与制作成品下载 ~DW旅游网页作业代码下载 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头 ...

  5. 仙剑java_xianjian 仙剑游戏JAVA版源码,早期练习保存的资料 Develop 244万源代码下载- www.pudn.com...

    文件名称: xianjian下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 636 KB 上传时间: 2015-10-06 下载次数: 0 提 供 者: 黄 详 ...

  6. java象棋人机代码_中国象棋人机对弈Java版源码

    [实例简介] 中国象棋人机对弈Java版源码,包含人工智能实现(含多个难度级别,采用α-β迭代搜索算法) [实例截图] [核心代码] 中国象棋人机对弈Java版源码 ├── boards │   ├─ ...

  7. 网页小游戏源码丨FC模拟器网页版源码

    简介: 网页小游戏源码/FC模拟器网页版源码/魂斗罗/超级玛丽/双截龙等几十款怀旧游戏无需数据库,没有后台,不占用服务器空间.上传即用,直接上传到根目录即可. 网盘下载地址: http://kekew ...

  8. java写一个简单的浪漫代码_2020浪漫七夕:7款程序员必备表白源码(超炫酷)

    2020七夕将要来临,php中文网给大家准备了七款程序员表白专用源码,让你可以一举俘获美人心,下面就来看一看这七款表白代码大全,包含html.html5.CSS.JQ编写的一些非常简单实用的表白代码, ...

  9. java写一个简单的浪漫代码,2018浪漫七夕:7款程序员必备表白源码(超炫酷)

    2018七夕将要来临,php中文网给大家准备了七款程序员表白专用源码,让你可以一举俘获美人心,下面就来看一看这七款表白代码大全,包含html.html5.CSS.JQ编写的一些非常简单实用的表白代码, ...

最新文章

  1. 读文件夹下所有文件,并提取中文字符
  2. RabbitMQ配置环境变量后启动不了的解决方法
  3. socket缓冲区以及阻塞模式详解
  4. 2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml
  5. [Leetcode][第120题][JAVA][三角形最小路径和][动态规划][递归]
  6. mysql blackhole引擎_MySQL BlackHole引擎
  7. Java ResourceBundle getLocale()方法与示例
  8. 基于注意力机制的seq2seq网络
  9. linux服务器用户组和权限管,linux 用户管理,用户权限管理,用户组管理
  10. python开发人员看什么书_python初学者看什么书
  11. shell脚本启动语法错误syntax error near unexpected token '{
  12. Layer 提示框tips使用
  13. 蓝牙小钢炮 - Bose 博士 Revolve 蓝牙音箱使用感受
  14. sony手机刷linux,索尼Z3 Z3C 5.0系统刷recovery教程_Sony Z3第三方recovery
  15. 如何添加虚拟PDF打印机
  16. 前瞻性研究(Prospective study)
  17. mybatis中的事务
  18. 电视与电脑连接html线,电视机与电脑连接的方法
  19. chloe.mysql_Chloe.ORM框架应用实践
  20. VS一个解决方案中有多个项目,如何快速选择启动项

热门文章

  1. 第十二届蓝桥杯省赛c++b组—杨辉三角形
  2. 上海大学计算机学硕和专硕,2016年上岸上海大学计算机工程与技术学院专硕,考研总结...
  3. 发那科机器人六轴放大器保险丝熔断_发那科机器人R-30iB控制柜保险丝解析——发那科机器人...
  4. 在随着layui官网下架后 layui镜像站起来了
  5. Ajax怎么获取data为集合的值,vue,ajax获取本地的json文件,赋值后,computed和mounted里访问不到重新赋值后的listDatas...
  6. 被清理的文件怎么恢复
  7. 运放电路中各种电阻的计算-运算放大器
  8. PlusWell Mirror使用手册
  9. 最全行车记录仪方案+主控芯片介绍!
  10. BugkuCTF: 啊哒