游戲與演算法
① 關燈游戲的演算法...
根據示例可以看出,點了一個開關,其本身及四周開關取反,游戲代碼如下,至於如何全部清空,慢慢點吧
<pstyle="padding:0;margin:0"><inputtype="button"id="btn_0_0"value="0"onclick="change(0,0)"/><inputtype="button"id="btn_0_1"value="1"onclick="change(0,1)"/><inputtype="button"id="btn_0_2"value="1"onclick="change(0,2)"/><inputtype="button"id="btn_0_3"value="0"onclick="change(0,3)"/><inputtype="button"id="btn_0_4"value="1"onclick="change(0,4)"/><inputtype="button"id="btn_0_5"value="0"onclick="change(0,5)"/></p>
<pstyle="padding:0;margin:0"><inputtype="button"id="btn_1_0"value="1"onclick="change(1,0)"/><inputtype="button"id="btn_1_1"value="0"onclick="change(1,1)"/><inputtype="button"id="btn_1_2"value="0"onclick="change(1,2)"/><inputtype="button"id="btn_1_3"value="1"onclick="change(1,3)"/><inputtype="button"id="btn_1_4"value="1"onclick="change(1,4)"/><inputtype="button"id="btn_1_5"value="1"onclick="change(1,5)"/></p>
<pstyle="padding:0;margin:0"><inputtype="button"id="btn_2_0"value="0"onclick="change(2,0)"/><inputtype="button"id="btn_2_1"value="0"onclick="change(2,1)"/><inputtype="button"id="btn_2_2"value="1"onclick="change(2,2)"/><inputtype="button"id="btn_2_3"value="0"onclick="change(2,3)"/><inputtype="button"id="btn_2_4"value="0"onclick="change(2,4)"/><inputtype="button"id="btn_2_5"value="1"onclick="change(2,5)"/></p>
<pstyle="padding:0;margin:0"><inputtype="button"id="btn_3_0"value="1"onclick="change(3,0)"/><inputtype="button"id="btn_3_1"value="0"onclick="change(3,1)"/><inputtype="button"id="btn_3_2"value="0"onclick="change(3,2)"/><inputtype="button"id="btn_3_3"value="1"onclick="change(3,3)"/><inputtype="button"id="btn_3_4"value="0"onclick="change(3,4)"/><inputtype="button"id="btn_3_5"value="1"onclick="change(3,5)"/></p>
<pstyle="padding:0;margin:0"><inputtype="button"id="btn_4_0"value="0"onclick="change(4,0)"/><inputtype="button"id="btn_4_1"value="1"onclick="change(4,1)"/><inputtype="button"id="btn_4_2"value="1"onclick="change(4,2)"/><inputtype="button"id="btn_4_3"value="1"onclick="change(4,3)"/><inputtype="button"id="btn_4_4"value="0"onclick="change(4,4)"/><inputtype="button"id="btn_4_5"value="0"onclick="change(4,5)"/></p>
<scripttype="text/javascript"src="~/Js/jquery-1.8.2.min.js"></script>
<scripttype="text/javascript">
functionchange(i,j)
{
varthisval=$("#btn_"+i+"_"+j).val()=="1"?"0":"1";
$("#btn_"+i+"_"+j).val(thisval);
if($("#btn_"+(i-1)+"_"+j)){
varupval=$("#btn_"+(i-1)+"_"+j).val()=="1"?"0":"1";
$("#line"+(i-1)).find("input").eq(j).val(upval)
}
if($("#btn_"+(i+1)+"_"+j)){
vardownval=$("#btn_"+(i+1)+"_"+j).val()=="1"?"0":"1";
$("#line"+(i+1)).find("input").eq(j).val(downval)
}
if($("#btn_"+i+"_"+(j-1))){
varleftval=$("#btn_"+i+"_"+(j-1)).val()=="1"?"0":"1";
$("#btn_"+i+"_"+(j-1)).val(leftval)
}
if($("#btn_"+i+"_"+(j+1))){
varrightval=$("#btn_"+i+"_"+(j+1)).val()=="1"?"0":"1";
$("#btn_"+i+"_"+(j+1)).val(rightval)
}
}
</script>
② 24點游戲的演算法和技巧
最好的做法就是窮舉,我自己都編過,當然了,心算最好的做法就是找3*8和4*6來湊,這是最有效率的演算法了。有時候不是所有的牌組按加減乘除都能湊夠24點,如13.13.11.8。這個時候就需要用到特殊的演算法,如取余,開方,階乘,平方等。
③ 為什麼製作游戲 需要演算法
你想呀,
人物不就是圖片,
如何讓這些圖片能形成一個有規律的動作,
難道不要演算法,
俄羅斯方塊你試試就明白了,
每一個方塊下落,
它都要干什麼,
這些都是演算法來實現的;
演算法加上圖片就是游戲了;
演算法控制的是環境和形為;
圖片永遠是死的;
④ 游戲傷害演算法
你把滑鼠移動到護甲上 上面會顯示減免多少傷害的... 自己創個全人機自定義游戲 慢慢去研究
⑤ 一個游戲演算法的問題
小魚吃大魚,java應該行吧。
⑥ C++關於製作游戲,演算法對游戲真的有用嘛!~~o(>_<)o ~~
13歲肯好好學的話前途無量啊。
你學那些東西 是學語言最基本的,
做游戲至少少需要懂的東西如下
1 精通一門語言
2 常用數據結構和演算法 (數組 鏈表 樹 圖 隊列 堆棧 對這些數據結構的 增刪改查排序)
1 和2 是任何開發里都會要用到的東西
3 圖形圖像的常用演算法 (包括這些演算法的基礎 線性代數 和 解析幾何 特別是3D游戲,不會這個就和沒手沒腳一樣)
4 網路通信(如果想做網路游戲的話)
5 一套可用作游戲開發的開發庫(比如 OPENGL DIRECTX 或者一些游戲引擎 HGE IRRLICHT 之類的)
除了基礎必須要自己學意外,其他的工具庫網上有很多
編程這東西不是教出來的,都是自學出來的。
比如遞歸, 對樹的數據結構的操作就全是遞歸的,當然為了提高效率還需要把遞歸改成非遞歸的
你現在的情況,就老老實實先把語言學會。C++ 沒你想得那麼簡單。
另外沒有做游戲的簡易教程,如果你只是想做著玩,體驗一下的,可以用游戲工廠之類的軟體或者魔獸爭霸的編輯器。
如果你覺得自己C++語言已經學得差不多了,下面附一段求常量階乘的代碼,用的是遞歸,
接觸到這樣的代碼後,我開始使用模板元編程的,這段程序最大的好處是運算時間為0
template<int N>
struct fact
{
enum
{
value = N * fact<N-1>
};
};
template<>
struct fact<1>
{
enum
{
value = 1
};
};
template<>
struct fact<0>
{
enum
{
value = 0
};
};
std::cout << (fact<5>::value) << std::endl //求5的階乘
所以不管你做什麼基礎是很重要的,
建議的學習流程 C++ ->數據結構-> STL -> WINDOWS 或者 LINUX 的基礎圖形編程->boost::asio(網路) boost::gil(圖像)
->directX 或者 OPENGL, 以及線性代數和解析幾何 ->游戲引擎使用
當然以你的情況來說,最好先把大學計算機系的課程全都學一遍
包括
數據結構 (所有開發相關)
高等數學 (所有開發相關)
離散數學(所有開發相關)
線性代數(游戲開發相關)
解析幾何(游戲開發相關)
操作系統原理 (至少要了解)
資料庫概論(網路游戲相關)
編譯原理 (游戲開發相關,本來是編譯器如何開發的,但是很多演算法游戲開發里用的到)
計算機組成原理(至少要了解)
計算機體系結構(至少要了解)
計算機網路通信(網路游戲開發相關)
計算機圖形學(游戲開發相關)
多媒體處理(游戲開發相關)
軟體工程(所有開發相關,至少要先做到了解)
最後建議你測下IQ 如果低於120的話建議轉行吧
⑦ 游戲攻擊演算法
普攻傷害為攻擊力(基礎傷害加裝備加成)。ad技能傷害為基礎傷害加攻擊力ad加成(比如一個技能ad加成0.5,就是你攻擊力乘0.5)。ap傷害為基礎傷害加法強加成,具體同攻擊力加成一樣。還有的技能加成特殊,比如流浪的技能受魔法值加成。狗頭的q殺死目標積累傷害。但計算是一樣的有的技能沒有加成,比如蓋倫的大招。收到的物理傷害會受護甲見面,比如100的護甲則你受到的傷害會減免100/(100+護甲值),即減傷50%。魔法傷害受魔抗減免,計算同物理傷害。真實傷害無視抗性。ps,點燃為真實傷害,傷害隨等級提升。日炎斗篷造成魔法傷害 ,也隨等級等級提升。
⑧ 討論小游戲的演算法(俄羅斯方塊)!
import java.awt.*;
import java.awt.event.*;
//俄羅斯方塊類
public class ERS_Block extends Frame{
public static boolean isPlay=false;
public static int level=1,score=0;
public static TextField scoreField,levelField;
public static MyTimer timer;
GameCanvas gameScr;
public static void main(String[] argus){
ERS_Block ers = new ERS_Block("俄羅斯方塊游戲 V1.0 Author:Vincent");
WindowListener win_listener = new WinListener();
ers.addWindowListener(win_listener);
}
//俄羅斯方塊類的構造方法
ERS_Block(String title){
super(title);
setSize(600,480);
setLayout(new GridLayout(1,2));
gameScr = new GameCanvas();
gameScr.addKeyListener(gameScr);
timer = new MyTimer(gameScr);
timer.setDaemon(true);
timer.start();
timer.suspend();
add(gameScr);
Panel rightScr = new Panel();
rightScr.setLayout(new GridLayout(2,1,0,30));
rightScr.setSize(120,500);
add(rightScr);
//右邊信息窗體的布局
MyPanel infoScr = new MyPanel();
infoScr.setLayout(new GridLayout(4,1,0,5));
infoScr.setSize(120,300);
rightScr.add(infoScr);
//定義標簽和初始值
Label scorep = new Label("分數:",Label.LEFT);
Label levelp = new Label("級數:",Label.LEFT);
scoreField = new TextField(8);
levelField = new TextField(8);
scoreField.setEditable(false);
levelField.setEditable(false);
infoScr.add(scorep);
infoScr.add(scoreField);
infoScr.add(levelp);
infoScr.add(levelField);
scorep.setSize(new Dimension(20,60));
scoreField.setSize(new Dimension(20,60));
levelp.setSize(new Dimension(20,60));
levelField.setSize(new Dimension(20,60));
scoreField.setText("0");
levelField.setText("1");
//右邊控制按鈕窗體的布局
MyPanel controlScr = new MyPanel();
controlScr.setLayout(new GridLayout(5,1,0,5));
rightScr.add(controlScr);
//定義按鈕play
Button play_b = new Button("開始游戲");
play_b.setSize(new Dimension(50,200));
play_b.addActionListener(new Command(Command.button_play,gameScr));
//定義按鈕Level UP
Button level_up_b = new Button("提高級數");
level_up_b.setSize(new Dimension(50,200));
level_up_b.addActionListener(new Command(Command.button_levelup,gameScr));
//定義按鈕Level Down
Button level_down_b =new Button("降低級數");
level_down_b.setSize(new Dimension(50,200));
level_down_b.addActionListener(new Command(Command.button_leveldown,gameScr));
//定義按鈕Level Pause
Button pause_b =new Button("游戲暫停");
pause_b.setSize(new Dimension(50,200));
pause_b.addActionListener(new Command(Command.button_pause,gameScr));
//定義按鈕Quit
Button quit_b = new Button("退出遊戲");
quit_b.setSize(new Dimension(50,200));
quit_b.addActionListener(new Command(Command.button_quit,gameScr));
controlScr.add(play_b);
controlScr.add(level_up_b);
controlScr.add(level_down_b);
controlScr.add(pause_b);
controlScr.add(quit_b);
setVisible(true);
gameScr.requestFocus();
}
}
//重寫MyPanel類,使Panel的四周留空間
class MyPanel extends Panel{
public Insets getInsets(){
return new Insets(30,50,30,50);
}
}
//游戲畫布類
class GameCanvas extends Canvas implements KeyListener{
final int unitSize = 30; //小方塊邊長
int rowNum; //正方格的行數
int columnNum; //正方格的列數
int maxAllowRowNum; //允許有多少行未削
int blockInitRow; //新出現塊的起始行坐標
int blockInitCol; //新出現塊的起始列坐標
int [][] scrArr; //屏幕數組
Block b; //對方快的引用
//畫布類的構造方法
GameCanvas(){
rowNum = 15;
columnNum = 10;
maxAllowRowNum = rowNum - 2;
b = new Block(this);
blockInitRow = rowNum - 1;
blockInitCol = columnNum/2 - 2;
scrArr = new int [32][32];
}
//初始化屏幕,並將屏幕數組清零的方法
void initScr(){
for(int i=0;i<rowNum;i++)
for (int j=0; j<columnNum;j++)
{ scrArr[i][j]=0; }
b.reset();
repaint();
}
//重新刷新畫布方法
public void paint(Graphics g){
for(int i = 0; i < rowNum; i++)
for(int j = 0; j < columnNum; j++)
drawUnit(i,j,scrArr[i][j]);
}
//畫方塊的方法
public void drawUnit(int row,int col,int type){
scrArr[row][col] = type;
Graphics g = getGraphics();
switch(type){ //表示畫方快的方法
case 0: g.setColor(Color.black);break; //以背景為顏色畫
case 1: g.setColor(Color.blue);break; //畫正在下落的方塊
case 2: g.setColor(Color.magenta);break; //畫已經落下的方法
}
g.fill3DRect(col*unitSize,getSize().height-(row+1)*unitSize,unitSize,unitSize,true);
g.dispose();
}
public Block getBlock(){
return b; //返回block實例的引用
}
//返回屏幕數組中(row,col)位置的屬性值
public int getScrArrXY(int row,int col){
if (row < 0 || row >= rowNum || col < 0 || col >= columnNum)
return(-1);
else
return(scrArr[row][col]);
}
//返回新塊的初始行坐標方法
public int getInitRow(){
return(blockInitRow); //返回新塊的初始行坐標
}
//返回新塊的初始列坐標方法
public int getInitCol(){
return(blockInitCol); //返回新塊的初始列坐標
}
//滿行刪除方法
void deleteFullLine(){
int full_line_num = 0;
int k = 0;
for (int i=0;i<rowNum;i++){
boolean isfull = true;
L1:for(int j=0;j<columnNum;j++)
if(scrArr[i][j] == 0){
k++;
isfull = false;
break L1;
}
if(isfull) full_line_num++;
if(k!=0 && k-1!=i && !isfull)
for(int j = 0; j < columnNum; j++){
if (scrArr[i][j] == 0)
drawUnit(k-1,j,0);
else
drawUnit(k-1,j,2);
scrArr[k-1][j] = scrArr[i][j];
}
}
for(int i = k-1 ;i < rowNum; i++){
for(int j = 0; j < columnNum; j++){
drawUnit(i,j,0);
scrArr[i][j]=0;
}
}
ERS_Block.score += full_line_num;
ERS_Block.scoreField.setText(""+ERS_Block.score);
}
//判斷游戲是否結束方法
boolean isGameEnd(){
for (int col = 0 ; col <columnNum; col ++){
if(scrArr[maxAllowRowNum][col] !=0)
return true;
}
return false;
}
public void keyTyped(KeyEvent e){
}
public void keyReleased(KeyEvent e){
}
//處理鍵盤輸入的方法
public void keyPressed(KeyEvent e){
if(!ERS_Block.isPlay)
return;
switch(e.getKeyCode()){
case KeyEvent.VK_DOWN:b.fallDown();break;
case KeyEvent.VK_LEFT:b.leftMove();break;
case KeyEvent.VK_RIGHT:b.rightMove();break;
case KeyEvent.VK_SPACE:b.leftTurn();break;
}
}
}
//處理控制類
class Command implements ActionListener{
static final int button_play = 1; //給按鈕分配編號
static final int button_levelup = 2;
static final int button_leveldown = 3;
static final int button_quit = 4;
static final int button_pause = 5;
static boolean pause_resume = true;
int curButton; //當前按鈕
GameCanvas scr;
//控制按鈕類的構造方法
Command(int button,GameCanvas scr){
curButton = button;
this.scr=scr;
}
//按鈕執行方法
public void actionPerformed (ActionEvent e){
switch(curButton){
case button_play:if(!ERS_Block.isPlay){
scr.initScr();
ERS_Block.isPlay = true;
ERS_Block.score = 0;
ERS_Block.scoreField.setText("0");
ERS_Block.timer.resume();
}
scr.requestFocus();
break;
case button_levelup:if(ERS_Block.level < 10){
ERS_Block.level++;
ERS_Block.levelField.setText(""+ERS_Block.level);
ERS_Block.score = 0;
ERS_Block.scoreField.setText(""+ERS_Block.score);
}
scr.requestFocus();
break;
case button_leveldown:if(ERS_Block.level > 1){
ERS_Block.level--;
ERS_Block.levelField.setText(""+ERS_Block.level);
ERS_Block.score = 0;
ERS_Block.scoreField.setText(""+ERS_Block.score);
}
scr.requestFocus();
break;
case button_pause:if(pause_resume){
ERS_Block.timer.suspend();
pause_resume = false;
}else{
ERS_Block.timer.resume();
pause_resume = true;
}
scr.requestFocus();
break;
case button_quit:System.exit(0);
}
}
}
//方塊類
class Block {
static int[][] pattern = {
{0x0f00,0x4444,0x0f00,0x4444},//用十六進至表示,本行表示長條四種狀態
{0x04e0,0x0464,0x00e4,0x04c4},
{0x4620,0x6c00,0x4620,0x6c00},
{0x2640,0xc600,0x2640,0xc600},
{0x6220,0x1700,0x2230,0x0740},
{0x6440,0x0e20,0x44c0,0x8e00},
{0x0660,0x0660,0x0660,0x0660}
};
int blockType; //塊的模式號(0-6)
int turnState; //塊的翻轉狀態(0-3)
int blockState; //快的下落狀態
int row,col; //塊在畫布上的坐標
GameCanvas scr;
//塊類的構造方法
Block(GameCanvas scr){
this.scr = scr;
blockType = (int)(Math.random() * 1000)%7;
turnState = (int)(Math.random() * 1000)%4;
blockState = 1;
row = scr.getInitRow();
col = scr.getInitCol();
}
//重新初始化塊,並顯示新塊
public void reset(){
blockType = (int)(Math.random() * 1000)%7;
turnState = (int)(Math.random() * 1000)%4;
blockState = 1;
row = scr.getInitRow();
col = scr.getInitCol();
dispBlock(1);
}
//實現「塊」翻轉的方法
public void leftTurn(){
if(assertValid(blockType,(turnState + 1)%4,row,col)){
dispBlock(0);
turnState = (turnState + 1)%4;
dispBlock(1);
}
}
//實現「塊」的左移的方法
public void leftMove(){
if(assertValid(blockType,turnState,row,col-1)){
dispBlock(0);
col--;
dispBlock(1);
}
}
//實現塊的右移
public void rightMove(){
if(assertValid(blockType,turnState,row,col+1)){
dispBlock(0);
col++;
dispBlock(1);
}
}
//實現塊落下的操作的方法
public boolean fallDown(){
if(blockState == 2)
return(false);
if(assertValid(blockType,turnState,row-1,col)){
dispBlock(0);
row--;
dispBlock(1);
return(true);
}else{
blockState = 2;
dispBlock(2);
return(false);
}
}
//判斷是否正確的方法
boolean assertValid(int t,int s,int row,int col){
int k = 0x8000;
for(int i = 0; i < 4; i++){
for(int j = 0; j < 4; j++){
if((int)(pattern[t][s]&k) != 0){
int temp = scr.getScrArrXY(row-i,col+j);
if (temp<0||temp==2)
return false;
}
k = k >> 1;
}
}
return true;
}
//同步顯示的方法
public synchronized void dispBlock(int s){
int k = 0x8000;
for (int i = 0; i < 4; i++){
for(int j = 0; j < 4; j++){
if(((int)pattern[blockType][turnState]&k) != 0){
scr.drawUnit(row-i,col+j,s);
}
k=k>>1;
}
}
}
}
//定時線程
class MyTimer extends Thread{
GameCanvas scr;
public MyTimer(GameCanvas scr){
this.scr = scr;
}
public void run(){
while(true){
try{
sleep((10-ERS_Block.level + 1)*100);
}
catch(InterruptedException e){}
if(!scr.getBlock().fallDown()){
scr.deleteFullLine();
if(scr.isGameEnd()){
ERS_Block.isPlay = false;
suspend();
}else
scr.getBlock().reset();
}
}
}
}
class WinListener extends WindowAdapter{
public void windowClosing (WindowEvent l){
System.exit(0);
}
}
⑨ 想知道一個關於游戲製作編程演算法
摘要 您好,比如,24點游戲的演算法,其中最主要的思想就是窮舉法。所謂窮舉法就是列出4個數字加減乘除的各種可能性。我們可以將表達式分成以下幾種:首先我們將4個數設為a,b,c,d,,將其排序列出四個數的所有排序序列組合(共有A44=24種組合)。再進行符號的排列表達式,其中算術符號有+,—,*,/,(,)。其中有效的表達式有a*(b-c/b),a*b-c*d,等等。
⑩ 游戲經驗演算法
每個游戲都不一樣的