用了好几天的时间,一直在写一个小游戏---三子棋,虽然是黑白框,但还是能够达到基本的效果,基本思路就是先用一个二维数组创建一个棋盘,起初可以将它初始化为空格,至于电脑可以用随机数来代替,核心主要是函数和数组的基本应用,不是太难,只要细心点就可以成功啦!
代码如下
头文件game.h
#ifndef __GAME_H__ #define __GAME_H__ #include <stdio.h> #include <Windows.h> #include <time.h> #include <stdlib.h> #define ROW 3 #define COL 3 enum OPTION { QUIT, PLAY }; void InitBorad(char board[ROW][COL],int row,int col); void Display(char board[ROW][COL],int row,int col); void PlayerMove(char board[ROW][COL],int row,int col); void ComputerMove(char board[ROW][COL],int row,int col); char CheckWin(char board[ROW][COL],int row,int col); #endif //__GAME_H__
test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void game() { char win=0; char board[ROW][COL]={0}; InitBorad(board,ROW,COL); Display(board,ROW,COL); while(1) { PlayerMove(board,ROW,COL); win=CheckWin(board,ROW,COL); Display(board,ROW,COL); if(win!=' ') break; ComputerMove(board,ROW,COL); Display(board,ROW,COL); win=CheckWin(board,ROW,COL); if(win!=' ') break; } if(win=='x') { printf("玩家赢\n"); } else if(win=='0') { printf("电脑赢\n"); } else { printf("平局\n"); } } void menu() //打印菜单 { printf("*************************\n"); printf("*****1.play 0.quit*****\n"); printf("*************************\n"); } //游戏基本框架 void test() { int input=0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:"); scanf("%d",&input); switch(input) { case QUIT: printf("退出游戏\n"); break; case PLAY: game(); break; default: printf("选择错误\n"); break; } }while(input); } int main() { test(); return 0; }
game.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" //初始化数组 void InitBorad(char board[ROW][COL],int row,int col) { int i=0; for(i=0;i<row;i++) { int j=0; for(j=0;j<col;j++) { board[i][j]=' '; } } } //打印棋盘 void Display(char board[ROW][COL],int row,int col) { int i=0; for(i=0;i<row;i++) { printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]); if(i<row-1) printf("---|---|---\n"); } } //玩家走 void PlayerMove(char board[ROW][COL],int row,int col) { int x=0; int y=0; printf("玩家走\n"); while(1) { printf("请输入坐标->"); scanf("%d%d",&x,&y); if(x>=1 && x<=row && y>=1 && y<=col)//一定要判断坐标是否合法 { if(board[x-1][y-1]==' ') { board[x-1][y-1]='x'; break; } else printf("坐标被占用\n"); } else printf("坐标非法\n"); } } //电脑走 void ComputerMove(char board[ROW][COL],int row,int col) { int x=0; int y=0; printf("电脑走\n"); while(1) { x=rand()%row;//产生随机数 y=rand()%col; if(board[x][y]==' ') { board[x][y]='0'; break; } } } //检验棋盘是否已满 static int IsFull(char board[ROW][COL],int row,int col) { int i=0; int j=0; for(i=0;i<row;i++) { for(j=0;j<col;j++) { if(board[i][j]==' ') return 0; } } return 1; } //判断输赢 char CheckWin(char board[ROW][COL],int row,int col) { int i=0; for(i=0;i<row;i++) { if(board[i][0]==board[i][1] && board[i][1]==board[i][2]) { return board[i][0]; } } for(i=0;i<col;i++) { if(board[0][i]==board[1][i] && board[1][i]==board[2][i]) return board[0][i]; } if(board[0][0]==board[1][1] && board[1][1]==board[2][2]) return board[0][0]; if(board[0][2]==board[1][1] && board[1][1]==board[2][0]) return board[0][0]; if(IsFull(board,row,col)) { return 'Q';//平局 } return ' ';//继续 }