⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~pas

📁 我就是贪吃蛇(delphix)的作者
💻 ~PAS
字号:
//作者:曹扬^_^

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ExtCtrls, Menus, StdCtrls, DXSounds,XPMan, AsphyreDb, AsphyreImages, AsphyreSubsc,AsphyreDevices, Asphyre2D, AsphyreCanvas, AsphyreTimers, AsphyreKeyboard,directinput,
  AsphyreFonts,AsphyreDef,mmSystem;

type
  TMainForm = class(TForm)
    MainMenu: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N13: TMenuItem;
    N4: TMenuItem;
    N8: TMenuItem;
    N14: TMenuItem;
    N15: TMenuItem;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    XPManifest1: TXPManifest;
    Device: TAsphyreDevice;
    Timer: TAsphyreTimer;
    MyCanvas: TAsphyreCanvas;
    Images: TAsphyreImages;
    ASDb: TASDb;
    KeyBoard: TAsphyreKeyboard;
    Fonts: TAsphyreFonts;
    procedure FormCreate(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure N13Click(Sender: TObject);
    procedure N12Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N14Click(Sender: TObject);
    procedure N15Click(Sender: TObject);
    procedure DeviceRender(Sender: TObject);
    procedure TimerProcess(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure FormClick(Sender: TObject);
  private
    { Private declarations }
  public
    procedure gameover;
    { Public declarations }
  end;

var
  MainForm: TMainForm;
  setkey: byte; //保存按键数据
  long:byte; //保存小蛇的长度
  body:array[0..400] of Tpoint;  //保存小蛇数据
  i:longint; //循环变量
  food:tpoint;  //保存食物数据
  x:Boolean;  //食物是否与蛇身冲突
  Fraction:longint;  //保存得分
  music:boolean;  //是否播放音效
  level:byte;  //保存关数
implementation

{$R *.dfm}


procedure TMainForm.FormCreate(Sender: TObject);
begin
  //初始化
  Device.Initialize;
  Images.LoadFromASDb(ASDb);
  Fonts.LoadFromASDb(ASDb);
  music:=true;
  randomize;
end;


procedure TMainForm.N2Click(Sender: TObject);
begin
  //初始化
  level:=1;
  timer.speed:=10;
  setkey:=1;
  long:=5;
  body[1].X :=100;
  body[1].y:=400;
  body[2].x:=100;
  body[2].y:=425;
  body[3].x:=100;
  body[3].y:=450;
  body[4].X :=100;
  body[4].Y :=475;
  body[5].X :=100;
  body[5].Y :=500;
  food.X :=250;
  food.Y :=350;
  if music then
    sndPlaySound('begin.wav',1);
  Fraction:=0;
  mainform.Caption :='贪吃蛇(DirectX版)    得分:0    第1关';
  timer.Enabled :=true;
end;

procedure TMainForm.N3Click(Sender: TObject);
begin
  //退出
  close;
end;


procedure TMainForm.N10Click(Sender: TObject);
begin
  music:=true;
  n10.Checked :=true;
  n11.Checked :=false;
end;

procedure TMainForm.N11Click(Sender: TObject);
begin
  music:=false;
  n10.Checked :=false;
  n11.Checked :=true;
end;

procedure TMainForm.N13Click(Sender: TObject);
begin
  showmessage('作者:曹扬!!!^_^');
end;
procedure TMainForm.N12Click(Sender: TObject);
begin
  showmessage('方向键控制小蛇移动,小蛇不能撞墙,也不能碰到自己的身体。');
end;

procedure TMainForm.gameover;
begin
  Device.Clear(0);
  Mycanvas.Draw(images.Image['back.image'],0,0,0,1);
  Fonts[0].TextOut('Game Over',180,250, $ff0000ff,$ffff00ff,fxBlend);
  timer.Enabled :=false;
end;

procedure TMainForm.N4Click(Sender: TObject);
begin
  if n4.Checked then n4.Checked :=false else n4.Checked :=true;
end;

procedure TMainForm.N14Click(Sender: TObject);
var
  f:textfile;
  run:boolean;
begin
  //储存进度
  run:=timer.Enabled;
  timer.Enabled :=false;
  if savedialog.Execute then
  begin
    assignfile(f,savedialog.FileName);
    rewrite(f);
    writeln(f,floattostr(timer.speed));
    writeln(f,inttostr(Fraction));
    writeln(f,inttostr(level));
    writeln(f,inttostr(long));
    writeln(f,inttostr(food.X));
    writeln(f,inttostr(food.Y));
    writeln(f,inttostr(setkey));
    for i:=1 to long do
    begin
      writeln(f,inttostr(body[i].X));
      writeln(f,inttostr(body[i].Y));
    end;
    closefile(f);
  end;
  timer.Enabled :=run;
end;

procedure TMainForm.N15Click(Sender: TObject);
var
  f:textfile;
  temp:single;
  run:boolean;
begin
  //读取进度
  run:=timer.Enabled;
  timer.Enabled :=false;
  if opendialog.Execute then
  begin
    assignfile(f,opendialog.FileName);
    reset(f);
    readln(f,temp);
    timer.speed :=temp;
    readln(f,Fraction);
    readln(f,level);
    readln(f,long);
    readln(f,food.x);
    readln(f,food.y);
    readln(f,setkey);
    for i:=1 to long do
    begin
      readln(f,body[i].X);
      readln(f,body[i].Y);
    end;
    closefile(f);
  end;
  timer.Enabled :=run;
end;

procedure TMainForm.DeviceRender(Sender: TObject);
begin
  //画背景
  MyCanvas.Draw(Images.Image['back.image'],0,0,0,1);
  //处理小蛇数据
  for i:=long downto 2 do
    body[i]:=body[i-1];
  case setkey of
    1:body[1].y :=body[1].y -25;
    2:body[1].Y :=body[1].Y +25;
    3:body[1].X :=body[1].X -25;
    4:body[1].X :=body[1].X +25;
  end;
  //画小蛇
  for i:=1 to long do
    MyCanvas.Draw(Images.Image['body.image'],body[i].X ,body[i].Y,0,1);
  //判断是否撞墙
  if (body[1].X <0) or (body[1].X >475) or (body[1].y <0) or (body[1].y >550) then
    gameover;
  //判断是否撞到自己
  for i:=2 to long do
  begin
    if (body[i].X =body[1].x) and (body[i].y=body[1].Y) then
      gameover;
  end;
  //判断是否吃到食物
  if (body[1].X =food.X) and (body[1].Y =food.Y)  then
  begin
    if music then
      sndPlaySound('eat.wav',1);
    Fraction:=Fraction+10;
    mainform.Caption :='贪吃蛇(DirectX版)    得分:' + inttostr(Fraction) + '    第' + inttostr(level) + '关';
    //过关
    if (Fraction>=300) and n4.Checked then
    begin
      Fraction:=0;
      timer.speed :=timer.speed +2;
      level:=level+1;
      mainform.Caption :='贪吃蛇    得分:' + inttostr(Fraction) + '    第' + inttostr(level) + '关';
      setkey:=1;
      long:=5;
      body[1].X :=100;
      body[1].y:=400;
      body[2].x:=100;
      body[2].y:=425;
      body[3].x:=100;
      body[3].y:=450;
      body[4].X :=100;
      body[4].Y :=475;
      body[5].X :=100;
      body[5].Y :=500;
    end;
    //重新生成食物
    repeat
      x:=true;
      food.X :=random(20)*25;
      food.Y :=random(23)*25;
      for i:=1 to long do
      begin
        if (food.X =body[i].x) and (food.Y =body[i].Y) then
          x:=false;
      end;
    until x;
    //加长蛇身
    long:=long+1;
    body[long].X :=body[long-1].X +25;
    body[long].Y :=body[long-1].Y ;
  end;
  //画食物
  Fonts[0].TextOut('FPS: '+inttostr(Timer.FrameRate), 5,5, $FF00FF00,$FFFFFFFF,fxBlend);
  MyCanvas.Draw(Images.Image['food.image'],food.X ,food.y,0,1);
end;

procedure TMainForm.TimerProcess(Sender: TObject);
begin
  Device.Render(0,true);
  Device.Flip;
end;

procedure TMainForm.TimerTimer(Sender: TObject);
begin
  //取得键盘信息
  keyboard.Update;
  if (keyboard.Keypressed[dik_up]=true) and (setkey<>2) then
    setkey:=1;
  if (keyboard.Keypressed[dik_down]=true) and (setkey<>1) then
    setkey:=2;
  if (keyboard.Keypressed[dik_left]=true) and (setkey<>4) then
    setkey:=3;
  if (keyboard.Keypressed[dik_right]=true) and (setkey<>3) then
    setkey:=4;
  Timer.Process;
end;

procedure TMainForm.N1Click(Sender: TObject);
begin
  Timer.Enabled:=false;
end;

procedure TMainForm.N5Click(Sender: TObject);
begin
  Timer.Enabled:=false;
end;

procedure TMainForm.FormClick(Sender: TObject);
begin
  Timer.Enabled:=true;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -