C
1 2#include<stdio.h> 3#include<stdlib.h> 4#include <Windows.h> 5#include <time.h> 6 7 8#define WORLD_H 38 9#define WORLD_W 38 10 11//プロトタイプ宣言 12void init_map(char map[WORLD_H][WORLD_W]); 13void print_map(char map[WORLD_H][WORLD_W]); 14void next_gen(char map[WORLD_H][WORLD_W]); 15int lifeCount(char temp[WORLD_H][WORLD_W], int ypos, int xpos); 16 17 18int main(void) { 19 20 char map[WORLD_H][WORLD_W]; 21 22 COORD coord; HANDLE hStdout; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 23 24 25 srand((unsigned)time(NULL)); 26 27 init_map( map); //初期化 28 29 30 while (1) { 31 coord.X = 0;// Xの位置(横) 32 coord.Y = 1; // Yの位置(縦) 33 SetConsoleCursorPosition(hStdout, coord); // カーソルの移動 34 35 print_map(map); //マップの表示 36 void next_gen(map); //世代を進める 37 } 38} 39 40 41 42//初期化する関数 43void init_map(char map[WORLD_H][WORLD_W]) { 44 45 46 int tate, yoko; 47 int rudval; 48 49 for (tate = 0; tate < WORLD_H; tate++) { 50 51 for (yoko = 0; yoko < WORLD_W; yoko++) { 52 53 int rudval = rand() % 10; 54 55 if (rudval >= 6) { 56 map[tate][yoko] = 1; 57 } 58 else { 59 map[tate][yoko] = 0; 60 61 } 62 63 } 64 } 65 66} 67 68//マップ表示 69 70void print_map(char map[WORLD_H][WORLD_W]) { 71 72 int tate, yoko; 73 74 75 for (tate = 0; tate < WORLD_H; tate++) { 76 77 for (yoko = 0; yoko < WORLD_W; yoko++) { 78 79 if (map[tate][yoko] == 1) { 80 81 printf("@"); 82 83 84 } 85 else if (map[tate][yoko] == 0) { 86 87 88 printf("."); 89 90 } 91 92 } 93 printf("\n"); 94 } 95 96 97} 98 99//世代を進める 100 101void next_gen(char map[WORLD_H][WORLD_W]) { 102 103 int rowtbl; 104 int coltbl; 105 106 char temp[WORLD_H][WORLD_W]; 107 108 for (coltbl = 0; coltbl < WORLD_H; coltbl++) { 109 110 for (rowtbl = 0; rowtbl < WORLD_W; rowtbl++) { 111 112 temp[coltbl][rowtbl] = map[coltbl][rowtbl]; 113 114 115 temp[coltbl][rowtbl] = lifeCount( temp[coltbl][rowtbl], coltbl, rowtbl); 116 117 if (temp[coltbl][rowtbl] == 3 && map[coltbl][rowtbl] ==0) { 118 map[coltbl][rowtbl] = 1; 119 }else if(temp[coltbl][rowtbl ]<= 1 && map[coltbl][rowtbl] == 1){ 120 map[coltbl][rowtbl] = 0; 121 } 122 else if (temp[coltbl][rowtbl] >= 4 && map[coltbl][rowtbl] == 1) { 123 124 map[coltbl][rowtbl] = 0; 125 126 } 127 } 128 129 } 130 131 132 133} 134 135//生存数を数える 136 137int lifeCount (char temp[WORLD_H][WORLD_W], int ypos, int xpos) { 138 139 140 int sum = 0; 141 142 if (ypos > 0 && xpos > 0) { 143 sum += temp[ypos - 1][xpos - 1]; //左上 144 } 145 146 if (xpos > 0) { 147 sum += temp[ypos][xpos - 1]; // 左 148 149 } 150 if (ypos < WORLD_H - 1 && xpos > 0) { 151 sum += temp[ypos + 1][xpos - 1]; //左下 152 } 153 if (ypos < WORLD_H - 1) { 154 sum += temp[ypos + 1][xpos]; //下 155 } 156 if(ypos < WORLD_H - 1 && xpos < WORLD_W - 1){ 157 sum += temp[ypos + 1][xpos + 1]; //右下 158 } 159 if (xpos < WORLD_W - 1) { 160 161 sum += temp[ypos][xpos + 1]; //右 162 } 163 if (ypos > 0 && xpos < WORLD_W - 1) { 164 sum += temp[ypos - 1][xpos + 1]; //右上 165 166 } 167 if (ypos > 0) { 168 sum += temp[ypos - 1][xpos]; //上 169 170 } 171 172 return sum; //周り8個の生存数 173} 174
現在、C言語の勉強のためにライフゲームというものを作っているのですが、
コンソールに表示させることは出来たのですが
永遠に表示されます。
どのような条件で終了(画面が止まる)こうやったら終わりみたいな 感じでしたいのですが
あまり思いつかなかったので何かアドバイス頂けると助かります。
また、コードが間違ってるなども指摘いただけると幸いです。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/27 04:24