#include<stdio.h>
#include<windows.h>//基本型态定义。支援型态定义函数。使用者界面函数 图形装置界面函数。
#include<conio.h> //用户通过按键盘产生的对应操作 (控制台)
#include<stdlib.h>
#include<time.h>//日期和时间头文件
#define LEN 30
#define WID 25
int Snake[LEN][WID] = {0} //数组的元素代表蛇的各个部位
char Sna_Hea_Dir = 'a'//记录蛇头的移动方向
int Sna_Hea_X, Sna_Hea_Y//记录蛇头的位置
int Snake_Len = 3//记录蛇的长度
clock_t Now_Time//记录当前时间,以便自动移动
int Wait_Time //记录自动移动的时间间隔
int Eat_Apple = 1//吃到苹果表示为1
int Level
int All_Score = -1
int Apple_Num = -1
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE) //获取标准输出的句柄 <windows.h>
//句柄 :标志应用程序中的不同对象和同类对象中的不同的实例 方便操控,
void gotoxy(int x, int y)//设置光标位置
{
COORD pos = {x,y} //定义一个字符在控制台屏幕上的坐标POS
SetConsoleCursorPosition(hConsole, pos) //定位光标位置的函数<windows.h>
}
void Hide_Cursor()//隐藏光标 固定函数
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0}
SetConsoleCursorInfo(hConsole, &cursor_info)
}
void SetColor(int color)//设置颜色
{
SetConsoleTextAttribute(hConsole, color)
//是API设置字体颜色和背景色的函数 格式:SetConsoleTextAttribute(句柄,颜色)
}
void Print_Snake()//打印蛇头和蛇的脖子和蛇尾
{
int iy, ix, color
for(iy = 0iy <WID++iy)
for(ix = 0ix <LEN++ix)
{
if(Snake[ix][iy] == 1)//蛇头
{
SetColor(0xf) //oxf代表分配的内存地址 setcolor:34行自定义设置颜色的函数
gotoxy(ix*2, iy)
printf("※")
}
if(Snake[ix][iy] == 2)//蛇的脖子
{
color = rand()%15 + 1 //rand()函数是产生随机数的一个随机函数。C语言里还有 srand()函数等。
//头文件:stdlib.h
if(color == 14)
color -= rand() % 13 + 1 //变色
SetColor(color)
gotoxy(ix*2, iy)
printf("■")
}
if(Snake[ix][iy] == Snake_Len)
{
gotoxy(ix*2, iy)
SetColor(0xe)
printf("≈")
}
}
}
void Clear_Snake()//擦除贪吃蛇
{
int iy, ix
for(iy = 0iy <WID++iy)
for(ix = 0ix <LEN++ix)
{
gotoxy(ix*2, iy)
if(Snake[ix][iy] == Snake_Len)
printf(" ")
}
}
void Rand_Apple()//随机产生苹果
{
int ix, iy
do
{
ix = rand() % LEN
iy = rand() % WID
}while(Snake[ix][iy])
Snake[ix][iy] = -1
gotoxy(ix*2, iy)
printf("⊙")
Eat_Apple = 0
}
void Game_Over()//蛇死掉了
{
gotoxy(30, 10)
printf("Game Over")
Sleep(3000)
system("pause >nul")
exit(0)
}
void Move_Snake()//让蛇动起来
{
int ix, iy
for(ix = 0ix <LEN++ix)//先标记蛇头
for(iy = 0iy <WID++iy)
if(Snake[ix][iy] == 1)
{
switch(Sna_Hea_Dir)//根据新的蛇头方向标志蛇头
{
case 'w':
if(iy == 0)
Game_Over()
else
Sna_Hea_Y = iy - 1
Sna_Hea_X = ix
break
case 's':
if(iy == (WID -1))
Game_Over()
else
Sna_Hea_Y = iy + 1
Sna_Hea_X = ix
break
case 'a':
if(ix == 0)
Game_Over()
else
Sna_Hea_X = ix - 1
Sna_Hea_Y = iy
break
case 'd':
if(ix == (LEN - 1))
Game_Over()
else
Sna_Hea_X = ix + 1
Sna_Hea_Y = iy
break
default:
break
}
}
if(Snake[Sna_Hea_X][Sna_Hea_Y]!=1&&Snake[Sna_Hea_X][Sna_Hea_Y]!=0&&Snake[Sna_Hea_X][Sna_Hea_Y]!=-1)
Game_Over()
if(Snake[Sna_Hea_X][Sna_Hea_Y] <0)//吃到苹果
{
++Snake_Len
Eat_Apple = 1
}
for(ix = 0ix <LEN++ix)//处理蛇尾
for(iy = 0iy <WID++iy)
{
if(Snake[ix][iy] >0)
{
if(Snake[ix][iy] != Snake_Len)
Snake[ix][iy] += 1
else
Snake[ix][iy] = 0
}
}
Snake[Sna_Hea_X][Sna_Hea_Y] = 1//处理蛇头
}
void Get_Input()//控制蛇的移动方向
{
if(kbhit())
{
switch(getch())
{
case 87:
Sna_Hea_Dir = 'w'
break
case 83:
Sna_Hea_Dir = 's'
break
case 65:
Sna_Hea_Dir = 'a'
break
case 68:
Sna_Hea_Dir = 'd'
break
default:
break
}
}
if(clock() - Now_Time >= Wait_Time)//蛇到时间自动行走
{
Clear_Snake()
Move_Snake()
Print_Snake()
Now_Time = clock()
}
}
void Init()//初始化
{
system("title 贪吃毛毛蛇")
system("mode con: cols=80 lines=25")
Hide_Cursor()
gotoxy(61, 4)
printf("You Score:")
gotoxy(61, 6)
printf("You Level:")
gotoxy(61, 8)
printf("The Lenght:")
gotoxy(61, 10)
printf("The Speed:")
gotoxy(61, 12)
printf("Apple Num:")
int i
for(i = 0i <Snake_Len++i)//生成蛇
Snake[10+i][15] = i+1
int iy, ix//打印蛇
for(iy = 0iy <WID++iy)
for(ix = 0ix <LEN++ix)
{
if(Snake[ix][iy])
{
SetColor(Snake[ix][iy])
gotoxy(ix*2, iy)
printf("■")
}
}
}
void Pri_News()//打印信息
{
SetColor(0xe)
gotoxy(73,4)
All_Score += Level
printf("%3d", All_Score)
gotoxy(73, 6)
printf("%3d", Level)
gotoxy(73, 8)
printf("%3d",Snake_Len)
gotoxy(73, 10)
printf("0.%3ds", Wait_Time/10)
gotoxy(73, 12)
printf("%d", Apple_Num)
}
void Lev_Sys()//等级系统
{
if(((Apple_Num-1) / 10) == Level)
{
++Level
if(Wait_Time >50)
Wait_Time -= 50
else
if(Wait_Time >10)
Wait_Time -= 10
else
Wait_Time -= 1
}
}
int main(void)
{
Init()
srand((unsigned)time(NULL))//设置随机数的种子
Now_Time = clock()
int speed1=1000,speed2,a
printf("\n")
printf("请输入你想要的速度\n")
scanf("%d",&speed2)
Level=1
Wait_Time=speed1-speed2
printf("请输入你想要的苹果数\n")
scanf("%d",&a)
while(a--)
Rand_Apple()
while(1)
{
if(Eat_Apple)
{
++Apple_Num
Rand_Apple()
Lev_Sys()
Pri_News()
}
Get_Input()
Sleep(10)
}
return 0
}
我的楼主可以自己玩一下试试吧
#define N 200
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key
int score=0/*得分*/
int gamespeed=50000/*游戏速度自己调整*/
struct Food
{
int x/*食物的横坐标*/
int y/*食物的纵坐标*/
int yes/*判断是否要出现食物的变量*/
}food/*食物的结构体*/
struct Snake
{
int x[N]
int y[N]
int node/*蛇的节数*/
int direction/*蛇移动方向*/
int life/* 蛇的生命,0活着,1死亡*/
}snake
void Init(void)/*图形驱动*/
void Close(void)/*图形结束*/
void DrawK(void)/*开始画面*/
void GameOver(void)/*结束游戏*/
void GamePlay(void)/*玩游戏具体过程*/
void PrScore(void)/*输出成绩*/
/*主函数*/
void main(void)
{
Init()/*图形驱动*/
DrawK()/*开始画面*/
GamePlay()/*玩游戏具体过程*/
Close()/*图形结束*/
}
/*图形驱动*/
void Init(void)
{
int gd=DETECT,gm
initgraph(&gd,&gm,"c:\\tc")
cleardevice()
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN)*/
setcolor(11)
setlinestyle(SOLID_LINE,0,THICK_WIDTH)/*设置线型*/
for(i=50i<=600i+=10)/*画围墙*/
{
rectangle(i,40,i+10,49)/*上边*/
rectangle(i,451,i+10,460)/*下边*/
}
for(i=40i<=450i+=10)
{
rectangle(50,i,59,i+10)/*左边*/
rectangle(601,i,610,i+10)/*右边*/
}
}
/*玩游戏具体过程*/
void GamePlay(void)
{
randomize()/*随机数发生器*/
food.yes=1/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0/*活着*/
snake.direction=1/*方向往右*/
snake.x[0]=100snake.y[0]=100/*蛇头*/
snake.x[1]=110snake.y[1]=100
snake.node=2/*节数*/
PrScore()/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==1)/*需要出现新食物*/
{
food.x=rand()%400+60
food.y=rand()%350+60
while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++
while(food.y%10!=0)
food.y++
food.yes=0/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要显示*/
{
setcolor(GREEN)
rectangle(food.x,food.y,food.x+10,food.y-10)
}
for(i=snake.node-1i>0i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1]
snake.y[i]=snake.y[i-1]
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case 1:snake.x[0]+=10break
case 2: snake.x[0]-=10break
case 3: snake.y[0]-=10break
case 4: snake.y[0]+=10break
}
for(i=3i<snake.nodei++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver()/*显示失败*/
snake.life=1
break
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墙壁*/
{
GameOver()/*本次游戏结束*/
snake.life=1/*蛇死*/
}
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0)/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10)
snake.x[snake.node]=-20snake.y[snake.node]=-20
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++/*蛇的身体长一节*/
food.yes=1/*画面上需要出现新的食物*/
score+=10
PrScore()/*输出新得分*/
}
setcolor(4)/*画出蛇*/
for(i=0i<snake.nodei++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10)
delay(gamespeed)
setcolor(0)/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10)
} /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循环*/
break
key=bioskey(0)/*接收按键*/
if(key==ESC)/*按ESC键退出*/
break
else
if(key==UP&&snake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4
}/*endwhile(1)*/
}
/*游戏结束*/
void GameOver(void)
{
cleardevice()
PrScore()
setcolor(RED)
settextstyle(0,0,4)
outtextxy(200,200,"GAME OVER")
getch()
}
/*输出成绩*/
void PrScore(void)
{
char str[10]
setfillstyle(SOLID_FILL,YELLOW)
bar(50,15,220,35)
setcolor(6)
settextstyle(0,0,2)
sprintf(str,"score:%d",score)
outtextxy(55,20,str)
}
/*图形结束*/
void Close(void)
{
getch()
closegraph()
}
五子棋的代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
using namespace std
const int N=15 //15*15的棋盘
const char ChessBoardflag = ' ' //棋盘标志
const char flag1='o' //玩家1或电脑的棋子标志
const char flag2='X' //玩家2的棋子标志
typedef struct Coordinate //坐标类
{
int x //代表行
int y //代表列
}Coordinate
class GoBang //五子棋类
{
public:
GoBang() //初始化
{
InitChessBoard()
}
void Play() //下棋
{
Coordinate Pos1 // 玩家1或电脑
Coordinate Pos2 //玩家2
int n = 0
while (1)
{
int mode = ChoiceMode()
while (1)
{
if (mode == 1) //电脑vs玩家
{
ComputerChess(Pos1,flag1) // 电脑下棋
if (GetVictory(Pos1, 0, flag1) == 1) //0表示电脑,真表示获胜
break
PlayChess(Pos2, 2, flag2) //玩家2下棋
if (GetVictory(Pos2, 2, flag2)) //2表示玩家2
break
}
else //玩家1vs玩家2
{
PlayChess(Pos1, 1, flag1) // 玩家1下棋
if (GetVictory(Pos1, 1, flag1)) //1表示玩家1
break
PlayChess(Pos2, 2, flag2) //玩家2下棋
if (GetVictory(Pos2, 2, flag2)) //2表示玩家2
break
}
}
cout <<"***再来一局***" <<endl
cout <<"y or n :"
char c = 'y'
cin >>c
if (c == 'n')
break
}
}
protected:
int ChoiceMode() //选择模式
{
int i = 0
system("cls") //系统调用,清屏
InitChessBoard() //重新初始化棋盘
cout <<"***0、退出 1、电脑vs玩家 2、玩家vs玩家***" <<endl
while (1)
{
cout <<"请选择:"
cin >>i
if (i == 0) //选择0退出
exit(1)
if (i == 1 || i == 2)
return i
cout <<"输入不合法" <<endl
}
}
void InitChessBoard() //初始化棋盘
{
for (int i = 0i <N + 1++i)
{
for (int j = 0j <N + 1++j)
{
_ChessBoard[i][j] = ChessBoardflag
}
}
}
void PrintChessBoard() //打印棋盘,这个函数可以自己调整
{
system("cls") //系统调用,清空屏幕
for (int i = 0i <N+1++i)
{
for (int j = 0j <N+1++j)
{
if (i == 0) //打印列数字
{
if (j!=0)
printf("%d ", j)
else
printf(" ")
}
else if (j == 0) //打印行数字
printf("%2d ", i)
else
{
if (i <N+1)
{
printf("%c |",_ChessBoard[i][j])
}
}
}
cout <<endl
cout <<" "
for (int m = 0m <Nm++)
{
printf("--|")
}
cout <<endl
}
}
void PlayChess(Coordinate&pos, int player, int flag) //玩家下棋
{
PrintChessBoard() //打印棋盘
while (1)
{
printf("玩家%d输入坐标:", player)
cin >>pos.x >>pos.y
if (JudgeValue(pos) == 1) //坐标合法
break
cout <<"坐标不合法,重新输入" <<endl
}
_ChessBoard[pos.x][pos.y] = flag
}
void ComputerChess(Coordinate&pos, char flag) //电脑下棋
{
PrintChessBoard() //打印棋盘
int x = 0
int y = 0
while (1)
{
x = (rand() % N) + 1 //产生1~N的随机数
srand((unsigned int) time(NULL))
y = (rand() % N) + 1 //产生1~N的随机数
srand((unsigned int) time(NULL))
if (_ChessBoard[x][y] == ChessBoardflag) //如果这个位置是空的,也就是没有棋子
break
}
pos.x = x
pos.y = y
_ChessBoard[pos.x][pos.y] = flag
}
int JudgeValue(const Coordinate&pos) //判断输入坐标是不是合法
{
if (pos.x >0 &&pos.x <= N&&pos.y >0 &&pos.y <= N)
{
if (_ChessBoard[pos.x][pos.y] == ChessBoardflag)
{
return 1 //合法
}
}
return 0 //非法
}
int JudgeVictory(Coordinate pos, char flag) //判断有没有人胜负(底层判断)
{
int begin = 0
int end = 0
int begin1 = 0
int end1 = 0
//判断行是否满足条件
(pos.y - 4) >0 ? begin = (pos.y - 4) : begin = 1
(pos.y + 4) >N ? end = N : end = (pos.y + 4)
for (int i = pos.x, j = beginj + 4 <= endj++)
{
if (_ChessBoard[i][j] == flag&&_ChessBoard[i][j + 1] == flag&&
_ChessBoard[i][j + 2] == flag&&_ChessBoard[i][j + 3] == flag&&
_ChessBoard[i][j + 4] == flag)
return 1
}
//判断列是否满足条件
(pos.x - 4) >0 ? begin = (pos.x - 4) : begin = 1
(pos.x + 4) >N ? end = N : end = (pos.x + 4)
for (int j = pos.y, i = begini + 4 <= endi++)
{
if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j] == flag&&
_ChessBoard[i + 2][j] == flag&&_ChessBoard[i + 3][j] == flag&&
_ChessBoard[i + 4][j] == flag)
return 1
}
int len = 0
//判断主对角线是否满足条件
pos.x >pos.y ? len = pos.y - 1 : len = pos.x - 1
if (len >4)
len = 4
begin = pos.x - len //横坐标的起始位置
begin1 = pos.y - len //纵坐标的起始位置
pos.x >pos.y ? len = (N - pos.x) : len = (N - pos.y)
if (len>4)
len = 4
end = pos.x + len //横坐标的结束位置
end1 = pos.y + len //纵坐标的结束位置
for (int i = begin, j = begin1(i + 4 <= end) &&(j + 4 <= end1)++i, ++j)
{
if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j + 1] == flag&&
_ChessBoard[i + 2][j + 2] == flag&&_ChessBoard[i + 3][j + 3] == flag&&
_ChessBoard[i + 4][j + 4] == flag)
return 1
}
//判断副对角线是否满足条件
(pos.x - 1) >(N - pos.y) ? len = (N - pos.y) : len = pos.x - 1
if (len >4)
len = 4
begin = pos.x - len //横坐标的起始位置
begin1 = pos.y + len //纵坐标的起始位置
(N - pos.x) >(pos.y - 1) ? len = (pos.y - 1) : len = (N - pos.x)
if (len>4)
len = 4
end = pos.x + len //横坐标的结束位置
end1 = pos.y - len //纵坐标的结束位置
for (int i = begin, j = begin1(i + 4 <= end) &&(j - 4 >= end1)++i, --j)
{
if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j - 1] == flag&&
_ChessBoard[i + 2][j - 2] == flag&&_ChessBoard[i + 3][j - 3] == flag&&
_ChessBoard[i + 4][j - 4] == flag)
return 1
}
for (int i = 1i <N + 1++i) //棋盘有没有下满
{
for (int j =1j <N + 1++j)
{
if (_ChessBoard[i][j] == ChessBoardflag)
return 0 //0表示棋盘没满
}
}
return -1 //和棋
}
bool GetVictory(Coordinate&pos, int player, int flag) //对JudgeVictory的一层封装,得到具体那个玩家获胜
{
int n = JudgeVictory(pos, flag) //判断有没有人获胜
if (n != 0) //有人获胜,0表示没有人获胜
{
PrintChessBoard()
if (n == 1) //有玩家赢棋
{
if (player == 0) //0表示电脑获胜,1表示玩家1,2表示玩家2
printf("***电脑获胜***\n")
else
printf("***恭喜玩家%d获胜***\n", player)
}
else
printf("***双方和棋***\n")
return true //已经有人获胜
}
return false //没有人获胜
}
private:
char _ChessBoard[N+1][N+1]
}
扩展资料:设计思路
1、进行问题分析与设计,计划实现的功能为,开局选择人机或双人对战,确定之后比赛开始。
2、比赛结束后初始化棋盘,询问是否继续比赛或退出,后续可加入复盘、悔棋等功能。
3、整个过程中,涉及到了棋子和棋盘两种对象,同时要加上人机对弈时的AI对象,即涉及到三个对象。