Last active
January 3, 2018 20:22
-
-
Save HoraceShmorace/8e5ce48714de549694c903d02789b49e to your computer and use it in GitHub Desktop.
Ethereum Zombie Game
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import web3 from 'web3' | |
var abi = '' /* TODO: abi generated by the compiler */ | |
var ZombieFeedingContract = web3.eth.contract(abi) | |
var contractAddress = '' /* TODO: our contract address on Ethereum after deploying */ | |
var ZombieFeeding = ZombieFeedingContract.at(contractAddress) | |
// Assuming we have our zombie's ID and the kitty ID we want to attack | |
let zombieId = 1 | |
let kittyId = 1 | |
// To get the CryptoKitty's image, we need to query their web API. This | |
// information isn't stored on the blockchain, just their webserver. | |
// If everything was stored on a blockchain, we wouldn't have to worry | |
// about the server going down, them changing their API, or the company | |
// blocking us from loading their assets if they don't like our zombie game ;) | |
let apiUrl = 'https://api.cryptokitties.co/kitties/' + kittyId | |
$.get(apiUrl, function (data) { | |
let imgUrl = data.image_url | |
// do something to display the image | |
}) | |
// When the user clicks on a kitty: | |
$('.kittyImage').click(function (e) { | |
// Call our contract's `feedOnKitty` method | |
ZombieFeeding.feedOnKitty(zombieId, kittyId) | |
}) | |
// Listen for a NewZombie event from our contract so we can display it: | |
ZombieFactory.NewZombie(function (error, result) { | |
if (error) return | |
// This function will display the zombie, like in lesson 1: | |
generateZombie(result.zombieId, result.name, result.dna) | |
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.19; | |
contract ZombieFactory { | |
event NewZombie(uint zombieId, string name, uint dna); | |
uint dnaDigits = 16; | |
uint dnaModulus = 10 ** dnaDigits; | |
struct Zombie { | |
string name; | |
uint dna; | |
} | |
Zombie[] public zombies; | |
mapping (uint => address) public zombieToOwner; | |
mapping (address => uint) public ownerZombieCount; | |
function _createZombie(string _name, uint _dna) internal { | |
uint id = zombies.push(Zombie(_name, _dna)) - 1; | |
zombieToOwner[id] = msg.sender; | |
ownerZombieCount[msg.sender]++; | |
NewZombie(id, _name, _dna); | |
} | |
function _generateRandomDna(string _str) private view returns (uint) { | |
uint rand = uint(keccak256(_str)); | |
return rand % dnaModulus; | |
} | |
function createRandomZombie(string _name) public { | |
assert(ownerZombieCount[msg.sender] == 0); | |
uint randDna = _generateRandomDna(_name); | |
_createZombie(_name, randDna); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.19; | |
import "./zombiefactory.sol"; | |
contract KittyInterface { | |
function getKitty(uint256 _id) external view returns ( | |
bool isGestating, | |
bool isReady, | |
uint256 cooldownIndex, | |
uint256 nextActionAt, | |
uint256 siringWithId, | |
uint256 birthTime, | |
uint256 matronId, | |
uint256 sireId, | |
uint256 generation, | |
uint256 genes | |
); | |
} | |
contract ZombieFeeding is ZombieFactory { | |
address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; | |
KittyInterface kittyContract = KittyInterface(ckAddress); | |
function feedAndMultiply(uint _zombieId, uint _targetDna, string _species) public { | |
require(msg.sender == zombieToOwner[_zombieId]); | |
Zombie storage myZombie = zombies[_zombieId]; | |
_targetDna = _targetDna % dnaModulus; | |
uint newDna = (myZombie.dna + _targetDna) / 2; | |
if (keccak256(_species) == keccak256("kitty")) { | |
newDna = newDna - newDna % 100 + 99; | |
} | |
_createZombie("NoName", newDna); | |
} | |
function feedOnKitty(uint _zombieId, uint _kittyId) public { | |
uint kittyDna; | |
(,,,,,,,,,kittyDna) = kittyContract.getKitty(_kittyId); | |
feedAndMultiply(_zombieId, kittyDna, "kitty"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment