Trung Tâm Đào Tạo Mạng Máy Tính Nhất Nghệ   Trung Tâm Đào Tạo Mạng Máy Tính Nhất Nghệ
Trang Chủ Giới Thiệu Chương Trình Học Tài Liệu Lịch Khai Giảng Học Phí Việc Làm Lộ trình học

Go Back   Trung Tâm Đào Tạo Mạng Máy Tính Nhất Nghệ > WEB - ĐỒ HỌA - LẬP TRÌNH > LẬP TRÌNH iOS
Đăng Ký Thành Viên Thành Viên Lịch Ðánh Dấu Ðã Ðọc


LẬP TRÌNH iOS THIẾT KẾ ỨNG DỤNG, GAME TRÊN IPHONE, IPAD, IPOD

Vui lòng gõ từ khóa liên quan đến vấn đề bạn quan tâm vào khung dưới , trước khi đặt câu hỏi mới.


Trả lời
 
Ðiều Chỉnh
  #1  
Old 14-09-2012, 11:47
duylee duylee vẫn chưa có mặt trong diễn đàn
Thành Viên Mới
 
Tham gia ngày: Aug 2012
Tuổi: 30
Bài gởi: 11
Thanks: 1
Thanked 3 Times in 3 Posts
Game Tic tac toe (thuật toán tự chế:D) - Lê Khắc Duy

Mọi người cùng góp ý cho mình bài này nhá. Bài này như thầy nói chủ yếu là thuật toán, thuật toán mình đưa ra cũng dễ hiểu mình sẽ nói sau.

Thuật toán mình đưa ra có thể làm được các vấn đề sau:
- Chặn người chơi.
- Tự ra cờ.
- Nhìn thấy đường thắng.

Còn đây là vài hình giới thiệu:



Tiếp theo là ánh xạ nhá:


Cái ánh xạ lên lbResult là Outlet màu xanh nhá, mình nhầm =_=

Và code như sau:

PHP Code:
//
//  NhatNgheViewController.m
//  Tictactoe
//
//  Created by Duy Lee on 9/10/12.
//  Copyright (c) 2012 Duy Lee. All rights reserved.
//

#import "NhatNgheViewController.h"

@interface NhatNgheViewController ()

@
end

@implementation NhatNgheViewController

bool flag 
NO;

- (
void)viewDidLoad
{
    [
super viewDidLoad];
    
// Do any additional setup after loading the view, typically from a nib.
    // Khoi tao ma tran chua cac vi tri de chien thang
    
arrMatrix = [[NSArray allocinitWithObjects:
                 [
NSArray arrayWithObjects:@"1",@"2",@"3"nil],
                 [
NSArray arrayWithObjects:@"4",@"5",@"6"nil],
                 [
NSArray arrayWithObjects:@"7",@"8",@"9"nil],
                 [
NSArray arrayWithObjects:@"1",@"4",@"7"nil],
                 [
NSArray arrayWithObjects:@"2",@"5",@"8"nil],
                 [
NSArray arrayWithObjects:@"3",@"6",@"9"nil],
                 [
NSArray arrayWithObjects:@"1",@"5",@"9"nil],
                 [
NSArray arrayWithObjects:@"7",@"5",@"3"nil], nil];
    
    
arrMutableMatrix = [[NSMutableArray allocinitWithObjects:
                        [
NSMutableArray arrayWithObjects:@"1",@"2",@"3"nil],
                        [
NSMutableArray arrayWithObjects:@"4",@"5",@"6"nil],
                        [
NSMutableArray arrayWithObjects:@"7",@"8",@"9"nil],
                        [
NSMutableArray arrayWithObjects:@"1",@"4",@"7"nil],
                        [
NSMutableArray arrayWithObjects:@"2",@"5",@"8"nil],
                        [
NSMutableArray arrayWithObjects:@"3",@"6",@"9"nil],
                        [
NSMutableArray arrayWithObjects:@"1",@"5",@"9"nil],
                        [
NSMutableArray arrayWithObjects:@"7",@"5",@"3"nil], nil];
    
// Khoi tao cac phan tu button
    
arrButton = [[NSArray allocinitWithObjects:btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9nil];
}
    

- (
void)viewDidUnload
{
    [
arrButton release];
    
arrButton nil;
    [
arrMatrix release];
    
arrMatrix nil;
    [
arrMutableMatrix release];
    
arrMutableMatrix nil;
    [
btn1 release];
    
btn1 nil;
    [
btn2 release];
    
btn2 nil;
    [
btn3 release];
    
btn3 nil;
    [
btn4 release];
    
btn4 nil;
    [
btn5 release];
    
btn5 nil;
    [
btn6 release];
    
btn6 nil;
    [
btn7 release];
    
btn7 nil;
    [
btn8 release];
    
btn8 nil;
    [
btn9 release];
    
btn9 nil;
    [
lblX release];
    
lblX nil;
    [
lblO release];
    
lblO nil;
    [
lblDraw release];
    
lblDraw nil;
    [
lblResult release];
    
lblResult nil;
    [
super viewDidUnload];
    
// Release any retained subviews of the main view.
}

- (BOOL)
shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (
interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (
void)dealloc {
    [
arrButton release];
    [
arrMutableMatrix release];
    [
arrMatrix release];
    [
btn1 release];
    [
btn2 release];
    [
btn3 release];
    [
btn4 release];
    [
btn5 release];
    [
btn6 release];
    [
btn7 release];
    [
btn8 release];
    [
btn9 release];
    [
lblX release];
    [
lblO release];
    [
lblDraw release];
    [
lblResult release];
    [
super dealloc];
}

- (
void)makeAlphaOfButtonsLowExcept:(int)index{
    
    
NSArray *temp = [NSArray arrayWithArray:[arrMatrix objectAtIndex:index]];
    
    
int runBtn 1;
    for (
UIButton *btn in arrButton) {
        
NSString *str = [NSString stringWithFormat:@"%i",runBtn];
        
runBtn++;
        if (![
temp containsObject:str]) {
            
btn.alpha 0.5;
        }
        else
        {
            continue;
        }
    }
    
}
- (Boolean)
checkWhoWin:(NSString*)xo{
    if (
flag == NO && [xo isEqualToString:@"x"]) {
        
int score = [lblDraw.text intValue] + 1;
        
lblDraw.text = [NSString stringWithFormat:@"%i",score];
        
lblResult.text = @"DRAW";
        for (
UIButton *btn in arrButton) {
            
btn.enabled false;
        }
        return 
NO;
    }
    
int index 0;
    for (
NSMutableArray *run in arrMutableMatrix) {
        if ([
run containsObject:xo]) {
            
            
int count 0;
            for (
NSString *i in run) {
                if ([
i isEqualToString:xo]) count++;
            }
            if (
count == 3) {
                if ([
xo isEqualToString:@"x"]) {
                    
lblResult.text = @"YOU LOSE";
                    
//Tinh diem
                    
int score = [lblX.text intValue] + 1;
                    
lblX.text = [NSString stringWithFormat:@"%i",score];
                    
//Lam mo cac button
                    
[self makeAlphaOfButtonsLowExcept:index];
                }
                else {
                    
lblResult.text = @"YOU WIN";
                    
int score = [lblO.text intValue] + 1;
                    
lblO.text = [NSString stringWithFormat:@"%i",score];
                    [
self makeAlphaOfButtonsLowExcept:index];
                }
                for (
UIButton *btn in arrButton) {
                    
btn.enabled false;
                }
                return 
YES;
            }
            
        }
    
index++;
    }
    return 
NO;
}

- (
void)putChess:(NSString*)xo At:(NSString*)position {
    for (
NSMutableArray *arrRun in arrMutableMatrix) {
        for (
int i 3i++) {
            if ([[
arrRun objectAtIndex:iisEqualToString:position]) {
                [
arrRun replaceObjectAtIndex:i withObject:xo];
            }
        }
    }
}

- (
void)addChessOfComputer{
    
int caseOf 5;// Thu tu uu tien: 1,2,3,4
    
int countX 0;
    
int countO 0;
    
NSString *position = @"";
    for (
NSMutableArray *arrRun in arrMutableMatrix) {
        
countO 0;
        
countX 0;
        
int tmp_indexOfO = -1;
        
int tmp_indexOfX = -1;
        
        for (
NSString *x in arrRun) {
            if ([
x isEqualToString:@"x"]) countX++;
            else if(![
x isEqualToString:@"o"]) tmp_indexOfX = [arrRun indexOfObject:x];// Luu lai vi tri con trong
            
            
if ([x isEqualToString:@"o"]) countO++;
            else if(![
x isEqualToString:@"x"]) tmp_indexOfO = [arrRun indexOfObject:x];
            
        }
        if (
countX == && tmp_indexOfX > -1) {
            
caseOf 1;
            
position = [arrRun objectAtIndex:tmp_indexOfX];
            break;
        }
        if (
countO == && tmp_indexOfO > -1) {
            
caseOf 2;
            
position = [arrRun objectAtIndex:tmp_indexOfO];

        }
        if (
caseOf >= && countX == && tmp_indexOfX > -1) {
            
caseOf 3;
            
position = [arrRun objectAtIndex:tmp_indexOfX];
        }
        if (
caseOf >= && countO == && tmp_indexOfO > -1) {
            
caseOf 4;
            
position = [arrRun objectAtIndex:tmp_indexOfO];
 
        }
    }
    
UIButton *btn = [[UIButton alloc]init];
    if (
caseOf 5) {
        
btn = [arrButton objectAtIndex:[position intValue]-1];
        [
btn setImage:[UIImage imageNamed:@"x.png"forState:UIControlStateNormal];
        
btn.enabled false;
        [
self putChess:@"x" At:position];
        
flag YES;
    }
    else 
flag NO;
    
//[btn release];
}

- (
IBAction)touchFirstCell:(id)sender {
    [
btn1 setImage:[UIImage imageNamed:@"o.png"forState:UIControlStateNormal];
    
btn1.enabled false;
    [
self putChess:@"o" At:@"1"];
    if ([
self checkWhoWin:@"o"]) {
        return;
    }
    [
self addChessOfComputer];
    [
self checkWhoWin:@"x"];
    
    
}

- (
IBAction)touchSecondCell:(id)sender {
    [
btn2 setImage:[UIImage imageNamed:@"o.png"forState:UIControlStateNormal];
    
btn2.enabled false;
    [
self putChess:@"o" At:@"2"];
    if ([
self checkWhoWin:@"o"]) {
        return;
    }
    [
self addChessOfComputer];
    [
self checkWhoWin:@"x"];


}

- (
IBAction)touchThirdCell:(id)sender {
    [
btn3 setImage:[UIImage imageNamed:@"o.png"forState:UIControlStateNormal];
    
btn3.enabled false;
    [
self putChess:@"o" At:@"3"];
    if ([
self checkWhoWin:@"o"]) {
        return;
    }
    [
self addChessOfComputer];
    [
self checkWhoWin:@"x"];


}

- (
IBAction)touchFourthCell:(id)sender {
    [
btn4 setImage:[UIImage imageNamed:@"o.png"forState:UIControlStateNormal];
    
btn4.enabled false;
    [
self putChess:@"o" At:@"4"];
    if ([
self checkWhoWin:@"o"]) {
        return;
    }
    [
self addChessOfComputer];
    [
self checkWhoWin:@"x"];

}

- (
IBAction)touchFifthCell:(id)sender {
    [
btn5 setImage:[UIImage imageNamed:@"o.png"forState:UIControlStateNormal];
    
btn5.enabled false;
    [
self putChess:@"o" At:@"5"];
    if ([
self checkWhoWin:@"o"]) {
        return;
    }
    [
self addChessOfComputer];
    [
self checkWhoWin:@"x"];

}

- (
IBAction)touchSixthCell:(id)sender {
    [
btn6 setImage:[UIImage imageNamed:@"o.png"forState:UIControlStateNormal];
    
btn6.enabled false;
    [
self putChess:@"o" At:@"6"];
    if ([
self checkWhoWin:@"o"]) {
        return;
    }
    [
self addChessOfComputer];
    [
self checkWhoWin:@"x"];

}

- (
IBAction)touchSeventhCell:(id)sender {
    [
btn7 setImage:[UIImage imageNamed:@"o.png"forState:UIControlStateNormal];
    
btn7.enabled false;
    [
self putChess:@"o" At:@"7"];
    if ([
self checkWhoWin:@"o"]) {
        return;
    }
    [
self addChessOfComputer];
    [
self checkWhoWin:@"x"];

}

- (
IBAction)touchEighthCell:(id)sender {
    [
btn8 setImage:[UIImage imageNamed:@"o.png"forState:UIControlStateNormal];
    
btn8.enabled false;
    [
self putChess:@"o" At:@"8"];
    if ([
self checkWhoWin:@"o"]) {
        return;
    }
    [
self addChessOfComputer];
    [
self checkWhoWin:@"x"];

}

- (
IBAction)touchNinethCell:(id)sender {
    [
btn9 setImage:[UIImage imageNamed:@"o.png"forState:UIControlStateNormal];
    
btn9.enabled false;
    [
self putChess:@"o" At:@"9"];
    if ([
self checkWhoWin:@"o"]) {
        return;
    }
    [
self addChessOfComputer];
    [
self checkWhoWin:@"x"];

}

- (
IBAction)reset:(id)sender {
    
flag NO;
    
lblResult.text = @"";
    for (
UIButton *btn in arrButton) {
        
btn.enabled true;
        [
btn setImage:[UIImage imageNamed:@""forState:UIControlStateNormal];
        
btn.alpha 1;
    }
    [
arrMutableMatrix release];
    
arrMutableMatrix nil;
    
arrMutableMatrix = [[NSMutableArray allocinitWithObjects:
                        [
NSMutableArray arrayWithObjects:@"1",@"2",@"3"nil],
                        [
NSMutableArray arrayWithObjects:@"4",@"5",@"6"nil],
                        [
NSMutableArray arrayWithObjects:@"7",@"8",@"9"nil],
                        [
NSMutableArray arrayWithObjects:@"1",@"4",@"7"nil],
                        [
NSMutableArray arrayWithObjects:@"2",@"5",@"8"nil],
                        [
NSMutableArray arrayWithObjects:@"3",@"6",@"9"nil],
                        [
NSMutableArray arrayWithObjects:@"1",@"5",@"9"nil],
                        [
NSMutableArray arrayWithObjects:@"7",@"5",@"3"nil], nil];
}
@
end 
Source code: nhấn vào đây
Youtube cũng có lun: http://youtu.be/fBUvIPkgvio

Vậy là xong, mình sẽ bổ sung giải thích về thuật toán sau

thay đổi nội dung bởi: duylee, 14-09-2012 lúc 12:49
Trả Lời Với Trích Dẫn
  #2  
Old 14-09-2012, 12:31
duylee duylee vẫn chưa có mặt trong diễn đàn
Thành Viên Mới
 
Tham gia ngày: Aug 2012
Tuổi: 30
Bài gởi: 11
Thanks: 1
Thanked 3 Times in 3 Posts
Sau đây là thuật toán mình nghĩ ra:

- Tạo 2 ma trận A và B có các phần tử giống nhau, chỉ khác ma trận A thì "readonly" ma trận B có thể chỉnh sửa. Phần tử của 2 ma trận là vị trí mà người chơi hoặc máy có thể thắng:
PHP Code:
1 2 3
4 5 6
7 8 9
1 4 7
2 5 8
3 6 9
1 5 9
7 5 3 
=> Lưu ý: các con số là vị trí các button theo thứ tự tính từ trái sang phải từ trên xuống dưới.

- Ma trận A: readonly là vì sau khi ma trận B đã chỉnh sửa sẽ cần tham chiếu đến ma trận A để biết vị trí chính xác.
- Ma trận B: mỗi lần người chơi hay máy đánh cờ thì sẽ cần chỉnh sửa ma trận B, cụ thể như sau:

+Người chơi sẽ dùng cờ "o" còn máy sẽ dùng "x"
+Thí dụ người chơi đánh "o" ở vị trí số 1 thì ma trận B thay đổi như sau:
PHP Code:
o 2 3
4 5 6
7 8 9
o 4 7 
2 5 8
3 6 9
o 5 9
7 5 3 
+Tương tự cho máy đánh.

- Giải thuật để máy ra cờ như sau:

Gọi các vị trí không phải là "x" hay "o" là các vị trí trống
+Có 5 bậc ưu tiên(Trường hợp) để máy ra cờ
+Bậc 5: máy ko ra cờ =>huề cờ
+Bậc 4: chỉ có 1 quân "o"
thí dụ: o 2 3=> còn 2 vị trí trống và có sẵn 1 quân o. Tuy nhiên nếu là o x 3 thì bỏ qua vì có đánh vào vị trí trống còn lại cũng vô ích
+Bậc 3: có 1 quân "x"
thí dụ: x 2 3=> còn 2 vị trí trống và có sẵn 1 quân x. Bỏ qua trường hợp tuơng tự như trên.
+Bậc 2: Có 2 quân o và 1 vị trí trống=> phải chặn
thí dụ: o o 3 => phải chặn ở vị trí 3 nếu ko muốn thua. Trường hợp o o x bỏ qua vì ko còn vị trí trống để đánh và cờ "o" đã bị chặn
+Bậc 1: có 2 quân x và 1 vị trí trống => thắng rồi còn gì
thí dụ: x x 3=> đánh vào 3 là quân x thắng. Bỏ qua trường hợp như trên
=> Lưu ý: trong bài của mình gọi là bậc ưu tiên bởi vì, nếu chương trình tính ra(bằng cách cho vòng lặp chạy hết ma trận) đang ở bậc 2 ( tức trường hợp 2) có nghĩa là ta bỏ qua bậc 3 và 4( trường hợp 3 và 4)
vì dụ:
PHP Code:
o 2 3
o o 6 
ví dụ trên có cả bậc 4 và bậc 2, rõ ràng phải ra cờ "x" phải chặn nên ta phải ra cờ ở bậc 2( trường hợp 2) chứ ko thể ra cờ "x" ở bậc 4 (trường hợp 4) nếu ko người chơi sẽ thắng.

Đó là thuật toán mình nghĩ ra nếu không hiểu chỗ nào bạn cứ hỏi, nếu bạn nào có giải thuật khác thì cũng đưa lên cùng thảo luận nhá.

thay đổi nội dung bởi: duylee, 14-09-2012 lúc 13:34
Trả Lời Với Trích Dẫn
Trả lời

Bookmarks

Ðiều Chỉnh

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến

Similar Threads
Ðề tài Người Gởi Chuyên mục Trả lời Bài mới gởi
Kho game điện thoại .đồ họa siêu đẹp linkcasau Softwares - Tools 0 18-07-2012 20:08
Chú ý : Bộ game hay nhất và mới nhất cho mobile mikura Thùng Rác 2 10-07-2012 15:40
Game hot tren mobile nam 2012 khanh_pig Quản Lý Phòng Internet - Games 0 09-07-2012 08:53



Múi giờ GMT +7. Hiện tại là 12:48
Powered by: vBulletin Version 3.8.7
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Ad Management by RedTyger