C语言实现三子棋
2017-07-22 00:23
363 查看
本次程序是三子棋的简单实现,首先我们要了解三子棋的游戏规则,3X3的游戏格子里先,先连成一条线的获胜。
根据游戏规则,我们将其规则转换为编程,大致思路是棋盘的打印,电脑放置棋子,玩家放置棋子,对每次放置棋子进行胜负判断。棋盘为3X3,用到了我们C语言中的二维数组,还有其他的循环和判断语句,数组的合理布置和运用帮助我们很好的在一个棋盘上放置了棋子。
编写此次程序我们需要添加一个头文件来包含我们的头文件,标识符的定义,函数的声明(game.h);还需要的是两个源文件,一个负责对游戏程序的测试(test.h),一个为我们所写的游戏主程(game.h)。
首先编写我们的头文件(game.h)
#ifndef __GAME_H__ //判断头文件是否已经使用 if not define 如果没有则定义 #define __GAME_H__ //定义头文件 #include <stdio.h> #include <stdlib.h> #include <time.h> #include<string.h> extern void meun(); extern void game(); extern int Judgement(); extern void Computer_Set(); 4000 extern void Person_Set(); extern void chessBorad(); #endif //__GAME_H__
然后写入我们的测试程序(test.c),需要注意的是我们在此需要引入我们的头文件,注意头文件引入不是<>而是”“,在此说明下”“是先检测当前目录搜索头文件,<>是从系统指定目录搜索,所以不要用错。
在此我们要实现的是用户选择1进行游戏,选择0退出,其他则不能识别重新选择,需要用到while语句嵌套switch case语句。
#include"game.h" int main() { int a; srand((unsigned)time(NULL)); //产生一个随机数 do { meun(); //打印游戏菜单 scanf_s("%d", &a); //进行游戏模式选择 switch (a) { case 1: game(); break; case 0: break; default: printf("输入错误请重新输入:"); break; } } while (a); return 0; }
这里开始写入游戏的主要程序(game.c),此部分需要对棋盘设置和将所需要的二维数组加入在棋盘中,原理是通过对数组的赋值来进行棋子的布置,坐标的x,y相当于二位数组确定的参数。
在此需要注意的是
1.作为程序员知道数组是从0,0开始,用户可能并不明白其原理,会输入1,1,要做到用户友好,在此我们需要对输入进行处理
2.我们需要对每次输入的值进行判断,如果输入重复,则需要提示重新输入。
3.对每次如果结果进行判断,最终结果分为三种,玩家胜,电脑胜,平局。
#include"game.h" //游戏菜单设置 void meun() { printf("************************************************\n"); printf("************** 1.play ******************\n"); printf("************** 2.exits ******************\n"); printf("************************************************\n"); } //游戏主程序 void game() { printf("------------------welcome!!!--------------------\n"); char arr[3][3]; memset(arr, ' ', sizeof(arr)); //对数组进行初始化 chessBorad(arr); while (1) { Computer_Set(arr); int judge = Judgement(arr); //每次都要进行判断 if (judge == 0) { system("cls"); //清空屏幕进行下一次游戏 break; } Person_Set(arr); judge = Judgement(arr); if (judge == 0) { system("cls"); break; } } } //游戏棋盘的设置,注意数组要安置在棋盘里 void chessBorad(char arr[3][3]) { for (int i = 0; i < 4; i++) { if (i == 0) printf("\n"); if (i>0) for (int j = 0; j < 1; j++) { printf(" | %c | %c | %c |\n", arr[i - 1][j], arr[i - 1][j + 1], arr[i - 1][j + 2]); } printf(" --- --- ---\n"); } printf("_________________________________________________\n"); } //电脑安置棋子设置,用随机数的产生来设置 void Computer_Set(char arr[3][3]) { printf("computer seted:"); while (1) { int a = rand() % 3; int b = rand() % 3; if (arr[a][b] == ' ') { arr[a][b] = 'O'; break; } } chessBorad(arr); } //玩家放置棋子设置 void Person_Set(char arr[3][3]) { while (1) { printf("please input coordinate:"); int a = 0; int b = 0; scanf("%d %d", &a, &b); a--; b--; if (((a >= 0) && (a<3)) && ((b >= 0) && (b < 3)) && (arr[a][b] == ' ')) { arr[a][b] = 'X'; chessBorad(arr); break; } else { printf("please try again;\n"); } } } //胜负的判断条件 int Judgement(char arr[3][3]) { if (((arr[0][0] == arr[0][1]) && (arr[0][1] == arr[0][2]) && (arr[0][0] == 'X')) || ((arr[1][0] == arr[1][1]) && (arr[1][1] == arr[1][2]) && (arr[1][1] == 'X')) || ((arr[2][0] == arr[2][1]) && (arr[2][1] == arr[2][2]) && (arr[2][2] == 'X')) || ((arr[0][0] == arr[1][0]) && (arr[1][0] == arr[2][0]) && (arr[2][0] == 'X')) || ((arr[0][1] == arr[1][1]) && (arr[1][1] == arr[2][1]) && (arr[2][1] == 'X')) || ((arr[0][2] == arr[1][2]) && (arr[1][2] == arr[2][2]) && (arr[2][2] == 'X')) || ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'X')) || ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'X'))) { printf("you win this game.\n"); return 0; } if (((arr[0][0] == arr[0][1]) && (arr[0][1] == arr[0][2]) && (arr[0][0] == 'O')) || ((arr[1][0] == arr[1][1]) && (arr[1][1] == arr[1][2]) && (arr[1][1] == 'O')) || ((arr[2][0] == arr[2][1]) && (arr[2][1] == arr[2][2]) && (arr[2][2] == 'O')) || ((arr[0][0] == arr[1][0]) && (arr[1][0] == arr[2][0]) && (arr[2][0] == 'O')) || ((arr[0][1] == arr[1][1]) && (arr[1][1] == arr[2][1]) && (arr[2][1] == 'O')) || ((arr[0][2] == arr[1][2]) && (arr[1][2] == arr[2][2]) && (arr[2][2] == 'O')) || ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'O')) || ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'O'))) { printf("you lose this game.\n"); return 0; } if ((arr[1][1] != ' ') && (arr[1][2] != ' ') && (arr[1][3] != ' ') && (arr[2][1] != ' ') && (arr[2][2] != ' ') && (arr[2][3] != ' ') && (arr[3][1] != ' ') && (arr[3][2] != ' ') && (arr[3][3] != ' ')) { printf("draw!\n"); return 0; } return 1; }
程序还可以进行部分优化,对电脑的放置进行判断,比如玩家快到三个或者电脑快到三个进行判断,选择放置。可以设置不同的模式,比如玩家vs玩家,也可以优化电脑,可以选择难度,不同的难度对应不同的函数。还有需要自己的开发和思考。
程序最重要的一点是一定要注重用户友好,好的界面,好的优化,程序的效率都是需要每个程序员注重的。
Author:yk