Pascal atur cara permainan sedia ABC. Mencipta permainan komputer dalam Pascal

Catatan nostalgia untuk mainan yang kami tulis untuk diri kami sendiri pada zaman kanak-kanak.
Mendaki melalui kawasan lapang Stor aplikasi mencari mainan lain untuk iPad saya, saya terjumpa mainan lama "Brothers Pilots". Saya segera membelinya, memasangnya dan menyelesaikannya sekali gus (mungkin sudah 3 kali). Tetapi kebanyakannya saya berlarutan pada episod dengan peti sejuk. Teka-teki ini sangat mengganggu saya.

Dan tiba-tiba saya teringat bahawa pada tahun-tahun sekolah saya, selepas melalui peti sejuk, teka-teki itu sangat membebankan saya sehingga saya menulis mainan saya sendiri dalam Pascal - emulator teka-teki. Tetapi ia bukan sahaja mengulangi permainan asal, ia membenarkan anda memilih saiz medan, mempunyai bantuan, keupayaan untuk menyimpan dan meneruskan permainan dari tempat sebelumnya selepas keluar.

Setelah mendapatkan kembali sandaran lama, saya menemui permainan asal. Saya melancarkannya dalam dosbox dan hilang untuk dunia luar selama beberapa jam.


Teka-teki asal, perhatikan lajur kiri terbuka dan kedudukan pintu pagar

Apa gunanya?

Intipati teka-teki itu agak mudah. Terdapat bidang injap 4 hingga 4 keping; adalah perlu untuk meletakkan semua injap pada peti sejuk dalam kedudukan mendatar. "Tetapi ada nuansa"(c): apabila anda menghidupkan injap, semua injap dalam lajur dan baris di mana injap ini terletak berpusing bersama-sama dengannya. Dan di sinilah keseronokan bermula!
Apabila saya mula-mula duduk bermain teka-teki ini dalam pencarian asal, memainkannya di sekolah, saya mungkin mengambil masa 40 minit untuk menyelesaikannya, tidak kurang. Tetapi saya sangat menyukainya sehingga saya memainkannya dan memainkannya dan memainkannya...
Tetapi saya mahu lebih: keupayaan untuk menyimpan proses permainan, menjana tahap yang berbeza dan menukar saiz medan untuk memahami algoritma permainan.
Kemudian saya menyedari bahawa jika saya suka teka-teki dan ingin mencuba skala yang berbeza padang bermain, maka anda tidak perlu menunggu cuaca di tepi laut. Hanya ada satu jalan keluar - untuk melaksanakan permainan ini sendiri.

Baiklah, mari kita mulakan!

Saya tidak akan dapat menentukan tarikh sebenar penciptaan permainan, tetapi ia pastinya tamat sekolah, permulaan kolej. Pada tahun-tahun itu saya fasih berbahasa Pascal. Di institut itu, saya menyelesaikan masalah di dalamnya untuk wang, membantu menulis kerja kursus, dan secara umum - ia adalah bahasa logik yang indah. Oleh itu, ia telah memutuskan untuk menulis mainan di atasnya.
Walaupun saya tahu bagaimana untuk melaksanakan grafik dalam DOS, saya memutuskan untuk tidak melakukannya aplikasi grafik. Ini disebabkan oleh fakta bahawa ia akan menjadi sangat buggy dan lambat, yang, pertama sekali, saya ingin melaksanakan secepat mungkin permohonan ini, dan melaksanakan grafik akan mengambil banyak masa; dan kedua, paparan teks Saya lebih suka. Walaupun, melihat ke belakang, nampaknya saya akan melakukan yang lebih baik dengan grafik dan menambah sokongan tetikus.
Tugasnya adalah mudah: untuk membuat permainan yang ringkas dan elegan yang tidak akan memalukan untuk dipertontonkan. Antara ciri: bantuan, keupayaan untuk menyimpan dan selepas memulakan permainan untuk meneruskan dari saat ia dihentikan, keupayaan untuk menukar saiz padang permainan. Ditambah sedikit warna dan keanggunan.

Perlaksanaan

Saya tidak akan menganalisis sepenuhnya kod sumber dan logik keseluruhan program, kerana ia jelas, dan apa yang tidak jelas adalah jelas daripada kod. Tetapi saya akan membincangkan beberapa perkara dengan lebih terperinci.
Asas permainan ialah tatasusunan teks elemen NxN, di mana N boleh sama dengan 2, 4, 8 dan 16. Tatasusunan diisi dengan hanya dua aksara X dan Y. Kedudukan kursor ialah kedudukan elemen tatasusunan semasa i dan j. Apabila menyongsangkan elemen tatasusunan, X digantikan oleh Y dan Y oleh X dalam lajur dan baris tatasusunan. Selain itu, terdapat kekunci pintas (F1-F4, F10) yang membolehkan anda memanggil Bantuan, Simpan/Muat, Buat dan Keluar. Segala-galanya jelas di sini, dan cara melaksanakannya adalah mudah dan kami tidak akan membincangkan perkara ini secara terperinci.

Kepentingan terbesar, dari sudut pendidikan, adalah prosedur WRIFT.*

* - ambil perhatian mengapa hanyut

Pada zaman itu, untuk menjimatkan wang, mesej SMS ditulis dalam transliterasi. Bagaimana kita mengingati surat itu " Sh" digantikan dengan gabungan " sh”, tetapi untuk menjimatkan ruang saya menggantikannya dengan huruf yang tidak digunakan dengan ejaan yang serupa “ W" Di sinilah nama itu berasal Wrift(Font). Begitu juga huruf “ X” (X) menggantikan huruf “ X” (Bahasa Rusia “ Ha”).

Memandangkan saya memutuskan untuk menggunakan mod teks untuk permainan, saya memerlukan surat untuk menggantikan injap. Apakah kaitan ini dengan surat yang akan menunjukkan injap dalam menegak dan kedudukan mendatar. Satu-satunya calon yang sesuai untuk tujuan ini ialah surat“N” dan “Z”. Huruf "Z" menyerupai huruf N yang diletakkan di sisinya, hanya terbentang.
Saya mencuba pilihan ini dan tidak berpuas hati dengannya. Dan saya menyedari bahawa saya perlu melakukan sesuatu sendiri, beberapa penyelesaian alternatif. Saya sudah berfikir tentang menulis versi grafik, apabila saya menjumpai program Pascal "Matrix" dari pengarang Abrarov A.M. . Program ini bermula dengan cara yang sama seperti "Matriks" pertama - memaparkan garis pada skrin, mencari kod. Dan kemudian simbol hieroglif mula turun. Selain itu, ini hanya dilaksanakan dalam mod teks.

Program pendidikan kecil tentang program Matrix.pas

Program ini sangat cantik dan elegan pada zamannya. Dan kemudian ia memberi saya banyak keseronokan. Perkara yang paling menarik ialah fon penuh dilaksanakan di sana, untuk 208 aksara! Tetapi saya menganggap bahawa pengarang mengambil pelaksanaan program seperti "russifier" kami, hanya untuk hieroglif, dan membuatnya semula untuk dirinya sendiri.

Benar, sekarang untuk menjadikan program berfungsi seperti biasa, walaupun dalam dosbox, anda perlu mengurangkan semua kelewatan sebanyak 10 kali (kelewatan), jika tidak, cucu anda akan menunggu sehingga tamat kerja. Memandangkan saya terlalu malas untuk membuat semula program ini, ia adalah untuk kepentingan akademik semata-mata. Atau mungkin seseorang akan membuat semula dan menunjukkannya kepada dunia, perisian itu cantik (terutamanya kerana saya memberikan pautan kepada sumber). Dan jika tiba-tiba penulisnya membaca catatan ini, maka saya sampaikan kepadanya ucapan terima kasih saya.

Perkara yang paling penting ialah dalam program itu, “krakozyabr” mempunyai fon sendiri! Dan ia dimuatkan. Saya meminjam prosedur pemuatan ini, sudah tentu mengubahnya sedikit.
Beberapa perkataan tentang bekerja dengan fon.

Dalam MS-DOS, BIOS menyokong kerja dengan fon bitmap. Ciri BIOS membolehkan anda mendapatkan dan memasang fon tersuai, dan juga menerima fon daripada penjana aksara penyesuai video. Semua fon yang dipasang mempunyai lebar yang sama iaitu 8 mata, dan ketinggian boleh mempunyai tiga nilai tetap - 8, 14 atau 16 mata. Nilai ketinggian fon tertentu ditentukan oleh mod video yang mana fon dimuatkan. Ketinggian fon 8 titik sepadan dengan mod video baris 50/43, ketinggian fon 14 titik sepadan dengan mod video 25 baris untuk EGA, dan ketinggian fon 16 titik sepadan dengan mod video baris VGA 25.

Kami akan menggunakan mod video 16 warna 40x25 aksara. Dalam mod video ini, setiap aksara ialah tatasusunan titik 8x16. Ringkasnya, setiap aksara mewakili 16 bait, di mana dalam bait sedikit ditetapkan kepada satu bermakna ia berwarna hitam. Jika anda mempunyai kekacauan dalam kepala anda sekarang, jangan risau - ia akan menjadi lebih jelas kemudian.
Untuk menetapkan injap tertutup (menegak), huruf "X" dipilih (Latin huruf besar“X”) dan untuk mendatar terbuka, huruf “Y” (huruf besar Latin “Y”). Surat-surat ini dipilih atas beberapa sebab. Pertama, mereka mengenali antara satu sama lain dari kurikulum sekolah dan dengan telinga. Kedua, dan yang lebih penting, mereka Jadual ASCII aksara berada dalam satu baris (masing-masing 88d dan 89d), yang memudahkan penggantiannya. Dan yang Latin dipilih supaya menu boleh dibuat dalam bahasa Rusia, tanpa memuat naik semula fon.
Jadi, kami telah memutuskan simbol, sekarang mari kita beralih kepada pakaian mereka, aka fon. Kami mengambil sehelai kertas dalam sangkar, dan membuat medan 8x16 di atasnya dan mula melukis simbol untuk mendatar dan kemudian injap menegak. Memandangkan gerbang mestilah sama dalam kedua-dua keadaan menegak dan mendatar, kami hanya akan menggunakan 8 baris pertama untuk mendapatkan segi empat sama. Dan kemudian kami menarik dua injap dalam bidang ini, secara menegak dan mendatar. Ia sepatutnya berfungsi seperti ini


Fon dua injap

Seterusnya, kami menandakan segi empat sama hitam dengan satu, sifar putih. Dan kami membentuk 8 bait. Kemudian kami menukarnya kepada format perpuluhan dan membentuk tatasusunan. Mula-mula, 8 bait aksara, kemudian 8 bait sifar (kami biarkan ruang bawah tanah kosong), ulangi prosedur ini untuk aksara kedua.


Jadual kod binari, dan ditukar kepada format perpuluhan

Akibatnya, kami mendapat pengepala prosedur berikut:

Prosedur WRIFT; (Zagruzka shrifta ("pesochnye chasy")) Const Font:array of Byte=(129,195,231,153,153,231,195,129,0,0,0,0,0,0,0,0, 255,102,36,24,502,24,102 0,0,0,0,0,0); Var SegScr:Word; OfsScr:Word; skrin1: Tatasusunan Fon mutlak Byte;

Fon ialah susunan dua aksara get (setiap aksara pada barisnya sendiri). Pembolehubah yang paling menarik ialah tatasusunan screen1 - tatasusunan yang terletak di alamat mutlak pembolehubah Font (directive mutlak). Seterusnya datang bahagian yang menyeronokkan.

Mulakan ofsscr:=ofs(screen1); segscr:=seg(skrin1); Asm push bp mov ax,segscr mov es,ax mov bp,ofsscr mov bx,1000h mov dx,88 (s kakogo simvola na4at" zapis" 88d-X,89d-Y) mov cx,2 (koli4estvo simvolov) mov ax, 1100j int 10j pop bp mov ah,1 (ustanovit videorezhim txt, tsvetnoj (16 cvetov) 40x25 ) mov cx,1000j int 10j Tamat; tamat;(WRIFT)

Seperti yang jelas daripada baris di atas, kami memuatkan segmen ES ke dalam daftar ES, dan alamat mengimbangi lokasi fon kami ke dalam daftar BP. Dengan arahan mov bx,1000h kita katakan bahawa kita mempunyai 16 baris dalam fon (nombor 10h=16d dimuatkan ke dalam BH, dan BL=0). Seterusnya, kita memuatkan nombor aksara ke dalam daftar DX, dari mana kita bermula untuk menukar fon. Dan dalam CX - bilangan aksara yang akan diganti. Kami memuatkan daftar AX ke dalam nombor fungsi BIOS untuk menukar fon, dan memanggil gangguan BIOS. Seterusnya, kami memulihkan daftar BP dan menetapkan mod penyesuai video dengan cara yang sama. Butiran lanjut diterangkan di sini: shackmaster.narod.ru/fonts.htm. Untuk pemahaman yang lebih baik tentang struktur fon, adalah lebih baik untuk membaca laman web ini.

Dengan cara mudah ini, anda boleh menukar keseluruhan fon dalam DOS kepada anda sendiri. Untuk memunggah fon, gunakan prosedur Pulihkan:

Pemulihan Prosedur; (Sbros shrifta) Mulakan asm mov ax,3 int 10h Tamat; Tamat;(Pulihkan)

Yang dilaksanakan apabila menu dipaparkan dan program keluar.

Ngomong-ngomong, untuk rujukan, apa yang dipanggil "Russifiers" berfungsi dalam DOS dengan cara yang sama. Mereka hanya menggantikan fon semasa dengan fon dengan huruf Rusia.

Salah satu jenaka

Salah seorang kawan saya, khususnya semasa dia belajar pengaturcaraan di Borland C++, membuat fon dalam bentuk MPH, juga menggunakan contoh dari "The Matrix". Itu. Saya hanya menggantikan semua watak dengan satu watak MPH. Komander Norton kelihatan menakutkan! Sayangnya tiada lagi foto masa itu.
Jika pautan program sedemikian boleh dilancarkan dalam sains komputer, guru akan gembira.

Pengubahsuaian hari ini

Sebenarnya, saya tidak memberikan permainan dalam bentuk yang ditulis bertahun-tahun yang lalu. Ia mendedahkan beberapa pepijat yang sangat tidak menyenangkan:
1. Program ini hanya ranap jika fail GAME.SAV tidak dikesan;
2. Penjana nombor rawak tidak dimulakan, jadi ia sentiasa menghasilkan tahap yang sama.
Selain itu, disebabkan masalah dengan pengekodan, saya mencipta versi kedua permainan, sepenuhnya dalam Bahasa Inggeris. Dan jika anda membaca kod sumber bukan dalam editor yang serasi dengan DOS, saya cadangkan menggunakan sumbernya - tidak akan ada masalah dengan pengekodan.

Sungguh menggembirakan kerana DOSbox ada di mana-mana; Saya secara peribadi menyunting kebanyakan program pada iPad di kereta bawah tanah. Bolehkah anda bayangkan betapa lucunya Pepper dengan iPad dan Borland Pascal terbuka padanya?


Borland Pascal lama yang bagus pada iPad

Jadi jambs segera dibetulkan.

Beberapa tangkapan skrin program, dengan penerangan ringkas

Bagi mereka yang tidak mempunyai peluang atau keinginan untuk bermain permainan, berikut adalah beberapa tangkapan skrin utama permainan.
Selepas pelancaran, medan permainan dibuka dengan permainan terakhir yang disimpan


Mulakan

Kursor diserlahkan dan berkelip.

Jika anda menekan F1, anda boleh mendapatkan bantuan mudah ini




Tolong

Untuk menjana tahap, tekan F4 dan masuk ke menu ini


Menu penjanaan tahap

Nah, selepas kemenangan permainan akan mengucapkan tahniah kepada anda


Tahniah atas kemenangan anda

Dan ia akan menunggu sebarang kekunci ditekan. Dalam kes ini, kemajuan permainan tidak disimpan.

Cara memasang dan bermain

Disebabkan oleh keanehan dan aplikasi pemuatan fon, mainan hanya berfungsi dalam DOS tiub tulen. Oleh itu, untuk berfungsi, anda perlu menggunakan dosbox atau program yang serupa.
Pemasangan adalah remeh. Muat turun arkib dengan program. Pasang kotak dos. Dan, jika anda mahu, anda boleh Russify itu, kaedah untuk Linux ada di sini: old-game.org/?p=1717.
Pada dasarnya, semua fail ini boleh digunakan untuk Windows: Untuk melakukan ini, fail russian.txt diletakkan dalam folder dengan program dan konfigurasi, dan pintasan untuk Dosbox diedit. Laluan pintasan mestilah seperti: “ "C:\Program Files\DOSBox-0.74\DOSBox.exe" -userconf" Kami keluarkan “-userconf” dan konfigurasi anda akan berfungsi.

Di Ubuntu saya hanya klik Klik kanan tetikus ke atas program dan pilih untuk menjalankannya dalam dosbox, saya tidak tahu bagaimana untuk melakukannya dalam Windows, kerana ia bukan pada mana-mana mesin. baik masuk sebagai jalan terakhir laluan ke permainan dipasang, arahan mount laluan.
Anda mempunyai pilihan versi Rusia dan Inggeris. Anda tidak perlu bersusah payah dengan Russification dan buasir dengan konfigurasi, tetapi hanya menembak pada bahasa Inggeris. Hampir tidak ada perbezaan di antara mereka. Walaupun, secara peribadi, sebagai pengarang, saya lebih suka versi Rusia.
Kawalan dilakukan dengan anak panah papan kekunci, pemilihan dan penyongsangan dengan kekunci sisip atau Klik dua kali di ruang (ya, ada jamb di sini). Jika kedudukan tiba-tiba tersekat, tekan bar ruang sekali.

Ingat bahawa permainan terakhir yang disimpan dimuatkan setiap kali. Untuk menjana yang baharu, tekan F4. Saya cadangkan bermula dengan medan 4x4. Saya sedang bermain 8x8, dan saya masih takut untuk beralih kepada 16x16. Kerana saya melengkapkan 4x4 dalam masa kurang daripada seminit, 8x8 minit dalam 7-10, dan saya takut untuk membayangkan 16x16.
Ingat bahawa medan pemuatan dengan tulisan HABR dan nama panggilan saya (gambar dalam entri artikel) akan hilang selepas disimpan atau keluar secara sah. Ia disimpan dalam fail GAME.SAV. Jika anda ingin memulihkan, kemudian gantikan fail ini dengan fail daripada arkib.

Medan khusus untuk habr

Saya tidak mahu hanya melancarkan permainan, walaupun ia telah selesai dan selesai untuk hab. Saya mahukan sejenis helah. Dan saya memutuskan untuk membuat inskripsi dalam bidang 16x16 terbesar.
Format fail simpan adalah mudah: mula-mula datang saiz medan, contohnya nombor 16, pemulangan pengangkutan, kemudian 256 (untuk medan 16x16) aksara X dan Y yang membentuk corak medan, dan pada akhir bilangan Y dalam medan (sejenis checksum).
Untuk melakukan ini, saya mencipta medan sedemikian dalam OF Calc dan membuat inskripsi dalam sel dalam warna. Dan kemudian dia meletakkan huruf X dan Y dengan sewajarnya.

Persediaan ke padang.

Kemudian saya menyimpannya sebagai CSV. Dialih keluar semua pemisah. Saya mengira jumlah Y (ia sangat mudah, anda melakukan carian dalam OF Writer, menggantikan dengan dan menggantikan Y dengan sesuatu, ia memberitahu anda bilangan penggantian - itu nombor yang anda cari). Mula-mula saya letak nombor 16, gerabak pulang dan pada akhirnya bilangan pemain. Anda boleh menilai sendiri hasilnya :).

Kelemahan versi semasa program.

saya tulis versi terkini... Tidak mungkin saya akan menulis semula program dan memperbaikinya, kerana ia sudah sangat ketinggalan zaman. Tetapi sebaliknya, kini dosbox boleh diletakkan hampir pada lampu suluh, jadi ia boleh mencari kehidupan baru, dan mungkin masuk akal untuk menulis semula dan membetulkan kekurangan utama.

Jadi:
1. Kelemahan pertama dan paling tidak menyenangkan ialah kawalan yang lemah. Pertama, penyongsangan dilakukan menggunakan kekunci Sisipkan atau bar ruang berganda. Lebih-lebih lagi, jika anda menekan bar ruang beberapa kali ganjil, program "melekat" sehingga anda membuat bilangan tekanan genap. Ia menjengkelkan.
2. Kedua kelemahan yang ketara- ini memaparkan keseluruhan permainan menggunakan fungsi tulis/tulis. Dengan setiap acara, skrin dilukis semula. Apabila bermain di medan 16x16, kelembapan dan kelipan dalam pemaparan sudah ketara. Selain itu, pendekatan ini telah merumitkan logik program, dan kini membetulkannya adalah masalah besar.
Ia adalah perlu untuk melaksanakan rendering menggunakan fungsi goto(x;y); Kemudian ia akan menjadi mungkin untuk berubah watak yang berasingan tanpa melukis semula keseluruhan skrin.
3. Permainan ini hanya meminta sokongan tetikus. Sekali lagi, sokongan tetikus perlu dilaksanakan bersama dengan langkah 2, supaya anda boleh "menangkap" koordinat dengan tepat.
4. Pepijat kecil yang mengikuti dari titik 2 - apabila anda pergi ke sudut kanan bawah, satu simbol kehabisan daripada bingkai. Saya cuba membetulkannya dan menyedari bahawa lebih mudah untuk menulis semula lokasi pemaparan ini sepenuhnya daripada memikirkan cara ia berfungsi.

Apa yang anda ingin lakukan

Sudah tentu, saya mahukan aplikasi sedemikian untuk Android atau iPad. Supaya anda boleh bermain dengan jari anda. Atau, jika bukan aplikasi, maka mainan berasaskan penyemak imbas (tetapi yang berfungsi di bawah Android dan iOS). Untuk berada di sana menu cantik dan navigasi yang mudah. Terdapat jadual rekod. Terdapat kaunter masa yang boleh anda pamerkan dengan rakan anda. Terdapat juga statistik supaya anda boleh menganggarkan purata masa dan kelajuan kemahiran.
Secara umum, penerbangan besar untuk kreativiti, dengan ketiadaan sepenuhnya masa lapang untuk belajar pengaturcaraan untuk peranti ini. Sebaliknya, dosbox ada di mana-mana, dan mungkin sukar untuk mencapai lebih mudah alih universal, dan mungkin masuk akal untuk menyelesaikan program ini? Bagaimana anda berfikir?

Keputusan...

Tujuan artikel itu bukan untuk menunjukkan betapa hebatnya saya, tetapi hanya untuk mengingati bagaimana ia. Pasti hampir setiap daripada kita menulis sesuatu seperti ini pada zaman kanak-kanak. Ini bukan oh apa program yang kompleks, dan setiap pelajar sekolah boleh menulisnya, dengan ketabahan yang mencukupi. Ini lebih kepada catatan kenangan.
Saya sering menggunakan assembler dalam program. Saya suka "bercakap" dengan perkakasan secara langsung, tanpa perantara. Saya merasakan kereta itu lebih baik. Dan walaupun begitu, untuk AVR saya menulis secara eksklusif dalam assembler. Dan sekarang saya tidak faham bagaimana komputer berfungsi. Sudah tentu, saya membayangkan blok asas, dsb., tetapi saya tidak tahu gambaran terperinci, dan perkara yang lucu ialah tiada siapa yang mengetahuinya!
Dan sekarang... Bahasa tinggi dan seterusnya tahap tinggi abstraksi secara amnya memaksa kita untuk tidak memikirkan bagaimana dan di mana kod itu dilaksanakan. Ini sudah pasti bagus, kerana ia membolehkan anda menumpukan perhatian secara langsung pada tugas, tetapi sebaliknya, daya tarikan seperti lampu hangat untuk bekerja dengan perkakasan hilang...

Senarai rujukan dan pautan:
1. Penerangan tentang cara memuat turun fon untuk DOS shackmaster.narod.ru/fonts.htm
2. Buku rujukan yang sangat baik tentang pemasang, yang memberi saya pemahaman tentang cara bekerja dengannya Fungsi BIOS, dan secara umum dengan perkakasan komputer: “Pengaturcaraan dalam tahap perkakasan: buku rujukan khas.” Kulakov
3. Emulator kotak dos DOS www.dosbox.com/download.php?main=1
4. Program dan sumber narod.ru/disk/65499856001.6f143511c7c3c2ad7866f07008d8db29/INVERTOR.zip.html
5. Sumber program "Matrix" narod.ru/disk/65499898001.a6c953f20e2ee023bd00e3518e22fea8/Matrix.pas.html

P.S. Fuh, saya mungkin menghabiskan beberapa hari untuk mengingati dan mencari cara saya membuat fon ini. Terdapat kod, ia berfungsi, tetapi saya tidak ingat dan tidak faham bagaimana.
P.P.S. Jika orang berminat, saya akan menambah video bagaimana saya melengkapkan medan 4x4 dalam masa kurang daripada seminit (menggunakan peti sejuk Pilot Brothers sebagai contoh).
P.P.P.S. Saya akan menghargai sebarang komen tentang ejaan dan tanda baca yang dihantar ke mesej peribadi!

Hanya pengguna berdaftar boleh mengambil bahagian dalam tinjauan. Sila masuk.

Seorang pengaturcara baru tidak seharusnya mula menulis program permainan berbilang peringkat yang kompleks dalam Pascal. Anda harus bermula dengan permainan logik atau matematik dengan antara muka teks. Dengan memperoleh pengalaman secara beransur-ansur, anda boleh meneruskan untuk bekerja lebih banyak lagi projek besar.

Arahan

  • Mula bekerja pada program dengan tajuk dan senarai pemalam yang digunakan: penghantar semula program; menggunakan crt;
  • Beritahu pengkompil pembolehubah yang akan disertakan dalam atur cara:vara,b,c:integer;d:string;Di sini a dan b ialah sebutan, c ialah jumlah, d ialah jawapan kepada soalan sama ada pengguna mahu meneruskan bermain.
  • Tandakan permulaan program dan gelung tidak berkesudahan, dan juga memulakan penjana nombor rawak:beginrandomize;sementara 0=0 dobegin
  • Program penjanaan dua nombor rawak dalam julat dari 0 hingga 1000:a:=bulat(rawak(1000));b:=bulat(rawak(1000));
  • Tunjukkan kepada pengguna contoh yang dia mesti selesaikan, dan kemudian minta hasilnya: writeln("Berapa banyaknya"),a,("+"),b,("?");readln(c);
  • Beritahu pengguna jika dia menyelesaikan contoh dengan betul: jika a+b=c maka writeln("Betul!") else writeln("Salah!);
  • Tanya pengguna jika dia ingin bermain lebih banyak: writeln("Adakah kita akan terus bermain?"); readln(d);
  • Jika jawapannya negatif, tamatkan atur cara: jika huruf besar(d)"Y" maka hentikan(0);
  • Tamatkan gelung dahulu, dan kemudian program itu sendiri: tamat. Beri perhatian kepada tempoh selepas penyataan tamat kedua.
  • Lancarkan program dengan menekan Ctrl+F9. Contoh pertama akan dipaparkan pada skrin. Buat matematik dalam kepala anda dan masukkan jawapan. Mesin akan segera memberitahu anda sama ada ia diselesaikan dengan betul. Anda kemudiannya akan ditanya sama ada anda mahu terus bermain. Menjawab Y atau y akan menyebabkan contoh berikut dipaparkan, dan memasukkan mana-mana huruf lain akan menamatkan program.
  • Setelah mencapai operasi yang betul permainan, mula memperbaikinya. Sebagai contoh, tambahkan skrin yang jelas sebelum setiap contoh baharu ditunjukkan dengan arahan cls. Menggunakan prosedur warna teks, jadikan teks muncul dalam warna yang berbeza. Fikirkan tentang cara anda boleh memaksa atur cara menukar kerumitan contoh secara automatik: jika jawapannya betul, rumitkannya, dan jika ia salah, mudahkannya. Untuk mempelbagaikan permainan, tambahkan fungsi untuk menjana contoh bagi pelbagai operasi matematik.
  • Hari ini, permainan mudah, di mana tiada grafik atau kesan bunyi, mengalami kelahiran semula. Apabila memainkannya, pengguna menumpukan pada plot, dan bukan pada teknik artistik. Bahasa Pascal sangat sesuai untuk mencipta permainan sedemikian.

    Arahan

  • Muat turun pengkompil bahasa Pascal dari halaman berikut - http://edn.embarcadero.com/article/20803. Baca syarat penggunaan untuk ini pakej perisian, kemudian pasangkannya.
  • Cuba cipta permainan di mana pemain dikehendaki meneka nombor dalam julat dari 0 hingga 100. Mula-mula, masukkan nama program: program ugadayka;
  • Sambungkan modul CRT: menggunakan crt;
  • Nyatakan pembolehubah seperti berikut:var
  • zagadka,mnenie,popytki:integer;

  • Mulakan program dengan mengosongkan skrin dan pembolehubah, dan memberikan nilai rawak pseudo kepada nombor tersembunyi: mulakan
  • zagadka:=int(rnd*100);

  • Buat komputer bertanya kepada pengguna apa yang dia fikir nombor tersembunyi itu sehingga dia menekanya: sementara tidak mnenie=zagadka do
  • popytki:=popytki+1;

    writeln("Nombor percubaan ",popytki,".");

    write("Apa nombor yang anda fikir tersembunyi?");

    jika zagadka>mnenie maka tulisln("Tidak, nombor tersembunyi lebih besar!")

    else writeln("Tidak, nombor tersembunyi adalah kurang!")

  • Selepas nombor diteka, pengulangan automatik peristiwa di atas akan berhenti. Pelaksanaan akan bermula baris berikut program. Di dalamnya, jadikan maklumat paparan mesin yang pengguna telah meneka nombornya: writeln("Tahniah! Anda meneka nombor pada nombor percubaan ",popytki,"". Ia benar-benar sama dengan ",zagadka,".");
  • butang:=kunci baca

  • Masukkan operator untuk menamatkan program: tamat.
  • Simpan program di bawah sebarang nama yang dikehendaki menggunakan fail item menu -> Simpan sebagai. Pada masa hadapan, selepas setiap pengeditan, simpannya dengan menekan kekunci F2.
  • Untuk menjalankan program untuk pelaksanaan, tekan kekunci Kawalan dan F9 serentak.
  • Selepas program selesai berjalan, untuk melihat apa yang dipaparkan pada skrin serta-merta sebelum ini, tekan serentak Kekunci Alt dan F5. Untuk kembali ke editor, tekan kombinasi kekunci yang sama sekali lagi.
  • Pada masa kini, terdapat pendapat di kalangan pembuat permainan pemula bahawa untuk menulis permainan arked 2D yang tipikal pada PC, anda perlu memperoleh enjin atau pereka yang hebat, dan juga bagus untuk mengetahui C++ yang berprestij sedemikian, supaya anda boleh mencari artikel yang berbaloi Ia hampir mustahil di Pascal. Tetapi hari ini saya memutuskan untuk cuba memecahkan stereotaip yang tidak stabil dengan menulis pelajaran pendek tentang membangunkan platformer yang mudah. Jadi, selesakan diri anda, perjalanan "pencerahan" bermula...

    1. Apa yang diperlukan?
    Pelbagai persekitaran menggunakan sebagai bahasa pengaturcaraan Pascal, sangat ramai. Tetapi daripada semua timbunan ini, saya memutuskan untuk menggunakan PascalABC.net untuk pelajaran. kenapa? Jawapannya mudah: pertama persekitaran yang diberikan pengaturcaraan tidak menggunakan Pascal tulen, tetapi keturunannya yang moden dan lebih mudah - Objek Pascal; kedua, Pascal.Net adalah percuma, yang bermaksud anda tidak perlu risau tentang keretakan atau membelanjakan wang untuk mendapatkan lesen.

    2. Algoritma.
    Jadi, kami mempunyai keluasan 640x480, yang, menurut idea saya, akan dibahagikan kepada sel 8x8, yang mewakili pautan array s. Oleh itu, dengan menukar nilai sel, kita boleh menjadikannya "bebas" atau "diduduki" (contohnya, menggunakannya sebagai dinding).

    Hasilnya, kita akan dapat manipulasi yang tidak perlu tentukan di mana pemain boleh bergerak dan di mana tidak (lihat rajah).

    3. Pembolehubah dan modul.
    Untuk kerja penuh Untuk permainan masa depan kami, kami perlu menyambungkan hanya satu modul GraphABC, yang membolehkan kami memaparkan primitif grafik pada skrin.

    Penyenaraian 1:

    200?"200px":""+(this.scrollHeight+5)+"px");">menggunakan GraphABC;

    Var
    s: tatasusunan [,] integer;
    i,x,y,vkelajuan: integer;
    game_end: boolean;

    4. Ketukan kekunci.
    Jadi, supaya anda tidak perlu melalui tulisan anda sendiri untuk mengubah suai kod, mari buat dua prosedur berasingan yang bertanggungjawab untuk memanipulasi kedudukan pemain.

    Penyenaraian 2:

    200?"200px":""+(this.scrollHeight+5)+"px");">//Mengendalikan ketukan kekunci
    prosedur KeyPress(key: char); bermula

    Jika (key="d") dan (s[(x div 8)+1,(y div 8)]=0) maka //Jika kekunci D ditekan...
    x:=x+8; //... Terdapat juga tempat percuma, kemudian kita bergerak ke...
    //… sel ke hadapan (nilai x meningkat sebanyak 8)

    Jika (key="a") dan (s[(x div 8)-1,(y div 8)]=0) maka //lihat komen di atas
    x:=x-8;

    Jika (key="w") dan (vspeed=0) dan (s[(x div 8),(y div 8)+1]=1) maka //Jika terdapat "sel yang diduduki"...
    vspeed:=-16; //... di bawah kaki kita, kemudian kita membuat lompatan.

    Prosedur KeyDown(kunci: integer); bermula
    jika (key=vk_enter) maka game_end:=true; //Apabila menekan ENTER...
    //nilai pembolehubah game_end adalah benar
    akhir;

    5. Graviti.
    Bahagian penting platforming ialah graviti. Oleh itu, sekarang kita mesti menulis prosedur yang berasingan, yang pada masa akan datang akan membantu pemain bangkit semula dalam erti kata literal.

    Penyenaraian 3:

    200?"200px":""+(this.scrollHeight+5)+"px");">//Graviti
    prosedur Graviti(); bermula

    Jika vspeed=0 maka mulakan //Jika kelajuan lompatan adalah sifar...
    jika s[(x div 8),(y div 8)+1]=0 maka y+=8; //... kita bergerak ke bawah "sel" (kita jatuh)
    akhir;

    Jika s[(x div 8),(y div 8)+vspeed]=0 maka y+=vspeed; //Jika terdapat sel bebas di atas, maka...
    //… naik dengan vspeed.

    Jika vspeed<>0 maka //Jika kelajuan lompatan bukan sifar (dalam kes kami: kurang daripada sifar)…
    vspeed+=2; //...maka kita kurangkan sedikit demi sedikit.

    6. Melukis.
    Saya fikir ia jelas di sini tanpa perkataan yang tidak perlu, tetapi untuk pertunjukan, saya akan ambil perhatian bahawa permainan ini dibahagikan kepada bahagian "visual" dan "bukan visual". "Bukan visual" bertanggungjawab untuk semua yang berlaku dalam permainan itu sendiri, dan "visual" sebenarnya, bertanggungjawab untuk memaparkan apa yang berlaku pada skrin. Jadi, prosedur yang diberikan di bawah bertanggungjawab untuk bahagian "visual" dan tidak lebih.

    Penyenaraian 4:

    200?"200px":""+(this.scrollHeight+5)+"px");">prosedur Cabutan(); mulakan

    lukis semula;
    LockDrawing;

    //Lukis segi empat tepat putih...
    setbrushcolor(clwhite); //... saiz 640 x 480
    fillrectangle(0,0,640,480);

    Setbrushcolor(clblack);//Lukis dinding hitam...
    fillrectangle(0,192,640,224);//… mengikut koordinat…
    //… 0 – 640 dalam X; 192 – 224 dalam Y
    //(PERHATIAN! Manipulasi ini tidak menjadikan dinding itu nyata, tetapi hanya...
    //... cipta imej grafik mereka.

    Setbrushcolor(clred); //Lukis pemain mengikut koordinat...
    fillrectangle(x,y,x+8,y+8);//… x dan y

    7. Badan program.
    Jadi kami sebenarnya sampai ke program itu sendiri. Di sini kita perlu mengisi tatasusunan dengan nilai yang kita perlukan, dan juga menggunakan prosedur yang ditulis sebelum ini.

    Penyenaraian 5:

    200?"200px":""+(this.scrollHeight+5)+"px");">Mulakan //permulaan program

    //Menentukan nilai untuk pembolehubah
    game_end:=false;
    x:=0; //Kedudukan permulaan pemain dengan X
    y:=0; //Kedudukan permulaan pemain dalam Y

    //Buat tatasusunan
    s:= integer baharu;

    //Buat platform yang dilukis dalam prosedur Cabutan
    untuk i:=0 hingga 79 lakukan
    s := 1;

    Walaupun game_end=false bermula //Buat gelung...
    //... yang akan membatalkan jika game_end = false

    //Lukis skrin
    Lukis();

    //Graviti untuk pemain
    Graviti();

    OnKeyPress:=KeyPress; //Memproses klik...
    OnKeyDown:=KeyDown; //… kunci

    Tidur(30); //Tunggu kira-kira setengah saat untuk permainan...
    //... bekerja dengan kelajuan biasa

    Tamat;//akhir kitaran.

    tamat. //tamat program

    8. Kesimpulan.
    Secara keseluruhan, kami mendapat platformer mudah dengan titik dalam peranan utama. Kita boleh bergerak secara mendatar dan melompat:

    Secara umum, saya tidak mahu mencairkan pengakhiran pelajaran ini dengan pelbagai jenis ampas, kerana "air yang tidak perlu" selalunya tidak dibaca, jadi saya akan berhenti dengan meminta anda meninggalkan komen. Terima kasih kerana memberi perhatian! Saya harap saya membantu anda!

    Tekstual (Permainan Lombong Tambang) menggunakan GraphABC,ABCObjects,ABCButtons; Const N = 10; //Bidang N x N sz = 40; //Saiz sel d0 = 10; //Inden dari tepi kiri dan atas zz = 2; //Jarak antara sel NMines = 10; //Bilangan lombong Jenis OneSellField = rekod lombong: boolean; //Adakah terdapat lombong fl: boolean; //Adakah terdapat kotak semak jiran: integer; //positif - Berapa ramai jiran; neg - diperlukan untuk algoritma pengesanan - membuka sel kosong klik: boolean; //Adakah ia terbuka; Var BtNewGame: ButtonABC; Jual: pelbagai SquareABC; Medan: tatasusunan OneSellField; c: pendek; //Untuk mengira lombong dalam sel jiran Dibuka: shortint; //Berapa banyak kotak pilihan yang ditanda dengan betul Nfl: Integer; //Bilangan bendera yang disemak (untuk menang mestilah sama dengan bilangan minit) Prosedur CreateField; bermula untuk var y:= 1 hingga N lakukan untuk var x:= 1 hingga N mulakan Jual := SquareABC(d0+(x-1)*(sz+zz),d0+(y-1)*(sz+zz)*(sz+zz) ), sz, clLightSeaGreen); Sell.BorderColor:= clGreen; Sell.BorderWidth:= 2; Jual.Skala Teks:= 0.7; akhir; akhir; Prosedur NewGame; var Rx, Ry: integer; mulakan untuk var j:=1 hingga N lakukan untuk var i:=1 hingga N mulakan Field.mine:= false; Field.click:= palsu; Field.fl:= palsu; Medan.jiran:= 0; Sell.BorderColor:= clGreen; Jual.Teks: = ""; Jual.Warna:= clLightSeaGreen; akhir; //Letakkan lombong untuk var i:= 1 hingga NMines bermula Rx:= Random(N)+1; Ry:= Rawak(N)+1; //Jika terdapat lombong dalam sel yang dipilih, kemudian hasilkan koordinat lombong baharu manakala Field.mine bermula Rx:= Random(N)+1; Ry:= Rawak(N)+1; akhir; Field.mine:= benar; akhir; ( //Petunjuk sementara di mana lombong adalah untuk var j:=1 hingga N lakukan untuk var i:=1 hingga N bermula jika Field.mine kemudian Sell.BorderColor:= clYellow; end; ) var ii, jj:shortint; //Kira lombong di sekeliling untuk var j:=1 hingga N lakukan untuk var i:=1 hingga N mulakan c:= 0; untuk var dx:= -1 hingga 1 mulakan untuk var dy:= -1 hingga 1 lakukan jika tidak ((dx = 0) dan (dy = 0)) kemudian mulakan ii:= i + dx; jj:= j + dy; jika ((ii > 0) dan (ii<= N) and (jj >0) dan (jj<= N)) then begin c:= c + Integer(Field.mine); end; end; end; Field.neighbours:= c; end; Opened:= 0; //Кол. открытых мин Nfl:= 0; //Кол. установленных флажков end; Procedure OpenZero(fx, fy: integer); var fl:boolean; step, ii, jj: integer; begin Field.neighbours:= -1; step:= -1; repeat fl:= true; for var x:= 1 to N do begin for var y:= 1 to N do begin if Field.neighbours < 0 then begin {*** Проверка соседних клеток ***} for var dx:= -1 to 1 do begin for var dy:= -1 to 1 do if not ((dx = 0) and (dy = 0)) then begin //Центральную клетку не считаем ii:= x + dx; jj:= y + dy; //Если не выходит за границы поля if ((ii >0) dan (ii<= N) and (jj >0) dan (jj<= N)) then begin if Field.neighbours = 0 then begin Sleep(30); //Для анимации открывания клеток Sell.Color:= clLightYellow; Field.click:= true; Field.neighbours:= step; fl:= false; //Была открыта клетка - ищем др. end; if Field.neighbours >0 kemudian mula Sell.Color:= clLightGreen; Sell.Text:= IntToStr(Field.neighbours); Field.click:= benar; akhir; akhir; akhir; akhir; (********************) tamat; akhir; akhir; langkah:= langkah - 1; sehingga fl; akhir; Prosedur MouseDown(x, y, mb: integer); mulakan jika ObjectUnderPoint(x,y)=nil kemudian // Jika kita mengklik pada sesuatu selain daripada objek, maka jangan bertindak balas kepada keluar tetikus; var fx:= (x-d0) div (sz+zz) + 1; // Kira koordinat pada papan untuk sel yang kita klik var fy:= (y-d0) div (sz+zz) + 1; Field.click:= benar; jika mb = 1 maka mulakan //Jika lombong diklik jika Field.mine kemudian mula Jual.Teks:= "M"; Jual.Warna:= clRed; //writeln("Hilang!"); end else begin //Jika anda mengklik pada sel kosong jika (Field.neighbors = 0) kemudian mula Sell.Color:= clLightYellow; jika Field.fl kemudian Sell.Text: = ""; //Panggil prosedur untuk mengembangkan medan kosong OpenZero(fx, fy); tamatkan lain jika Field.neghbors > 0 kemudian mula Jual.Color:= clLightGreen; Sell.Text:= IntToStr(Field.neighbours); akhir; akhir; akhir; //Semak dan nyahtanda kotak jika mb = 2 kemudian mulakan jika Field.fl kemudian mula //Nyahtanda kotak Field.fl:= Palsu; Jual.Teks: = ""; Jual.Warna:= clLightSeaGreen; Nfl -= 1; jika (Dibuka = ​​NMines) dan (Nfl = NMines) kemudian writeln("Kemenangan!"); //Window.Title:= IntToStr(Nfl)+" M "+IntToStr(Opened); end else begin //Tetapkan kotak semak Field.fl:= true; Jual.Teks: = "F"; Jual.Warna:= clBlue; Nfl += 1; //Window.Title:= IntToStr(Nfl)+" M "+IntToStr(Opened); akhir; jika Field.mine kemudian mulakan jika Field.fl kemudian Dibuka += 1 lagi Dibuka -= 1; //Window.Title:= IntToStr(Nfl)+" M "+IntToStr(Opened); jika (Dibuka = ​​NMines) dan (Nfl = NMines) kemudian writeln("Kemenangan!"); akhir; akhir; akhir; Prosedur MouseMove(x, y, mb: integer); mulakan jika ObjectUnderPoint(x,y)=nil kemudian // Jika kita mengklik pada sesuatu selain daripada objek, maka jangan bertindak balas kepada keluar tetikus; var fx:= (x-d0) div (sz+zz) + 1; // Kira koordinat pada papan untuk sel yang kita klik var fy:= (y-d0) div (sz+zz) + 1; (Semua sel berwarna hijau) untuk var j:= 1 hingga N lakukan untuk var i:= 1 hingga N bermula jika tidak Field.klik kemudian Jual.Warna:= clLightSeaGreen; akhir; (Semua sel berwarna hijau, dan yang di atasnya tetikus berwarna hijau terang) jika bukan Field.click kemudian Sell.Color:= clLightGreen; akhir; MULAKAN SetSmoothingOff; //Lumpuhkan Antialiasing Window.Title:= "Mineweeper"; Window.IsFixedSize:= Benar; CreateField;//Create a field btNewGame:= ButtonABC.Create(535, d0, 100, " Satu permainan baru", clSkyBlue); btNewGame.OnClick:= NewGame; NewGame; OnMouseDown:= MouseDown; OnMouseMove:= MouseMove; END.