我有一个用于购买数据的数据集,该数据集有两列,一列用于用户ID,一列用于购买的产品(产品ID),用|分隔。
public class Snake extends Activity
{
SnakeEngine snakeEngine;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the pixel dimensions of the screen
Display display = getWindowManager().getDefaultDisplay();
// Initialize the result into a Point object
Point size = new Point();
display.getSize(size);
// Create a new instance of the SnakeEngine class
snakeEngine = new SnakeEngine(this, size);
// Make snakeEngine the view of the Activity
setContentView(snakeEngine);
}
@Override
protected void onResume() {
super.onResume();
snakeEngine.resume();
}
// Stop the thread in snakeEngine
@Override
protected void onPause() {
super.onPause();
snakeEngine.pause();
}
}
public class SnakeEngine extends SurfaceView implements Runnable {
private Thread thread = null;
// To hold a reference to the Activity
private Context context;
// for plaing sound effects
private SoundPool soundPool;
private int eat_bob = -1;
private int snake_crash = -1;
// For tracking movement Heading
public enum Heading {
UP, RIGHT, DOWN, LEFT
}
// Start by heading to the right
private Heading heading = Heading.RIGHT;
// To hold the screen size in pixels
private int screenX;
private int screenY;
// How long is the snake
private int snakeLength;
// Where is Bob hiding?
private int bobX;
private int bobY;
// The size in pixels of a snake segment
private int blockSize;
// The size in segments of the playable area
private final int NUM_BLOCKS_WIDE = 40;
private int numBlocksHigh;
// Control pausing between updates
private long nextFrameTime;
// Update the game 10 times per second
private final long FPS = 10;
// There are 1000 milliseconds in a second
private final long MILLIS_PER_SECOND = 1000;
// We will draw the frame much more often
// How many points does the player have
private int score;
// The location in the grid of all the segments
private int[] snakeXs;
private int[] snakeYs;
// Everything we need for drawing
// Is the game currently playing?
private volatile boolean isPlaying;
// A canvas for our paint
private Canvas canvas;
// Required to use canvas
private SurfaceHolder surfaceHolder;
// Some paint for our canvas
private Paint paint;
public SnakeEngine(Context context, Point size) {
super(context);
context = context;
screenX = size.x;
screenY = size.y;
// Work out how many pixels each block is
blockSize = screenX / NUM_BLOCKS_WIDE;
// How many blocks of the same size will fit into the height
numBlocksHigh = screenY / blockSize;
// Set the sound up
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
try {
// Create objects of the 2 required classes
// Use m_Context because this is a reference to the Activity
AssetManager assetManager = context.getAssets();
AssetFileDescriptor descriptor;
// Prepare the two sounds in memory
descriptor = assetManager.openFd("get_mouse_sound.ogg");
eat_bob = soundPool.load(descriptor, 0);
descriptor = assetManager.openFd("death_sound.ogg");
snake_crash = soundPool.load(descriptor, 0);
} catch (IOException e) {
// Error
}
//onTouch(v, event);
// Initialize the drawing objects
surfaceHolder = getHolder();
paint = new Paint();
// If you score 200 you are rewarded with a crash achievement!
snakeXs = new int[200];
snakeYs = new int[200];
// Start the game
newGame();
}
@Override
public void run() {
while (isPlaying) {
// Update 10 times a second
if (updateRequired()) {
update();
draw();
}
}
}
public void pause() {
isPlaying = false;
try {
thread.join();
} catch (InterruptedException e) {
// Error
}
}
public void resume() {
isPlaying = true;
thread = new Thread(this);
thread.start();
}
public void newGame() {
// Start with a single snake segment
snakeLength = 1;
snakeXs[0] = NUM_BLOCKS_WIDE / 2;
snakeYs[0] = numBlocksHigh / 2;
// Get Bob ready for dinner
spawnBob();
// Reset the score
score = 0;
// Setup nextFrameTime so an update is triggered
nextFrameTime = System.currentTimeMillis();
}
public void spawnBob() {
Random random = new Random();
bobX = random.nextInt(NUM_BLOCKS_WIDE - 1) + 1;
bobY = random.nextInt(numBlocksHigh - 1) + 1;
}
private void eatBob() {
// Got him!
// Increase the size of the snake
snakeLength++;
//replace Bob
// This reminds me of Edge of Tomorrow. Oneday Bob will be ready!
spawnBob();
//add to the score
score = score + 1;
Log.e("SOUNDPOOL1", "SOUNDPOOL1");
// int explosion = soundPool.load(this, R.raw.explosion_1, 1);
soundPool.play(eat_bob, 1, 1, 0, 0, 1);
Log.e("SOUNDPOOL2", "SOUNDPOOL2");
}
private void moveSnake() {
// Move the body
for (int i = snakeLength; i > 0; i--) {
// Start at the back and move it
// to the position of the segment in front of it
snakeXs[i] = snakeXs[i - 1];
snakeYs[i] = snakeYs[i - 1];
// Exclude the head because
// the head has nothing in front of it
}
// Move the head in the appropriate heading
switch (heading) {
case UP:
// Log.e("UP0", "UP0");
snakeYs[0]--;
break;
case RIGHT:
// Log.e("RIGHT0", "RIGHT0");
snakeXs[0]++;
break;
case DOWN:
// Log.e("DOWN0", "DOWN0");
snakeYs[0]++;
break;
case LEFT:
// Log.e("LEET0", "LEET0");
snakeXs[0]--;
break;
}
}
private boolean detectDeath() {
// Has the snake died?
boolean dead = false;
// Hit the screen edge
if (snakeXs[0] == -1) dead = true;
if (snakeXs[0] >= NUM_BLOCKS_WIDE) dead = true;
if (snakeYs[0] == -1) dead = true;
if (snakeYs[0] == numBlocksHigh) dead = true;
// Eaten itself?
for (int i = snakeLength - 1; i > 0; i--) {
if ((i > 4) && (snakeXs[0] == snakeXs[i]) && (snakeYs[0] == snakeYs[i])) {
dead = true;
}
}
return dead;
}
public void update() {
// Did the head of the snake eat Bob?
if (snakeXs[0] == bobX && snakeYs[0] == bobY) {
eatBob();
}
moveSnake();
if (detectDeath()) {
//start again
soundPool.play(snake_crash, 1, 1, 0, 0, 1);
newGame();
}
}
public void draw() {
// Get a lock on the canvas
if (surfaceHolder.getSurface().isValid()) {
canvas = surfaceHolder.lockCanvas();
// Fill the screen with Game Code School blue
canvas.drawColor(Color.argb(255, 26, 128, 182));
// Set the color of the paint to draw the snake white
paint.setColor(Color.argb(255, 255, 255, 255));
// Scale the HUD text
paint.setTextSize(70);
canvas.drawText("Score:" + score, 10, 70, paint);
// Draw the snake one block at a time
for (int i = 0; i < snakeLength; i++) {
canvas.drawRect(snakeXs[i] * blockSize,
(snakeYs[i] * blockSize),
(snakeXs[i] * blockSize) + blockSize,
(snakeYs[i] * blockSize) + blockSize,
paint);
}
// Set the color of the paint to draw Bob red
paint.setColor(Color.argb(255, 255, 0, 0));
// Draw Bob
canvas.drawRect(bobX * blockSize,
(bobY * blockSize),
(bobX * blockSize) + blockSize,
(bobY * blockSize) + blockSize,
paint);
// Unlock the canvas and reveal the graphics for this frame
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
public boolean updateRequired() {
// Are we due to update the frame
if (nextFrameTime <= System.currentTimeMillis()) {
// Tenth of a second has passed
// Setup when the next update will be triggered
nextFrameTime = System.currentTimeMillis() + MILLIS_PER_SECOND / FPS;
// Return true so that the update and draw
// functions are executed
return true;
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent motionEvent) {
switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_UP:
// if (motionEvent.getX() >= screenX / 2) {
if (motionEvent.getX() >= screenX) {
switch (heading) {
case UP:
heading = Heading.RIGHT;
Log.e("UP1", "UP1");
Log.e("RIGHTONE", "RIGHTONE");
break;
case RIGHT:
heading = Heading.DOWN;
Log.e("RIGHT1", "RIGHT1");
Log.e("DOWNONE", "DOWNONE");
break;
case DOWN:
heading = Heading.LEFT;
Log.e("DOWN1", "DOWN1");
Log.e("LEETONE", "LEETONE");
break;
case LEFT:
heading = Heading.UP;
Log.e("LEET1", "LEET1");
Log.e("UPONE", "UPONE");
break;
}
} else {
switch (heading) {
case UP:
heading = Heading.LEFT;
Log.e("UP2", "UP2");
Log.e("LEETTWO", "LEETTWO");
break;
case LEFT:
heading = Heading.DOWN;
Log.e("LEET2", "LEET2");
Log.e("DOWNTWO", "DOWNTWO");
break;
case DOWN:
heading = Heading.RIGHT;
Log.e("DOWN2", "DOWN2");
Log.e("RIGHTTWO", "RIGHTTWO");
break;
case RIGHT:
heading = Heading.UP;
Log.e("RIGHT2", "RIGHT2");
Log.e("UPTWO", "UPTWO");
break;
}
}
}
return true;
}
}
以此类推。
我设法将数据转换为用户ID矩阵,并用代表用户购买次数的产品列来表示。
id prod
1 20|30|35|30
2 1|20
3 85|1|1
4 20|2|11|20
对此我还是很陌生,我想在此数据集上使用recommederlab(UBCF)。我不确定数据的格式是否正确,您对使用推荐实验室的建议如何做。