C#實現(xiàn)坦克大戰(zhàn)游戲
本文實例為大家分享了C#實現(xiàn)坦克大戰(zhàn)游戲的具體代碼,供大家參考,具體內(nèi)容如下
前言
該程序主要對原始的坦克大戰(zhàn)游戲進行了簡單的還原。目前程序可以做到自動生成敵方坦克且敵方能夠隨機發(fā)射子彈,我方坦克也能做到邊發(fā)射子彈邊移動。唯一的不足之處就是還沒有完整通關(guān)的設(shè)置以及障礙的設(shè)置。
界面效果圖

圖1
部分代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace MyTankWar
{
public partial class FormMain : Form
{
//game state
private GameState _gameState = GameState.Close;
//my tank
private Tank _myTank = new Tank(Side.Me);
//list set of enemy's tank
private List<Tank> _listEnemyTank = new List<Tank>();
//list set of bullets
private List<Bullet> _listBullet = new List<Bullet>();
// import dynamic link library
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
public static extern short GetAsyncKeyState(int keyCode);
public FormMain()
{
InitializeComponent();
}
//'begin game' button function
private void BeginToolStripMenuItem_Click(object sender, EventArgs e)
{
_gameState = GameState.Open;
//enable timer
timer1.Enabled = true;
timer2.Enabled = true;
timer3.Enabled = true;
timer4.Enabled = true;
}
//'end game' button function
private void EndToolStripMenuItem_Click(object sender, EventArgs e)
{
_gameState = GameState.Close;
//unenable timer
timer1.Enabled = false;
timer2.Enabled = false;
timer3.Enabled = false;
timer4.Enabled = false;
}
//'pictureBox1'-> Paint function
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
//draw my tanks
_myTank.DrawMe(e.Graphics);
//draw enemy's tanks
for (int i = 0; i <= _listEnemyTank.Count - 1; i++)
_listEnemyTank[i].DrawMe(e.Graphics);
//draw each bullet
foreach (Bullet myBullet in _listBullet)
{
myBullet.DrawMe(e.Graphics);
}
}
//'FormMain'-> KeyDown function
private void FormMain_KeyDown(object sender, KeyEventArgs e)
{
//if game started
if (_gameState == GameState.Open)
{
//if press 'Space' key, my tank start shooting
if (e.KeyCode == Keys.Space)
{
Bullet myBullet = _myTank.Fire();
_listBullet.Add(myBullet);
}
//refresh interface
pictureBox1.Invalidate();
}
}
//timer1' Tick function, used for generating a enemy's tank
private void timer1_Tick(object sender, EventArgs e)
{
//if game started
if (_gameState == GameState.Open)
{
//generate a enemy's tank
Tank enemyTank = new Tank(Side.Enemy);
//add enenmy's tank
_listEnemyTank.Add(enemyTank);
//refresh pictureBox1
pictureBox1.Invalidate();
}
}
//timer2' Tick function, used for controlling the direction of a enemy's tank
private void timer2_Tick(object sender, EventArgs e)
{
// if game started
if (_gameState == GameState.Open)
{
//define a random object
Random myRand = new Random(DateTime.Now.Second);
for (int i = 0; i <= _listEnemyTank.Count - 1; i++)
{
//generate a random number
int newDirection = myRand.Next(1, 10);
//move the tank
if (newDirection <= 4)
_listEnemyTank[i].Move((Direction)newDirection);
else
_listEnemyTank[i].Move(_listEnemyTank[i]._Direction);
}
//make bullet move
foreach (Bullet Bullet in _listBullet)
Bullet.Move();
//refresh pictureBox1
pictureBox1.Invalidate();
}
}
//timer3' Tick function, used for shooting of a enemy's tank
private void timer3_Tick(object sender, EventArgs e)
{
// if game started
if (_gameState == GameState.Open)
{
//define a random class
Random myRand = new Random(DateTime.Now.Second);
//make bullet move
foreach (Tank enemyTank in _listEnemyTank)
{
//generate a random number whose value is between 1 to 4
int fireFlag = myRand.Next(1, 10);
//if enemy's tank can shoot
if (fireFlag <= 4)
{
Bullet enemyBullet = enemyTank.Fire();
_listBullet.Add(enemyBullet);
}
}
}
}
//timer4' Tick function, used for spying the key pressing state to make my tank move while shooting
private void timer4_Tick(object sender, EventArgs e)
{
if (_gameState == GameState.Open)
{
bool keyDown = (((ushort)GetAsyncKeyState((int)Keys.Down)) & 0xffff) != 0;
if (keyDown == true)
_myTank.Move(Direction.Down);
bool keyUp = (((ushort)GetAsyncKeyState((int)Keys.Up)) & 0xffff) != 0;
if (keyUp == true)
_myTank.Move(Direction.Up);
bool keyLeft = (((ushort)GetAsyncKeyState((int)Keys.Left)) & 0xffff) != 0;
if (keyLeft == true)
_myTank.Move(Direction.Left);
bool keyRight = (((ushort)GetAsyncKeyState((int)Keys.Right)) & 0xffff) != 0;
if (keyRight == true)
_myTank.Move(Direction.Right);
//refresh pictureBox1
pictureBox1.Invalidate();
}
}
}
}
下載:完整文件
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#?WinForm?RichTextBox文本動態(tài)滾動顯示文本方式
這篇文章主要介紹了C#?WinForm?RichTextBox文本動態(tài)滾動顯示文本方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
C#讀取word中表格數(shù)據(jù)的方法實現(xiàn)
本文主要介紹了C#讀取word中表格數(shù)據(jù)的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
c#中使用BackgroundWorker的實現(xiàn)
本文主要介紹了c#中使用BackgroundWorker的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
C#實現(xiàn)Access通用訪問類OleDbHelper完整實例
這篇文章主要介紹了C#實現(xiàn)Access通用訪問類OleDbHelper,結(jié)合完整實例形式分析了C#針對access數(shù)據(jù)庫的連接、查詢、遍歷、分頁顯示等相關(guān)操作技巧,需要的朋友可以參考下2017-02-02

