贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)

 

程序效果:

 

 

 

 

代码:

 

//main.cpp
1
#include <iostream> 2 #include<fstream> 3 #include <graphics.h> 4 #include <conio.h> 5 #include<ctime> 6 #include<windows.h> 7 #include<mmsystem.h> 8 #pragma comment(lib,"Winmm.lib") 9 10 #define IMGWIDTH 20 11 #define IMGHEIGHT 20 12 #define WIDTH 1100 13 #define HEIGHT 650 14 #define UP 72 15 #define DOWN 80 16 #define LEFT 75 17 #define RIGHT 77 18 #define HEADUP "headup.jpg" 19 #define HEADDOWN "headdown.jpg" 20 #define HEADLEFT "headleft.jpg" 21 #define HEADRIGHT "headright.jpg" 22 #define BODYLR "bodylr.jpg" 23 #define BODYUD "bodyud.jpg" 24 #define TAILL "taill.jpg" 25 #define TAILR "tailr.jpg" 26 #define TAILU "tailu.jpg" 27 #define TAILD "taild.jpg" 28 #define WALL "wall.jpg" 29 #define FOOD "food.jpg" 30 #define GAMEOVER "gameover.jpg" 31 #define SNAKE "snake.jpg" 32 #define L 60 // 33 #define U 80 // 34 #define R 900 // 35 #define D 600 // 36 using namespace std; 37 38 IMAGE wallimg; 39 int score=0,grade=1,rec[4]; 40 class Food; 41 class BodyNode{ 42 private: 43 IMAGE img; 44 int x; 45 int y; 46 BodyNode* next; 47 BodyNode(){} 48 friend class Body; 49 friend bool check(Body& snake,Food& food); 50 public: 51 BodyNode(char* str,int X,int Y){ 52 x=X; 53 y=Y; 54 loadimage(&img, _T(str)); 55 next=NULL; 56 } 57 BodyNode(BodyNode& bodynode){ 58 x=bodynode.x; 59 y=bodynode.y; 60 next=bodynode.next; 61 img=bodynode.img; 62 } 63 }; 64 class Body{ 65 private: 66 BodyNode* head; 67 BodyNode* tail; 68 int length; 69 public: 70 friend bool check(Body& snake,Food& food); 71 Body(){ 72 head=new BodyNode(HEADRIGHT,L+(10*(IMGWIDTH)),U+(10*(IMGHEIGHT))); 73 head->next=new BodyNode(BODYLR,head->x-head->img.getwidth(),head->y); 74 head->next->next=new BodyNode(TAILR,head->next->x-head->img.getwidth(),head->y); 75 tail=head->next->next; 76 length=2; 77 } 78 int Length(){return length;} 79 bool IsDead(){ 80 BodyNode* p=head->next; 81 while(p!=NULL){ 82 if(head->x==p->x&&head->y==p->y){ 83 return true; 84 } 85 p=p->next; 86 } 87 return false; 88 } 89 int Move(int dir){ //1 上 2下 3左 4 右 90 BodyNode* p=head->next; 91 int tempx=head->x,tempy=head->y,temp_x,temp_y; 92 while(p!=tail->next){ 93 temp_x=p->x; 94 temp_y=p->y; 95 p->x=tempx;; 96 p->y=tempy; 97 tempx=temp_x; 98 tempy=temp_y; 99 p=p->next; 100 } 101 if(dir==1){ 102 loadimage(&(head->img), _T(HEADUP)); 103 head->y=head->next->y-head->img.getheight(); 104 } 105 if(dir==2){ 106 loadimage(&(head->img), _T(HEADDOWN)); 107 head->y=head->next->y+head->img.getheight(); 108 } 109 if(dir==3){ 110 loadimage(&(head->img), _T(HEADLEFT)); 111 head->x=head->next->x-head->img.getwidth(); 112 } 113 if(dir==4){ 114 loadimage(&(head->img), _T(HEADRIGHT)); 115 head->x=head->next->x+head->img.getwidth(); 116 } 117 if((head->x+head->img.getwidth())>R){head->x=L;} 118 if(head->x<L){head->x=R-head->img.getwidth();} 119 if((head->y+head->img.getheight())>D){head->y=U;} 120 if(head->y<U){head->y=D-head->img.getheight();} 121 p=head; 122 while(p->next!=tail){ 123 p=p->next; 124 } 125 if(p->x-tail->x>0){loadimage(&(tail->img), _T(TAILR));} 126 if(p->x-tail->x<0){loadimage(&(tail->img), _T(TAILL));} 127 if(p->y-tail->y>0){loadimage(&(tail->img), _T(TAILD));} 128 if(p->y-tail->y<0){loadimage(&(tail->img), _T(TAILU));} 129 return 0; 130 } 131 int Grow(){ 132 BodyNode*p=head; 133 while(p->next!=tail){ 134 p=p->next; 135 } 136 tail->img=p->img; 137 tail->next=new BodyNode(&(TAILL[0]),tail->x-(p->x-tail->x),tail->y-(p->y-tail->y)); 138 139 tail=tail->next; 140 if(p->x-tail->x>0){loadimage(&(tail->img), _T(TAILR));} 141 if(p->x-tail->x<0){loadimage(&(tail->img), _T(TAILL));} 142 if(p->y-tail->y>0){loadimage(&(tail->img), _T(TAILD));} 143 if(p->y-tail->y<0){loadimage(&(tail->img), _T(TAILU));} 144 tail->next=NULL; 145 length++; 146 return 0; 147 } 148 int Show(){ 149 BodyNode* p=head; 150 while(p!=NULL){ 151 putimage(p->x, p->y, &(p->img)); 152 p=p->next; 153 } 154 return 0; 155 } 156 }; 157 class Food{ 158 private: 159 int x; 160 int y; 161 IMAGE rat; 162 public: 163 friend bool check(Body& snake,Food& food); 164 Food(){ 165 x=400; 166 y=300; 167 loadimage(&(rat), _T(FOOD)); 168 } 169 int givefood(Body& snake){ 170 srand((unsigned)time(0)); 171 while(check(snake,*this)==true){ 172 x=0;y=0; 173 while(!(x>L&&y>U)){ 174 x= rand()%900; 175 y= rand()%600; 176 } 177 x=x-(x%20); 178 y=y-(y%20); 179 } 180 return 0; 181 } 182 int Show(){ 183 putimage(x,y,&(rat)); 184 return 0; 185 } 186 }; 187 int showgame(Body& snake,Food food){ 188 189 cleardevice(); 190 BeginBatchDraw(); 191 setbkcolor(RGB(0,0,0)); //设置背景色 192 setcolor(YELLOW); //设置绘图色 193 outtextxy((WIDTH/2)-80, 10, "贪吃蛇"); 194 outtextxy(L+300, U-IMGHEIGHT-20, "按空格 暂停"); 195 outtextxy(R+IMGWIDTH+20, U+IMGHEIGHT+20, "最高记录:"); 196 char rec1[10];//,rec2[10],rec3[10]; 197 for(int index=0;index<=2;index++){ 198 sprintf(rec1, "%d",rec[index]); 199 outtextxy(R+IMGWIDTH+20, U+IMGHEIGHT+20+(index+1)*30, rec1); 200 } 201 int i,j; 202 for(i=L-IMGWIDTH;i<=R;i=i+IMGWIDTH){ 203 j=U-IMGHEIGHT; 204 putimage(i,j,&(wallimg)); 205 } 206 for(j=U;j<=D;j=j+IMGHEIGHT){ 207 i=L-IMGWIDTH; 208 putimage(i,j,&(wallimg)); 209 } 210 for(j=U;j<=D;j=j+IMGHEIGHT){ 211 i=R; 212 putimage(i,j,&(wallimg)); 213 } 214 for(i=L-IMGWIDTH;i<=R;i=i+IMGWIDTH){ 215 j=D; 216 putimage(i,j,&(wallimg)); 217 } 218 outtextxy(L-10, U-IMGHEIGHT-20, "得分:"); 219 char s[10]; 220 sprintf(s, "%d",score); 221 outtextxy(L+60, U-IMGHEIGHT-20, s); 222 outtextxy(L+120, U-IMGHEIGHT-20, "长度:"); 223 char l[10]; 224 sprintf(l, "%d",snake.Length()); 225 outtextxy(L+180, U-IMGHEIGHT-20, l); 226 227 snake.Show(); 228 229 food.Show(); 230 FlushBatchDraw(); 231 Sleep(50*grade); 232 233 return 0; 234 } 235 bool check(Body& snake,Food& food){ 236 BodyNode* pl=snake.head; 237 bool flag=false; 238 while(pl!=snake.tail->next){ 239 240 if((pl->x==food.x)&&(pl->y==food.y)){flag=true;break;} 241 242 pl=pl->next; 243 } 244 return flag; 245 } 246 DWORD WINAPI Fun1Proc(LPVOID IpParameter) 247 { 248 mciSendString("play yeah.mp3 repeat", NULL, 0, NULL);//播放 249 return 0; 250 } 251 int menu(){ 252 //cleardevice(); 253 outtextxy((WIDTH/2)-80, 120, "贪吃蛇"); 254 outtextxy((WIDTH/2)-180, 230, "按↑和↓选择难度"); 255 outtextxy((WIDTH/2)-180, 250, "按空格键确定选择"); 256 return 0; 257 } 258 int record(){ 259 fstream f1("record.txt"); //打开文件,若文件不存在就创建它 260 if(!f1) return -1; 261 //int a=0,b=0,c=0; 262 f1>>rec[0]>>rec[1]>>rec[2]; 263 264 f1.close(); 265 return 0; 266 } 267 int saverecord(){ 268 system("del record.txt "); 269 ofstream f1("record.txt"); //打开文件,若文件不存在就创建它 270 if(!f1) return -1; 271 int flag=1; 272 int temp; 273 rec[3]=score; 274 while(flag==1){ 275 flag=0; 276 for(int i=0;i<=2;i++){ 277 if(rec[i]<rec[i+1]){ 278 flag=1; 279 temp=rec[i]; 280 rec[i]=rec[i+1]; 281 rec[i+1]=temp; 282 } 283 } 284 } 285 286 f1<<rec[0]<<"\n"<<rec[1]<<"\n"<<rec[2]; 287 288 f1.close(); 289 if(score!=rec[3]){ 290 settextstyle(50, 0, _T("宋体")); 291 outtextxy(WIDTH/2-(50*5),U+40, "恭喜你创造了新纪录!"); 292 } 293 return 0; 294 } 295 int main(){ 296 for(int i=0;i<=3;i++){ 297 rec[i]=0; 298 } 299 record(); 300 IMAGE snakeimg; 301 302 HANDLE hThread1; 303 hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); 304 char key; 305 int movekey=4; 306 int movekeyold=movekey; 307 initgraph(WIDTH,HEIGHT); 308 char temp=0,choose; 309 while(temp!=' '){ 310 cleardevice(); 311 if(kbhit()){ 312 choose=getch(); 313 fflush(stdin); 314 switch(choose){ 315 case UP:{ 316 grade++; 317 };break; 318 case DOWN:{ 319 grade--; 320 }; 321 } 322 } 323 if(grade==4){grade=3;} 324 if(grade==0){grade=1;} 325 outtextxy(420,350,"简单"); 326 outtextxy(420,380,"中等"); 327 outtextxy(420,410,""); 328 // cleardevice(); 329 menu(); 330 outtextxy(300,300,"请选择难度:"); 331 if(grade==3){ 332 outtextxy(390,350,""); 333 } 334 if(grade==2){ 335 outtextxy(390,380,""); 336 } 337 if(grade==1){ 338 outtextxy(390,410,""); 339 } 340 temp=getch(); 341 } 342 loadimage(&(wallimg), _T(WALL)); 343 Body snake; 344 Food food; 345 showgame(snake,food); 346 while(snake.IsDead()==false){ 347 while(snake.IsDead()==false&&(!kbhit())){ 348 349 if(movekey==1&&movekeyold==2||movekey==2&&movekeyold==1||movekey==3&&movekeyold==4||movekey==4&&movekeyold==3){ 350 movekey=movekeyold;} 351 movekeyold=movekey; 352 snake.Move(movekey); 353 showgame(snake,food); 354 if(check(snake,food)==true){ 355 mciSendString("play yeah.wav", NULL, 0, NULL);//播放 356 cout<<'\a'; 357 score+=10; 358 food.givefood(snake); 359 snake.Grow(); 360 snake.Grow(); 361 snake.Grow(); 362 } 363 } 364 if(kbhit()){ 365 key=getch(); 366 switch(key){ 367 case UP:{movekey=1; 368 };break; 369 case DOWN:{movekey=2; 370 };break; 371 case LEFT:{movekey=3; 372 };break; 373 case RIGHT:{movekey=4; 374 };break; 375 case ' ':{int t=0; 376 while(t==0){ 377 if(kbhit()){ 378 key=getch(); 379 if(key==' '){ 380 t=1; 381 } 382 } 383 } 384 }; 385 } 386 } 387 } 388 CloseHandle(hThread1); 389 BeginBatchDraw(); 390 showgame(snake,food); 391 IMAGE gameoverimg; 392 loadimage(&(gameoverimg), _T(GAMEOVER)); 393 putimage(WIDTH/2-(gameoverimg.getwidth()/2),HEIGHT/2-(gameoverimg.getheight()/2),&(gameoverimg)); 394 395 saverecord(); 396 FlushBatchDraw(); 397 while(1) 398 { 399 Sleep(3000); 400 } 401 saverecord(); 402 return 0; 403 }

 

 

 

 

 素材:

 

wall.jpg

tailu.jpg

tailr.jpg

taill.jpg

taild.jpg

headup.jpg

headright.jpg

headleft.jpg

headdown.jpg

food.jpg

bodylr.jpg

gameover.jpg

 

 

record.txt 内容:

330
140
110

 

yeah.mp3游戏背景音乐。

yeah.wav 蛇吃到食物时的哔声。

 

程序写于大二上学期。

2016.4.12更新博客。

END

转载于:https://www.cnblogs.com/maxuewei2/p/5273944.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中sorted的用法append_python sorted()排序详解

排序&#xff0c;在编程中经常遇到的算法&#xff0c;我也在几篇文章中介绍了一些关于排序的算法。有的高级语言内置了一些排序函数。本文讲述Python在这方面的工作。供使用内置函数sorted()/list.sort()的使用简单应用python对list有一个内置函数&#xff1a;>>> a[5…

云上的播放框架变得简单:Openshift模块

仅仅几年前&#xff0c;找到一个负担得起的Java Web应用程序托管解决方案是一项艰巨的任务&#xff0c;而寻找免费的托管解决方案是一项不可能的任务。 更不用说甚至考虑自动缩放&#xff0c;单命令部署&#xff0c;持续集成等事情&#xff0c;这都是科幻小说。 去年见证了云计…

C#中的yield return与Unity中的Coroutine(协程)(下)

Unity中的Coroutine&#xff08;协程&#xff09; 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件&#xff0c; Image&#xff1a; 将以下代码绑定到Image 1 using UnityEngine;2 using System.Collections;3 using System.Threading;4 using …

【CSS3动画】transform对文字及图片的旋转、缩放、倾斜和移动

前言&#xff1a;之前我有写过CSS3的transform这一这特性&#xff0c;对于它的用法&#xff0c;还不是很透彻&#xff0c;今天补充补充&#xff0c;呵呵 你懂的&#xff0c;小司机准备开车了。 a)再提一提transform的四个属性 ①旋转--->rotate(参数a)&#xff0c;单位deg&a…

数据库行转列在现实需求中的用法

select t.客户姓名,sum(case when t.收款类型首款 then t.金额 else 0 end as 首款),sum(case when t.收款类型尾款 then t.金额 else 0 end as 尾款) from table t group by t.客户姓名 这段sql的意思 是 查询出所有客户收款信息 然后按客户分组 分组后 然后将这个客户的所…

apk反编译方式

一、Apk反编译得到Java源代码 下载上述反编译工具包&#xff0c;打开apk2java目录下的dex2jar-0.0.9.9文件夹&#xff0c;内含apk反编译成java源码工具&#xff0c;以及源码查看工具。 apk反编译工具dex2jar&#xff0c;是将apk中的classes.dex转化成jar文件 源码查看工具jdgui…

ADF声明性组件示例

在我以前的文章中&#xff0c;我答应展示如何为智能值列表创建ADF声明性组件。 因此&#xff0c;我将创建一个包含三个元素的组件&#xff1a;标签&#xff0c;输入文本和值的组合框列表。 那很容易。 我在工作空间中创建了一个单独的ADF ViewController项目&#xff1a; 在此项…

Solr集群更新配置的方式

solr集群中配置文件是经常更新的&#xff0c;频率最高的也就是schema.xml和solrconfig.xml这两个配置文件了&#xff0c;对于更新配置文件之前&#xff0c;我们先了解一下集群项目结构 由于在集群模式下&#xff0c;solrconfig.xml和schema.xml等配置文件都由Zookeeper集群管理…

java文本框双击可编辑_java swing 文本域双击变为可编辑

java swing如何实现文本域双击变为可编辑呢?给文本域添加鼠标事件监听程序即可:resultTA1new AssistPopupTextArea();resultTA1.setEditable(false);resultTA1.setLineWrap(true);resultTA1.setWrapStyleWord(true);resultTA1.addMouseListener(new MouseAdapter() {Overridep…

OSGi简介–模块化Java

OSGi联盟是这一搁浅的管理机构&#xff0c;它始于1999年。其最初目标是为网络设备创建开放搁浅。 基于此思想&#xff0c;此规范也针对Java引入。 Eclipse在Java中是第一个。 他们于2004年6月推出了基于OSGi的Eclipse IDE。 OSGi是在Java中定义动态模块的方法。 主要为Java实现…

HDU FatMouse's Speed 基本DP

题意&#xff1a;要求找到的体重递增&#xff0c;速度递减的老鼠&#xff0c;并且输出最长的长度数&#xff0c;而且输出各自的序列数。Special Judge 思路&#xff1a;先按体重由小到大排序&#xff0c;再找最长速度递减序列。 转移方程&#xff1a;mou[i].w>mou[j].w&am…

java xmpp openfire_搭建Xmpp服务器Openfire

step1、 安装java环境这里是检测是否安装java的网页如没有安装则进行以下步骤1、下载jdk7的mac版&#xff1a;jdk-7u79-macosx-x64.dmg2、安装好之后&#xff0c;在命令行进入以下路径查看#cd /Library/Java/JavaVirtualMachines/3、再查看你自己安装的版本#ls版本为jdk-8u171-…

Spark程序运行报错解决(1)

报错内容&#xff1a;System memory 259522560 must be at least 4.718592E8. Please use a larger heap size. 解决&#xff1a;Window——Preference——Java——Installed JREs——选中一个Jre 后 Edit 在Default VM arguments 里加入&#xff1a;-Xmx512M 转载于:https://w…

java setsolinger_java socket 的参数选项解读(转)

在MulticastSocket的源代码里有设置多播的方法&#xff1a;public void setInterface(InetAddress inf) throwsSocketException {if(isClosed()) {throw new SocketException("Socket is closed");}checkAddress(inf, "setInterface");synchronized(infLoc…

【转】Linux终端下 dstat 监控工具

转自https://linux.cn/article-3215-1.html dstat 是一个可以取代vmstat&#xff0c;iostat&#xff0c;netstat和ifstat这些命令的多功能产品。dstat克服了这些命令的局限并增加了一些另外的功能&#xff0c;增加了监控项&#xff0c;也变得更灵活了。dstat可以很方便监控系统…

java jdbc连接db2数据库_Java连接db2数据库(常用数据库连接五)

1.安装好db2数据库&#xff0c;并建立表如下&#xff1a;2.eclipse或myeclipse中建立工程并导入java连接db2所需要的jar包db2java.jar 下载地址&#xff1a;http://download.csdn.net/detail/whzhaochao/64149813.建立iConn接口&#xff0c;代码如下&#xff1a;package com.zh…

Oracle通过邀请Weaver和Chin推动JavaFX向前发展

我昨天发布了愚人节帖子&#xff0c;内容涉及加入NASA协助探索红色大行星。 那个帖子与事实相距不远... NASA开发的技术的所有细节都是100&#xff05;准确的。 哎呀&#xff0c;即使我辞职也是事实&#xff01; 唯一不正确的部分是我将加入的公司。 在NASA协助探索火星的工作也…

WinForm------TextEdit只能输入数字

代码: this.textEdit1.Properties.Mask.EditMask "\d"; this.textEdit1.Properties.Mask.MaskType MaskType.RegEx; 转载于:https://www.cnblogs.com/tianhengblogs/p/6093634.html

JavaFX:创建Sprite动画

到目前为止&#xff0c;尽管我的大多数文章都涉及JavaFX属性和绑定&#xff0c;但今天我想写一讲我也致力于JavaFX运行时的另一部分&#xff1a;动画API。 在本文中&#xff0c;我将解释如何在JavaFX中编写自定义动画&#xff0c;以及如何使用这种方法为Sprite动画创建类。 &am…

使用UIBinder的GWT自定义按钮

这是一个有关如何在GWT上使用UIBinder创建自定义按钮的示例。 public class GwtUIBinderButton implements EntryPoint {public void onModuleLoad() {Button button new Button();button.setText("Button");button.addClickHandler(new ClickHandler(){Overridepub…