重温c语言之,7天开整,就是随便的写写,第九天
这次照着网站上的内容,写了一个简单的小游戏,3字棋,其实也可以n字棋
附上代码,
这里是:game.h
1 #pragma once 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<time.h> 5 6 //游戏代码的声明(函数声明,符号定义) 7 8 #define Row 3 9 #define Col 3 10 11 //初始化棋盘 12 void InitBoard(char board[Row][Col], int Row_n, int Col_n); 13 //打印棋盘 14 void DisplayBoard(char board[Row][Col], int Row_n, int Col_n); 15 //玩家下棋 16 void PlayerMove(char board[Row][Col], int Row_n, int Col_n); 17 //电脑下棋,随机生成坐标 18 void ComputerMove(char board[Row][Col], int Row_n, int Col_n); 19 20 //玩家赢:Congratulation!---'*' 21 //电脑赢:Lost!-----"#' 22 //平局:The game ends in a tie.---'Q' 23 //继续:Go on!-----'C' 24 char IsWin(char board[Row][Col], int Row_n, int Col_n);
之后是:game.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include "game.h" 3 4 //三子棋 5 //代码的实现 6 7 8 void InitBoard(char board[Row][Col], int Row_n, int Col_n) { 9 int i = 0; 10 int j = 0; 11 for (i = 0; i < Row_n; i++) 12 { 13 for (j = 0; j < Col_n; j++) { 14 board[i][j] = ' '; 15 } 16 } 17 } 18 19 //第一版本 20 //void DisplayBoard(char board[Row][Col], int Row_n, int Col_n) { 21 // int i = 0; 22 // for (i = 0; i < Row_n; i++) 23 // { 24 // //打印数据 25 // printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); 26 // //打印分隔符 27 // if (i < Row_n - 1) { 28 // printf("---|---|---\n"); 29 // } 30 // } 31 //} 32 33 //第二版本,为了更好的扩展地图 34 void DisplayBoard(char board[Row][Col], int Row_n, int Col_n) { 35 int i = 0, j = 0, z = 0; 36 for (i = 0; i < Row_n; i++) 37 { 38 for (j = 0; j < Col_n; j++) 39 { 40 //打印数据 41 printf(" %c ", board[i][j]); 42 //打印分隔符 43 if (j < Col_n - 1) 44 { 45 printf("|"); 46 } 47 } 48 printf("\n"); 49 if (i < Row_n - 1) { 50 for (z = 0; z < Col_n; z++) 51 { 52 printf("---"); 53 if (z < Row_n - 1) { 54 printf("|"); 55 } 56 } 57 printf("\n"); 58 } 59 60 } 61 } 62 63 void PlayerMove(char board[Row][Col], int Row_n, int Col_n) { 64 int x = 0, y = 0; 65 printf("玩家下棋:\n"); 66 while (1) { 67 printf("请输入坐标(x:%d-%d之间,y:%d-%d之间):>", 1, Row_n, 1, Col_n); 68 if (scanf("%d %d", &x, &y) == 2) { // 检查是否成功读取两个整数 69 if (x >= 1 && x <= Row_n && y >= 1 && y <= Col_n) { 70 if (board[x - 1][y - 1] == ' ') { 71 board[x - 1][y - 1] = '*'; 72 break; 73 } 74 else { 75 printf("坐标被占用,不能被下棋,请选择其他的位置\n"); 76 } 77 } 78 else { 79 printf("坐标非法,请重新输入\n"); 80 } 81 } 82 else { 83 printf("输入错误,请输入两个整数坐标\n"); 84 } 85 while (getchar() != '\n'); // 清空输入缓冲区 86 } 87 88 } 89 90 void ComputerMove(char board[Row][Col], int Row_n, int Col_n) { 91 printf("电脑下棋:>\n"); 92 int x = 0, y = 0; 93 while (1) { 94 x = rand() % Row_n;//0~Row_n-1 95 y = rand() % Col_n;//0~Col_n-1 96 if (board[x][y] == ' ') { 97 board[x][y] = '#'; 98 break; 99 } 100 } 101 102 } 103 //如果满了,则返回1 104 //不满,则返回0 105 int IsFull(char board[Row][Col], int Row_n, int Col_n) { 106 int i = 0,j=0; 107 for (i = 0; i < Row_n; i++) 108 { 109 for ( j = 0; j < Col_n; j++) 110 { 111 if (board[i][j] == ' ') { 112 return 0; 113 } 114 } 115 } 116 return 1; 117 } 118 char IsWin(char board[Row][Col], int Row_n, int Col_n) { 119 // 判断行 120 for (int i = 0; i < Row_n; i++) { 121 char rowChar = board[i][0]; 122 for (int j = 0; j < Col_n; j++) { 123 if (board[i][j] == '|' || board[i][j] == '---' || board[i][j] == ' ') { 124 continue; // 跳过分隔符和空位 125 } 126 if (board[i][j] != rowChar) { 127 break; // 如果字符不匹配,则检查下一行 128 } 129 if (j == Col_n - 1) { // 如果整行元素都相等 130 return rowChar; 131 } 132 } 133 } 134 135 // 判断列 136 for (int j = 0; j < Col_n; j++) { 137 char colChar = board[0][j]; 138 for (int i = 0; i < Row_n; i++) { 139 if (board[i][j] == '|' || board[i][j] == '---' || board[i][j] == ' ') { 140 continue; // 跳过分隔符和空位 141 } 142 if (board[i][j] != colChar) { 143 break; // 如果字符不匹配,则检查下一列 144 } 145 if (i == Row_n - 1) { // 如果整列元素都相等 146 return colChar; 147 } 148 } 149 } 150 151 // 判断主对角线 152 char diagMainChar = board[0][0]; 153 for (int i = 1; i < Row_n; i++) { 154 if (board[i][i] == '|' || board[i][i] == '---' || board[i][i] == ' ') { 155 continue; // 跳过分隔符和空位 156 } 157 if (diagMainChar != board[i][i]) { 158 break; // 如果字符不匹配,则游戏继续 159 } 160 if (i == Row_n - 1) { // 如果主对角线相等且不为空 161 return diagMainChar; 162 } 163 } 164 165 // 判断副对角线 166 char diagSecChar = board[0][Col_n - 1]; 167 for (int i = 0; i < Row_n; i++) { 168 if (board[i][Col_n - 1 - i] == '|' || board[i][Col_n - 1 - i] == '---' || board[i][Col_n - 1 - i] == ' ') { 169 continue; // 跳过分隔符和空位 170 } 171 if (diagSecChar != board[i][Col_n - 1 - i]) { 172 break; // 如果字符不匹配,则游戏继续 173 } 174 if (i == Row_n - 1) { // 如果副对角线相等且不为空 175 return diagSecChar; 176 } 177 } 178 179 // 检查是否平局或游戏继续 180 if (IsFull(board, Row_n, Col_n)) { 181 return 'Q'; // 平局 182 } 183 184 return 'C'; // 游戏继续 185 }
最后是:test.c
1 #define _CRT_SECURE_NO_WARNINGS 2 3 4 //测试游戏的逻辑 5 6 #include"game.h" 7 8 void manu() { 9 printf("************************\n"); 10 printf("***** 1.play *****\n"); 11 printf("***** 0.exit *****\n"); 12 printf("************************\n"); 13 } 14 15 void game() { 16 char ret = 'C'; 17 char board[Row][Col] = { 0 }; 18 //初始化棋盘的功能 19 InitBoard(board, Row, Col); 20 //打印棋盘 21 DisplayBoard(board, Row, Col); 22 //下棋,玩家先下 23 while (1) { 24 PlayerMove(board, Row, Col); 25 //判断输赢 26 ret = IsWin(board, Row, Col); 27 if (ret != 'C') { 28 break; 29 } 30 DisplayBoard(board, Row, Col); 31 ComputerMove(board, Row, Col); 32 //判断输赢 33 ret = IsWin(board, Row, Col); 34 if (ret != 'C') { 35 break; 36 } 37 DisplayBoard(board, Row, Col); 38 } 39 if (ret == '*') 40 { 41 printf("恭喜玩家获胜!\n"); 42 } 43 else if (ret == '#') { 44 printf("电脑获胜!\n"); 45 } 46 else if(ret=='Q') 47 { 48 printf("平局!\n"); 49 } 50 51 DisplayBoard(board, Row, Col); 52 } 53 54 55 int main() { 56 srand((unsigned int)time(NULL)); 57 int input = 0; 58 do { 59 manu(); 60 printf("请输入选项:"); 61 scanf("%d", &input); 62 switch (input) { 63 case 1: 64 game(); 65 break; 66 case 0: 67 printf("退出游戏\n"); 68 break; 69 default: 70 printf("输入错误!\n"); 71 break; 72 } 73 } while (input != 0); // 只有当input为0时,循环才会结束 74 return 0; 75 }
我这里的用法都比较简单,只是运用了if-else,for循环,函数等用法,没有用到十分高明的手段
注:我这里的电脑判断部分比较人机,十分的差劲,如果想要进一步改进or进化的话,可以按照:人类将要输入什么地方获得胜利,提前进行检测,之后占位,最终达到平局.....等想法来进行修改