mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-30 21:42:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			92 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // check whether our distance and tallycounter algorithms work correctly
 | |
| 
 | |
| namespace dhrg {
 | |
| 
 | |
| void test_paths(int radius) {
 | |
|   celllister cl(croot(), radius, 1000000, NULL);
 | |
|   int N = isize(cl.lst);
 | |
|   printf("N = %d\n", N);
 | |
|   vector<mycell*> mycells;
 | |
|   for(cell *c: cl.lst)
 | |
|     mycells.push_back(find_mycell_by_path(computePath(c)));
 | |
|   
 | |
|   int ctable[MAXDIST];
 | |
| 
 | |
|   for(int u=0; u<MAXDIST; u++)
 | |
|     ctable[u] = 0;
 | |
|   
 | |
|   int errorcount = 0;
 | |
| 
 | |
|   for(int i=0; i<N; i++) {
 | |
|     cell *c = cl.lst[i];
 | |
|     mycell *mc = mycells[i];
 | |
|     cell *c1 = mc->ascell();
 | |
|     if(c != c1) {
 | |
|       printf("ascell error %s / %s\n", computePath(c).c_str(), computePath(c1).c_str());
 | |
|       c->item = itEmerald;
 | |
|       c1->item = itRuby;
 | |
|       errorcount++;
 | |
|       return;
 | |
|       }
 | |
|     }
 | |
|   
 | |
|   for(int i=0; i<N; i++)
 | |
|     for(int j=0; j<N; j++) {
 | |
|       int a = celldistance(cl.lst[i], cl.lst[j]);
 | |
|       int b = quickdist(mycells[i], mycells[j]);
 | |
|       if(a != b) {
 | |
|         printf("celldistance = %d\n", a);
 | |
|         printf("quickdist = %d\n", b);
 | |
|         celllister cl2(cl.lst[i], 10, 1500, cl.lst[j]);
 | |
|         if(cl2.listed(cl.lst[j]))
 | |
|           printf("actual distance = %d\n", cl2.getdist(cl.lst[j]));
 | |
|         cl.lst[i]->item = itDiamond;
 | |
|         cl.lst[j]->item = itSilver;
 | |
|         errorcount++;
 | |
|         return;
 | |
|         }
 | |
|       else ctable[a]++;
 | |
|       }
 | |
|   
 | |
|   for(mycell* mc1: mycells) for(mycell* mc2: mycells) {
 | |
|     add_to_set(mc1, 1, 0);
 | |
|     add_to_tally(mc2, 1, 0);
 | |
|     // int v = 0;
 | |
|     if(tally[quickdist(mc1, mc2)] != 1) {
 | |
|       printf("[%p] [%p]\n", (void*) mc1, (void*) mc2);
 | |
|       printf("quickdist = %d\n", quickdist(mc1, mc2));
 | |
|       for(int i=0; i<MAXDIST; i++) if(tally[i]) printf("in tally = %d\n", i);
 | |
|       mc1->ascell()->item = itDiamond;
 | |
|       mc2->ascell()->item = itSilver;
 | |
|       errorcount++;
 | |
|       add_to_tally(mc2, -1, 0);
 | |
|       add_to_set(mc1, -1, 0);
 | |
|       return;
 | |
|       }
 | |
|     add_to_tally(mc2, -1, 0);
 | |
|     add_to_set(mc1, -1, 0);
 | |
|     }
 | |
| 
 | |
|   for(mycell* mc: mycells)
 | |
|     add_to_set(mc, 1, 0);
 | |
| 
 | |
|   for(mycell* mc: mycells)
 | |
|     add_to_tally(mc, 1, 0);
 | |
| 
 | |
|   for(int u=0; u<MAXDIST; u++) if(ctable[u] || tally[u]) {
 | |
|     printf("%d: %d/%d\n", u, ctable[u], (int) tally[u]);
 | |
|     if(ctable[u] != tally[u]) errorcount++;
 | |
|     }
 | |
|   
 | |
|   for(mycell* mc: mycells)
 | |
|     add_to_tally(mc, -1, 0);
 | |
| 
 | |
|   for(mycell* mc: mycells)
 | |
|     add_to_set(mc, -1, 0);
 | |
| 
 | |
|   if(errorcount)
 | |
|     printf("errors found: %d\n", errorcount);
 | |
|   }
 | |
| 
 | |
| }
 | 
